오늘은 가져온 파이썬의 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 관련된 내용은 별도 클래스로 만들어 분리하는 것이 더욱 좋습니다.

오늘은 여기까지입니다.

+ Recent posts