키움 증권 API를 이용하여 주식 자동 매매 프로그램 개발하기 - 코스닥 종목의 일봉 데이터를 가져오는 방법 [Python]
안녕하세요? 코딩중독입니다.
저번 시간에는 미체결 내역을 조회하는 방법을 알아 보았습니다. 오늘은 코스닥 종목의 일봉 데이터를 어떻게 가져오는지 설명하겠습니다.
일봉 데이터를 가져오는 이유
우리는 이번 포스팅부터 자동으로 포트폴리오를 구성하는 방법을 알아볼 것입니다. 그랜빌의 매수 신호 4법칙을 이용할 것인데, 이를 수행하기 위해서는 다양한 종목에 대한 방대한 일봉 데이터가 있어야 합니다. 그래서 키움증권 api를 활용하여 전체 코스닥 종목을 불러오고, 각각의 종목에 대해 전체 일봉 데이터를 얻어올 것입니다. (그랜빌의 매수 신호 4법칙은 추후 소개하겠습니다.)
코스닥의 전체 종목 가져오기 - 사용될 함수
KOA Studio에서 [개발 가이드] - [기타 함수] - [종목정보관련 함수]에 있는 GetCodeListByMarKet() 함수입니다. 여기서 인자로, "10"을 넘김으로써 코스닥의 전체 종목 코드를 얻어올 수 있습니다.
일봉 데이터 가져오기 - KOA Studio 실습
코스닥의 전체 종목 코드를 얻어오는 방법은 간단합니다. 이제 이들의 모든 일봉 데이터를 불러오는 코드를 설명하기 전에 KOA Studio로 실습해 보겠습니다. 먼저, 로그인을 하시고, TR 목록 검색창에 '주식일봉차트조회요청'이라고 검색합니다.
여기서 싱글 데이터는 종목코드 하나만을 반환하고, 멀티 데이터는 종목의 실제 일봉 데이터를 반환합니다.
필요한 인자는 종목코드, 기준일자, 수정주가구분이 있는데 기준일자를 NULL로 넘길 시, 오늘 날짜부터 일봉 데이터를 조회합니다. 또한, 수정주가 구분은 주로 "1"로 설정하는데, 취향에 따라 다른 값도 넣어보셔도 괜찮습니다.
저는 코스닥 종목 중 씨젠의 종목코드 096530을 넣어보겠습니다.
이렇게 두 번째줄부터는 멀티 데이터가 쭉 나오는 모습을 알 수 있습니다. 그리고 멀티 데이터를 한 번 조회할 때는 최대 600개의 데이터만을 얻어올 수 있습니다. 그래서 추가로 600개의 일봉 데이터를 불러오려면 우측 상단의 [다음] 버튼을 눌러야 합니다.
씨젠의 상장일은 2010년 9월 10일이므로 적어도 10년 이상의 일봉 데이터를 받아올 수 있습니다. 실제로, [다음] 버튼을 5번 누르면 더 이상 누를 수 없도록 비활성화가 됩니다. 이는 캡쳐하기가 어려우므로 직접 해 보시길 바랍니다.
일봉 데이터 가져오기 - 알아두면 좋은 함수
이 함수는 일봉 데이터를 기준으로 한다면, 최대 600일까지의 데이터만 가져오도록 하는 함수입니다. 제 프로그램에서는사용하지 않을 것이지만, 혹시나 사용할 사람들을 위해서 소개는 하고 갑니다.
전체 소스코드
슬슬 코드의 양이 길어지고 있군요. 나중에 날 잡아서 구조를 깔끔하게 리팩토링해 보겠습니다.
__init__()
__init__()에는 종목 분석용 리스트와 화면 번호, 그리고 주석 처리된 종목 분석 함수만 추가되었습니다. 주석을 해 둔 이유는 전체 코스닥의 일봉 데이터를 불러오는 데 상당히 오래 걸리고, 이를 지금 할 필요가 없으므로 간단히 테스트만 해 두시라고 작성하였습니다.
코스닥의 전체 종목 코드 가져오기
상당히 심플합니다. GetCodeListByMarket()의 반환값으로는 문자열인데, "A;B;C;"와 같이 ';'를 구분자로 쭉 나열됩니다. 따라서, split() 함수를 통해서 이를 리스트로 바꿉니다. 그리고 [:-1]을 한 이유는 ';'를 기준으로 split하였을 때 맨 마지막 요소는 빈 문자열이기 때문입니다.
트랜잭션 요청 함수
tr_slot() 함수를 보기 전에 TR을 요청하는 함수를 봅시다. 먼저, calculator() 함수에서는 코스닥의 전체 종목 코드를 받아오고, 아래 반복문에서 사용한 화면 번호를 끊어준 후 일봉 데이터 TR을 요청하는 함수를 호출합니다.
그리고 day_kiwoom_db() 함수가 실제로 TR을 요청하는 역할을 하는데, 필요한 입력값을 설정해 줍니다. 이때, 저는 오늘날짜부터 일봉 데이터를 얻어오고 싶은 것이므로 date는 None으로 설정합니다. 이후, CommRqData() 함수를 이용하여 트랜잭션을 요청하고, 이벤트 루프가 수행되고 있지 않다면 이를 실행합니다.
그런데, 맨 윗줄의 처음보는 함수가 등장합니다. 이것은 별 거 아니고 3.6초동안 기다려주는 함수입니다. 소스코드 상단에 'from PyQt5.QtTest import *'을 추가하여 사용할 수 있고, 과도한 TR 요청으로 인해 과부하를 방지하기 위해서 딜레이를 설정하였습니다.
TR을 요청하면, OnReceiveTrData() 이벤트가 발생하여 tr_slot() 함수를 호출하게 됩니다. 이 안에서 GetCommData() 함수를 이용하여 일봉 데이터를 받아오면 됩니다. 그리고 주석을 처리한 부분은 제가 위에서 설명한 최대 600일까지의 데이터만 받아오는 함수입니다. 이는 출력 결과가 2차원 배열인데, 각 요소에는 맨앞과 맨뒤에 빈 문자열이 붙습니다. 혹시나 이 함수를 사용할 사람을 위해서 calculator_list의 형태도 똑같이 맞춰 주었습니다.
마지막으로 더 조회할 일봉 데이터가 있다면 TR을 연속하여 요청합니다. 그렇지 않다면, 이벤트 루프를 종료합니다.
출력 결과
1472개를 다 할 필요는 없으므로 일부분만 캡쳐하였습니다. 이와 같이 출력 문구가 쭉 나오면 됩니다.
정리
지금까지 코스닥의 전체 종목의 일봉 데이터를 얻어오는 방법에 대해서 알아 보았습니다. 다음 시간에는 그랜빌의 매수 신호 4법칙이 무엇이고, 이것을 이용하여 유망한 종목을 선별해 보겠습니다.
출처
프로그램 동산(장용준)님이 집필하신 '손가락 하나 까딱하지 않는 주식 거래 시스템 구축' 교재를 참고하여 작성하였습니다.
그 외에 프로그램 동산님은 깃허브, 카페, 유튜브를 운영 중이십니다. 굉장히 도움이 되는 내용이 많으니 참고하셔도 좋을 것 같습니다.
(깃허브) github.com/programgarden
(유튜브) www.youtube.com/channel/UCq7fsrxP6oi6vnYgPkw92jg
(네이버 카페) cafe.naver.com/programgarden
댓글