[AD]MCO VISA 암호화폐로 결제하자

[일상] 이베스트 증권 API를 이용한 자동매매(1)

요즘 같은 변동성이 큰 주식 시장은 좋은 매매 대상입니다. 이에 이베스트 증권 API를 이용한 자동매매 개발과정을 공유합니다.

다행히 파이썬으로도 자동매매 툴 개발이 가능하군요. 지난 글에서 개발을 위하여 필요한 사항들에 대하여 설명을 했었는데요. 그 과정을 정리해보면 다음과 같습니다.

  • 이베스트 증권 계좌 열기
  • API 신청하기
  • Dev Center 설치하기
  • 아나콘다 32bit 설치하기

이베스트 증권 API를 사용하기 위해서는 파이썬 32비트 버전을 사용해야 합니다. 그래서 아나콘다32bit를 설치합니다.

개발환경으로는 아나콘다에 있는 Spyder를 이용합니다. 지난 번 글에서 로그인하는 방법에 대하여 정리를 했었고, 이번 글에서는 특정 주식의 과거 데이터를 가져오는 방법에 대하여 정리합니다.

매매 전략을 만들기 위해서는 과거 데이터를 이용하여 전략분석을 해 보아야 합니다. 그래서 우선 과거 데이터 다운 부터 받아야 합니다.

과거데이터를 가져오는 TR 번호는 8413입니다. 해당 TR의 RES 파일을 DevCenter에서 다운받습니다.

다운 받을 데이터에 대한 정보를 입력하면 엑셀파일로 만들어주는 함수를 만들어 봅니다.

# ----------------------------------------------------------------------------
# T8413 과거데이터 다운로드
# ----------------------------------------------------------------------------

KODEX200 = '069500'
KODEX_INV = '114800'
codes = [KODEX200, KODEX_INV]
from_ = '20020101'
to_ = '20021231'
for code in codes :
    print(code)
    datelist, datalist = get_price_history_daily(code, from_, to_, 1)

기간과 코드 입력받아 과거 일 봉 데이터를 엑셀파일로 저장하는 함수입니다.

def get_price_history_daily(code, from_, to_, save=0) :
    instXAQueryT8413 = win32com.client.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEventHandler)
    instXAQueryT8413.ResFileName = "C:\\eBEST\\xingAPI\\Res\\t8413.res"

    instXAQueryT8413.SetFieldData("t8413InBlock", "shcode", 0, code)
    instXAQueryT8413.SetFieldData("t8413InBlock", "gubun", 0, "2")
    instXAQueryT8413.SetFieldData("t8413InBlock", "sdate", 0, from_)
    instXAQueryT8413.SetFieldData("t8413InBlock", "edate", 0, to_)
    instXAQueryT8413.SetFieldData("t8413InBlock", "comp_yn", 0, "N")
    
    instXAQueryT8413.Request(0)
    
    while XAQueryEventHandlerT8413.query_state == 0:
        pythoncom.PumpWaitingMessages()
    
    datalist = []
    datelist = []
        
    count = instXAQueryT8413.GetBlockCount("t8413OutBlock1")
    for i in range(count):
        date = instXAQueryT8413.GetFieldData("t8413OutBlock1", "date", i)
        open = instXAQueryT8413.GetFieldData("t8413OutBlock1", "open", i)
        high = instXAQueryT8413.GetFieldData("t8413OutBlock1", "high", i)
        low = instXAQueryT8413.GetFieldData("t8413OutBlock1", "low", i)
        close = instXAQueryT8413.GetFieldData("t8413OutBlock1", "close", i)
        vol = instXAQueryT8413.GetFieldData("t8413OutBlock1", "jdiff_vol", i)
        datalist.append([open, high, low, close, vol])
        datelist.append(date)
        print(date, open, high, low, close, vol)
        
    ebest_day = DataFrame(datalist, columns=['open', 'high', 'low', 'close', 'vol'], index=datelist)
    if save :
        print('save', code)
        ebest_day.to_csv('.\\{}-{}-{}.csv'.format(code, from_, to_))
    return ebest_day

API가 Com 방식이기 때문에 과거 데이터를 요청한 후 해당 데이터가 전송되었는지 기다리는 부분이 필요합니다. 다른 정보를 얻기 위해서도 같은 방식이 필요합니다. 그래서 이벤트 핸들러 class를 만들어서 대응합니다.

class XAQueryEventHandler:
    query_state = 0

    def OnReceiveData(self, code):
        print('OnRecv', code)
        if code == 't8413' :
            XAQueryEventHandlerT8413.query_state = 1
        elif code == 't8430' :
            XAQueryEventHandlerT8430.query_state = 1
        elif code == 't1102' :
            XAQueryEventHandlerT1102.query_state = 1

즉 구조적으로는 아래와 같은 방식입니다.

    #명령어 만들기

    # 명령어 보내기  # 
    instXAQueryT8413.Request(0)

    # 해당 명령어의 답신이 왔는지 기다리기

    while XAQueryEventHandlerT8413.query_state == 0:
        pythoncom.PumpWaitingMessages()

    # 해당 명령어의 답신 처리하기

실행 결과입니다.

엑셀파일에도 잘 기록이 되어 있군요.

다음에는 과거 데이터를 바탕으로 적절한 트레이딩 전략을 적용한 백테스트를 하는 과정을 정리해보도록 하겠습니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

JCAR 4월 구독보팅입니다.

이베스트 증권이 자동매매 하기 편리한가요?

파이썬으로 할 수 있어서 작업 중입니다. 크게 어려운 부분은 없는 것 같아요.

저 이런거 아주 좋아하는데 따라할 수가 없네요 ㅋ
그냥 가만히 않아서 지속 수익내는거 아주 좋은데~~~ 쩝!!
여시 아들 열심히 공부시키는 신공을 서야 할듯요 ㅋㅋㅋ

아무래도 파이썬 공부를 좀 하셔야 가능합니다. 아들 신공 좋은데요.