반응형

파이썬으로 백테스트를 하기 위해서는
주가 데이터베이스의 구축이 선행이 되어야 합니다.
이번 강의에서는 대신증권 API를 이용하여 주가 데이터를 받은 뒤,
데이터베이스에 저장해 보겠습니다.


* Python 32bit, Jupyter notebook 환경에서 작성되었습니다.

* 32Bit로 실행하지 않을경우 정상적으로 작동되지 않습니다.

* 관리자 권한으로 Notebook을 실행하지 않을경우 정상적으로 작동되지 않습니다.

(1) 필요 패키지의 호출

import pandas as pd
import win32com.client
import sqlite3

먼저 데이터 구축을 위해 필요한 패키지들을 불러옵니다.

- pandas : 데이터 분석을 위한 라이브러리입니다.
여기서는 주가데이터의 핸들링을 위해 사용됩니다. (테이블 형식으로 변환)

- win32com : windows 기능을 사용하기 위한 패키지입니다.
여기서는 대신증권 API를 사용하기 위해 사용됩니다.

- sqlite3 : Sqlite3 Database를 사용하기 위한 패키지입니다.
여기서는 주가데이터를 저장하기 위해 사용됩니다.


(2) 대신증권 CYBOS(Creon) PLUS와 연결

대신증권 API를 사용하기 위해 CYBOS(Creon) Plus와 연결을 실시합니다.

먼저 사이보스(크레온)을 실행하여, 사이보스(크레온) 플러스에 로그인합니다.

objCpStatus = win32com.client.Dispatch('CpUtil.CpCybos')

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

    else:
        print("연결완료")

    return True

check_connection()

다음 함수를 작성하여 정상적으로 연결이 되었는지 확인해봅니다.

objCpStatus : Cybos(Creon)의 상태를 확인하기 위해 dll파일에 접근합니다.
objCpStatus.IsConnect : Cybos(Creon)와의 연결 상태를 확인합니다. (0 : 연결끊김, 1 : 연결 정상)

정상적으로 접속이 되었다면 연결완료라는 결과가 나오게 됩니다.



(3) 주가 데이터 받아오기

사이보스 플러스에서 주가 데이터를 받아오는 방법은 두가지가 있습니다.

첫째로 갯수로 받아오는 방법이 있는데, 이것은 오늘부터 00거래일전까지 데이터를 받아옵니다.
(100을 넣을경우 100거래일전 데이터부터 오늘까지 데이터를 받아옴)

둘째로 날짜로 받아오는 방법이 있는데, 이것은 시작일부터 종료일까지 데이터를 받아옵니다.
(20200301, 20200401을 넣을경우 3월 1일부터 4월 1일까지 주가데이터를 받아옴)

먼저, 주가 갯수로 데이터를 불러와보겠습니다.

# 주가 불러오기 - 갯수 기준
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")

## 조회할 데이터 입력
## 순서 : 종목코드 -> 조회방법 -> 조회할 갯수 -> 조회할 데이터 -> 봉 형식 -> 수정주가여부
objStockChart.SetInputValue(0, 'A005930')   # 종목 코드 - 삼성전자

objStockChart.SetInputValue(1, ord('2')) # 개수로 조회
objStockChart.SetInputValue(4, 10) # 최근 10일 치

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)

print("날짜", "시가", "고가", "저가", "종가", "거래량")
print("==============================================")

## 데이터 출력
## SetInputValue '5' 에 넣은 리스트의 인덱스 순으로 데이터가 출력됨
## i는 데이터 열 순서. 값이 커질수록 옛날 데이터가 출력이 됨.
for i in range(len):
    day = objStockChart.GetDataValue(0, i)
    open = objStockChart.GetDataValue(1, i)
    high = objStockChart.GetDataValue(2, i)
    low = objStockChart.GetDataValue(3, i)
    close = objStockChart.GetDataValue(4, i)
    vol = objStockChart.GetDataValue(5, i)
    print (day, open, high, low, close, vol)

