๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

Prophet์„ ์ด์šฉํ•œ ๊ธฐ์•„ ์ž๋™์ฐจ ์ฃผ๊ฐ€ ์˜ˆ์ธกํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ์ธ๊ณต์ง€๋Šฅ (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
๋ฐ˜์‘ํ˜•
Comments