๐ฉ๐ป ์ธ๊ณต์ง๋ฅ (ML & DL)/Serial Data
Prophet์ ์ด์ฉํ ๊ธฐ์ ์๋์ฐจ ์ฃผ๊ฐ ์์ธกํ๊ธฐ
์ง์ง์ํ์นด
2022. 9. 26. 13:26
728x90
๋ฐ์ํ
220926 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ HyeongWookKim ๋์ ๊น์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
https://gist.github.com/HyeongWookKim/c8f31f30b233896bb8947622d7efaf82
[Ch 7. ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ค๋ณด์] from "ํ์ด์ฌ์ผ๋ก ๋ฐ์ดํฐ ์ฃผ๋ฌด๋ฅด๊ธฐ(๋ฏผํ๊ธฐ ์ง์)"
[Ch 7. ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ค๋ณด์] from "ํ์ด์ฌ์ผ๋ก ๋ฐ์ดํฐ ์ฃผ๋ฌด๋ฅด๊ธฐ(๋ฏผํ๊ธฐ ์ง์)" - Ch 7. ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ค๋ณด์.ipynb
gist.github.com
1๏ธโฃ library & data load
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
from fbprophet import Prophet
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from pandas_datareader import data
import yfinance as yf
yf.pdr_override()
- '๊ธฐ์์๋์ฐจ(000270)'์ 2012 1์ 1์ผ๋ถํฐ 2017๋ 6์ 30์ผ๊น์ง์ ์ฃผ๊ฐ ์ ๋ณด๋ฅผ ์ฌ์ฉ
start_date = '2012-1-1'
end_date = '2017-6-30'
KIA = data.get_data_yahoo('000270.KS', start_date, end_date)
KIA.head()
2๏ธโฃ Data ๋ถ์
-
์ข ๊ฐ(Close)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ํ
-
์ข ๊ฐ : ์ฃผ์๊ฑฐ๋์ ๋น์ผ ๋งจ ๋ง์ง๋ง ๊ฑฐ๋๊ฐ ์ฒด๊ฒฐ๋ ๊ฐ๊ฒฉ
-
KIA['Close'].plot(figsize = (12, 6), grid = True)
- ๋์ค์ ์ค์ ๊ฐ๊ณผ์ ๋น๊ต๋ฅผ ์ํด, ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์๋ผ์ ๋จผ์ forecast๋ฅผ ์ํ
KIA_trunc = KIA[:'2016-12-31']
KIA_trunc
df = pd.DataFrame({'ds': KIA_trunc.index, 'y': KIA_trunc['Close']})
df.reset_index(inplace = True)
# 'ds' ๋ณ์๋ฅผ ์์ฑํด์คฌ์ผ๋ฏ๋ก, 'date' ๋ณ์๋ ์ญ์
del df['Date']
df.head()
- ์ฃผ๊ธฐ์ฑ์ด '์ผ๋จ์(daily_seasonality)'๋ก ์๋ค๊ณ ์๋ ค์ค๋ค
m = Prophet(daily_seasonality = True)
m.fit(df)
- 1๋ (365์ผ) ํ. ์ฆ, 2017๋ 12์ 31์ผ๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ฒ ๋ค๋ ์๋ฏธ
future = m.make_future_dataframe(periods = 365)
future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
- ์์ ์ํํ๋ ๊ทธ๋ํ์ ๋น์ท
m.plot(forecast)
-
๊ณ์ ์ฑ ์ฑ๋ถ ๋ณ๋ก ๋ถํด
-
์ถ์ธ(trend), ์์ธก๋ ๋ถ๋ถ์ด ๋ฐ๋ฑ๋๊ฑฐ๋ ๊ทธ๋๋ก ๋ด๋ ค๊ฐ ์๋ ์์ด๋ณด์ธ๋ค
-
์ฃผ๊ฐ(weekly), ์ฃผ๋ง์ ์ฅ์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ํ์์ผ๊ณผ ์์์ผ์ด ์๋์ ์ผ๋ก ๋์ ์ฃผ๊ฐ๋ฅผ ์ ์ง
-
์ฐ๊ฐ(yearly), ๊ธฐ์์๋์ฐจ์ ์ฃผ๊ฐ๋ 1๋ ์ค์ 2์์ ๊ฐ์ฅ ๋ฎ์ ์ฃผ๊ฐ๋ฅผ ๋ณด์ด๊ณ 5์์ ๊ฐ์ฅ ๋์ ์ฃผ๊ฐ
-
m.plot_components(forecast)
3๏ธโฃ ์ฃผ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ ์ง๋ฅผ ๋ณ๊ฒฝํด์ ๋ค์ ์์ธก ์ฑ๋ฅ์ ํ์ธ
- ์์ธก์ฉ์ผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ๋ 5์ 31์ผ๊น์ง
- ์ข ๊ฐ(Close)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ํ
# ๋ฐ์์จ ๋ฐ์ดํฐ
start_date = '2014-1-1'
end_date = '2017-7-31'
KIA = data.get_data_yahoo('000270.KS', start_date, end_date)
KIA['Close'].plot(figsize = (12, 6), grid = True);
# ์์ธก์ฉ์ผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ
KIA_trunc = KIA[:'2017-05-31']
KIA_trunc['Close'].plot(figsize = (12, 6), grid = True);
df = pd.DataFrame({'ds': KIA_trunc.index, 'y': KIA_trunc['Close']})
df.reset_index(inplace = True)
# 'ds' ๋ณ์๋ฅผ ์์ฑํด์คฌ์ผ๋ฏ๋ก, 'date' ๋ณ์๋ ์ญ์
del df['Date']
- ์ฃผ๊ธฐ์ฑ์ด '์ผ๋จ์(daily_seasonality)'๋ก ์๋ค
# ์ฃผ๊ธฐ์ฑ์ด '์ผ๋จ์(daily_seasonality)'๋ก ์๋ค๊ณ ์๋ ค์ค๋ค
m = Prophet(daily_seasonality = True)
m.fit(df)
# 61์ผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ฒ ๋ค๋ ์๋ฏธ
future = m.make_future_dataframe(periods = 61)
future.tail()
# ์์ธก๋ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํ
forecast = m.predict(future)
m.plot(forecast)
- ์ค์ ๋ฐ์ดํฐ ๊ฐ๊ณผ ์์ธก ๊ฐ์ ๋น๊ต
plt.figure(figsize = (12, 6))
plt.plot(KIA.index, KIA['Close'], label = 'real')
plt.plot(forecast['ds'], forecast['yhat'], label = 'forecast')
plt.grid()
plt.legend()
plt.show()
728x90
๋ฐ์ํ