본문 바로가기

시계열분석

Fitting the ARMA model

저번에 배운 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