퀀트투자 - KRX에서 재무 데이터 DB로 저장하기
본문 바로가기
파이썬으로 만든 것들/퀀트투자

퀀트투자 - KRX에서 재무 데이터 DB로 저장하기

by Squat Lee 2022. 9. 25.

지난 포스트에서 KRX에서 영업일을 다운받아 DB에 저장하는 과정을 기록했다.

 

이전 포스트(KRX에서 영업일 다운로드 받기)

 

이제 드디어 데이터를 다운 받았다. 다행히 차단되지 않고, 한 번에 받았지만 아주 오래 걸렸다.

 

미리 받은 영업일을 데이터프레임을 가져오고, 다시 List로 저장 했다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from pykrx import stock
from datetime import datetime, timedelta
import pandas as pd
import numpy as np
import time
import sqlite3
 
# 영업일을 List로 가져오기
con = sqlite3.connect('krx_data.db')
df = pd.read_sql("SELECT * FROM dates", con)
dates = df['일자'].to_list()
print(dates)
 
def data_download(date):
    codes = stock.get_market_ticker_list(date, market='ALL'# code list 만들기
    corp = [] #Code와 Name을 저장할 List
    for code in codes:
        name = stock.get_market_ticker_name(code) #종목 이름 가져오기
        corp.append([code, name]) #Code와 이름으로 리스트를 만들기
    df1 = pd.DataFrame(data=corp, columns=['code''종목명'])#code와 종목명을 데이터프레임으로 만들기
    df1.index = df1['code'#index를 코드로 만들기
 
 
    df_f = stock.get_market_fundamental_by_ticker(date=date, market='ALL')#BPS, PER, PBR, EPS, DIV, DPS 가져와서 데이터 프레임 만들기
    df_c = stock.get_market_cap_by_ticker(date=date, market='ALL')#종가, 시가총액, 거래량, 거래대금, 상장주식수 가져오기
 
    time.sleep(1)
 
    df = pd.merge(df1, df_c, left_index=True, right_index=True#종목명, 종가, 시가총액, 거래량, 거래대금, 상장주식수
    df = pd.merge(df, df_f, left_index=True, right_index=True#위에 df + PER, PBR...
    #column은 '종목명', '종가', '시가총액', '거래량', '거래대금', '상장주식수', 'BPS', 'PER', 'PBR', 'EPS', 'DIV', 'DPS'
 
    df['일자'= np.array([date]*len(df))
    df = df.set_index('일자')
 
    return df
 
# 데이터 받아서 데이터프레임으로 합치고, DB에 저장
try:
    for n, date in enumerate(dates):
        print(date)
        if n == 0:
            t_df = data_download(date)
        else:
            t_df = pd.concat([t_df, data_download(date)])
        time.sleep(1#혹시나 차단될 수 있으니깐
    print(t_df)
    con = sqlite3.connect("krx_data.db")
    t_df.to_sql('fundamental', con, if_exists='append')
except:
    pass
 
 
cs

영업일을 받는 과정은 너무나 힘들고, 손이 많이 갔지만, 만들어진 영업일로 재무데이터를 가져오는데는 시간은 좀 걸렸지만 어려움이 상대적으로 덜 했다.

 

이제 맘껏 백테스트를 해 볼 수 있어서 다행이다. 이렇게 노력만 조금 하면 원하는 것을 얻을 수 있는 세상에 태어난 것에 감사한다.

728x90
반응형

댓글