PYTHON/Kiwoom Open API

자동 매매 프로그램의 가격 데이터 관리 - (1)

  • -

이번 게시글에서는 키움증권 Open API를 이용한 자동 매매 시스템을 구축하고자 할 때, 어떠한 로직을 통해 이루어져야 하는지에 대해 간략하게나마 살펴볼 예정이다. 게시글을 통해 "아. 이러이러한 로직을 거쳐 동작하도록 구축하면 되겠구나."하는 정도의 감만 온다면 이 게시글의 목표는 모두 달성한 것이라 볼 수 있다.

 

 

키움증권 Open API는 기본적으로 실시간 등록을 통해 데이터 조회가 이루어진다.

그 말인 즉슨, 우리가 거래하고자 하는 종목은 실시간 등록이 되어 있어야 실시간으로 거래를 진행할 수 있다는 것이다. 대략적으로 설명하자면, 실시간 데이터는 아래와 같은 로직으로 이루어진다.


SetRealReg(scrno, codelist, fidlist, realtype) : 실시간 조회 종목으로 등록

실시간 데이터 발생 시 OnReceiveRealData 이벤트 발생

데이터 수신

매수 예정 가격 및 매도 예정 가격과의 데이터 비교

SendOrder(rqname, scrno, accno, ordertype, ···) : 주문


여기서 주의해야 할 부분이 있다면, 키움증권의 SetRealReg() 함수를 통해 실시간으로 등록할 수 있는 종목의 개수는 100개라는 것이다. 따라서 우리는 실시간으로 조회하며 거래를 진행하고자 하는 종목의 리스트를 사전에 정리해두어야 한다.

[출처 : 키움증권 Open API 개발가이드 공식 배포 자료]

 

 

매수가와 매도가 등의 데이터 비교는 데이터프레임을 기반으로 한다.

이에 대해서는 다양한 의견이 있을 수 있다. 예를 들어 실시간으로 데이터를 처리한다거나 하는 등의 방법을 통해 거래 가능 여부를 판단하거나 하는 다양한 방법들이 있을 것이다. 하지만 본인이 생각하기에 가장 좋은 방법은 ① 키움증권 HTS 프로그램인 영웅문 내 조건검색식 화면을 통해 1차적으로 종목을 선정한 후,  ② 해당 종목을 대상으로 차트 데이터를 조회하여 본인의 거래 적용 알고리즘을 통해 종목을 선정해내고,  ③ 해당 종목들의 매수 예정가와 매도 예정가 등의 데이터를 사전에 계산하여 데이터프레임으로 DB에 저장하고,  ④ 실시간 등록을 통해 실시간으로 바뀌는 해당 종목의 현재가 데이터가 사전에 계산된 가격에 부합하는가에 따라 거래를 진행하는 것이다. 이런 방법으로 자동 매매 시스템을 구축하게 된 이유에는 키움증권의 조회 제한과 등록 종목의 제한이 큰 영향을 미쳤다. 하나하나 그 이유를 살펴보도록 하자.

첫째, ①번 과정에서 1차적인 종목을 선정해내지 못한다면 우리는 코스피와 코스닥에 상장되어 있는 모든 종목을 대상으로 하여 필요로 하는 차트 데이터(본인의 경우에는 일봉, 3분봉, 15분봉을 사용한다.)를 모두 받아와서 저장해야 한다. 이 방법을 사용한다면 데이터를 저장하는 데에 많은 저장 공간이 필요하겠지만, 무엇보다도 너무 많은 시간이 소요되어 다음날 거래할 데이터를 사전에 구비할 수 없다. 다시 말해, 전 날 장 마감 후(3시 30분 이후)부터 2,000개가 넘는 종목의 차트 데이터를 모두 불러온다고 했을 때, 해당 데이터 조회와 저장이 다음 날 오전 9시까지 모두 이루어지지 못한다는 것이다. 따라서 우리는 종목을 사전에 선정해서 해당 종목만을 대상으로 하여 차트 데이터를 조회해야만 해당 데이터를 기반으로 매수가와 매도가 등의 데이터를 뽑아낼 수 있는 시간을 확보할 수 있다.
※ 조회 제한에 관해 직접 실험을 진행하신 분의 게시글을 참고하셔도 좋습니다 : 바로가기 링크(클릭 시 이동)

이는 둘째 과정과 연결되는 부분인데, 기본적으로 우리가 거래하고자 하는 종목의 매수가와 매도가 데이터를 계산해내기 위해서는 그 데이터를 반드시 저장해주어야만 한다.(물론 조회만으로도 가능하기도 하나, 이는 프로그램이 고도의 완성도를 갖추었을 때 가능할 것 같다.) 저장된 데이터가 있어야 하는 이유는 알고리즘이 매수가와 매도가를 계산할 수 있는 그 기반이 되는 데이터가 있어야 하기 때문이다. 

이러한 계산에 따라 아래와 같은 형태의 데이터를 생성해야 한다. 위의 표는 한 번의 매수와 한 번의 매도만 이루어지는 알고리즘에서 만들어지는 거래 기반 데이터이고, 아래의 표는 두 번의 분할 매수와 두 번의 분할 매도가 이루어지는 알고리즘에서 만들어지는 거래 기반 데이터이다.

이런 표(데이터프레임)를 생성하여 각 칸에 사전에 계산한 데이터를 입력한 후, 실시간 데이터에서 발생하는 데이터와 비교함으로써 매수 예정 가격에 도달했는지 아니면 매도 예정 가격에 도달했는지 등과 같은 부분을 판단하여 거래를 진행하도록 할 수 있는 것이다.

 

 

과연 당신은 하나의 알고리즘만 이용할 것인가?

이 부분에 대해서는 다음 게시글에서 살펴보도록 하자. 꽤나 중요하지만, 예상외로 생각해내기 어려운 부분이다.

 

 

자동 매매 프로그램의 가격 데이터 관리하기 (2) 게시글

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.