본 포스팅에서는 파이썬 주식 분봉 데이터 다운로드 코드를 작성해보겠습니다. 이전 글들과 마찬가지로 크레온 API를 사용하였으며, 크레온 API가 처음이시라면 아래 글을 먼저 읽으셔야 이해 및 실행이 가능합니다.
코드 실행의 쾌감을 얻고 싶으시다면 파이썬 크레온 API 기본 설정 글을 반드시 읽으시기 바랍니다. 그리고 글을 쉽게 이해하기 위해서는 크레온 API 기본 구조 글을 읽으시기 바랍니다. 또한 증권사 API를 이용하기 위해서는 64비트 파이썬이 아닌 32비트 파이썬을 사용하셔야 합니다.
[주식/주식 프로그래밍] - 파이썬 크레온 API 기본 설정
[주식/주식 프로그래밍] - 파이썬 크레온 API 기본 구조
[주식/주식 프로그래밍] - 파이썬 주식 전 구간 일봉 데이터 받아오기 (크레온 API)
파이썬 주식 분봉 데이터 다운로드
크레온 API 단계
1. win32com.client
2. SetInputValue
3. BlockRequest
4. GetHeaderValue
5. GetDataValue
사용한 코드
저번 글에서 사용한 삼성전자 일봉 데이터 조회하기 코드를 약간 수정하여 분봉 데이터 코드를 작성했습니다.
1. win32com.client~SetInputValue로 원하는 데이터 설정하기
이전 글과 마찬가지 먼저 win32com.client 모듈과 데이터프레임을 사용하기 위해 판다스 모듈도 import합니다. 그리고 크레온 플러스가 정상적으로 연결되었는지도 확인해줍니다. 여기까지는 크레온 플러스를 사용할 때 기본적으로 넣어주신다고 생각하시면 됩니다.
다음으로 win32com.client의 Dispatch 메소드를 이용하여 원하는 클래스를 가져와, 인스턴스를 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import win32com.client
import pandas as pd
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
# 차트 객체 구하기
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
stockcode = 'A005930'
objStockChart.SetInputValue(0, stockcode) #종목 코드 - 삼성전자
objStockChart.SetInputValue(1, ord('1')) # 기간으로 조회
objStockChart.SetInputValue(3, 20100102) # 2010년부터 시작
objStockChart.SetInputValue(5, [0,1,2,3,4,5, 8,9]) #날짜,시간,시가,고가,저가,종가,거래량, 거래대금
objStockChart.SetInputValue(6, ord('m')) # '차트 주가 - 분봉 차트 요청
objStockChart.SetInputValue(7, 1) # 차트 주기 - 1분봉
objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용
|
cs |
일봉, 분봉 모두 CpSysDib.StockChart 클래스를 통해 받아올 수 있습니다. 마찬가지로 Dispatch 메소드와 CpSysDib.StockChart 클래스를 이용하여 objStockChart라는 객체를 사용하겠습니다. 이제 SetInputValue 안에 구체적인 정보를 입력해줄 차례입니다. 크레온 플러스 도움말에서 CpSysDib.StockChart를 검색하여 SetInputValue 부분을 확인해줍니다. (클릭 시 이동)
종목코드는 마찬가지로 삼성전자를 조회하겠습니다. 그리고, 이번 글에서는 개수가 아닌 기간으로 조회해보겠습니다. 그러기 위해서 1번 자리에 ord('1')을 입력해줍니다. 그리고 2010년부터 데이터를 조회해보겠습니다. 2번자리에는 요청 종료일을 넣어야하는데요, 만약 요청종료일을 넣지 않으면 가장 최근 데이터부터 제공합니다.
다음으로 날짜, 시간, 시가, 고가 ,저가, 종가, 거래량, 거래대금을 요청하기 위해 5번 자리에 해당하는 리스트를 입력해줍니다. 분봉이므로 6번자리에는 ord('m')을, 1분봉을 조회하기 위해 7번 자리에는 1을 입력해줍니다.
정리하면 삼성전자 종목의, 2010년부터 오늘까지, 날짜, 시간, 가격 데이터를, 1분봉 주기로, 수정주가로 받아오는 것입니다.
이제 SetInputValue에 구체적인 정보를 입력해줬으니 서버에 데이터를 요청할 차례입니다.
2. BlockRequest~GetDataValue로 데이터 요청 및 받아오기
이제 BlockRequest 메소드를 실행하여 서버에 데이터를 요청하고, GetHeaderValue와 GetDataValue를 통해 서버에서 우리에게 주는 데이터를 데이터프레임으로 가공해보겠습니다. 데이터프레임을 만들어 csv 파일로 저장할 것이기 때문에, 데이터를 담기 위한 빈 리스트들을 생성해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
day_list = []
time_list = []
open_list = []
high_list = []
low_list = []
close_list = []
vol_list = []
amount_list = []
while True :
objStockChart.BlockRequest()
cnt = objStockChart.GetHeaderValue(3) # 3은 요청 개수
print(cnt) # 한번에 일부의 데이터만 받아올 수 있다! => 한번 더해주고, 받아올 데이터가 있으면 또 BlockRequest해줌
for i in range(cnt) : #
day_list.append(objStockChart.GetDataValue(0, i))
time_list.append(objStockChart.GetDataValue(1, i))
open_list.append(objStockChart.GetDataValue(2, i))
high_list.append(objStockChart.GetDataValue(3, i))
low_list.append(objStockChart.GetDataValue(4, i))
close_list.append(objStockChart.GetDataValue(5, i))
vol_list.append(objStockChart.GetDataValue(6, i))
amount_list.append(objStockChart.GetDataValue(7, i))
if objStockChart.Continue == False : # 더 요청할 데이터가 없으면 break, 있으면 계속 요청!
break
|
cs |
다음으로 BlockRequest 메소드를 실행하여 서버에 데이터를 요청해줍니다. BlockRequest 메소드를 실행하면 서버에서는 우리가 요청한 모든 데이터를 주지 않고, 조금씩 나눠주게 됩니다. 따라서 전 구간의 데이터를 요청하기 위해서 여러 번 서버에 요청을 해야 합니다.
우선 한번 요청하신 다음, Continue 함수를 이용하면 남은 데이터가 있는지 알 수 있습니다. 만약 Continue 함수의 결과가 False가 되면 남은 데이터가 없이 모든 데이터를 서버에서 우리에게 전달해준 것이므로 while문을 탈출합니다.
또한 데이터를 1분 1분마다 처리하기 위해 for문을 사용할 것입니다. GetHeaderValue(3)은 요청 개수를 의미하는데요, 요청개수란 한번에 서버에 요청한 분봉의 개수를 의미합니다. 매분마다의 데이터를 처리하기 위해서 GetHeaderValue(3)만큼 for문을 실행해주시면 됩니다.
또한 GetDataValue는 (type,index)의 형태를 가지는데요, type은 우리가 요청한 데이터의 종류를 0부터 오름차순으르로 나타냅니다. 예를 들어 순서대로 0은 날짜, 1은 시간, 2는 시가가 되는것입니다.
index는 매분마다의 데이터를 최신순부터 나타냅니다. 즉 가장 최신 데이터인 가장 최근 개장일의 장 종료직전 마지막 1분데이터의 index는 0이 되는 것입니다. 반복문을 실행하게 되면 day_list에는 오늘부터 과거까지 내림차순으로 날짜가 들어가고, time_list에는 가장 최근 시간인 1530부터 1519, 1518식으로 저장이 됩니다.
결국 반복문을 실행하게 되면 전체 구간의 날짜, 시간, 시고저종가, 거래량, 거래대금이 최신순부터 들어가있는 리스트를 얻게 되는 것입니다.
3. 만들어진 리스트와 딕셔너리로 데이터프레임 생성 및 csv 저장
이제 전체 날짜의 데이터가 들어간 리스트 여러개와, 빈 딕셔너리를 이용해 데이터프레임을 만들고 csv로 저장해주면 끝입니다.
1
2
3
4
5
6
|
dict1 = {'day' : day_list, 'time' : time_list, 'open' :open_list, 'high' : high_list, 'low' : low_list, 'close' :close_list,
'vol' : vol_list, 'amount' : amount_list}
df = pd.DataFrame(dict1,
columns=['day', 'time', 'open', 'high', 'low', 'close','vol', 'amount']) # 2. 데이터프레임으로 만들기
df = df.sort_index(ascending=False)
|
cs |
일반적으로 데이터프레임을 만드는 방식은 다음과 같습니다.
1. 각 리스트들을 이용하여 딕셔너리를 생성합니다. 이때 각 리스트들의 길이는 같아야 합니다.
2. pandas의 DataFrame함수를 이용하여 데이터프레임을 생성합니다. 인자는 (우리가 만든 딕셔너리, columns=['열1','열2',...]) 형식으로 넣어줍니다.
3. 마지막으로 정렬해줍니다. 우리가 만든 데이터프레임은 첫번째 행이 최신 데이터인 내림차순 데이터입니다. 하지만 첫번째 행은 제일 예전 데이터부터 들어가는 것이 활용하기 편합니다. 그래서 오름차순 정렬을 해줍니다. False라 내림차순 정렬처럼 보일 수 있으나 데이터프레임의 index와 날짜가 반대로 돼있어 날짜 기준으로는 오름차순으로 정렬이 됩니다.
df를 만드신 후, df를 print해보시면 이해가 쉬우실 겁니다.
그리고 종목코드를 이름으로 하는 csv를 저장해줍니다. 저장 위치는 파이썬 코드가 저장된 파일과 같습니다. 구체적인 경로를 지정해주어도 좋습니다.
그런데 실행해보시면 2010년 데이터부터 없고 2021년 데이터부터 있는데요, 이것은 크레온 플러스에서 분봉 데이터는 전 구간을 제공하지 않기 때문입니다. 5분봉은 약 5년치의 데이터를 제공하며, 5분 미만의 봉은 약 2년치의 데이터를 제공합니다.
따라서 데이터베이스를 일찍 생성하여 데이터를 일찍 수집할 수록 더 많은 데이터를 얻을 수 있는 것입니다. 물론 유료로 사는 방법도 있겠지만 말입니다.
긴 글 읽어주셔서 감사합니다. 파이썬을 이용하여 삼성전자 분봉을 수집하여 봤는데요, 여기까지 이해가 되셨으면 기본적으로 크레온 플러스로 데이터 수집을 하는데는 어려움이 없을 것입니다. 오늘도 좋은하루 보내시기 바랍니다.
함께 읽으면 좋은 글
[주식/주식 프로그래밍] - 파이썬 크레온 API 기본 설정
파이썬 크레온 API 기본 설정
이번 글에서는 시스템 트레이딩 API 중 하나인 크레온 API를 사용하기 위해 기본적으로 설정해야 할 사항들에 대해서 작성해 보겠습니다. HTS에서 시스템 트레이딩 신청을 해주셔야 하고, 크레온
allthingsaboutour.com
[주식/주식 프로그래밍] - 파이썬 크레온 API 기본 구조
파이썬 크레온 API 기본 구조
이번 글에서는 주식 시스템트레이딩에서 가장 많이 쓰이는 크레온 플러스 API의 기본 구조에 대해 작성해 보겠습니다. 저는 파이썬으로 주식 시스템트레이딩을 하고 있어 파이썬을 기준으로 작
allthingsaboutour.com
파이썬 주식 전 구간 일봉 데이터 받아오기 (크레온 API)
파이썬 주식 전 구간 일봉 데이터 받아오기 (크레온 API)
본 포스팅에서는 파이썬 주식 전 구간 일봉 데이터 받아오기 코드를 작성해보겠습니다. 이전 글들과 마찬가지로 크레온 API를 사용하였으며, 크레온 API가 처음이시라면 아래 글을 먼저 읽으셔야
allthingsaboutour.com
댓글