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

Joh*_*lum 6 python forecasting arima

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

本质上,当进行预测时,我希望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)
Run Code Online (Sandbox Code Playgroud)

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

forecast = model_fit.predict(end=len(data)-1, exog=external, dynamic=False)
Run Code Online (Sandbox Code Playgroud)

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

forecast = model_fit.predict_fn(end = len(data)-1, exog=external, true=data, dynamic=False)
Run Code Online (Sandbox Code Playgroud)

我知道我总是可以通过以下方式不断调整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])
Run Code Online (Sandbox Code Playgroud)

但这导致我一次又一次地训练ARIMAX模型,这对我来说意义不大。它导致使用大量的计算资源,并且是不切实际的。这进一步使得难以评估ARIMAX模型,从而使拟合参数不断变化。

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

小智 6

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

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

并且本次讲座可能使您了解这是如何可行的:关于ARIMA参数估计的讲座

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

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


小智 2

我正在为这个问题苦苦挣扎。幸运的是,我发现了一个非常有用的讨论。据我所知,Python中的ARIMA不支持这种情况,我们需要使用SARIMAX。

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