GIL's LAB

오픈 API를 이용한 주식 데이터 수집하기 (3) 분틱 코스피/코스닥 데이터 수집 방법 본문

퀀트 투자/데이터 수집

오픈 API를 이용한 주식 데이터 수집하기 (3) 분틱 코스피/코스닥 데이터 수집 방법

GIL~ 2021. 9. 17. 12:30

이번 포스팅에서는 이전 포스팅에서 소개한 Cybos Plus를 가지고 분틱 코스피/코스닥 데이터를 수집하는 방법을 소개한다. 이 방법을 바탕으로 수집한 데이터는 다양한 퀀트 실험에 활용할 예정이다 (일별 데이터 수집 내용과 거의 중복되지만, 이전 포스팅을 보고 이해하고 이 포스팅을 보긴 힘들 것 같아서 복붙을 했다).

 

가장 먼저, Cybos Plus를 실행해서 로그인한다. 

그리고나서 주피터를 32bit 환경에서 관리자권한으로 실행한다. 

즉, 아나콘다 프롬프트를 관리자권한으로 실행한 뒤, 아래 명령어를 순차적으로 입력하여 주피터를 실행한다.

 

set CONDA_FORCE_32BIT=1

conda activate py36_32

jupyter notebook

 

당연하지만, 이전 포스팅에서 py36_32 환경을 구축하고 그 환경에 주피터 노트북을 설치해야만 위 명령어가 정상적으로 작동한다. 이제 본격적으로 Cybos Plus를 사용해보자.

 

가장 먼저, 아래 코드를 실행하여 정상적으로 CyBos에 연결되었는지 확인한다.

출력 결과가 1이 나오면 정상적으로 연결된 것이다. 0이 나오거나 오류가 나오면 이전 포스팅을 참고하기 바란다.

# 연결 확인
import win32com.client
instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
print(instCpCybos.IsConnect)

 

그 다음으로 코스피와 코스닥 종목의 코드를 가져올 것이다. 이 코드는 추후 데이터를 가져오는데 입력으로 사용될 것이다. 코드 내 주요 라인을 설명하면 다음과 같다.

  • 라인 1: 이 코드는 win32com.client의 Dispatch 함수를 사용하여 CpUtil.CpCodeMgr이라는 COM 객체를 codemgr라는 변수에 저장한다. 어렵게 생각할 것 없이 누군가 잘 만들어놓은 클래스에서 인스턴스를 만들었다고 생각하면 편하다. 
  • 라인 2 ~ 3: GetStockListByMarket 함수를 사용하여 코드 목록을 가져온다. 1을 입력하면 코스피의 종목이, 2를 입력하면 코스닥의 종목이 반환된다.
# 종목 코드 가져오기
1 codemgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")

2 kospi_code = codemgr.GetStockListByMarket(1) # 1: 코스피
3 kosdaq_code = codemgr.GetStockListByMarket(2) # 2: 코스닥

4 print(kospi_code[:5])
5 print(kosdaq_code[:5])

# 리스트로 형변환
6 kospi_code = list(kospi_code)
7 kosdaq_code = list(kosdaq_code)

이제 종목 코드를 종목명으로 나타낼 것이다. 사실 필수적인 작업은 아니지만, 데이터 이름을 종목명으로 저장하는 것이 더 적절할 것 같아 이 단계를 수행한다. 코드를 종목명으로 바꾸는 것은 앞서 생성한 인스턴스의 CodeToName이라는 함수를 사용하면 손쉽게 바꿀 수 있다. 

# CpStockCode를 사용하여 종목 코드를 종목명으로 나타내기
kospi_name = [codemgr.CodeToName(code) for code in kospi_code]
kosdaq_name = [codemgr.CodeToName(code) for code in kosdaq_code]

print(kospi_name[:5])
print(kosdaq_name[:5])

이제 본격적으로 데이터를 요청하여 가져오는 작업을 수행해보자. 설명을 위해, 핵심적인 코드 구조만 먼저 설명한다. 가장 먼저 CpSysDib.StockChart 객체를 아래와 같이 생성한다.

instance = win32com.client.Dispatch("CpSysDib.StockChart")

그 후에 SetInputValue를 이용하여 가져올 데이터에 대한 정보를 전달한다.

이 함수는 종목코드, 기간 등을 입력받는다. 

분/틱 데이터도 정상적으로 수집이 되는 것을 확인했다. 

여기서 3번째 위치에 시작점만 입력하면 현시점까지의 데이터가 자동으로 수집되며 (예제에선 2019년 10월 5일부터 현시점까지 수집하였다), 6번째 위치에 m을 입력하면 분 단위, T를 입력하면 틱 단위로 데이터가 수집된다.

 

instance.SetInputValue(0, code)  # 종목코드
instance.SetInputValue(1, ord('1')) # 분명 cybos에 분/틱 데이터는 기간으로 요청이 안 된다 하였는데 잘 됨.
instance.SetInputValue(3, 20191005)
instance.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8])  # 날짜, 시가, 고가, 저가, 종가, 거래량
instance.SetInputValue(6, ord('m'))  # 차트 주기 - 분 차트
instance.SetInputValue(9, ord('1'))  # 수정주가 사용

이제 이 내용을 종합해서 이전 포스팅과 유사하게 데이터를 수집한다.

이전 포스팅과 코드에서 크게 달라지는 부분은 사실 없다.

그런데 요청하는 데이터가 분/틱 데이터라 크기때문에, 락걸리는걸 방지하기 위해 적절히 코드를 재워줘야 한다. 

15초간 60건이상 락이 걸리기에, 호출한번당 0.28초를 재우면 문제없이 수집이 되는 것을 확인했다.

이 내용들을 종합하여 분/틱 데이터를 수집하였으며, 데이터 수집에 활용한 전체 코드는 아래와 같다.

 

분_틱 데이터 수집.ipynb
0.09MB

 


데이터 분석 서비스가 필요한 분은 아래 링크로! 

https://kmong.com/gig/374194 

 

데이터사이언스 박사의 데이터 분석 서비스 드립니다. | 150000원부터 시작 가능한 총 평점 5점의 I

78개 총 작업 개수 완료한 총 평점 5점인 데이터사이언스박사의 IT·프로그래밍, 데이터 분석·시각화 서비스를 68개의 리뷰와 함께 확인해 보세요. IT·프로그래밍, 데이터 분석·시각화 제공 등 150

kmong.com

 

Comments