본 코드를 실행할 경우 10행의 데이터가 출력이 됩니다.

< 실행 결과 >
날짜 시가 고가 저가 종가 거래량
================================
20200422 48700 50000 48350 49850 18613864
20200421 49400 49700 48700 49250 27407543
20200420 51400 51400 50000 50100 21866354
20200417 50800 52000 50300 51400 32041675
20200416 49350 49350 48550 49000 23349760
20200414 48800 49200 48300 49000 14206216
20200413 48650 48900 48300 48300 14431800
20200410 48950 49250 48650 49250 17839111
20200409 49750 49800 48700 49100 22628058
20200408 49600 49750 48600 48600 25010314

둘째로, 날짜 기준으로 데이터를 불러와보겠습니다.

# 주가 불러오기 - 날짜 기준
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")

objStockChart.SetInputValue(0, 'A005930') # 종목 코드 - 삼성전자
objStockChart.SetInputValue(1, ord('1')) # 날짜로 조회

objStockChart.SetInputValue(2, 0) # 종료 날짜, 0을 넣으면 가장 최근 날짜로 불러옴.
objStockChart.SetInputValue(3, 20200401) # 시작 날짜, 4월 1일로 설정하였음.

objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9]) # 날짜, 시가, 고가, 저가, 종가, 거래량, 거래대금
objStockChart.SetInputValue(6, ord('D')) # '차트 주가 - 일간 차트 요청
objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용
objStockChart.BlockRequest()

len = objStockChart.GetHeaderValue(3)

print("날짜", "시가", "고가", "저가", "종가", "거래량", "거래대금")
print("==============================================")

for i in range(len):
    day = objStockChart.GetDataValue(0, i)
    open = objStockChart.GetDataValue(1, i)
    high = objStockChart.GetDataValue(2, i)
    low = objStockChart.GetDataValue(3, i)
    close = objStockChart.GetDataValue(4, i)
    vol = objStockChart.GetDataValue(5, i)
    vol_mon = objStockChart.GetDataValue(6, i)

    # 데이터 확인해보기
    print(day, open, high, low, close, vol, vol_mon)

당 코드를 실행할 경우 2020년 4월 1일부터 오늘까지 데이터를 불러오게 됩니다.

<실행 결과>
날짜 시가 고가 저가 종가 거래량 거래대금
==============================================
20200422 48700 50000 48350 49850 18613864 912223000000
20200421 49400 49700 48700 49250 27407543 1347415000000
20200420 51400 51400 50000 50100 21866354 1106552000000
20200417 50800 52000 50300 51400 32041675 1641068000000
20200416 49350 49350 48550 49000 23349760 1143760000000
20200414 48800 49200 48300 49000 14206216 694513000000
20200413 48650 48900 48300 48300 14431800 700511000000
20200410 48950 49250 48650 49250 17839111 872177000000
20200409 49750 49800 48700 49100 22628058 1111936000000
20200408 49600 49750 48600 48600 25010314 1230375000000
20200407 49650 50200 49000 49600 31524034 1561333000000
20200406 47500 48800 47250 48700 23395726 1123254000000
20200403 47400 47600 46550 47000 22784682 1074180000000
20200402 46200 46850 45350 46800 21621076 997831000000
20200401 47450 47900 45800 45800 27259532 1282483000000


(4) 주가 데이터 저장하기

주가데이터가 어떤식으로 불러와지는지 확인하였으니,
테이블 형식으로 변환하여 데이터베이스에 저장해보겠습니다.

먼저 DataFrame 형식으로 저장해보겠습니다.

'''
- DataFrame로 저장하기
'''

# 1. 주가 불러오기 - 날짜 기준
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")

objStockChart.SetInputValue(0, 'A005930') # 종목 코드 - 삼성전자
objStockChart.SetInputValue(1, ord('1')) # 날짜로 조회

