본문 바로가기
Data Analysis/Python

[Python] 증권사 데이터 수집 (with CYBOS plus)

by 불탄오징어 2021. 3. 23.
반응형

 

 

 

일부 증권사에서는 주식 데이터 및 거래를 위해서 API를 제공하고 있습니다. 그 중에 제가 사용하고 있는 증권사는 대신증권이며 여기서 제공하는 API, CYBOS Plus를 사용하고 있습니다.

 

 

대신증권을 이용하게 된 이유는 여러가지가 있겠지만 CYBOS Plus API의 자료실에서 유용한 자료들을 제공하고 있기 때문입니다. 특히나 프로그램 별 API 연동 과제를 올려주거든요. 이 예제들을 활용하면 그래도 쉽게 API를 활용하여 데이터 수집 및 매매를 해볼 수 있는 프로그램을 제작할 수 있습니다.

 

 

참고로 CYBOS Plus API를 이용하기 위해서는 다음과 같은 제약/환경이 필요합니다.

  • 대신증권 계좌
  • 증권사 공동인증서
  • 크레온 HTS/PLUS설치
  • python 32bit

환경 구축에 대해서는 다음기회에 한번 정리를 해보겠습니다.........

 

 

최근 공교롭게도 예전에 만들어두었던 네이버 증권의 데이터를 크롤링하는 소스가 제대로 동작하지 않아서 증권사 데이터 수집 하던 소스를 다듬고 있는 중입니다. API 자료실에서 제공하는 소스를 기반으로 조금 다듬었습니다.

 

import win32com.client
import pandas as pd
 
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect

if (bConnect == 0):
    print("PLUS가 정상적으로 연결되지 않음. ")
    exit()

# 주어진 종목코드에 대해 지정한 기간만큼 주가 정보를 가져오는 함수
def RequestFromTo(code, fromDate, toDate):

    # 차트 객체 구하기
    objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
    objStockChart.SetInputValue(0, code)            #종목 코드
    objStockChart.SetInputValue(1, ord('1'))        # 기간으로 받기
    objStockChart.SetInputValue(2, toDate)          # 종료일
    objStockChart.SetInputValue(3, fromDate)        # 시작일
    objStockChart.SetInputValue(5, [0,2,3,4,5,8])   #날짜,시가,고가,저가,종가,거래량
    objStockChart.SetInputValue(6, ord('D'))        # '차트 주가 - 일간 차트 요청
    objStockChart.SetInputValue(9, ord('1'))        # 수정주가 사용
    objStockChart.BlockRequest()
 
    # 데이터 수
    len = objStockChart.GetHeaderValue(3)        
    
    codes    = []
    date     = []
    opens    = []
    highs    = []
    lows     = []
    closes   = []
    vols     = []    
    
    # 데이터 숫자만큼 list에 값을 추가
    for i in range(len):
        codes.append(code)
        date.append(objStockChart.GetDataValue(0, i))  # 일자
        opens.append(objStockChart.GetDataValue(1, i))  # 시가
        highs.append(objStockChart.GetDataValue(2, i))  # 고가
        lows.append(objStockChart.GetDataValue(3, i))  # 저가
        closes.append(objStockChart.GetDataValue(4, i))  # 종가        
        vols.append(objStockChart.GetDataValue(5, i))  # 거래량

    # list를 data frame으로 합쳐서 반환
    result = pd.DataFrame(zip(codes, map(str,date), opens, highs, lows, closes, vols))
    result.columns = ['CODE','DT','OPEN_PRC','HIGH_PRC','LOW_PRC','CLOSE_PRC','VOL_QTY']

    return(result)

 

예를 들어 메리츠 화재(000060)에 대한 주식정보를 가져온다면 다음과 같습니다.

 

추가로 주요 주식 정보를 예제로 가져와보겠습니다.

삼성전자(005930)                                                                                 현대차(005380)
NAVER(035420)                                                                                  카카오(035720)

 

다음 번에는 저번 NAVER 주식 크롤링 했던 것처럼 데이터 베이스 저장하는 것 까지 진행해보겠습니다.
데이터 수집보다는 모델링을 해봐야하는데 그건 하지 않고 맨날 데이터만 수집....

댓글