Значение начальных/конечных параметров статмоделей AutoReg.predict

Я понимаю, что этот вопрос задавался раньше, но решения не актуальны для новой версии statsmodel (0.12).

У меня есть этот набор данных в pandas, имя фрейма данных train:

date         value  
2017-01-09  0.331836
2017-01-10  0.330815
2017-01-11  0.329794
2017-01-12  0.328773
2017-01-13  0.327752
...     ...
2020-05-29  0.254081
2020-05-30  0.267420
2020-05-31  0.280758
2020-06-01  0.294097
2020-06-02  0.309384

Столбец даты — это индекс, а моя поздняя дата — 2020-06-02. Я хотел бы получить прогнозы на 14 дней с моей последней даты, то есть прогноз на период с 03.06.2020 (включительно) по 16.06.2020 (включительно). Я не уверен, правильно ли я понимаю начальный и конечный параметры.

from statsmodels.tsa.ar_model import AutoReg,ar_select_order
f = 14
mod = ar_select_order(train[y_col].ravel(), maxlag=15)
AutoRegfit = AutoReg(train[y_col].ravel(), trend='c', lags=mod.ar_lags).fit()
AutoRegfit.predict(start=len(train),end=len(train)+f-1,dynamic=False)

>>> array([0.32489822, 0.34010067, 0.35508626, 0.36968769, 0.38416325,
       0.39825263, 0.41186002, 0.42501389, 0.43766567, 0.44985079,
       0.46153405, 0.47270074, 0.48336156, 0.49351065])

Это выглядит нормально, однако означает ли это, что первое предсказание (0,32489822) относится к дате 2020-06-03 или 2020-06-02? потому что обычно в python, когда вы указываете диапазон, первое значение включается, а последнее не включается.

В документах сказано:

первый прогноз начинается

Значит ли это, что параметры start должны быть len(train)+1, а не len(train)?


person user88484    schedule 18.09.2020    source источник


Ответы (1)


Здесь нет правильной настройки start=len(train). Обратите внимание в этом контексте, что индексация в Python начинается с 0. Следовательно, последний индекс, доступный в вашей серии pandas, будет len(train)-1.

Простой способ проверить это — сравнить прогноз от .predict() с прогнозом, рассчитанным вручную. Поскольку у меня нет доступа к вашим данным, я проиллюстрирую это примером солнечных пятен из документация. Там мы оцениваем следующую авторегрессионную модель

import statsmodels.api as sm
from statsmodels.tsa.ar_model import AutoReg
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
res = AutoReg(data, lags=[1, 11, 12]).fit()

Использование .predict() для прогнозирования стоимости на следующий год теперь дает

print(res.predict(start=len(data), end=len(data)))
>>> 35.964103

который совпадает с рассчитанным вручную прогнозом

print(sum(res.params * [1, *data.iloc[[-1, -11, -12]]]))
>>> 35.964103
person sp59b2    schedule 20.09.2020
comment
Спасибо, значит, если мне нужно f дней прогноза, я должен указать: start=len(data), end=len(data)+f-1? -1 потому что end включительно - person user88484; 21.09.2020