본문 바로가기
주식/주식 일반

파이썬 데이타 가져오기

by 잠실돼지2 2022. 10. 21.

어제는 이베스트 xingAPI로 코스피200선물 5분봉 데이터를 가져왔는데요.

제공하는 기간이 짧기도 하고

만들어진 코드 파일도 기존에 코드에 연결해서 만들다보니

전체 파일을 다운 받아 하기에는 어려움이 있었죠.

오늘은 Cybos Plus API를 이용해서 5분봉 데이터를 받아오겠습니다.

전체 파일을 다운 받아 진행하면 약 10년치 데이터를 받을 수 있습니다.

자 시작해봅시다.

Cybos Plus는 데브센터처럼 확인해볼 수 있는 건 없고,

사이트에 공식문서를 보고 어떤 항목을 연결해서 데이터를 요청해야하는지 확인할 수 있습니다.

아래 링크 열어서 해당 항목 찾아야 합니다.

http://cybosplus.github.io/

링크 열어서 CpSysDib 안에 Future/Option에 보면

FutOptChart라는 항목이 있습니다.

열어서 아래로 내려가면서 보다보면

이런 항목이 있습니다.

대충 눈치로 분봉, 일봉, 주봉 데이터를 불러들이는구나 하실 수 있겠죠?

이 놈이 우리가 필요한 녀석입니다.

전체코드 먼저 올리고 다음 쪼개서 설명하겠습니다.

아래 코드만 복사해서 실행하면 데이터가 모아질 겁니다.

# -*- coding: utf-8 -*- import win32com.client from pandas import Series, DataFrame import datetime instFutOptChart = win32com.client.Dispatch("CpSysDib.FutOptChart") # 선물/옵션 데이터 연결 start = '20220527' while True: code = '10100' instFutOptChart.SetInputValue(0, code) # 받고자 하는 종목 코드 입력 instFutOptChart.SetInputValue(1, ord('1')) # 1: 기간별 데이터, 2: 개수 데이터 instFutOptChart.SetInputValue(2, int(start)) # 요청 종료일 / 기재한 날짜포함 출력됨 instFutOptChart.SetInputValue(3, 20100101) # 요청 시작일 / 기재한 날짜포함 출력됨 instFutOptChart.SetInputValue(5, (0, 1, 2, 3, 4, 5, 8)) # 필드 또는 필드 배열, 0: 날짜, 1: 시간, 2~5: 시고저종, 8: 거래량 instFutOptChart.SetInputValue(6, ord('m')) # 차트 구분, ('m':), D(), W(), M(), S(), T() instFutOptChart.SetInputValue(7, 5) # 주기 (1, 1, 1주 등등) instFutOptChart.SetInputValue(9, ord('0')) # 수정주가, 0: 미사용, 1: 사용 instFutOptChart.BlockRequest() numData = instFutOptChart.GetHeaderValue(3) # 3: 수신개수 numField = instFutOptChart.GetHeaderValue(1) # 1: 필드개수(위에서 SetInputValue의 5번 항목의 갯수) nameField = instFutOptChart.GetHeaderValue(2) # 2: 필드명 # 데이터 받아오기 df = DataFrame() for i in range(numField): a = [] for j in range(numData): a.append(instFutOptChart.GetDataValue(i, j)) df[instFutOptChart.GetHeaderValue(2)[i]] = a # 날짜, 시간 다루기 Date = [] for i in range(len(df[df.keys()[0]])): Date.append(str(df[df.keys()[0]][i])[:4] + str(df[df.keys()[0]][i])[4:6] + str(df[df.keys()[0]][i])[6:]) Time = [] for i in range(len(df[df.keys()[1]])): Time.append(str(df[df.keys()[1]][i])[:-2] + str(df[df.keys()[1]][i])[-2:] + '00') df[df.keys()[0]] = Date df[df.keys()[1]] = Time # 각 열의 제목을 일괄 변경 index = ['date', 'time', 'open', 'high', 'low', 'close', 'volume'] for i in range(len(df.columns)): df.rename(columns = {df.keys()[i]: index[i]}, inplace = True) del df['volume'] df = df[::-1] # 칼럼 중 하나를 인덱스로 변경 df.index = df['date'] del df['date'] # 소수점 둘째자리까지 df = round(df, 2) if len(df) == 0: break # Dates dates = df.index dates = list(set(dates)) dates.sort() start = dates[0] start = datetime.datetime.strptime(start, '%Y%m%d').date() start = start - datetime.timedelta(days=1) start = start.strftime('%Y%m%d') for date in dates: try: csv = df.loc[date] csv = csv.reset_index(drop=True) csv.index = csv['time'] del csv['time'] csv.to_csv('C:\\저장하고자\\하는\\폴더\\주소\\%s.csv' % date, sep=",") except KeyError: print(date)

