Есть ли проблема с предсказаниями SARIMAX С использованием Статсмоделей?

#python #time-series #statsmodels

Вопрос:

Я создаю модель временных рядов на Python, используя библиотеку Statsmodels.

Похоже, я получаю ошибочные результаты, когда использую метод прогнозирования на модели SARIMAX с экзогенными регрессорами. (Метод прогнозирования, похоже, отлично работает в случае отсутствия внешних регрессоров.)

Вот полное воспроизведение проблемы:

 import numpy as np
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX, SARIMAXResults

history = np.array([95818, 126537, 102856, 161188, 150539, 165138, 146603, 154334,
           150875, 134049, 137822, 126369, 124641, 111735, 126453])

history_exog = np.array([11.9835, 12.1981, 11.7108, 10.8174, 9.48247, 8.49162, 8.15208, 7.81663, 
                8.22422, 9.9492, 10.8724, 10.9911, 9.55874, 6.67079, 3.13028])

future_exog = np.array([0.279386, -1.72252, -2.87699, -2.64897, -1.51616])

model = SARIMAX(history,
                order=(1,0,0),
                seasonal_order=(0,0,0,52),
                exog = history_exog,
                enforce_stationarity=False,
                enforce_invertibility=False)

model_fit = model.fit(method = 'cg')

yhat = model_fit.predict(start = len(history),
                         end = len(history)   5 - 1,
                         exog = future_exog)       

model_fit.summary()
 

введите описание изображения здесь

Прогноз на пять шагов вперед, который я получаю (yhat), выглядит следующим образом:

  • 138068
  • 145810
  • 149686
  • 147245
  • 140676

Вы можете увидеть проблему в самом первом предсказании. Учитывая параметры модели, я бы подумал, что прогноз будет:

yhat(t 1) = (126453 х 0,9898) (-4579,3944 х 0,279386) = 123883,76

Прогноз, который я получаю, — 138068.

Где я здесь ошибаюсь? Или это может быть ошибка?

Ответ №1:

Модель SARIMAX имеет форму «регрессия с ошибками SARIMA». Например, для модели ARX(1) это:

 y(t) = beta' x(t)   e(t)
e(t) = phi e(t-1)   z(t)
 

в то время как ваше уравнение прогнозирования будет точным для модели вида:

 y(t) = beta' x(t)   phi y(t-1)   z(t)
 

Если вас интересует модель AR(p) (т. Е. Не включает никаких терминов MA), вы можете использовать sm.tsa.AutoReg , которая имеет такую форму.