「每日科技果粉」通过时间序列建模ARIMA利用过去来预测未来( 二 )


因此 , MA模型使用模型的过去错误来预测Y(与AR模型类似 , 我们告诉它要考虑多少过去的错误) 。
让我们花点时间考虑一下为什么行得通 。 请考虑以下简化的MA(1)模型:
Y=u+B1*E_lag1其中u=Y的平均值E=Y-预测的
第一项 , u , 意味着我们的模型将其预测集中在Y的平均值附近(这就像在说什么都不知道 , 我会猜测平均值) 。 第二项B1*E_lag1是错误的来源 。 我们假设现在估计B1为0.2 。 误差(E)定义为Y的实际值减去模型的预测值 。
这意味着 , 如果最近的误差(E_lag1)为正(意味着实际误差大于我们的预测) , 我们将把预测上移误差量的1/5 。 这具有使模型的错误程度降低的效果(因为第二项 , B1*E_lag1将模型的预测略微推向正确的答案) 。
因此 , 如果模型知道自己的错误 , 那么为什么它不会一直过拟合(换句话说 , 为什么我们不通过不公平地给出一些答案来偏向我们的模型)?除非过度拟合 , 否则MA模型不会固有地产生偏差 , 因为模型误差是独立的并且近似正态分布(误差是随机变量) 。 并且由于它们是随机变量 , 因此误差(E_lag1)可以取大不相同的值 , 具体取决于观察到它们的时间步长 。 误差中固有的噪声意味着仅需一个beta(B1)就能找到一个完美地调整每个误差的B1 , 从而使它们的产品完美地塞住实际Ys和预测Ys之间的每个孔 , 这几乎是不可能的 。 换一种说法 , MA(1)模型只能使用其对错误的了解来非常正确地将自己推向正确的方向 。
当然 , 与任何其他模型一样 , 我们可以通过允许更多功能来过拟合MA模型-在这种情况下 , 它将出现越来越多的滞后错误(这意味着要安装更多的beta) 。 但是 , 这种过拟合模型的性能将超出样本 。
ARIMA实际GDP预测
让我们通过构建一个ARIMA模型来预测实际GDP来将它们放在一起 。 我们将使用ARIMA的statsmodel实现 。 我从FRED(圣路易斯联邦储备银行的数据存储库)中提取了实际GDP数据 。
statsmodel中的ARIMA函数至少需要两个参数:
数据-在这种情况下 , 我们为它提供了一系列原始的真实GDP实际值(由于ARIMA算法会为我们完成此操作 , 因此我们无需事先进行差分) 。 第二个参数order告诉ARIMA函数 , 以下顺序应考虑每种模型类型的多少个组成部分-(AR滞后 , 差异之间的时间步长 , MA滞后) 。让我们检查一下AR(4)模型的外观(没有MA) 。 我们采取1步的差异来使我们的数据稳定:
从statsmodels.tsa.arima_model导入ARIMAmod=ARIMA(master_df['GDP'] , order=(4,1,0))mod.fit()预测=mod.fit() 。 predict()
我们的预测如下图所示 。 如果仔细看 , 橙色线(我们的预测)落后于蓝色线(实际) 。 这不好 。 这意味着我们的预测总是落后于现实 。 因此 , 如果遵循此模型 , 我们总是会落后几步 。 但这是AR模型所期望的 , AR模型试图通过推断最近的过去来预测未来(如果很简单的话) 。
「每日科技果粉」通过时间序列建模ARIMA利用过去来预测未来
文章图片
AR(4)模型
还需要注意的是 , 在本演示中 , 我并没有拆分火车和测试仪 。 我正在使用整个数据集来拟合我的参数(而不是扩展窗口) 。 在实践中 , 我们希望对模型的样本外预测能力进行更强大的测试 。 因此 , 我们希望使用时间点数据(而不是修订的GDP数据)和扩展的窗口回归 , 以便在每个时间步长 , 我们仅使用历史上该点可用的数据来估计参数 。
现在 , 将2个MA组件添加到模型中:
mod=ARIMA(master_df['GDP'] , order=(4,1,2))mod.fit()预测=mod.fit() 。 predict()
通过赋予模型考虑误差的大小和方向的能力 , 我们赋予了模型进行一定程度的修正的能力 。 这是以较长的模型估计过程为代价的-与OLS相比 , MLE需要花费一些时间来收敛 , 而OLS的速度非常快 。 让我们看看我们的新预测如何: