글
[XingAPI] 파이썬과 OpenAPI로 TR 만들어보기
OpenAPI가 나오면서 API 접근성이 많이 개선이 된 것 같습니다.
하지만 처음 자동매매를 시작하시는 분들이 참고할만한 자료가 많지 않아서 진도가 잘 나가지 않을텐데요. 그래서 문서를 보고 직접 코드를 만드는 절차를 자세하게 기술하고자 합니다.
이베스트 증권 OpenAPI를 이용하기 위해서는 API key를 발급받아야합니다. 아래 내용 참고하세요.
API key를 받았다면 아래 API Guide로 이동합니다.
https://openapi.ebestsec.co.kr/apiservice
여기에 보시면 Open API가 지원하는 다양한 TR 정보들에 대한 자세한 정보가 나옵니다.
"주식/시세/기간별주가" 어떻게 코딩을 하는지 알려드리겠습니다.
API Guide에 나오는 내용입니다.
기본정보에 나오는 값도 코드에 사용을 하여야하니 일단 참고만 합니다.
다음은 요청시에 필요한 header 정보입니다.
뭔가 좀 복잡한데요. t1305를 이용하기 위해서는 header에 이런 정보를 넣어야한다는 의미입니다.
큰 틀은 get_token() 함수를 이용하여 token을 받은 후 본인이 원하는 함수를 호출하는 형식입니다.
token = get_token()
ticker = '069500' # kodex 200
qrycnt = 2 # 몇 개를 받을지
dwmcode = 1 # 일봉:1, 주봉:2, 월봉:3
# infos : candle info
infos = get_stock_dwm_info(ticker, qrycnt, dwmcode)
for info in infos :
print(json.dumps(info, indent=4))
일반적으로 t1305를 한번만 부르지 않기 때문에 아래와 같이 함수를 만듭니다. 함수를 만들때에는 인자는 header와 body에 들어갈 정보를 보고 적절하게 만드시면 됩니다. 함수 작성하는 방법 default 값을 assign하는 방법 등은 파이썬 교재를 통하여 습득하시기 바랍니다.
-----------------------
t1305에 해당하는 get_stock_dwm_info()를 만드는 과정을 설명합니다.
header 부분입니다.
PATH는 기본정보의 URL 값을 입력하세요.
연속여부는 edate 값에 따라 결정합니다.
content-type과 authorization에 들어가는 부분은 꿈에님 코드를 활용하였습니다. 이 부분은 예제에 나오는 함수를 그냥 사용하시면 됩니다.
다음으로 각 항목은 tr 마다 모두 틀리기 각 tr에 대하여 guide 참고하여 적절한 값을 넣어야합니다. 만약 api가 작동하지 않는다면 header에 넣어주는 정보가 틀렸다는 의미이므로, guide를 다시 한번 자세하게 읽어서 정확한 값을 넣어주셔야 합니다. 특히 type 부분을 잘 보셔야 합니다. string인지 int인지 자리수는 몇자리인지 잘 확인하셔야 합니다.
def get_stock_dwm_info(ticker, qrycnt, dwmcode=1, edate = ' ', tr_cont_key=''):
PATH = "/stock/market-data"
# 연속여부 판단
cont = 'N'
if tr_cont_key != '' :
cont = 'Y'
headers = {
"content-type": "application/json; charset=utf-8", "authorization": "Bearer "+token,
"tr_cd": "t1305",
"tr_cont": cont,
"tr_cont_key": tr_cont_key
}
다음은 body 부분입니다. header와 마찬가지로 정확한 값을 입력해야합니다.
date 필드는 처음조회시와 연속조회시 다른 값이 들어갑니다. 일반적으로 한번에 받을 수 있는 자료의 크기가 정해져있으므로, 그 이상 받고 싶은 경우에는 연속조회를 해야합니다. 연속조회 방식은 이전 글 참고하세요.
body에 대응하는 실제 코드입니다. body와 1:1로 위치 맞춰서 적절한 값이 설정되도록 합니다.
body = {
"t1305InBlock": {
"shcode": ticker,
"dwmcode": dwmcode, # 1@일, 2@주, 3@월
"date": edate, # 처음 조회시는 Space 연속 조회시에 이전 조회한 OutBlock의 date 값으로 설정
"idx": 0, # 무시
"cnt": qrycnt # 건수
}
}
이제 query를 할 준비가 끝났습니다. query를 던집니다.
result = requests.post(BASE_URL+PATH, headers=headers, data=json.dumps(body))
header = result.headers
body = result.json()
결과는 header와 body를 통하여 확인이 가능합니다.
header에는 tr 정보가 들어있습니다. 혹시라도 답이 제대로 나오지 않는다면 header 정보를 확인하시면 됩니다. 정상적인 경우에는 무시하셔도 됩니다.
body에는 query한 결과가 들어있습니다.
body를 보시면 아래 두 key 값으로 결과 값이 저장되어 있습니다. 만약 연속조회를 한다면 "t1305OutBlock"에 있는 date 값을 이용하여 재 조회를 하시면 됩니다. 이렇게 글은 쉽게 썼지만 처음 접하시는 분들은 무슨 말이냐 하실텐데, 이전 선물 tick 받는 소스 참고하여 스스로 공부해보시기 바랍니다.
t1305OutBlock1에는 우리가 원하던 candle 정보가 들어있습니다.
query 결과는 json 형태로 돌려주는데 이 값을 출력할 때 아래 방식을 사용하면 보시기 편할겁니다.
print(json.dumps(body, indent=4))
마지막으로 함수에서 돌려줄 때 OpenAPI로 받은 값을 그냥 돌려주면 사용하는 쪽에서 힘들어집니다. 앞으로 다양한 API를 이용할텐데 그때마다 t1305OutBlock1 이런 식으로 정해진 값을 key 사용하면 불편해집니다. 따라서 단순하게 dict list로 돌려주는 것이 사용하기 편해집니다. 아래와 같이요.
return body["t1305OutBlock1"]
이제는 받은 값을 출력해봐야겠죠.
# infos : candle info
infos = get_stock_dwm_info(ticker, qrycnt, dwmcode)
for info in infos :
print(json.dumps(info, indent=4))
출력결과입니다.
잘 나오는군요.
만약 query 하고자 하는 개수가 100개라면 이런식으로 출력하면 너무 양이 많습니다. 시간도 많이 걸리고요.
이런 경우에는 1-2개만 잘 받는지 확인하고 그 다음부터는 print 문을 빼시면 됩니다.
query한 결과를 화면 출력하였다면 이번에는 파일에 저장하는 방법입니다.
저장하는 방법도 여러가지가 있겠지만 저는 csv 파일 형태로 저장하는 것을 선호합니다.
저장할 때와 읽을 때 사용하는 함수도 포함해놓았으니 필요할 때 사용하시기 바랍니다. 아래는 코드 사용 예입니다.
# 저장
fname = ticker + '_day.csv'
save_to_file_csv(fname, infos)
# 읽기
data = read_csv_to_dict(fname)
print('읽은 값')
for info in data :
print(json.dumps(info, indent=4))
cvs 파일 형태로 저장이 되어 있으므로 excel을 이용하면 뭔가 하기 편합니다.
간단하게 Open API로 본인만의 파이썬 코드를 만드는 방법을 정리해보았습니다. OpenAPI는 많은 TR이 있으므로, 본인이 필요한 TR이 생기면 그때 그때 같은 방식으로 함수를 만들어서 사용하시면 됩니다.
개발하시다가 잘 안되는 경우가 생기면 댓글로 남겨주세요.
소스코드는 아래 github에 있습니다. OpenAPI_Stock_Candle.py
https://github.com/multizone-quant/api_ex
'이베스트 API xingAPI' 카테고리의 다른 글
[XingAPI] 파이썬과 OpenAPI로 실시간 TR 받기(2) (0) | 2024.03.04 |
---|---|
[XingAPI] 파이썬과 OpenAPI로 실시간 TR 받기(1) (1) | 2024.02.29 |
[XingApi] OpenAPI로 선물 tick 데이터 down 받는 파이썬 소스코드 (0) | 2024.01.31 |
[Xing API] 연속 TR API 오류 (0) | 2024.01.31 |
[API] 일봉 데이터에서 수정주가 해석하기 (0) | 2023.08.11 |