objStockChart.SetInputValue(2, 0) # 종료 날짜, 0을 넣으면 가장 최근 날짜로 불러옴.
objStockChart.SetInputValue(3, 20200401) # 시작 날짜, 3월 1일로  설정하였음.

objStockChart.SetInputValue(5, [0, 2, 3, 4, 5, 8, 9]) # 날짜, 시가, 고가, 저가, 종가, 거래량, 거래대금
objStockChart.SetInputValue(6, ord('D')) # '차트 주가 - 일간 차트 요청
objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용
objStockChart.BlockRequest()

len = objStockChart.GetHeaderValue(3)

# 2. 리스트 기반으로 저장
value_list = []

for i in range(len):
    day = objStockChart.GetDataValue(0, i)
    open = objStockChart.GetDataValue(1, i)
    high = objStockChart.GetDataValue(2, i)
    low = objStockChart.GetDataValue(3, i)
    close = objStockChart.GetDataValue(4, i)
    vol = objStockChart.GetDataValue(5, i)
    vol_mon = objStockChart.GetDataValue(6, i)

    # 데이터 확인해보기
    value_list.append([day, open, high, low, close, vol, vol_mon])

# 3, DataFrame로 변환
price_df = pd.DataFrame(value_list, columns = ['day','open', 'high', 'low', 'close', 'vol', 'vol_money'])

# 4. 데이터 확인
print(price_df)

실행하게 되면 테이블 형식으로 결과가 나오게 됩니다.
총 14행에, 날짜, 시가, 고가, 저가, 종가, 거래량, 거래대금의 열이름을 가지는 형식의
테이블이 제작되었습니다.

< 실행 결과 >
day open high low close vol vol_money
0 20200422 48700 50000 48350 49850 18613864 912223000000
1 20200421 49400 49700 48700 49250 27407543 1347415000000
2 20200420 51400 51400 50000 50100 21866354 1106552000000
3 20200417 50800 52000 50300 51400 32041675 1641068000000
4 20200416 49350 49350 48550 49000 23349760 1143760000000
5 20200414 48800 49200 48300 49000 14206216 694513000000
6 20200413 48650 48900 48300 48300 14431800 700511000000
7 20200410 48950 49250 48650 49250 17839111 872177000000
8 20200409 49750 49800 48700 49100 22628058 1111936000000
9 20200408 49600 49750 48600 48600 25010314 1230375000000
10 20200407 49650 50200 49000 49600 31524034 1561333000000
11 20200406 47500 48800 47250 48700 23395726 1123254000000
12 20200403 47400 47600 46550 47000 22784682 1074180000000
13 20200402 46200 46850 45350 46800 21621076 997831000000
14 20200401 47450 47900 45800 45800 27259532 1282483000000

생성한 데이터를 Sqlite3 Database에 저장해보겠습니다.

'''
방금 만든 데이터를 sqlite3 데이터베이스에 저장하기
'''

## 데이터베이스 연결
con = sqlite3.connect("price.db")

## 데이터베이스 저장
## 테이블 이름 -> 연결한 데이터베이스 -> 이미 데이터 존재시 설정 (덮어쓰기)
price_df.to_sql('A005930', con, if_exists='replace')

코드를 실행하고, price_db 파일을 열어서
데이터가 저장이 되었는지 확인해 보겠습니다.

Sqlite3 Database 파일을 열기 위해서는
아래 링크에서 DB Browser for SQLite를 설치해서 열어야 합니다.

https://sqlitebrowser.org/

파일을 확인해 보니, 데이터베이스가 잘 저장되었습니다.

응용문제
1. 2010년 1월 1일부터 주가데이터를 불러와서 저장해봅시다.
2. 코스피200 종목의 주가데이터를 불러와서 저장해 봅시다.


예제 파일은 아래에서 다운 받을 수 있습니다.

1. 주가데이터 받아오기.ipynb
0.01MB

 

강의가 도움이 되셨다면, 좋아요와 구독을 눌러주세요.
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기