본문 바로가기

금융 및 데이터

[Python] FinanceDataReader 데이터 Mysql DB에 적재하기

728x90

주가 데이터를 가져오기에 가장 좋은 라이브러리는 Financedatareader 같습니다. (+종목 코드 리스트만 가져오기 위해 Pykrx도 사용했습니다.)

 

https://github.com/financedata-org/FinanceDataReader

 

GitHub - financedata-org/FinanceDataReader: Financial data reader

Financial data reader. Contribute to financedata-org/FinanceDataReader development by creating an account on GitHub.

github.com

https://github.com/sharebook-kr/pykrx

 

GitHub - sharebook-kr/pykrx: KRX 주식 정보 스크래핑

KRX 주식 정보 스크래핑. Contribute to sharebook-kr/pykrx development by creating an account on GitHub.

github.com

 

국내 주식 데이터뿐만 아니라 경제지표, 해외 주식 데이터까지 편하게 읽어올 수 있습니다.

 

저는 이 라이브러리를 매번 서버에서 조회하는 것도 좋지만 제 개인적인 DB에 필요한 데이터를 매달 혹은 매주 간격으로 저장해 놓으면 라이

브러리를 더이상 사용할 수 없다고 하더라도 제 DB에서 꺼내 쓰면 되기 때문에 좀 정기적으로 데이터를 DB에 쌓는 자동화 프로그램을 개발하려 합니다.

 

Import 

import pandas as pd #DataFrame 을 사용하기 위함.
from sqlalchemy import create_engine #db에 적재하기 위한 라이브러리
import time #api 호출을 연속적으로 하지않고 일정 시간(초) 단위로 호출하기 위함.
from datetime import datetime #날짜 계산을 위함.
import FinanceDataReader as fdr #금융데이터 로드
from pykrx import stock #상장 종목의 종목코드만을 가져오기 위한 라이브러리

 

Data Load

stnd_date = "2013-01-01" #시작날짜
end_date = datetime.today().strftime("%Y%m%d") #끝날짜, 오늘

stock_list = stock.get_market_ticker_list()
#stock_list = ['005930'.....]

stock_list_len = len(stock_list)

result_df = pd.DataFrame()

process_num = 0
#진행단계 파악을 위한 변수
fdr.DataReader("005930", stnd_date, end_date)

 

df = df.resample('1M').mean().reset_index()
#일별 데이터를 월별 평균 데이터로 합산 후 index 를 컬럼으로 뺀다.

 

이제 stock_list 를 loop 돌면서 만들어진 월별 주가 데이터 Dataframe을 result_df에 concat 시켜주면 됩니다.

 

import time
result_df = pd.DataFrame()
process_num = 0
stnd_date = "2013-01-01"
end_date = datetime.today().strftime("%Y%m%d")
stock_list = stock.get_market_ticker_list()
stock_list_len = len(stock_list)

for code in stock_list:
    df = fdr.DataReader(code, stnd_date, end_date)
    df = df.resample('1M').mean().reset_index()
    df['code'] = code
    result_df = pd.concat([result_df, df], axis=0)
    process_num+=1
    time.sleep(1)
    print(str(process_num) + "/ " + str(stock_list_len))

Save

db_connection_str = 'mysql+pymysql://root:[비번]@localhost:3306/[db이름]'
db_connection = create_engine(db_connection_str)
conn = db_connection.connect()
result_df.to_sql(name='KOSPI_M', con=db_connection, if_exists='append', index=True )

 

이런식으로 Mysql DB에 들어온 걸 볼 수 있습니다. 

 

월별 데이터이므로 매달 특정일에만 이 프로세스가 동작하는 프로그램을 만들어놓고 실행하면 됩니다.