본문 바로가기

Python

python- 파이썬에서 크레온 API 사용 #3. 특정종목 데이터 추출

알고 있는 방법은 2가지 입니다.

  1. 하루씩 추출해서 보는 방법
  2. 분단위로 추출해서 보는 방법 ( 분은 사용자가 지정 가능하게 만들었음.)


  • 사용하는 함수는 다음과 같습니다.
import win32com.client
import time
import shutil
import os
import codecs
import pandas as pd
import numpy as np
from datetime import datetime
from tqdm import tqdm
# from pywinauto import application
# from pywinauto import timings


class CREON(object):
    """대신증권 크레온 API"""

    def __init__(self):
        # 연결 여부 체크
        self.objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
        bConnect = self.objCpCybos.IsConnect
        if (bConnect == 0):
            print("PLUS가 정상적으로 연결되지 않음. ")
        else:
            print("정상적으로 연결되었음")

    def setMethod(self, code, char, minutes=1, 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.colnames = "날짜, 시간, 시가, 고가, 저가, 종가, 거래량".split(", ")
        self.objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8])
        # 날짜,시가,고가,저가,종가,거래량, 거래대금, 상장주식수, 시가총액, 외국인현보유수량, 기관순매수
        # self.colnames = "날짜, 시가, 고가, 저가, 종가, 거래량, 거래대금, 상장주식수, 시가총액, 외국인현보유수량, 기관순매수".split(", ")
        # self.objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9, 12, 13, 16, 20])

        self.objStockChart.SetInputValue(6, ord(char))  # '차트 주기 - 분/틱 # # 'D', m'
        if char == "m":
            self.objStockChart.SetInputValue(7, minutes)  # 분틱차트 주기 ## 1분은 1로

        self.objStockChart.SetInputValue(9, ord('1'))  # 수정주가 사용

        self.data = {i: [] for i in self.colnames}

    def checkRequest(self):
        self.objStockChart.BlockRequest()
        rqStatus = self.objStockChart.GetDibStatus()
        if rqStatus != 0: 
            return False
        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)  # 시세 제한
        print("남은시간: ",remainTime, " 남은개수: ", remainCount)
        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):
                    for idx, col in enumerate(self.colnames):
                        self.data[col].append(self.objStockChart.GetDataValue(idx, i))
            else:
                break
        self.data = pd.DataFrame(self.data).astype('str')
        return self.data


1. 하루단위 조회 방법

code = 'A005930'
name='삼성전자'
creon = CREON()
#creon.setMethod(code=code, char="m", minutes=2, to_yyyymmdd=20200519,from_yyyymmdd=20200520)
creon.setMethod(code=code, char="D", to_yyyymmdd=20200519,from_yyyymmdd=20200520)
getStockPrice = creon.getStockPriceMin()
print('---------name : {} 요청은 완료됬습니다.'.format(name))

image



2. 분단위 조회방법 ( 예제는 2분단위 )

code = 'A005930'
name='삼성전자'
creon = CREON()
creon.setMethod(code=code, char="m", minutes=2, to_yyyymmdd=20200519,from_yyyymmdd=20200520)
#creon.setMethod(code=code, char="D", to_yyyymmdd=20200519,from_yyyymmdd=20200520)
getStockPrice = creon.getStockPriceMin()
print('---------name : {} 요청은 완료됬습니다.'.format(name))

image