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