맨땅에 헤딩하는 사람

퀀트 주가 분석 및 자동매매 시스템 환경 구축 | python 본문

퀀트/구현

퀀트 주가 분석 및 자동매매 시스템 환경 구축 | python

purplechip 2020. 7. 16. 13:25

이번 년도 초기에 퀀트 투자를 위해 DB, 백테스트를 조잡하게 구현했는데 sqlite와 키움 open api를 사용하는데 있어 애로사항이 여러가지가 있었다. (병렬성 문제 등) 그래서 이전 것은 갈아엎고 시스템 환경을 발전시키고자 사용할 툴을 정의하고 설치하였다. 이 포스팅은 그 과정이 담겨있다.

 

요구사항

중장기 전략 수립 데이터 → 일봉데이터, 기업데이터

빠른 DB 업데이트 및 분석 속도 → 병렬처리
전략에 따른 분석 → 백테스트 도구 (예후 분석, 가상매매)

 

위 요구사항을 고려하여 결정한 도구와 방법은 다음과 같다.

 

DB | DBMS

고려한 DB는 다음과 같다.

  • SQLite

  • MySQL

  • MariaDB (선택)

  • Oracle

sqlite의 경우 병렬처리가 불가능하다. 그리고 MySQL, Oracle의 경우 Oracle社의 DB로 무료버전이 제공되지만 그만큼 기능이 제한된다. MariaDB는 MySQL에서 파생된 오픈소스 DB로 기능에 제한이 없다. 그래서 MariaDB로 결정하였다. MariaDB 사이트에서 설치파일을 다운로드 할 수 있으며 MariaDB의 설치방법은 아래 링크에서 확인할 수 있다.

MariaDB 설치 방법 : https://pyonji.tistory.com/11

Kiwoom OpenAPI+는 32bit만 지원하기 때문에 DB 역시 연동의 편의성을 위해 32bit를 설치하였다. (현재 모든 국내 증권사 API는 32bit만을 지원한다.)

 

데이터

고려한 일봉 데이터는 다음과 같다.

  • Kiwoom OpenAPI+ (선택)

  • 대신증권 API
  • Google Finance

  • Yahoo Finance

  • Naver Finance

Google, Yahoo의 경우 쉽고 빠르게 데이터를 얻을 수 있지만 소실된 데이터가 간혹 있으며 소형주의 정보는 표기되지 않을 수 있다. Naver의 경우 수정주가 반영이 되어있지 않다. (증자 혹은 액면분할 등이 발생할 경우 주가가 끊어진 것처럼 보임)  대신 API와 키움 API는 큰 차이가 없지만 키움의 경우 비동기식, 대신의 경우 동기식이어서 비동기식으로 구현해야 좀 더 성능이 좋을 것이라 판단했고 무엇보다 키움증권 계좌가 있다는 이유가 크다(...) Kiwoom OpenAPI+의 경우 TR 데이터 요청시간에 제한이 있어 속도는 느리지만 신뢰도 높은 데이터를 얻을 수 있다. 아래 링크를 통해 설치 방법 및 간단한 api 구현이 가능하다.  

Kiwoom OpenAPI+ 설치 사이트 : https://www2.kiwoom.com/nkw.templateFrameSet.do?m=m1408000000

Kiwoom OpenAPI+ 설치 및 파이썬 구현 방법 : https://wikidocs.net/2872

 

키움증권의 경우 TR 데이터 조회 제한 시간은 다음과 같다.

1초에 5회이상 → 70초에 100회이상 → 600초에 700회이상 → 1000회 이상

이는 멀티프로세싱을 사용하여 성능을 높일 예정이다.

 

그리고 데이터 중 기업 데이터가 남았는데 기업데이터의 경우 시가총액, 업종, 재무 등 다양한 데이터가 존재한다. 고려한 기업 데이터 소스는 다음과 같다.

  • Kiwoom OpenAPI+

  • 웹크롤링 - FnGuide + WICS 업종 (선택)

웹크롤링이 동적 웹크롤링이 필요가 없고, 빠르게 반영해줄 필요가 없기에 키움보다 빠르고 효율적이라 선택하였다. 아래 링크에서 기업의 웬만한 정보는 다 얻을 수 있다.

기업 정보 사이트 (CompanyGuide) : http://comp.fnguide.com/SVO2/ASP/SVD_main.asp?pGB=1&gicode=A005930&cID=&MenuYn=Y&ReportGB=&NewMenuID=11&stkGb=&strResearchYN= 

WICS 업종 사이트 (WiseIndex) : http://www.wiseindex.com/Index/Index#/WMI500 

 

DB 인터페이스 모듈

파이썬과 DB를 연결해주는 인터페이스 모듈이 필요하다. 옵션은 다음과 같다.

  • mysqlclient (선택)

  • pymysql 

  • mysql-connector-python

mysqlclient를 선택하는데 그 이유는 별 거 없다. 가장 흔하게 사용되는 pymysql과 mysqlclient 중 mysqlclient가 성능이 더 좋기 때문이다. (담당자가 같으며 담당자도 호환성 등의 이유를 제외하면 mysqlclient 쓰라고 한다. C언어로 개발되었기 때문) mysql-connector-python은 Oracle 社에서 제작한 것으로 퍼포먼스도 별로고 라이센스도 있어서 사용하기가 좀 껄끄러울 것 같다.

 

백테스트 모듈

주가 예후 분석 시 반드시 필요하다. 옵션은 다음과 같다.

  • backtrader

  • Zipline

  • 직접 구현 (선택)

backtrader, Zipline은 하나의 주식에 대해 기술적 분석을 적용한 백테스트를 진행한다. 나한테 필요한 것은 특정 시그널 시 주가들의 예후 확인, 그리고 가상 매매 진행 시 시그널에 해당하는 여러 주식을 매수 매도 했을 때의 수익률인데 두 모듈 다 그것을 충족시키진 못하는 것 같다. 

 

마치며

대략적인 환경 구축에 사용할 옵션들을 정했다. 알아보고 근거를 찾아보는 것이 굉장히 고된 작업이었지만 제일 어렵고 귀찮은 게 환경 구축이란 말도 있듯이 긍정적으로 생각하고 개발에 임해야겠다.

 

참고

DB 인터페이스 모듈 참고

https://velog.io/@city7310/%EB%B0%B1%EC%97%94%EB%93%9C%EA%B0%80-%EC%9D%B4%EC%A0%95%EB%8F%84%EB%8A%94-%ED%95%B4%EC%A4%98%EC%95%BC-%ED%95%A8-12.-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%A0%88%EB%B2%A8-%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95-1

증권사 API 비교

http://blog.quantylab.com/htsapi.html

백테스트 모듈 

https://wendys.tistory.com/181

https://wikidocs.net/2874

키움 Open API+ TR 조회 횟수 제한

toptrader.tistory.com/3

Comments