-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.py
More file actions
71 lines (59 loc) · 2.81 KB
/
main.py
File metadata and controls
71 lines (59 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import pykis
import pandas as pd
import logging
from allocation import baa_aggressive
from config import APP_KEY, APP_SECRET, CANO, ACNT_PRDT_CD, VIRTUAL
from datetime import datetime
from kis import get_cash_balance, get_total_balance
from pykis import MarketCodeMap
from time import sleep
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
market_codes = {'SPY': "AMS", 'EFA': "AMS", 'EEM': "AMS", 'AGG': "AMS", 'QQQ': "NAS", 'EEM': "AMS", 'EFA': "AMS", 'AGG': "AMS", 'TIP': "AMS", 'DBC': "AMS", 'BIL': "AMS", 'IEF': "NAS", 'TLT': "NAS", 'LQD': "AMS", 'AGG': "AMS"}
key_info = { # KIS Developers 서비스 신청을 통해 발급받은 API key 정보
"appkey": APP_KEY,
"appsecret": APP_SECRET
}
account_info = { # 사용할 계좌 정보
"account_code": CANO,
"product_code": ACNT_PRDT_CD
}
# API 객체 생성
domain_info = pykis.DomainInfo(kind="virtual" if VIRTUAL else "real")
api = pykis.Api(domain_info=domain_info, key_info=key_info,
account_info=account_info)
# 현재 보유한 주식을 파악
stocks_os = api.get_os_stock_balance()
for stock in stocks_os.index:
market_codes[stock] = MarketCodeMap().to_3(stocks_os.loc[stock, "거래소코드"])
# 현재 총 자산을 파악
stock_usd = 0
if len(stocks_os) > 0:
stocks_os.loc[:, "총액"] = stocks_os.loc[:, "현재가"] * stocks_os.loc[:, "보유수량"]
stock_usd = stocks_os.loc[:, "총액"].sum()
cash_usd = get_cash_balance(api)
if VIRTUAL:
asset_usd = stock_usd + cash_usd
else:
asset_usd = get_total_balance(api)
logger.info(f"현재 총 자산: {asset_usd}")
# 자산배분 비율을 파악
allocation_ratio = baa_aggressive(datetime.now())
# 현재 얼로케이션을 파악
if len(stocks_os) > 0:
current_allocation = stocks_os.loc[:,['보유수량']]
else:
current_allocation = pd.DataFrame(columns=["보유수량"])
# 목표 얼로케이션을 파악
allocation_goal = pd.DataFrame(data=
{"보유수량": [allocation_ratio[stock] * asset_usd // api.get_os_current_price(stock, market_codes[stock]) for stock in allocation_ratio.index], "목표비중": allocation_ratio.values}, index=allocation_ratio.index)
diff = allocation_goal.sub(current_allocation, fill_value=0).rename(columns={"보유수량": "매매계획수량"})
logger.info(diff)
# 매수/매도
for stock in diff.loc[diff.loc[:,"매매계획수량"] < 0].index:
api.sell_os_stock(market_codes[stock], stock, int(abs(diff.loc[stock, "매매계획수량"])), round(api.get_os_current_price(stock, market_codes[stock]) * 0.99, 2))
sleep(3)
for stock in diff.loc[diff.loc[:,"매매계획수량"] > 0].index:
api.buy_os_stock(market_codes[stock], stock, int(abs(diff.loc[stock, "매매계획수량"])), round(api.get_os_current_price(stock, market_codes[stock]) * 1.01, 2))
stocks_os = api.get_os_stock_balance()
logger.info(stocks_os)