AI를 활용한 재밌는 것들을 개발합니다

2021년 9월 23일 목요일

방구석지니 퀀트 매매주문 주기 단축 테스트 (0.2초 성공)

 현재 방구석지니는 최소 매매주기 1분으로 설정되어 있다. 그리고 한 계좌에서 최대로 자동매수해서 보유 할 수 있는 종목 수는 60종목으로 제한 되어 있다. 예를 들어 60종목을 1분 주기로 한번에 매수하려면 1분 안에 60종목의 매수주문이 키움OpenAPI를 통해서 나가야하는 것이다. 하지만 현재 프로그램 상 주문과 주문 사이에는 1초의 딜레이를 주고 있기 때문에 1분안에 60종목 주문이 완료가 되지 않아 다음 매매주기가 돌아올 때 명령들이 충돌하면서 한 종목을 2배로 매수하게 되는 문제가 발생했었다.


이 문제를 해결하기 위해 주문과 주문 사이의 딜레이 시간을 최소화 하는 테스트를 해보려고 한다. 0.5초로만 줄여도 매매주기 1분에서도 충분히 돌아갈 것이지만 나의 최종 목표는 현재 한 계좌에 한해서만 자동주문이 나가는 것을 향후에는 여러 계좌에 대한 자동주문을 한번에 하려는 것이기 때문에 주문과 주문 사이의 딜레이는 최소화 하는 것이 최선의 방법이다.


그럼 테스트를 시작해보겠다. 우선 60종목의 포트폴리오를 만들어야겠다. 대충 옛날 퀀트종목들 짬뽕해서 만들자. 


잘 아시다시피 키움OpenAPI는 1초에 5번의 명령신호를 보내도록 트래픽 제한을 두고 있다. 그럼 산술적으로 0.2초마다 매수주문을 넣을 수 있다는 말인데 사실인지 확인을 위해 딜레이를 0.1초로 두고 60종목을 순차적으로 매수 주문 넣어보자.

60종목 매수 주문이 나가야 하는데 6~7종목만 매수주문이 나가고 나머지 종목들은 위와 같은 에러코드가 발생했다. '-308' 이 에러코드가 뭔지 확인해보자. 


역시나 주문횟수제한에 대한 에러코드였다. 0.1초 간격은 일단 안되는걸로...

이번엔 0.2초로 셋팅해서 매수주문을 넣어보자.



에러 없이 주문이 정상적으로 잘 나갔다.

지금까지는 테스트를 위해서 '시장가'로 주문을 보냈는데 이번에는 실제처럼 '현재가'로 셋팅하고 주문가격 정정도 작동되게 테스트 해보자.


60종목이 에러없이 0.2초 간격으로 매수주문이 잘 나갔고 1분뒤 매수정정 주문도 정상적으로 잘 나갔다.


모든 종목이 동일비중금액에 맞게 추가 매수가 되어 있는 것을 확인할 수 있다.


여기까지 테스트를 통해 주문과 주문 사이 0.2초 딜레이로 셋팅해도 되는 것을 확인했다. 60종목 매수 주문 나가는데는 60종목*0.2초=12초가 걸린다는 계산이 나온다. 이렇다면 매매주기를 현재 최소 1분으로 설정되어 있는 것을 30초 정도로 셋팅해도 된다는 말인데... 테스트 해보니 계산대로 동작이 잘 되는 것이 확인된다. 30초마다 매수정정 주문을 보낼 수 있으니 기존보다 더 빠른 미체결종목 체결이 되는 좋은 효과가 있다.

반면에 아래와 같은 오작동은 가끔씩 발생한다.


동일비중금액 664,654원 만큼만 추가매수를 하는 동작인데 717,484원이 매수된 경우인데, 추가매수 주문이 동일 종목에 대해 2번 나간 경우이다. 이런 경우는 미세한 타이밍의 오차로 발생하는데 계좌평가현황조회의 계좌현황은 30초마다 리프레쉬가 되는 반면 체결은 실시간으로 되기 때문에 체결된 금액이 계좌현황에 반영이 안되어 있는 상태에서 주문이 또 나가게 되는 것이다. 

안그래도 이 문제는 해결해야 되는 부분이고, 게다가 여러계좌에 대한 매수주문을 하게 되면 이 문제는 더 복잡해지게 되기 때문에 더더욱 해결해야 하는 부분이다.

현재는 매수나간 주문에 대해서 따로 관리하지 않고 있는데 향후는 매수나간 종목을 테이블로 관리해야겠다. 아울러 매수/매도 주문 현황 화면을 하나 만들어서 주문이 몇종목 몇수량이 나갔는지 현재 진척도 같은 것도 만들면 사용자가 더 보기 편할 거 같다.

근데... 언제 다 만드냐...


* 본 방구석지니 프로그램은 자동매매 및 퀀트 투자를 위한 자동 리밸런싱 기능이 있는 무료 프로그램입니다. 단, 크몽에서 전자책 구매시 무료로 제공해 드리고 있습니다. 관심 있는 분은 아래 링크 참고해 주세요.


댓글 없음:

댓글 쓰기

가장 많이 본 글