오늘은 가져온 파이썬의 pykrx를 사용해 주가 이력 정보를 가져오고,
pymysql을 사용해, 가져온 주가 정보를 개인용 주식 DB에 insert까지 해보도록 하겠습니다.
먼저 아래를 참고해 테이블을 생성합니다.
CREATE TABLE MYTRDDB.KRX_HIST_DT(
STK_CD VARCHAR(40) NOT NULL
,DT DATE NOT NULL
,O_PRC DECIMAL(18,3)
,H_PRC DECIMAL(18,3)
,L_PRC DECIMAL(18,3)
,C_PRC DECIMAL(18,3)
,VOL DECIMAL(18,3)
,CHG_RT DECIMAL(18,3)
,PRIMARY KEY(STK_CD, DT)
);
간단히 dataframe 관련된 명령어 몇 개를 살펴봅니다.
# Dataframe의 Index 값 중에, 최대값, 최소값 가져오기.
df.index.min()
df.index.max()
# Dataframe의 Index 값을 loop로 순차적으로 가져오기.
# 가저온 Index 값을 이해용해 해당 로우의 데이터를 가져오기.
for ix in df.index:
print(ix)
print(df.loc[ix].시가)
print(df.loc[ix].고가)
최종 아래와 같은 소스코드를 통해 삼성전자(005930)의 주가 정보를 가져와, 우리가 위에서 만들었던 MYSTKDB.KRX_HIST_DT에 입력할 수 있습니다.
기존에 클래스내에 static으로 만들었던 함수는, static을 모두 제거했습니다.
get_stock_history에서 새로 만든 함수인, insert_hist_dt를 호출하도록 구성되어 있습니다.
get_stock_history에서는 pykrx를 통해, 데이터프레임에 주가 정보를 입력하고,
insert_hist_dt에서는 데이터프레임을 넘겨받아 주가 데이터를 insert합니다.
이때, 기존에 입력된 구간과 겹쳐지지 않도록 delete를 처리합니다.
import pymysql
from pykrx import stock
from datetime import datetime, timedelta
class MyCollectKRX:
def get_stock_master(self, _market):
stk_master = []
for stk_cd in stock.get_market_ticker_list(market=_market):
stk_nm = stock.get_market_ticker_name(stk_cd)
stk_master.append((stk_cd, stk_nm, _market))
return stk_master
def get_stock_history(self, _stk_cd, _fr_ymd, _to_ymd):
if _to_ymd == '':
_to_ymd = datetime.now().strftime('%Y%m%d')
if _fr_ymd == '':
_fr_ymd = (datetime.strptime(_to_ymd, '%Y%m%d') - timedelta(weeks=54)).strftime('%Y%m%d')
df = stock.get_market_ohlcv(_fr_ymd, _to_ymd, _stk_cd)
self.insert_hist_dt(_stk_cd, df)
def insert_hist_dt(self, _stk_cd, _df):
# MySQL 연결 객체 생성
myConn = pymysql.connect(user='???', password='???', host='localhost', port=3306,
charset='utf8', database='MYTRDDB')
myCursor = myConn.cursor()
_fr_ymd = _df.index.min()
_to_ymd = _df.index.max()
sql_del = "DELETE T1 FROM MYTRDDB.KRX_HIST_DT T1 WHERE T1.STK_CD = %s AND T1.DT BETWEEN %s AND %s"
myCursor.execute(sql_del, (_stk_cd, _fr_ymd, _to_ymd))
for ix in _df.index:
sql_ins = "INSERT INTO MYTRDDB.KRX_HIST_DT(STK_CD ,DT ,O_PRC ,H_PRC ,L_PRC ,C_PRC ,VOL ,CHG_RT)"
sql_ins = sql_ins + " VALUES(%s ,%s ,%s ,%s ,%s ,%s ,%s ,%s)"
myCursor.execute(sql_ins, (
_stk_cd, ix, _df.loc[ix].시가, _df.loc[ix].고가, _df.loc[ix].저가, _df.loc[ix].종가, _df.loc[ix].거래량, _df.loc[ix].등락률))
myConn.commit()
myCursor.close()
myConn.close()
if __name__ == '__main__':
myCollectKRX = MyCollectKRX()
stk_cd = '005930'
myCollectKRX.get_stock_history(_stk_cd=stk_cd, _fr_ymd='', _to_ymd='')
print('작업 완료')
현재 작성된 모듈은 mysql의 연결과 처리에 대한 모듈이 모두 포함되어 있습니다.
나중에 mysql 관련된 내용은 별도 클래스로 만들어 분리하는 것이 더욱 좋습니다.
오늘은 여기까지입니다.
'데이터분석 > TradeOptimizer' 카테고리의 다른 글
트레이드 전략 - 위꼬리가 긴 하루 #4 (1) | 2022.12.02 |
---|---|
트레이드 전략 - 위꼬리가 긴 하루 #3 (0) | 2022.12.02 |
트레이드 전략 - 위꼬리가 긴 하루 #2 (0) | 2022.12.02 |
트레이드 전략 - 위꼬리가 긴 하루 #1 (0) | 2022.12.02 |
PyKRX - 주가 이력 정보 가져오기 (0) | 2022.11.25 |
Python 기초 - 날짜 다루기(문자에서 날짜로, 날짜에서 문자로, 날짜 계산) (0) | 2022.11.24 |
Trade Optimizer (0) | 2022.11.23 |
PyKRX - 주식 마스터 정보 가져오기 (0) | 2022.11.16 |