본문으로 바로가기

일별 종목 시세표 만들기

category 파이썬 2018. 10. 14. 23:13
크레온02_일별시세

일별 종목 시세표 만들기

증권사 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이면 연결된 것
1 : API 연결됨

일별시세 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))