[키움증권 OpenAPI ]전략 백테스팅을 위한 과거 일봉(주가) 데이터는 어떻게 가져올까?
(예제 구현은 https://kiwoom.dev 를 활용해서 작성)
상황: 이동평균선(MA), RSI 등 기술적 지표를 계산하고 퀀트 전략을 백테스트하려면 과거 며칠, 몇 달, 심지어 몇 년 치의 일봉 데이터가 반드시 필요합니다.
해결 방법: SetInputValue 함수로 요청 파라미터(종목코드, 기준일자 등)를 설정한 후, CommRqData를 호출하여 opt10081(주식일봉차트조회요청) TR 데이터를 요청합니다. 서버로부터 응답이 오면 OnReceiveTrData 이벤트 슬롯에서 데이터를 파싱하여 사용합니다.
def request_daily_data(self, stock_code, date):
# 삼성전자(005930) 예시
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", stock_code)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "기준일자", date)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", "1")
# TR 데이터 요청
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)",
"opt10081_req", "opt10081", 0, "0101")
# 바인딩된 OnReceiveTrData 이벤트 슬롯에서 파싱:
def on_receive_tr_data(self, screen_no, rqname, trcode, recordname, prev_next):
if rqname == "opt10081_req":
# 수신된 데이터의 반복 횟수(데이터 행 수) 가져오기
cnt = self.kiwoom.dynamicCall("GetRepeatCnt(QString, QString)", trcode, rqname)
for i in range(cnt):
date = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "일자").strip()
close_price = self.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "현재가").strip()
# 현재가는 음수로 내려오는 경우가 있으므로 abs() 처리
print(f"일자: {date}, 종가: {abs(int(close_price))}")