일별 종목 시세표 만들기¶
증권사 HTS와 연결여부 체크¶
In [59]:
import win32com.client
# 연결여부 체크
objCpCybos = win32com.client.Dispatch('CpUtil.CpCybos')
bConnect = objCpCybos.IsConnect
if bConnect == 0:
print("증권사 hts와 연결되지 않음")
exit()
else:
print(bConnect,': API 연결됨')
# 1이면 연결된 것
일별시세 stockChart로 구현¶
In [ ]:
import win32com.client
import pandas as pd
import time
import sqlalchemy
from sqlalchemy.dialects import mysql #mysql의 타입을 활용할 수 있도록 도와 줌
import matplotlib.pyplot as plt
# sql엔진 생성
engine = sqlalchemy.create_engine('mysql+pymysql://root:root@localhost:3306/first_db')
#모듈 호출
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
def get_daily_OHLC(getStockCode, num_Days):
## 일별, 주별, 월별 선택
term = 'D' #'D': 일별, 'W':주별 , 'M': 월별
# 대상 지정을 위한 값 입력
objStockChart.SetInputValue(0, getStockCode)#0 코드 입력, 네이버
objStockChart.SetInputValue(1, ord("2")) #'2'.갯수로 요청, '1' 날짜로 요청
objStockChart.SetInputValue(4, num_Days) #요청할 데이터 갯수
objStockChart.SetInputValue(5, (0,2,3,4,5,8)) #요청할 데이터 OHLC
objStockChart.SetInputValue(6, ord(term)) # 일별 데이터
objStockChart.SetInputValue(9,ord('0')) #수정주가 여부 1이 수정주가 0이 무수정, 근데 상관없이 무수정으로 나오는 듯
#정보요청
objStockChart.BlockRequest()
# 일자별 정보 처리
count = objStockChart.GetHeaderValue(3) # 데이터 개수
print('데이터의 갯수는',count,'개 입니다')
nextCount = 1
# 임시 리스트 초기화
list_temp=[]
# 리스트에 일별 주가 쌓기
for i in range(count):
# 앞에 숫자는 하나의 칼럼순서로 보라 date:0, 시가,:1...
DATE = 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)
temp=(DATE, Open, High, Low, Close, Vol)
list_temp.append(temp)
#데이터프레임으로 변환
columns=['ymd','op','hi','lo','cl','vol']
df_daily=pd.DataFrame(list_temp, columns=columns)
#DATE를 날짜 형식으로 변환
df_daily['ymd']=pd.to_datetime(df_daily['ymd'], format='%Y%m%d')
# DATE를 인덱스로 만들기
df_daily.index = df_daily['ymd']
# 기존에 있던 DATE칼럼은 제거하기
df_daily.drop('ymd', axis=1, inplace=True)
# df_daily 리턴으로 함수 밖으로 돌려주기
return df_daily
SQL 삽입함수 만들기 ('변수를 따옴표 안에 놓어라')¶
In [ ]:
#변수를 ''안에 넣으면 테이블로 생성된다.
def to_sql_OHLC(tableName):
# SQL로 담기
table_name = tableName
eval(table_name).to_sql(table_name,con = engine,if_exists='replace',index = True, index_label='ymd',
dtype ={'ymd':(mysql.DATE),
'op':mysql.INTEGER,
'hi':mysql.INTEGER,
'lo':mysql.INTEGER,
'cl':mysql.INTEGER,
'vol':mysql.INTEGER}
)
#'DATE'를 기본키로 변경
engine.execute('ALTER TABLE `%s` ADD PRIMARY KEY (ymd);' %table_name)
만든 함수 get_Daily_OHLC로 불러보기(종목명, 일자),SQL삽입하기¶
kodex200 a069500
tiger_dow30 A245340
kosef_india A200250
tiger_euro30 A245350
kindex_inni A256440
tiger_nikkei A241180
kindex_vn A245710
kdx_china A283580
tiger_usbond10 A305080
kdx_shortbond A153130
kdx_bond10 A152380
kdx_gold A132030
kdx_usd A261250
tiger_yen A292570
kdx_wti_oil A261220
In [ ]:
numDays= 2000
# 코덱스 달러 선물
tiger_dow30= get_daily_OHLC('A261250',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('tiger_dow30')
kosef_india= get_daily_OHLC('A200250',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kosef_india')
tiger_euro30= get_daily_OHLC('A245350',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('tiger_euro30')
kindex_inni= get_daily_OHLC('A256440',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kindex_inni')
tiger_nikkei= get_daily_OHLC('A241180',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('tiger_nikkei')
kindex_vn= get_daily_OHLC('A245710',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kindex_vn')
kdx_china= get_daily_OHLC('A283580',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kdx_china')
tiger_usbond10= get_daily_OHLC('A305080',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('tiger_usbond10')
kdx_shortbond= get_daily_OHLC('A153130',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kdx_shortbond')
kdx_bond10= get_daily_OHLC('A152380',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kdx_bond10')
kdx_gold= get_daily_OHLC('A132030',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kdx_gold')
kdx_usd= get_daily_OHLC('A261250',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kdx_usd')
tiger_yen= get_daily_OHLC('A292570',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('tiger_yen')
kdx_wti_oil= get_daily_OHLC('A261220',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('kdx_wti_oil')
In [ ]:
tiger_yen= get_daily_OHLC('A292570',num_Days=numDays)
#sql로 테이블 생성, 변수를 문자열로 입력하면 변수 이름의 테이블이 생성된다.
to_sql_OHLC('tiger_yen')
StockWeek로 구현¶
In [ ]:
import win32com.client
inStockWeek = win32com.client.Dispatch("dscbo1.StockWeek")
inStockWeek.SetInputValue(0, "A035420") #네이버
inStockWeek.BlockRequest() #연속 된 데이터를 불러올 때 반드시 필요한 것
count = inStockWeek.GetHeaderValue(1) # 데이터의 개수를 얻어옴
print('count is ',count,' 입니다.')
j = 1
while inStockWeek.Continue:
if j > 5:
break
j+=1
count = inStockWeek.GetHeaderValue(1) # 데이터의 개수를 얻어옴
inStockWeek.BlockRequest()
for i in range(count):
day = inStockWeek.GetDataValue(0, i)
starting_price = inStockWeek.GetDataValue(1, i) # 시가
high_price = inStockWeek.GetDataValue(2, i) # 고가
low_price = inStockWeek.GetDataValue(3, i) # 저가
ending_price = inStockWeek.GetDataValue(4, i) # 종가
trade_volumn = inStockWeek.GetDataValue(6, i) # 거래량
print(day, starting_price, high_price, low_price, ending_price, trade_volumn) # 가격 출력
종목의 일별 시세를 DATAfRAME으로 만든 후 DB에저장¶
In [ ]:
import win32com.client
import time
import sqlalchemy
from sqlalchemy.dialects import mysql #mysql의 타입을 활용할 수 있도록 도와 줌
#모듈 호출
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
## 검색 일수(봉수)
numDays = 3000
## 일별, 주별, 월별 선택
term = 'D' #'D': 일별, 'W':주별 , 'M': 월별
# 종목명
stockCodeNum = "A123310"
# 대상 지정을 위한 값 입력
objStockChart.SetInputValue(0, stockCodeNum)#0 코드 입력, 네이버
objStockChart.SetInputValue(1, ord("2")) #'2'.갯수로 요청, '1' 날짜로 요청
objStockChart.SetInputValue(4, numDays) #요청할 데이터 갯수
objStockChart.SetInputValue(5, (0,2,3,4,5,8)) #요청할 데이터 OHLC
objStockChart.SetInputValue(6, ord(term)) # 일별 데이터
objStockChart.SetInputValue(9,ord('0')) #수정주가 여부 1이 수정주가 0이 무수정, 근데 상관없이 무수정으로 나오는 듯
#정보요청
objStockChart.BlockRequest()
# 일자별 정보 처리
count = objStockChart.GetHeaderValue(3) # 데이터 개수
print(count)
nextCount = 1
list_temp=[]
for i in range(count):
# 앞에 숫자는 하나의 칼럼순서로 보라 date:0, 시가,:1...
DATE = 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)
temp=(DATE, Open, High, Low, Close, Vol)
list_temp.append(temp)
columns=['ymd','op','hi','lo','cl','vol']
df_daily=pd.DataFrame(list_temp, columns=columns)
# DateFrame을 DB에 저장
df_daily.to_sql('kodex200',con = engine,if_exists='replace',index = False,
dtype ={'ymd':(mysql.DATE),
'op':mysql.INTEGER,
'hi':mysql.INTEGER,
'lo':mysql.INTEGER,
'cl':mysql.INTEGER,
'vol':mysql.INTEGER})
# 'DATE'를 기본키로 변경
engine.execute('ALTER TABLE `kodex200` ADD PRIMARY KEY (ymd);')
DB의 테이블을 데이터프레임으로 불러오기¶
In [ ]:
import sqlalchemy
import pandas as pd
import matplotlib.pyplot as plt
# sql엔진 생성
engine = sqlalchemy.create_engine('mysql+pymysql://root:root@localhost:3306/first_db')
# read_sql_table사용
df = pd.read_sql_table(table_name='kdx_wti_oil',
con= engine,
index_col='ymd')
df['cl'].plot(figsize = (25,15))
'파이썬' 카테고리의 다른 글
시계열 데이터에서 원하는 날짜만 선택하기 (슬라이싱) (0) | 2019.01.28 |
---|---|
파이썬 변수 삭제등 기초명령어 모음 (0) | 2019.01.28 |
데이터프레임의 행과 열 삭제 (0) | 2018.10.24 |
데이터프레임 생성하기 (0) | 2018.10.24 |
Pandas에서 데이터 선택과 인덱싱 (0) | 2018.10.23 |