주식 자동화 프로그램 만들기 프로젝트

대신증권 크레온에서 분단위 데이터를 가져오기 위해서 CpSysDib.StockChart 를 사용했다.
이전 포스트에서 사용했던 DsCbo1.StockWeek 이것과는 인풋과 아웃풋이 다르다.
분, 일, 주, 월 단위 데이터를 가져올 수 있고 내용도 많은 것으로 보인다.

full code

https://github.com/Park-Ju-hyeong/Quant/tree/master/ipynb

import

import time
import win32com.client
import pandas as pd

일단위 데이터와 분단위 데이터를 선택해서 가져올 수 있는 함수입니다.

분단위데이터는 2년치정도 제공하는 것으로 보입니다.

분단위 데이터를 모두 가져오는 데 25 초정도 걸리고

일단위 데이터는 1초 안으로 가져옵니다.

한 요청당 최대 2856개를 가져올 수 있고

15초당 60건을 요청할 수 있습니다.

2856 * 60 = 171360

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 setMethod(self, code, char, from_yyyymmdd=None, to_yyyymmdd=None, count=None):
        """
        count는 보통 상식의 데이터 개수가 아니다.
        여기서는 한번 요청 시 가져와지는 데이터의 개수이다.
        한번 요청 시 최대 2856개 가능하다.
        
        원하는 데이터 개수가 있으면 to_yyyymmdd 로 가져온 다음에 잘라서 사용한다.
        하루에 분단위 데이터가 381개이다. (* 마지막 10분은 동시호가)
        
        """
        # object 구하기
        self.objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
        self.objStockChart.SetInputValue(0, code)  # 종목코드
        
        if to_yyyymmdd:
            self.objStockChart.SetInputValue(1, ord('1'))  # 요청 구분 '1': 기간, '2': 개수
            self.objStockChart.SetInputValue(2, from_yyyymmdd)  # To 날짜
            self.objStockChart.SetInputValue(3, to_yyyymmdd)  # From 날짜
        elif count:
            self.objStockChart.SetInputValue(1, ord('2'))  # 개수로 받기
            self.objStockChart.SetInputValue(4, count)  # 조회 개수
        else: raise print("기간을 입력해주세요.")
            
        self.objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8])  # 요청항목 - 날짜, 시간,시가,고가,저가,종가,거래량
        self.objStockChart.SetInputValue(6, ord(char))  # '차트 주기 - 분/틱
        self.objStockChart.SetInputValue(7, 1)  # 분틱차트 주기
        
        self.objStockChart.SetInputValue(9, ord('1'))  # 수정주가 사용
        
        
        
        self.data = {
            "date": [],
            "time": [],
            "open": [],
            "high": [],
            "low": [],
            "close": [],
            "vol": [],
        }
        
    def checkRequest(self):
        
        self.objStockChart.BlockRequest()
        
        rqStatus = self.objStockChart.GetDibStatus()
        
        if rqStatus != 0: 
            
            return False
        
#         else:
#             print("통신상태 양호, 누적 개수 {}".format(len(self.data["date"])))
        
        self.count = self.objStockChart.GetHeaderValue(3)
        
        if self.count <= 1: 
            
            return False
        
        return int(self.count)
    
    def checkRemainTime(self):
        
        # 연속 요청 가능 여부 체크
        remainTime = self.objCpCybos.LimitRequestRemainTime / 1000.
        remainCount = self.objCpCybos.GetLimitRemainCount(1)  # 시세 제한
        
        if remainCount <= 0:
            print("15초당 60건으로 제한합니다.")
            time.sleep(remainTime)
            
    
    def getStockPriceMin(self):
        
        while 1:
        
            self.checkRemainTime()
            rows = self.checkRequest()

            if rows:

                for i in range(rows):

                    self.data["date"].append(self.objStockChart.GetDataValue(0, i))
                    self.data["time"].append(self.objStockChart.GetDataValue(1, i))
                    self.data["open"].append(self.objStockChart.GetDataValue(2, i))
                    self.data["high"].append(self.objStockChart.GetDataValue(3, i))
                    self.data["low"].append(self.objStockChart.GetDataValue(4, i))
                    self.data["close"].append(self.objStockChart.GetDataValue(5, i))
                    self.data["vol"].append(self.objStockChart.GetDataValue(6, i))
            else:

                break
                
    
        return self.data

run

creon = CREON()
creon.setMethod(code="A005930", char="m", from_yyyymmdd=20200101, to_yyyymmdd=10000101)
%%time
samsung = creon.getStockPriceMin()
15초당 60건으로 제한합니다.
Wall time: 24.1 s
tmp = pd.DataFrame(samsung)
tmp.tail()
date time open high low close vol
189232 20170213 905 37800 37880 37800 37860 48100
189233 20170213 904 37880 37900 37780 37780 80500
189234 20170213 903 37880 37900 37840 37880 61400
189235 20170213 902 37920 37980 37820 37860 98000
189236 20170213 901 37740 37940 37720 37940 453900
creon.setMethod(code="A005930", char="D", from_yyyymmdd=20200101, to_yyyymmdd=10000101)
%%time
samsung = creon.getStockPriceMin()
Wall time: 607 ms
tmp = pd.DataFrame(samsung)
tmp.tail()
date time open high low close vol
10541 19800109 0 38 41 37 41 1243500
10542 19800108 0 37 37 36 37 1344000
10543 19800107 0 35 35 35 35 604000
10544 19800105 0 32 34 32 34 393500
10545 19800104 0 34 34 33 33 131500