대신증권 분봉 조회
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
1 대신증권 원본[편집]
import win32com.client
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
# 차트 객체 구하기
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
objStockChart.SetInputValue(0, 'A005930') #종목 코드 - 삼성전자
objStockChart.SetInputValue(1, ord('2')) # 개수로 조회
objStockChart.SetInputValue(4, 100) # 최근 100일 치
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("빼기빼기==============================================-")
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)
2 분봉데이터 적재[편집]
import win32com.client
import dbcon_synol
import pymysql
import time
import datetime
import UTIL_SLACK_CALL
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
# DB 연결
db = dbcon_synol.conn()
cursor = db.cursor(pymysql.cursors.DictCursor)
def selectLimitStockList(cursor):
# 종목코드 기준으로 tb_stock_daily_info 테이블에 적재된 max(일자) +1 값 , 현재 일자 조회
selectSql = "SELECT tl.stock_cd" \
" , tl.stock_kind_cd" \
" , IFNULL(DATE_FORMAT(DATE_ADD(MAX(td.date), INTERVAL +1 DAY),'%Y%m%d'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -900 DAY), '%Y%m%d')) AS start_date" \
" , DATE_FORMAT(CURDATE(), '%Y%m%d') AS end_date" \
" FROM vw_stock_list tl" \
" JOIN (SELECT td.stock_cd,stock_kind_cd,td.volume,td.date" \
" from tb_stock_daily_info_3h td" \
" WHERE 1=1" \
" AND CONVERT(CLS_PRICE,SIGNED) > CONVERT(START_PRICE,SIGNED)" \
" AND CONVERT(CLS_PRICE,signed) BETWEEN 1000 AND 9000" \
" AND ROUND((CLS_PRICE - START_PRICE)/START_PRICE * 100,1) BETWEEN 0 AND 30" \
" LIMIT 30" \
" ) td" \
" ON tl.stock_cd=td.stock_cd" \
" AND tl.stock_kind_cd = td.stock_kind_cd" \
" WHERE 1=1" \
" GROUP BY tl.stock_cd ,tl.stock_kind_cd" \
" ORDER BY td.volume DESC;"
print("selectSql:"+selectSql)
cursor.execute(selectSql)
result=cursor.fetchall()
return result
def selectAllStockList(cursor):
# 종목코드 기준으로 tb_stock_daily_info 테이블에 적재된 max(일자) +1 값 , 현재 일자 조회
selectSql = "SELECT tl.stock_cd" \
" , tl.stock_kind_cd" \
" , IFNULL(DATE_FORMAT(DATE_ADD(MAX(td.date), INTERVAL +1 DAY),'%Y%m%d'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -900 DAY), '%Y%m%d')) AS start_date" \
" , DATE_FORMAT(CURDATE(), '%Y%m%d') AS end_date" \
" FROM vw_stock_list tl" \
" JOIN tb_stock_daily_info td" \
" ON tl.stock_cd=td.stock_cd" \
" AND tl.stock_kind_cd = td.stock_kind_cd" \
" WHERE 1=1" \
" GROUP BY tl.stock_cd ,tl.stock_kind_cd" \
" ;"
print("selectSql:"+selectSql)
cursor.execute(selectSql)
result=cursor.fetchall()
return result
def getHhmmStockinfo(stockCd, getStartDate , endDate):
# 주식시간정보 임시저장
stockHhmmInfo = []
# 주식코드 저장
# stockHhmmInfo.append(stockCd)
# 차트 객체 구하기
objStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
# 0 - 종목코드(string): 주식(A003540), 업종(U001), ELW(J517016)의종목코드
print("stockCd:"+stockCd)
objStockChart.SetInputValue(0, stockCd) # 종목 코드 - 삼성전자
# objStockChart.SetInputValue(1, ord('2')) # 개수로 조회
# 1 - 요청구분(char):
objStockChart.SetInputValue(1, ord('1')) # '1': 기간 요청시 주,월,분,틱은 불가
# '2': 갯수로 요청이고 분,틱 모드인 경우에는 요청 갯수 및 수신 갯수를 누적해서
# 다음 데이터 요청을 체크해야 함.( 요청 갯수 <= 수신 갯수 비교하는 로직 추가)
#2 요청종료일(ulong): YYYYMMDD형식으로데이터의마지막(가장최근) 날짜 Default(0) - 최근거래날짜
objStockChart.SetInputValue(2, endDate) # endDate
#3 - 요청시작일(ulong): YYYYMMDD형식으로데이터의시작(가장오래된) 날짜
objStockChart.SetInputValue(3, getStartDate) #getStartDate or 20180111
#4 - 요청개수(ulong): 요청할데이터의개수
# objStockChart.SetInputValue(4, 100) # 최근 100일 치
#5 - 필드(long array): 필드 배열
"""
필드값
0: 날짜(ulong)
1:시간(long) - hhmm
2:시가(long or float)
3:고가(long or float)
4:저가(long or float)
5:종가(long or float)
6:전일대비(long or float) - 주) 대비부호(37)과반드시같이요청해야함
8:거래량(ulong or ulonglong)주) 정밀도만원단위
9:거래대금(ulonglong)
10:누적체결매도수량(ulong or ulonglong) -호가비교방식누적체결매도수량
11:누적체결매수수량(ulong or ulonglong) -호가비교방식누적체결매수수량
(주) 10, 11 필드는분,틱요청일때만제공
12:상장주식수(ulonglong)
13:시가총액(ulonglong)
14:외국인주문한도수량(ulong)
15:외국인주문가능수량(ulong)
16:외국인현보유수량(ulong)
17:외국인현보유비율(float)
18:수정주가일자(ulong) - YYYYMMDD
19:수정주가비율(float)
20:기관순매수(long)
21:기관누적순매수(long)
22:등락주선(long)
23:등락비율(float)
24:예탁금(ulonglong)
25:주식회전율(float)
26:거래성립률(float)
37:대비부호(char) - 수신값은 GetHeaderValue 8 대비부호와동일
"""
objStockChart.SetInputValue(5, [0, 1, 2, 3, 4, 5, 8, 9]) # 날짜,시간,시가,고가,저가,종가,거래량,거래대금
#6 - 차트구분(char)
"""
'D' 일
'W' 주
'M' 월
'm' 분
'T' 틱
"""
objStockChart.SetInputValue(6, ord('m')) # '차트 주가 - 일간 차트 요청
objStockChart.SetInputValue(9, ord('1')) # 수정주가 사용
objStockChart.BlockRequest()
numData = objStockChart.GetHeaderValue(3)
numField = objStockChart.GetHeaderValue(1)
# print("날짜","시간", "시가", "고가", "저가", "종가", "거래량", "거래금액")
# print("==============================================-")
if numData != 0: # 상장폐지 종목 예외, 상장폐지 종목은 0 값을 받음
for i in range(numData):
tempValue=[(stockCd)]
for j in range(numField):
tempValue+=[(objStockChart.GetDataValue(j, i))]
stockHhmmInfo.append(tempValue)
# print(stockHhmmInfo)
# for i in range(len):
# day = objStockChart.GetDataValue(0, i)
# hhmm = objStockChart.GetDataValue(1, i)
# open = objStockChart.GetDataValue(2, i)
# high = objStockChart.GetDataValue(3, i)
# low = objStockChart.GetDataValue(4, i)
# close = objStockChart.GetDataValue(5, i)
# vol = objStockChart.GetDataValue(6, i)
# amt = objStockChart.GetDataValue(7, i)
# # stockHhmmInfo.append(i)
# print(stockCd,day, hhmm,open, high, low, close, vol,amt)
sql = "insert into tb_stock_hhmm_info(stock_cd,date,hhmm, start_price, high_price, low_price, cls_price, volume, total_trd_price) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s)"
cursor.executemany(sql, stockHhmmInfo)
# print(sql + " 적재완료")
print(stockCd + " 적재완료")
db.commit()
if __name__ == "__main__":
now = datetime.datetime.now()
for stockCd in selectAllStockList(cursor):
if stockCd['start_date'] <= stockCd['end_date']:
# 일 기준으로 데이터 적재
# 변수 (종목코드, 종목부소속코드, DB에 적재된 MAX일자 +1, 기준이 되는 오늘일자 )
getHhmmStockinfo(stockCd['stock_cd'], '20200605','20200605')
# getHhmmStockinfo(stockCd['stock_cd'], stockCd['start_date'], stockCd['end_date'])
# time.sleep(0.5)
dbcon_synol.close(db)
2.1 분봉 차트 만들기[편집]
GIST: https://gist.github.com/esstory/b210775a03c7a41e2b58c0a2735f445c