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

대신증권 크레온에서 일별 주가를 가져오기 위해서 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