Cybos Plus는 대신증권 계좌를 가지고 있어야 하며,

대신증권 다운로드센터에서 Cybos5를 다운받아 설치한 다음

거기서 Cybos Plus를 눌러 또 설치해야 합니다.

여기서는 설치는 넘어갑니다.

관련된 다른 사이트 검색하셔서 설치해주세요~!

그리곤 Cybos Plus 실행해서 로그인 합니다.

PyCharm이든 cmd든 뭐든 python은 꼭 관리자 권한으로 실행해야 합니다.

그래야 대신증권 API를 사용할 수 있습니다.

코드 설명 들어갑니다.

우선 필요한 라이브러리를 import합니다.

import win32com.client from pandas import Series, DataFrame import pandas as pd import datetime

디스패치 해줍니다.

위 링크에서 찾았던 경로가 CpSysDib의 FutOptChart 였죠?

그래서 아래처럼 입력합니다.

만약 다른 항목을 보고 싶다고 하시면 그 항목을 찾아서

디스패치를 이런 방식으로 하면 대신증권 Cybos Plus를 사용할 수 있습니다.

instFutOptChart = win32com.client.Dispatch("CpSysDib.FutOptChart") # 선물/옵션 데이터 연결

일단 반복문을 넘어가구요.

이베스트와 이름도 비슷하죠?

SetFieldData 대신 SetInputValue입니다.

code = '10100' instFutOptChart.SetInputValue(0, code) # 받고자 하는 종목 코드 입력 instFutOptChart.SetInputValue(1, ord('1')) # 1: 기간별 데이터, 2: 개수 데이터 instFutOptChart.SetInputValue(2, int(start)) # 요청 종료일 / 기재한 날짜포함 출력됨 instFutOptChart.SetInputValue(3, 20100101) # 요청 시작일 / 기재한 날짜포함 출력됨 instFutOptChart.SetInputValue(5, (0, 1, 2, 3, 4, 5, 8)) # 필드 또는 필드 배열, 0: 날짜, 1: 시간, 2~5: 시고저종, 8: 거래량 instFutOptChart.SetInputValue(6, ord('m')) # 차트 구분, ('m':), D(), W(), M(), S(), T() instFutOptChart.SetInputValue(7, 5) # 주기 (1, 1, 1주 등등) instFutOptChart.SetInputValue(9, ord('0')) # 수정주가, 0: 미사용, 1: 사용

우선 code는 101000입니다.

이베스트에서는 101S6000이죠?

선물은 만기가 있습니다. 연결선물을 받아와야죠.

지금 생각해보니 21년 12월까지 이베스트에서 값을 줬던 건 6월물로 요청했기 때문인 것 같기도 하네요.

하여간 이베스트에는 연결선물 코드가 없었는데요.

대신에는 연결선물코드가 있습니다.

그게 바로 '101000'입니다.

코드를 설정하구요.

다음으로 넘어가서

인자로 0, 1, 2, 3... 등등은 아래 화면에서 나오는 것들입니다.

거기에 type도 나오죠?

string, char, ulong, long 등등

char는 python에서 ord() 타입으로 입력해서 넣어주면 됩니다.

제가 필요로 하는 건 위에 있는 8가지입니다.

5번에 필드값이 있죠?

0은 날짜, 1은 시가 등등등

방식은 위의 방식대로 입력하면 됩니다.

데이터를 Request 합니다.

instFutOptChart.BlockRequest()

이베스트 xingAPI와는 다르게

수신개수와 필드개수를 받아서

이 값을 가지고 중첩 반복문을 써서 데이터를 받습니다.

그래서 numData, numField 변수로 갯수를 받습니다.

numData = instFutOptChart.GetHeaderValue(3) # 3: 수신개수 numField = instFutOptChart.GetHeaderValue(1) # 1: 필드개수(위에서 SetInputValue의 5번 항목의 갯수) nameField = instFutOptChart.GetHeaderValue(2) # 2: 필드명

빈 데이터프레임을 하나 만들고,

중첩해서 For문을 사용하면서 필드의 갯수별로 데이터를 a라는 리스트에 넣은 뒤

df에 값을 넣습니다.

머리로는 이해하기 어려우니

콘솔창에 아래처럼 넣고 하나씩 살펴보세요.

