如何用statsmodels生成ARIMA静态预测?复现Stata分析遇阻
问题描述
我正在用statsmodels复现Stata的ARIMA分析,模型是包含4个外生回归变量的ARIMA(1,0,4),用来生成静态预测。目前模型拟合的系数、z值等结果已经和Stata完全一致,但卡在预测环节:
我的数据时间范围是1980-2024,训练集取1980-2018,需要对之后的时段做预测。尝试了两种statsmodels的预测方式:
- 使用
forecast方法:
forecast_values = model_fit.forecast(steps=32, exog=df[[外生变量列表]], dynamic=False)
其中df只包含样本外的观测值,返回的是动态预测,和Stata结果不符。
- 使用
predict方法(statsmodels不推荐用于样本外预测,但能运行):
forecast_values = model_fit.predict(start='2017-01-01', end='2024-10-01', exog=merged_testing[[外生变量列表]], dynamic=False)
结果和forecast方法完全一致,而且dynamic参数不管设为False还是True,输出都没有变化。
我知道因为有4个MA项,手动计算静态预测难度很大,想知道怎么在statsmodels里正确获取静态预测?
补充:我查到statsmodels默认用动态预测是因为缺少因变量的实测值,但不知道怎么把这些值提供给模型做预测;也看到过相关的议题讨论,但没搞懂重新估计的思路怎么解决这个问题。
解决方案
要在statsmodels里实现Stata式的静态预测(即每一步预测都使用因变量的真实观测值,而非前一步的预测值),核心是要把样本内的因变量真实值+样本外的外生变量一起传入模型,让模型能调用到预测时点之前的真实因变量值。具体步骤如下:
1. 准备完整的数据集
合并你的训练集(1980-2018)和测试集(2019-2024)的因变量与外生变量,得到一个包含1980-2024全时段的完整DataFrame,记为full_df。注意:测试集的因变量必须是真实观测值(如果有的话),这是静态预测的关键。
2. 使用predict方法指定预测范围
调用predict方法时,设置start为你要开始预测的时点(比如2019-01-01),end为预测结束时点,同时传入完整的外生变量数据,并确保dynamic=False:
# 假设full_df包含所有时段的因变量(y)和外生变量(exog1, exog2, exog3, exog4) forecast_static = model_fit.predict( start='2019-01-01', end='2024-10-01', exog=full_df[['exog1', 'exog2', 'exog3', 'exog4']], dynamic=False )
这里的dynamic=False会让模型在每一步预测时,优先使用full_df中已有的因变量真实值,而不是用模型的预测值来递推。
3. 为什么之前的方法无效?
你之前只传入了样本外的外生变量数据,模型无法获取预测时点之前的因变量真实值,所以不管dynamic设为False还是True,都只能退化为动态预测——用前一步的预测值来填充缺失的因变量值,自然和Stata的静态预测结果不符。
特殊情况:如果没有样本外的因变量真实值?
如果你的测试集没有因变量的真实观测值,那静态预测从定义上就无法实现(因为没有真实值可以代入),这种情况下只能做动态预测,和Stata的dynamic选项结果一致。
内容的提问来源于stack exchange,提问作者AustinC

