https://github.com/FinanceData/FinanceDataReader
!apt -qq install fonts-nanum*
# matplotlib rebuild
import matplotlib as mpl
mpl.font_manager._rebuild()
# matplotlib 환경 설정
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'nanummyeongjo'
plt.rcParams["axes.grid"] = True
plt.rcParams["figure.figsize"] = (12,6)
plt.rcParams["axes.formatter.useoffset"] = False
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams["axes.formatter.limits"] = -10000, 10000
한글이 제대로 표시되지 않는 경우 메뉴의 런타임을 다시 시작("런타임 / 런타임 다시 시작..."을 선택)하고 처음 셀 부터 실행합니다.
!pip -q install finance-datareader
import FinanceDataReader as fdr
# KB금융 (105560)
df = fdr.DataReader('105560', '2019-01-01', '2019-12-31')
df.head(15)
Open | High | Low | Close | Volume | Change | |
---|---|---|---|---|---|---|
Date | ||||||
2019-01-02 | 46700 | 46900 | 45600 | 45950 | 636199 | -0.011828 |
2019-01-03 | 46600 | 46800 | 46200 | 46450 | 1275976 | 0.010881 |
2019-01-04 | 46500 | 46600 | 45600 | 45650 | 784105 | -0.017223 |
2019-01-07 | 45800 | 46650 | 45450 | 45450 | 957133 | -0.004381 |
2019-01-08 | 45900 | 45950 | 45300 | 45500 | 868450 | 0.001100 |
2019-01-09 | 46050 | 46650 | 45800 | 46450 | 885435 | 0.020879 |
2019-01-10 | 46500 | 46500 | 45500 | 45500 | 1195029 | -0.020452 |
2019-01-11 | 45550 | 46100 | 45150 | 45350 | 1077396 | -0.003297 |
2019-01-14 | 45450 | 45850 | 44400 | 44550 | 1189035 | -0.017641 |
2019-01-15 | 45000 | 46750 | 44800 | 46750 | 1317274 | 0.049383 |
2019-01-16 | 46900 | 47700 | 46450 | 47450 | 1091289 | 0.014973 |
2019-01-17 | 47800 | 47850 | 47050 | 47600 | 1035554 | 0.003161 |
2019-01-18 | 47350 | 47400 | 46550 | 46700 | 1054443 | -0.018908 |
2019-01-21 | 46500 | 46700 | 46000 | 46100 | 1451479 | -0.012848 |
2019-01-22 | 45600 | 45800 | 45300 | 45750 | 1365448 | -0.007592 |
다수 종목의 데이터를 가져와 개별 종목의 종가를 pd.concat()로 합칩니다
stock_list = [
["삼성전자", "005930"],
["SK하이닉스", "000660"],
["현대차", "005380"],
["셀트리온", "068270"],
["LG화학", "051910"],
["POSCO", "005490"],
["삼성물산", "028260"],
["NAVER", "035420"],
]
import pandas as pd
df_list = [fdr.DataReader(code, '2019-01-01', '2019-12-31')['Close'] for name, code in stock_list]
len(df_list)
8
# pd.concat()로 합치기
df = pd.concat(df_list, axis=1)
df.columns = [name for name, code in stock_list]
df.head(10)
삼성전자 | SK하이닉스 | 현대차 | 셀트리온 | LG화학 | POSCO | 삼성물산 | NAVER | |
---|---|---|---|---|---|---|---|---|
Date | ||||||||
2019-01-02 | 38750 | 60600 | 114000 | 204879 | 337000 | 237000 | 104000 | 118000 |
2019-01-03 | 37600 | 57700 | 116500 | 201058 | 328000 | 237000 | 104500 | 122000 |
2019-01-04 | 37450 | 58300 | 119500 | 210132 | 330500 | 239000 | 107000 | 125500 |
2019-01-07 | 38750 | 58700 | 120500 | 206311 | 343000 | 246000 | 108000 | 131500 |
2019-01-08 | 38100 | 59200 | 119500 | 203923 | 349500 | 245500 | 107000 | 130000 |
2019-01-09 | 39600 | 63600 | 123000 | 204401 | 352000 | 255500 | 109000 | 133000 |
2019-01-10 | 39800 | 65300 | 123000 | 206789 | 347000 | 258500 | 108500 | 131000 |
2019-01-11 | 40500 | 65100 | 123000 | 206789 | 349000 | 255500 | 109000 | 131000 |
2019-01-14 | 40050 | 62100 | 121500 | 201536 | 350500 | 250000 | 109500 | 127000 |
2019-01-15 | 41100 | 64000 | 127500 | 198193 | 356000 | 256500 | 110500 | 132500 |
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f1e379f1a58>
다수의 종목을 한번에 차트로 그려낼 수 있습니다.
하지만 종목간의 비교를 하기 쉽지 않네요. 2개 종목만 그려봅니다.
df[['LG화학', '삼성전자']].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f1e36f01358>
종목간의 가격차이가 커서 서로 비교하기가 어렵습니다.
이때, secondary_y 옵션을 활용하면 서로 다른 영역을 비교하기 용이합니다.
df[['LG화학', '삼성전자']].plot(secondary_y=['LG화학'])
<matplotlib.axes._subplots.AxesSubplot at 0x7f1e36eeae48>
두 개의 종목('LG화학', '삼성전자')이 서로 다른 행보를 가지는 것은 보이지만 시작점이 다르기 떄문에 시간에 따른 변화를 보기 쉽지 않습니다.
시작점을 0으로 동일하게 맞추고 시간에 따른 수익률을 보기 위해 첫 번째 행(row)으로 모든 행(row)을 나누고 1.0을 빼줍니다.
df2 = df[['LG화학', '삼성전자']]
df_plot = df2 / df2.iloc[0] - 1.0
df_plot.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f1e351afa58>
전체 종목의 성과(performance)를 시각화 해봅니다
df_norm = df / df.iloc[0] - 1
df_norm.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f1e350020b8>
수익률이 큰 종목부터 순으로 나열해 봅니다. 가장 마지막날 (2019-12-30)의 수익률을 확인해 봅니다.
df_norm.iloc[-1].sort_values(ascending=False)
NAVER 0.580508 SK하이닉스 0.552805 삼성전자 0.440000 현대차 0.057018 삼성물산 0.043269 POSCO -0.002110 LG화학 -0.057864 셀트리온 -0.116552 Name: 2019-12-30 00:00:00, dtype: float64
2019년 가장 좋은 수익률은 NAVER 58.0%, SK하이닉스 55.2% 이며 반대로
LG화학과 셀트리온이 각각 -5.7%, -11.6%를 년 수익률을 기록했습니다.
이처럼, FinanceDataReader와 pandas의 몇가지 기능을 활용하면 손쉽게 다수 종목에 대한 기간 수익률 비교가 가능합니다.