디버그 하듯이 하시면 어떻게 데이터가 받아지는지 이해하게 됩니다.

받을 때는 GetDataValue 명령어를 입력해서 받습니다.

df = DataFrame() for i in range(numField): a = [] for j in range(numData): a.append(instFutOptChart.GetDataValue(i, j)) df[instFutOptChart.GetHeaderValue(2)[i]] = a

여기서 부터는 데이터 형식과 시간 형식을 이베스트에서 받은 파일과 동일하게 하는 설정이구요.

df 칼럼 이름을 변경하고 필요없는 데이터는 지우고,

시간 순서대로 df를 바꿨습니다.

# 날짜, 시간 다루기 Date = [] for i in range(len(df[df.keys()[0]])): Date.append(str(df[df.keys()[0]][i])[:4] + str(df[df.keys()[0]][i])[4:6] + str(df[df.keys()[0]][i])[6:]) Time = [] for i in range(len(df[df.keys()[1]])): Time.append(str(df[df.keys()[1]][i])[:-2] + str(df[df.keys()[1]][i])[-2:] + '00') df[df.keys()[0]] = Date df[df.keys()[1]] = Time # 각 열의 제목을 일괄 변경 index = ['date', 'time', 'open', 'high', 'low', 'close', 'volume'] for i in range(len(df.columns)): df.rename(columns = {df.keys()[i]: index[i]}, inplace = True) del df['volume'] df = df[::-1] # 칼럼 중 하나를 인덱스로 변경 df.index = df['date'] del df['date'] # 소수점 둘째자리까지 df = round(df, 2) if len(df) == 0: break

이베스트와 다른점은 이베스트는 일자별로 데이터를 받았는데

Cybos Plus는 한 번에 죽~ 받아옵니다.

그걸 받아서 일자별로 잘라서 파일에 저장을 하게 코드를 짰습니다.

일단 일자별로 하기 위해서 df의 인덱스에서 일자 값을 리스트로 뽑아

중복은 삭제한 후 그 리스트로 반복문을 실행하며

df를 일자별로 쪼갭니다.

쪼갠 뒤 저장하는 거죠.

# Dates dates = df.index dates = list(set(dates)) dates.sort() start = dates[0] start = datetime.datetime.strptime(start, '%Y%m%d').date() start = start - datetime.timedelta(days=1) start = start.strftime('%Y%m%d') for date in dates: try: csv = df.loc[date] csv = csv.reset_index(drop=True) csv.index = csv['time'] del csv['time'] csv.to_csv('C:\\저장하고자\\하는\\폴더\\주소\\%s.csv' % date, sep=",") except KeyError: print(date)

날짜를 조작하는 부분에 start 변수의 값을 바꾸는 건

반복문을 위한 내용입니다.

while 구문으로 감싸져있는 부분이요.

처음에 최근날짜를 넣고 반복을 하는데

df에 데이터가 없을 때까지 반복합니다.

그때 날짜를 바꿔주면서 계속 하는데

그 날짜를 어떻게 바꾸냐면

아까 위에 나온 입력값 중에 아래 항목이 있죠?

instFutOptChart.SetInputValue(2, int(start)) # 요청 종료일 / 기재한 날짜포함 출력됨

이 부분이 계속 바뀝니다.

요청 시작일은 충분히 옛날인 2010년으로 주고

종료일을 계속해서 바꾸는 건데요.

처음에 오늘날자를 종료일로 주면

최근 일자부터해서 받아지는데

대신증권도 무한정 계속 줄수는 없으니

몇 건 주고 나면 끊습니다.

그 끊어지는 날짜를 가지고 와서

start 변수에 넣는거에요.

음... 제가 설명해도 참 어렵습니다.

ㅋㅋㅋ

데이터를 만지면서 보셔야 이해가 갈거에요.

이렇게 넣고 실행하면

12년 3월 30일까지 5분봉데이터가 저장이 됩니다.

데이터는 이렇게 들어갑니다.

주식도 옵션도, 상품선물도 다 이렇게 해서 받을 수 있습니다.

이 데이터를 가지고 이제 데이트레이딩 백테스팅을 할 수 있죠.

해보시다 막히는 부분이 있으면 댓글로 남겨주세요.

감사합니다~!

'주식 > 주식 일반' 카테고리의 다른 글

주식용 컴퓨터 57만원  (0) 2023.03.11
워렌버핏이 투자한 TSMC  (1) 2022.11.15
어설픈 삼각수렴 해석  (0) 2022.10.21
유스홀딩스  (0) 2022.10.01
한반도 교통망  (0) 2022.09.30

댓글