한국투자증권 주식매매프로그램 만들기

파이썬 주식매매프로그램 만들기

미국 주식 프로그램 만들기(KIS Developers)/1. KIS Developer API 연동

5) 해외주식 매수가능금액조회(해외계좌잔고확인)

토폴로지 2022. 9. 13. 19:50
import requests
import json
import yaml

with open(r'config.yaml', encoding='UTF-8') as f:
    _cfg = yaml.load(f, Loader=yaml.FullLoader)
APP_KEY = _cfg['APP_KEY']
APP_SECRET = _cfg['APP_SECRET']
ACCESS_TOKEN = ""
CANO = _cfg['CANO']
ACNT_PRDT_CD = _cfg['ACNT_PRDT_CD']
ACTUAL_DOMAIN = _cfg['ACTUAL_DOMAIN']

# ACCESS TOKEN 발급
def get_access_token():
    url = '/oauth2/tokenP'
    request_url = f"{ACTUAL_DOMAIN}/{url}"
    headers = {
    }
    body = {
        "grant_type": "client_credentials",
        "appkey": APP_KEY,
        "appsecret": APP_SECRET,
    }
 
    res = requests.post(request_url, data=json.dumps(body), headers=headers)
    rescode = res.status_code
    if rescode == 200:
        ACCESS_TOKEN = res.json()["access_token"]
    else:
        print("Error Code : " + str(rescode) + " | " + res.text)
    
    return ACCESS_TOKEN
#한국계좌잔고 확인
def get_kor_balance():
    url = "/uapi/domestic-stock/v1/trading/inquire-psbl-order"
    request_url = f"{ACTUAL_DOMAIN}/{url}"
    headers = {"Content-Type": "application/json",
               "authorization": f"Bearer {ACCESS_TOKEN}",
               "appKey": APP_KEY,
               "appSecret": APP_SECRET,
               "tr_id": "TTTC8908R",   #실전투자값: TTTC8908R
               "custtype": "P", #P: 개인
               }
    params = {
        "CANO": CANO, #계좌번호
        "ACNT_PRDT_CD": ACNT_PRDT_CD, #계좌번호 뒷자리
        "PDNO": "005930", # 종목 코드 005930은 삼성
        "ORD_UNPR": "65500", #1주당 가격
        "ORD_DVSN": "01", # 01: 시장가
        "CMA_EVLU_AMT_ICLD_YN": "Y", #CMA 평가금액포함여부: Y
        "OVRS_ICLD_YN": "Y" #해외포함여부: Y
    }
    res = requests.get(request_url, headers=headers, params=params)
    cash = res.json()['output']['ord_psbl_cash']
    #print(f"주문 가능 현금 잔고: {cash}원")
    return int(cash)
#미국 주야간 확인
def check_day_or_night():
    url = "/uapi/overseas-stock/v1/trading/dayornight"
    request_url = f"{ACTUAL_DOMAIN}/{url}"
    headers = {"Content-Type": "application/json",
               "authorization": f"Bearer {ACCESS_TOKEN}",
               "appKey": APP_KEY,
               "appSecret": APP_SECRET,
               "tr_id": "JTTT3010R", 
               "custtype": "P", #P: 개인
               }
    params = {
    }
    res = requests.get(request_url, headers=headers, params=params)
    day_or_night = res.json()['output']['PSBL_YN']
    #미국: 23:30 ~ 06:00 (썸머타임 적용 시 22:30 ~ 05:00)
    return day_or_night
#해외주식 매수가능금액조회
def get_us_balance():
    #JTTT3007R : PSBL_YN(주야간 원장 구분) = 'Y' (야간용)
    #TTTS3007R : PSBL_YN(주야간 원장 구분) = 'N' (주간용)
    TR_ID = "JTTT3007R" if DAY_OR_NIGHT == 'Y' else "TTTS3007R"
    url = "/uapi/overseas-stock/v1/trading/inquire-psamount"
    request_url = f"{ACTUAL_DOMAIN}/{url}"
    headers = {"Content-Type": "application/json",
               "authorization": f"Bearer {ACCESS_TOKEN}",
               "appKey": APP_KEY,
               "appSecret": APP_SECRET,
               "tr_id": TR_ID,   #실전투자값: TTTC8908R
               "custtype": "P", #P: 개인
               }
    params = {
        "CANO": CANO, #계좌번호
        "ACNT_PRDT_CD": ACNT_PRDT_CD, #계좌번호 뒷자리
        "OVRS_EXCG_CD": "NASD", #NASD : 나스닥 / NYSE : 뉴욕 / AMEX : 아멕스 SEHK : 홍콩 / SHAA : 중국상해 / SZAA : 중국심천 TKSE : 일본 / HASE : 하노이거래소 / VNSE : 호치민거래소
        "OVRS_ORD_UNPR": "30.0", #해외주문단가, 정수부분 23자리, 소수부분 8자리
        "ITEM_CD": "TQQQ", #종목코드
    }
    res = requests.get(request_url, headers=headers, params=params)
    cash = res.json()['output']['ovrs_ord_psbl_amt']
    print(f"주문 가능 현금 잔고: {cash}$") 
    return cash

ACCESS_TOKEN = get_access_token()
DAY_OR_NIGHT = check_day_or_night()
#get_kor_balance()
get_us_balance()

참고할 점은 KIS Developer에서 엑셀로 API 문서를 제공해주는데

이 API는 엑셀에 없고 홈피 API 문서만 있다는 점

 

앞서 말했듯이

주야간에 따라 header의 tr_id 값이 달라진다.

그래서

TR_ID = "JTTT3007R" if DAY_OR_NIGHT == 'Y' else "TTTS3007R" 

위와 같이 한 줄로 처리했다.

 

51$ 있네요 ㅋㅋ

반응형