저번에 배운 ARMA 모델을 바탕으로 어떻게 해당 모델을 fitting 해서 어떠한 미래 데이터를 얻을 수 있는 지에 대해 간단하게 살펴보겠습니다
plot_acf 와 plot_pacf 를 통해 어떠한 parameter로 fitting 할 지 대략적인 감을 잡은 뒤
AIC 또는 BIC를 사용하여. 가장 알맞은 모델을 골라줄 수 있습니다.
2011 - 2021 까지의 SP500 data를 사용해보겠습니다.
SP500_diff = SP500.diff().dropna()
fig, (ax1, ax2) = plt.subplots(2,1, figsize=(12,8))
plot_acf(SP500_diff, ax=ax1)
plot_pacf(SP500_diff, ax=ax2)
SP500의 ACF를 살펴봤더니, 추세가 존재해 1차 처분을 해주고 처분한 데이터로 acf, pacf를 그려봤습니다.
정확하게 어떤 데이터를 사용해야되는지 알기 쉽지 않기 때문에, aic 를 돌려봅니다
from statsmodels.tsa.arima.model import ARIMA
order_aic = []
for p in range(3):
for q in range(3):
mod = ARIMA(SP500_diff, order=(p,0,q))
res = mod.fit()
order_aic.append((p,q,res.aic))
order_df = pd.DataFrame(order_aic,
columns=['p','q','AIC'])
# Print order_df in order of increasing AIC
print(order_df.sort_values("AIC"))
AIC 가 낮은 순으로 나열을 해봤더니 p=0, q=2 인 모델이 가장 AIC가 낮게 나와 해당 모델을 가지고 forecasting 해보겠습니다.
mod1 = ARIMA(SP500_diff, order=(0,0,2))
res1 = mod1.fit()
먼저 MA(2) 모델을 만들어주고 피팅해줍니다.
one_step_forecast = res1.get_prediction(start=-30)
mean_forecast = one_step_forecast.predicted_mean
confidence_intervals = one_step_forecast.conf_int()
get_prediction 함수를 사용하여 모델에 대한 예측을 plot으로 나타내보겠습니다.
이 때 start는 마지막 데이터부터 예측해보고 싶은 데이터의 개수를 나타내고,
confidence interval은 가장 낮은 데이터 예측값과 가장 높은 데이터 예측값을 반환해 줍니다.
plt.plot(SP500_diff.index, SP500_diff, label='observed')
plt.plot(mean_forecast.index, mean_forecast, color='r', label='forecast')
plt.fill_between(confidence_intervals.index, confidence_intervals["lower Close"],
confidence_intervals["upper Close"], color='pink')
plt.xlabel('Date')
plt.ylabel('SP500')
plt.legend()
plt.show()
해당 코드를 돌리면 아래와 같은 그래프의 모습을 볼 수 있습니다.
정확하게 알맞지는 않지만 대략적인 움직임은 비슷한 것을 볼 수 있습니다.
지금은 정확도보다는 어떤식으로 코드를 사용하는지, 어떤 개념인지에 대해 알아보는 것이기 때문에 넘어가도록 하겠습니다.
이 처분한 데이터를 다시 원상복귀해서 원래의 데이터의 예측값을 찾아내기 위해서는
누적합을 해서 원본 데이터에 합해야 하지만 이 과정이 너무 복잡하기 때문에
우리는 이것을 따로 할 필요가 없이 ARIMA 모델을 사용해서 편리하게 이용할 수 있습니다.
다음 포스트(?) 에서는 ARIMA 모델과 SARIMA모델에 대해 공부하겠습니다.
'시계열분석' 카테고리의 다른 글
prophet (0) | 2021.11.14 |
---|---|
ARIMA&SARIMA (0) | 2021.11.07 |
시계열분석 _ ARMA모델 개념정리 (0) | 2021.10.03 |
시계열분석 _ 자기상관과 ACF (0) | 2021.09.25 |
시계열분석 기초(1) (1) | 2021.09.24 |