[크레온 CREON API] 일별 데이터 수집
주식 자동화 프로그램 만들기 프로젝트
대신증권 크레온에서 일별 주가를 가져오기 위해서 DsCbo1.StockWeek
를 사용했다.
여기서는 주단위난 분단위 데이터를 가져올 수 없고 일단위만 가능한 것으로 보인다.
full code
https://github.com/Park-Ju-hyeong/Quant/tree/master/ipynb
import
import win32com.client
import pandas as pd
object
class CREON(object):
"""대신증권 크레온 API"""
def __init__(self):
# 연결 여부 체크
self.objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = self.objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
def SetCode(self, code):
"""
ReqeustData 함수를 호출하기 전에 실행해야 합니다.
ReqeustData 호출 후 오늘 날짜부터 다시 수집하고 싶다면
해당 함수를 다시 실행해야합니다.
"""
# 일자별 object 구하기
self.objStockWeek = win32com.client.Dispatch("DsCbo1.StockWeek")
self.objStockWeek.SetInputValue(0, code)
self.data = {
"date": [],
"open": [],
"high": [],
"low": [],
"close": [],
"diff": [],
"vol": [],
}
def ReqeustData(self):
"""데이터 요청"""
self.objStockWeek.BlockRequest()
# 통신 결과 확인
rqStatus = self.objStockWeek.GetDibStatus()
rqRet = self.objStockWeek.GetDibMsg1()
if rqStatus != 0:
return False
else:
print("통신상태 양호, 누적 개수 {}".format(len(self.data["date"])))
# 일자별 정보 데이터 처리
count = self.objStockWeek.GetHeaderValue(1) # 데이터 개수
for i in range(count):
self.data["date"].append(self.objStockWeek.GetDataValue(0, i))
self.data["open"].append(self.objStockWeek.GetDataValue(1, i))
self.data["high"].append(self.objStockWeek.GetDataValue(2, i))
self.data["low"].append(self.objStockWeek.GetDataValue(3, i))
self.data["close"].append(self.objStockWeek.GetDataValue(4, i))
self.data["diff"].append(self.objStockWeek.GetDataValue(5, i))
self.data["vol"].append(self.objStockWeek.GetDataValue(6, i))
return True
def GetStockPriceDay(self, from_yyyymmdd=None, to_yyyymmdd=None, count=None):
"""
count 를 설정하면 from, to 를 입력하지 않아도 됩니다.
그렇지 않으면 to_yyyymmdd 를 무조건 입력해야 합니다.
to_yyyymmdd 와 count 둘다 있으면 count는 무시됩니다.
"""
assert from_yyyymmdd or to_yyyymmdd or count, print("기간을 입력해 주세요.")
if to_yyyymmdd:
to_yyyymmdd = int(to_yyyymmdd)
if from_yyyymmdd:
from_yyyymmdd = int(from_yyyymmdd)
if from_yyyymmdd and to_yyyymmdd:
if to_yyyymmdd > from_yyyymmdd:
t1, t2 = to_yyyymmdd, from_yyyymmdd
to_yyyymmdd = t2
from_yyyymmdd = t1
if count:
count = int(count)
else:
assert to_yyyymmdd, print("마지막 날짜를 입력해 주세요.")
_ = self.ReqeustData()
while self.objStockWeek.Continue:
_ = self.ReqeustData()
if count:
if len(self.data["date"]) >= count:
for k, v in self.data.items():
self.data[k] = self.data[k][:count]
break
else:
lastday = self.data["date"][-1]
if to_yyyymmdd >= lastday:
endday = [i >= to_yyyymmdd for i in self.data["date"]].index(False)
if from_yyyymmdd:
from_yyyymmdd = int(from_yyyymmdd)
if from_yyyymmdd in self.data["date"]:
startday = self.data["date"].index(from_yyyymmdd)
else:
startday = 0
for k, v in self.data.items():
self.data[k] = self.data[k][startday:endday]
break
return self.data
run
creon = CREON()
creon.SetCode("A005930")
samsung = creon.GetStockPriceDay(to_yyyymmdd=20190123)
통신상태 양호, 누적 개수 0
통신상태 양호, 누적 개수 36
pd.DataFrame(samsung)
date | open | high | low | close | diff | vol | |
---|---|---|---|---|---|---|---|
0 | 20190306 | 44000 | 44300 | 43700 | 43850 | -400 | 7996786 |
1 | 20190305 | 44600 | 45100 | 44150 | 44250 | -600 | 10612405 |
2 | 20190304 | 46000 | 46100 | 44800 | 44850 | -250 | 12926539 |
3 | 20190228 | 46400 | 46500 | 45100 | 45100 | -1650 | 23569321 |
4 | 20190227 | 47000 | 47250 | 46750 | 46750 | 0 | 8045211 |
5 | 20190226 | 47350 | 47450 | 46500 | 46750 | -600 | 7985547 |
6 | 20190225 | 47400 | 47550 | 47050 | 47350 | 200 | 7484716 |
7 | 20190222 | 46500 | 47150 | 46450 | 47150 | 200 | 6895772 |
8 | 20190221 | 46500 | 47200 | 46200 | 46950 | 50 | 8694009 |
9 | 20190220 | 46750 | 47100 | 46500 | 46900 | 950 | 11506720 |
10 | 20190219 | 45850 | 46150 | 45450 | 45950 | -250 | 6741395 |
11 | 20190218 | 46500 | 46850 | 45850 | 46200 | 150 | 8183728 |
12 | 20190215 | 46750 | 46850 | 45650 | 46050 | -1450 | 10554643 |
13 | 20190214 | 46600 | 47500 | 46150 | 47500 | 1300 | 17259341 |
14 | 20190213 | 46400 | 46700 | 46000 | 46200 | 150 | 11299738 |
15 | 20190212 | 44650 | 46250 | 44650 | 46050 | 1050 | 13184367 |
16 | 20190211 | 44500 | 45000 | 44250 | 45000 | 200 | 11125044 |
17 | 20190208 | 45700 | 45700 | 44650 | 44800 | -1400 | 12689196 |
18 | 20190207 | 46800 | 47100 | 46200 | 46200 | -150 | 15872001 |
19 | 20190201 | 46650 | 46950 | 46250 | 46350 | 200 | 13832454 |
20 | 20190131 | 46650 | 47050 | 46150 | 46150 | -250 | 21621145 |
21 | 20190130 | 44800 | 46400 | 44800 | 46400 | 900 | 17505980 |
22 | 20190129 | 45050 | 45500 | 44350 | 45500 | 450 | 16215017 |
23 | 20190128 | 45000 | 45500 | 44600 | 45050 | 300 | 17998914 |
24 | 20190125 | 44300 | 44750 | 43750 | 44750 | 1700 | 22789395 |
25 | 20190124 | 43050 | 43100 | 42350 | 43050 | 1050 | 14747623 |
26 | 20190123 | 41350 | 42250 | 41350 | 42000 | -150 | 11071079 |