如何执行不涉及重新拟合ARIMA模型的多步时差预测?

时间:2019-05-28 06:11:19

标签: python forecasting arima

我有一个使用python拟合到时间序列数据(例如data[0:100])的ARIMA(p,d,q)模型。我想使用此模型进行预测(forecast[100:120])。但是,考虑到我也有未来的真实数据(例如:data[100:120]),我如何确保多步预测将我拥有的未来的真实数据考虑在内,而不是使用其预测的数据? / p>

本质上,在预测时,我希望使用forecast[101]而不是data[100]来计算forecast[100]

我想避免在每个时间步都用更新的“历史记录”重新拟合整个ARIMA模型。

我适合ARIMAX模型,如下所示:

train, test = data[:100], data[100:]
ext_train, ext_test = external[:100], external[100:]
model = ARIMA(train, order=(p, d, q), exog=ext_train)
model_fit = model.fit(displ=False)

现在,以下代码使我能够预测整个数据集(包括测试)的值

forecast = model_fit.predict(end=len(data)-1, exog=external, dynamic=False)

但是,在这种情况下,经过100个步长后,ARIMAX预测值会迅速收敛到长期平均值(如预期的那样,因为经过100个时间步长后,它仅使用预测值)。我想知道是否有办法提供“未来”的真实价值,以提供更好的在线预测。类似于:

forecast = model_fit.predict_fn(end = len(data)-1, exog=external, true=data, dynamic=False)

我知道我总是可以通过这样做不断调整ARIMAX模型

historical = train
historical_ext = ext_train
predictions = []

for t in range(len(test)):
    model = ARIMA(historical, order=(p,d,q), exog=historical_ext)
    model_fit = model.fit(disp=False)
    output = model_fit.forecast(exog=ext_test[t])[0]
    predictions.append(output)
    observed = test[t]
    historical.append(observed)
    historical_ext.append(ext_test[t])

但是,这导致我一次又一次地训练ARIMAX模型,这对我来说意义不大。它导致使用大量的计算资源,并且是不切实际的。由于所拟合的参数每次迭代都会不断变化,因此进一步难以评估ARIMAX模型。

我对ARIMAX模型的理解/使用是否存在错误?

3 个答案:

答案 0 :(得分:6)

是的,如果您想使用新数据进行在线预测,则需要一遍又一遍地估计参数,这在计算上效率低下。 要注意的一件事是,对于ARIMA模型,模型中MA部分参数的估计主要是计算量大的,因为这些参数是使用数值优化而不是使用普通最小二乘法估计的。由于在为初始模型计算了一次参数之后,您便知道对未来模型的期望,由于一次观察不会对它们进行太大更改,因此您可以初始化对参数的搜索以提高计算效率。

此外,也许有一种方法可以更有效地进行估算,因为您拥有模型的旧数据和参数,因此唯一要做的就是添加一个数据点。这意味着您只需要为新数据点与所有其他数据点的组合计算theta和phi参数,而无需再次计算已知组合,这将节省大量时间。我非常喜欢这本书:Heij,Christiaan等。计量经济学方法及其在商业和经济学中的应用。牛津大学出版社,2004年。

本讲座可能使您了解这是如何可行的:lecture on ARIMA parameter estimation

恐怕您必须自己实现。据我所知,目前尚无可做的事情。

希望这会给您一些新的想法!

答案 1 :(得分:2)

这个非常好的博客建议(3 facts about time series forecasting that surprise experienced machine learning practitioners):

“每次要生成新的预测时,您都需要重新训练模型”,它还可以通过示例直观地了解为什么会发生这种情况。
这基本上突出了时间序列预测的挑战,它是一个不断变化的需求,需要重新调整。

答案 2 :(得分:2)

我一直在努力解决这个问题。幸运的是,我发现了一个非常有用的讨论。据我所知,python中的ARIMA不支持这种情况,我们需要使用SARIMAX。

您可以参考讨论链接:https://github.com/statsmodels/statsmodels/issues/2788