🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
Facebook(Meta) Prophet을 활용한 시계열데이터 예측 및 시각화
이번 포스팅에서는 Facebook Prophet을 활용하여 시계열데이터 예측 튜토리얼을 진행해 보겠습니다.
Facebook Prophet을 활용한 시계열 데이터 예측은 Kaggle에서도 종종 노트북을 찾아보실 수 있을 정도로 캐글에서는 이미 꽤 많이 알려져 있습니다.
쉬운 사용성과 시각화, 그리고 인터랙티브 시각화인 plotly도 지원합니다.
부스팅 계열의 알고리즘, 딥러닝 모델과 함께 앙상블하여 예측한다면 꽤 좋은 성능을 기대해볼 수 있을 것 같습니다.
코드
Facebook Prophet을 활용한 주가 예측 모델
이번 튜토리얼 에서는 다음과 같은 프로세스 파이프라인으로 주가 예측을 진행합니다.
- FinanceDataReader를 활용하여 주가 데이터 받아오기
- Facebook Prophet을 활용하여 주가 예측
필요한 모듈 import
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import os
%matplotlib inline
warnings.filterwarnings('ignore')
데이터 (FinanceDataReader)
FinanceDataReader는 주가 데이터를 편리하게 가져올 수 있는 파이썬 패키지입니다.
FinanceDataReader가 아직 설치 되지 않으신 분들은 아래의 주석을 해제한 후 명령어로 설치해 주시기 바랍니다.
# !pip install finance-datareader
import FinanceDataReader as fdr
# 삼성전자 종목코드: 005930
samsung = fdr.DataReader('005930')
매우 편리하게 삼성전자 주가 데이터를 DataFrame
형식으로 받아옵니다.
기본 오름차순 정렬이 된 데이터임을 알 수 있습니다.
컬럼 설명
Open
: 시가High
: 고가Low
: 저가Close
: 종가Volume
: 거래량Change
: 대비
samsung.tail()
미국 주식 데이터도 가져올 수 있습니다.
# Apple(AAPL), 애플
apple = fdr.DataReader('AAPL')
apple.tail()
비트코인 시세
btc = fdr.DataReader('BTC/KRW', '2016-01-01')
btc
plt.figure(figsize=(16, 9))
sns.lineplot(x=btc.index, y='Close', data=btc)
plt.show()
시작과 끝 날짜를 지정하여 범위 데이터를 가져올 수 있습니다.
# 비트코인 시세
btc = fdr.DataReader('BTC/KRW', '2019-01-01', '2020-12-01')
btc
plt.figure(figsize=(16, 9))
sns.lineplot(x=btc.index, y='Close', data=btc)
plt.show()
그 밖에 금, 은과 같은 현물, 달러와 같은 화폐 데이터도 가져올 수 있습니다.
더욱 자세한 내용은 GitHub 페이지 링크를 참고해 보시기 바랍니다.
주가데이터 가져오기
# 삼성전자 주식코드: 005930
STOCK_CODE = '005930'
stock = fdr.DataReader(STOCK_CODE)
stock.head()
stock.index
stock.head()
시각화
plt.figure(figsize=(16, 9))
sns.lineplot(y=stock['Close'], x=stock.index)
plt.xlabel('time')
plt.ylabel('price')
time_steps = [['1990', '2000'],
['2000', '2010'],
['2010', '2015'],
['2015', '2020']]
fig, axes = plt.subplots(2, 2)
fig.set_size_inches(16, 9)
for i in range(4):
ax = axes[i//2, i%2]
df = stock.loc[(stock.index > time_steps[i][0]) & (stock.index < time_steps[i][1])]
sns.lineplot(y=df['Close'], x=df.index, ax=ax)
ax.set_title(f'{time_steps[i][0]}~{time_steps[i][1]}')
ax.set_xlabel('time')
ax.set_ylabel('price')
plt.tight_layout()
plt.show()
stock = fdr.DataReader(STOCK_CODE, '2019')
Prophet
모듈 import
from fbprophet import Prophet
from fbprophet.plot import plot_plotly, plot_components_plotly
컬럼
- 반드시 y 컬럼과 ds 컬럼이 존재해야합니다.
- 예측 값은 y, 시계열 데이터는 ds에 지정합니다.
stock['y'] = stock['Close']
stock['ds'] = stock.index
stock.head()
prophet 객체 선언 및 학습
m = Prophet()
m.fit(stock)
period에 예측 하고 싶은 기간을 입력 합니다.
예측할 시계열 row가 추가 됩니다.
future = m.make_future_dataframe(periods=30)
future.tail()
predict
로 예측을 진행합니다.predict
안에는 이전 단계에서 만들어준 future 데이터프레임을 입력합니다.
forecast = m.predict(future)
forecast.tail()
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].iloc[-40:-20]
시각화
plot
은 트렌드와 함께 예측된 결과물을 시각화하여 보여줍니다.
fig = m.plot(forecast)
plotly 활용
fig = plot_plotly(m, forecast)
fig
컴포넌트 별 시각화
컴포넌트 별 시각화에서는 seasonality 별 시각화를 진행해 볼 수 있습니다.
trend, yearly, weekly 데이터를 시각화하여 보여 줍니다.
plot_components_plotly(m, forecast)
change points
By default, Prophet specifies 25 potential changepoints which are uniformly placed in the first 80% of the time series. The vertical lines in this figure indicate where the potential changepoints were placed:
처음 80%의 시계열 데이터에 대하여 잠재적인 25개의 changepoints를 만들고, 그 중 선별하여 최종 changepoints를 그래프에서 vertical line으로 그려주게 됩니다.
from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)
flexibility 조절
If the trend changes are being overfit (too much flexibility) or underfit (not enough flexibility), you can adjust the strength of the sparse prior using the input argument changepoint_prior_scale. By default, this parameter is set to 0.05. Increasing it will make the trend more flexible:
flexibility 계수가 낮으면 과소적합, 높으면 과대적합하여 예측하게 됩니다.
중요한 hyperparameter 입니다.
m = Prophet(changepoint_prior_scale=0.8)
forecast = m.fit(stock).predict(future)
fig = m.plot(forecast)
m = Prophet(changepoint_prior_scale=0.01)
forecast = m.fit(stock).predict(future)
fig = m.plot(forecast)
댓글남기기