如何进行多步骤的时点预测,而不需要重新拟合ARIMA模型?

10
我已经使用Python拟合了一个ARIMA(p,d,q)模型,该模型适用于时间序列数据(例如,data[0:100])。 我想使用此模型进行预测(forecast[100:120])。但是,考虑到我还有未来的真实数据(例如:data[100:120]),我该如何确保多步预测考虑到我拥有的未来真实数据,而不是使用它预测的数据?
实质上,在进行预测时,我希望使用data[100]而不是forecast[100]来计算forecast[101]
我希望避免在每个时间步骤上重新拟合整个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模型的理解/使用是否存在问题?

我有完全相同的问题。你找到答案了吗? - tuomastik
很遗憾,我找不到一个简单的方法来做到这一点。我相信R包对此有一些支持,但我无法将我已经拥有的所有内容移植到R中。 - John.Ludlum
正确 @john.Ludlum - Amir Christian
如果您还没有解决问题,您可能会发现这个链接有所帮助:https://www.statsmodels.org/dev/examples/notebooks/generated/statespace_forecasting.html - Skeftical
3个回答

10
您说得对,如果您想使用新数据进行在线预测,您需要一遍又一遍地估计参数,这在计算上是低效的。需要注意的一点是,对于ARIMA模型,主要是模型MA部分的参数估计计算量较大,因为这些参数是使用数值优化而非普通最小二乘法来估计的。由于在计算初始模型的参数后,您知道未来模型的期望值,因为一个观察值不会对它们产生太大的影响,所以您可能能够初始化参数搜索以提高计算效率。
此外,可能有一种更有效地进行估计的方法,因为您拥有旧数据和模型的参数,您只需要添加一个新数据点即可。这意味着您只需要为新数据点与其他所有数据点的组合计算theta和phi参数,而不需要重新计算已知的组合,这将节省相当多的时间。我非常喜欢这本书:Heij, Christiaan, et al. Econometric methods with applications in business and economics. Oxford University Press, 2004。
这个讲座可能会给您一些关于如何实现这一点的想法:ARIMA参数估计讲座

恐怕您必须自行实现此操作。据我所知,没有现成的工具可以完成这项任务。

希望这能为您提供一些新的想法!


3

在我看来,你应该更加详细地说明。这个回答几乎只是一个链接。 - m02ph3u5
我明白了,我只是试图不重复博客,并总结了一个非常简短的解释。 - david.abekasis

2

哇,这太棒了,谢谢!如果我当时做这个的时候能找到它就好了。 - John.Ludlum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接