PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 알고리즘 구축하기 (1) - 조건검색식 사용하기 ①

  • -

이제 차트 데이터를 요청하고 그 데이터를 수신받아 사용할 수 있는 수준의 기능까지 구현한 시점에서, 자동 매매 시스템이 동작하도록 하기 위해서는 우리가 설정한 조건에 알맞은 종목의 데이터를 얻어다가 매수 가격과 매도 가격을 구현하고, 해당 가격을 기준으로 거래를 진행하도록 해야 한다. 이러한 일련의 절차를 알고리즘(Algorithm)이라고 할 수 있는데, 알고리즘의 정확한 사전적 의미는 아래와 같다.

 

알고리즘,
(정보·통신) 어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다.

 

사전적 의미만 봐도 알겠지만, "입력된 자료를 토대로 하여 원하는 출력을 유도해 내는 규칙의 집합"이 알고리즘이다. 물론 파이썬 언어를 통해 알고리즘을 구현할 수 있는 여러 라이브러리들이 있지만, 여기서 우리는 단순하게 코드만으로 알고리즘을 구현할 수 있기 때문에 몇 가지를 제외한 별도의 라이브러리는 사용하지 않을 예정이다.(최대한 쉽게, 복잡하지 않게.. 라이브러리는 물론 편하지만, 사용 방법을 공부해야 하는 번거로움이 있다.) 

또한 게시글을 작성하기 전에 앞서, 여기서 본인의 알고리즘을 공개할 생각은 없다. 얼마 전에 워렌 버핏도 한 어린 소녀와의 인터뷰 중 이런 이야기를 한 적이 있다. 

소녀 : "종목을 찍어달라."
버핏 : "특정 종목보다 더 나은 걸 말해주겠다. 당신이 할 수 있는 최선의 행동은 무언가를 특출나게 잘하는 것이다. 만약 최고가 된다면 사람들은 당신에게 막대한 돈을 지불하거나 그들이 생산하는 무언가를 당신의 일과 교환하려고 할 것이다. 당신의 능력은 누가 빼앗을 수도 없고, 사라지지도 않는다. 최고의 투자법은 자신 스스로를 성장시키는 것이며, 이건 세금도 붙지 않는다."

하물며 선진국이라 불리는 여러 국가들이 아프리카에 엄청나게 많은 양의 원조를 제공했음에도 불구하고 아프리카는 기근과 가난에서 벗어날 수 없는 이유는 바로 물고기를 잡는 법이 아닌 물고기를 줬기 때문이다. 사실, 따지고 보면 여러 선진국은 아프리카를 기근과 가난으로부터 구원하는 것이 목적이 아닌 아프리카에 매장되어 있는 수많은 천연자원이 타겟이었기 때문에 아프리카는 평생 가난한 상태로만 이어지는 게 맞기는 하다. 무언가로부터 벗어나기 위해서는 스스로의 변화가 필요할 뿐, 주변의 손길은 도움이 되지 않는다. 이는 본인 스스로가 깊은 나락에 빠져있을수록 주변의 손길은 더욱 더 도움되지 않는다. 오로지 스스로만이 해낼 수 있는 일이다.

본인 역시 위의 워렌 버핏의 이야기에 충분히 공감하며, 본인 역시 주식을 배울 때 본인에게 도움의 손길을 내어 준 여러 은인들이 있었지만 들을 당시에는 전혀 몰랐다. 많은 시간이 흘러 지나고 나서, 어느 순간 돌이켜보니 그 말이 이 말이었구나 하는 생각이 드는 정도로 그칠 뿐이다.

 

 


728x90

 

 

하나씩, 차근차근 생각하고 구현해보자.

일단 우리가 자동 매매 시스템을 동작시키기 위해서는 가장 먼저 우리가 거래하고자 하는 종목의 조건을 설정해줘야 한다. 예를 들어, 대형주라면 대형주, 중형주라면 중형주, 테마주라면 테마주 등등을 어떤 기준에 의해 선별해내야 한다는 것이다. 하지만 코스피와 코스닥, 즉 한국증권거래소 내에서 공식적으로 거래할 수 있도록 상장되어 있는 전체 종목의 개수는 2,421개다.(2022년 7월 19일 기준)

그렇다면 우리는 2,421개 종목에 대해 하나하나 조건을 적용해보고 그 결과로 얻어진 종목코드 리스트를 대상으로 하여 차트 데이터를 조회하고, 해당 차트 데이터를 알고리즘 파일에 전달하여 매수가와 매도가를 계산해야 한다. 하지만 실질적으로는 데이터의 조건을 판별하기 위해서는 판별하기 위한 기반이 되는 데이터가 필요하다. 다시 말해, 2,421개의 종목에 대해 특별한 조건을 잣대어 조건을 충족시키는지 아닌지 그 여부를 판단하기 위해서는 2,421개의 종목에 대한 그 날 그 날의 데이터를 가지고 있어야 한다는 것이다. 

그래, 백번 양보해서 맨날맨날 데이터를 저장한다고 가정해보자. 우리가 사용하는 컴퓨터의 하드디스크가 4TB라서 일평생 용량 걱정은 하지 않아도 되고, CPU와 RAM이 최고사양 부품이라 데이터를 처리하는 데에 소요되는 시간이 굉장히 짧고, 인터넷은 5GB를 사용해서 서버와의 통신 역시 그 누구보다 빠르게 사용할 수 있다고 가정해보면 2,421개의 종목 데이터를 조회하는 건 별 일이 아닐 것이다. 하지만 우리는 그렇게 사용할 수 없다. 왜냐하면 키움증권 Open API 서버에서는 TR 조회 횟수를 제한하고 있기 때문이다. 이전에 차트 데이터를 조회할 때만 해도 데이터 조회 제한 때문에 요청 TR 사이 사이에 time.sleep()을 넣어 조회 제한에 걸리지 않게 관리했는데, 2,421개 종목에 대한 데이터를 조회할 때에는 조회 제한에 걸리지 않을 수 있을까? 불가능하다. 하물며, 2,421개 종목에 대한 차트 데이터를 매일매일 갱신하는 것은 더 정신나간 짓이고 실현가능한 일이지도 않다. 

 

 

그래서 뭘 어쩌라는 거야..?

그렇기 때문에 우리는 더욱이 영웅문(HTS) 내에서 제공되는 조건검색식을 사용해야 한다. 조건검색식을 통해 당일당일 어느 정도 조건에 해당하는 종목들을 일차적으로 걸러낸 후에 선정된 종목들만을 대상으로 알고리즘을 적용해서 아주 빡센 선별 작업을 거친 후에 매수 가격과 매도 가격을 계산해내야 한다.

따라서 영웅문 내 조건검색식[0151]을 통해 어느 정도의 종목을 걸러낼 수 있는 조건검색식을 생성한 후, 해당 조건검색식이 잡아주는 종목들을 대상으로 알고리즘을 적용해서 조금 더 빡센 선별 작업을 진행하고, 그 결과로 얻은 데이터를 기반으로 거래를 진행하도록 하는 프로그램 구조를 갖춰야 한다. 그럼, 다음 게시글에서부터는 키움증권의 영웅문을 통해 조건검색식을 구현하고 핻아 조건검색식에서 찾아낸 종목들을 얻어다가 어떤 절차를 거쳐 실시간 거래에 필요한 데이터를 가공해낼 수 있는지 살펴보도록 하자.

 

 


728x90
반응형
Contents

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

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