使用ARIMA进行时间序列预测(Python)

27 sec read

前几篇文章介绍了使用时间序列进行预测的大致思路及流程,今天又找到一篇使用ARIMA进行时间序列的文章,处理的流程与先前的有些差异,简单的翻译出来供参考。

导入数据

首先是加载需要使用到的模块:

这里比较特别的是指定matplotlib 的样式

使用的数据为“美国夏威夷莫纳罗亚火山天文台空气样本中大气二氧化碳数据”,该数据手机了1958年3月至2001年12月的二氧化碳样本数据。重要的是statsmodels中自带此部分数据,可通过如下方式获取:

返回如下错误:

经查询,发现此为statsmodels的一个Bug,该版本已在Master分支中修复,但未在released的版本中修复。可以采取的方案是使用源代码方式进行模块的重新安装。这里只是为了做演示,所以直接拷贝了statsmodels模块文件夹下的co2.csv文件进行手动加载。

这里涉及到的内容有:

从绘制的图形看,整体的数据呈上升趋势,并且存在一定的季节性波动。

为ARIMA模型选择最优参数

在先前的时间序列预测完整教程中,详细介绍了ARIMA模型及,对应的(p,d,q)参数,当时介绍的方案是采用ACF和PACF图来确定具体的参数值。这里采用了另外一种方法“网格搜索”,通过迭代不同参数的组合来获取最佳参数。

接下来我们就可以通过不同的参数组合来多ARIMA进行评估。这里会使用到SARIMAX(),在评估和比较不同参数的模型时,我们可以使用AIC值来评估。该值将在模型中直接返回。在这里AIC的值越小,则模型越优。

由于某些参数组合可能会产生数值错误,所以在这里显式地禁用了警告消息,上述代码执行后获得的结果:

从上面返回的结果中,我们发现ARIMA(1, 1, 1)x(1, 1, 1, 12)返回的AIC为277.78,值最小。因此,我们应该认为这是我们所考虑的所有模型中的最佳选择。

拟合ARIMA模型

通过“网格搜索”我们找到了最佳拟合模型的参数,接下里我们将最佳参数值输入到一个新的 SARIMAX 模型:

输出内容为:

从 SARIMAX 输出结果得到的 summary 属性返回大量信息,但我们将把注意力集中在coef列上。在这里每列的P值都币0.05小或接近0.05,因此我们可以保留模型中的所有权重。在拟合季节 ARIMA 模型(以及其他相关的模型)时,重要的是要运行模型诊断,以确保模型所做的假设是正确的。 plot_diagnostics()允许我们快速生成模型诊断并调查任何异常行为。

这里我们主要要确保残差稳定,且平均分布为0。上面的模型诊断表明:

  • 右上角的红色KDE线和黄色N(0,1)线非常的接近(N(0,1)表示,平均值为0,标准差为1),表明残差是正态分布。
  • 左下角对的QQ分位图表明,从N(0,1)的标准正态分布抽取的样本,残差(蓝点)的有序分布服从线性趋势。 同样,这是一个强烈的迹象表明,残差是正态分布。
  • 随着时间的推移(左上图)残差不会显示任何明显的季节性,似乎是白噪声。这通过右下角的自相关(即相关图)证实了这一点,它表明时间序列的残差与其自身的滞后版本有很低的相关性。

这些观察结果使我们得出结论,我们的模型产生了令人满意的结果,可以帮助我们预测未来的数据。

备注:虽然我们得到了令人满意的拟合参数,但是ARIMA模型的一些参数还是可以改变,以改进我们的模型拟合。 例如,我们的网格搜索只考虑受限制的参数组合集,所以如果我们扩大网格搜索,我们可能会找到更好的模型。

验证预测

我们已经获得了我们时间序列的模型,现在可以用来产生预测。 我们首先将预测值与时间序列的实际值进行比较,这将有助于我们了解我们的预测的准确性。 get_prediction()和conf_int()属性允许我们获得时间序列预测的值和相关的置信区间。

代码中设置从1998年1月开始预测,通过dynamic=False设置后续的每一个都是使用1998年1月之前的数据预测生产的。

我们可以绘制二氧化碳时间序列的实际值和预测值,以评估我们做得如何。

总体而言,我们的预测值与真实值保持一致,呈现总体增长趋势。量化我们的预测的准确性也是有用的。 我们将使用MSE(均方误差)来评估预测的准确性。

这里预测的MSE值为0.07,是接近0的非常低的值。0的MSE是估计器将以完美的精度预测参数的观测值,这将是一个理想的场景但通常不可能。在这种情况下,我们只使用时间序列中的信息到某一点,之后,使用先前预测时间点的值生成预测。然而,使用动态预测可以获得更好地表达我们的真实预测能力。 在下面的代码块中,我们指定从1998年1月起开始计算动态预测和置信区间。

我们看到即使使用动态预测,总体预测也是准确的。 所有预测值(红线)与实际值(蓝线)相当吻合,并且在我们预测的置信区间内。我们再次通过计算MSE量化我们预测的预测的准确性:

从动态预测获得的预测值产生的MSE 为1.01。要比非动态要高,这个也在预料之中,原因是可供参考的历史数据较少。

采用动态或非动态的预测都证实了时间序列模型的有效。然而,关于时间序列预测的大部分兴趣是能够及时预测未来价值观。

预测及可视化

在本教程的最后一步,我们将介绍如何利用季节性ARIMA时间序列模型来预测未来的价值。 我们的时间序列对象的get_forecast()属性可以计算预先指定数量的“步数”的预测值。

我们可以使用此代码的输出绘制其未来值的时间序列和预测。

我们所作的预测和相关的置信区间现在都可以用来进一步理解时间序列,并预测将会发生什么。 我们的预测显示,预计时间序列将以稳定的速度持续增长。

总结

上面的代码中主要用到了statsmodels,对于如何使用好statsmodels还需要进一步学习。另外SARIMAX与ARIMA的差异也没有讲清楚。

原文链接::https://www.digitalocean.com/community/tutorials/a-guide-to-time-series-forecasting-with-arima-in-python-3

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

使用Prophet进行时间序列预测

Prophet是Facebook开源的预测工具,相比ARIMA模型,Prophet真的是非常的简单。只要读入两
1 min read

采用时间序列预测股价变化

时间序列简介 在数学上,随机过程被定义为一族时间随机变量,即{x(t),t∈T},其中T表示时间t的变动范围。
5 min read

SARIMAX:季节性ARIMA

在先前的使用Python创建季节性ARIMA模型中,出现了SARIMAX模型。在上一篇的文章中并没有讲清楚SA
18 sec read

发表评论

电子邮件地址不会被公开。 必填项已用*标注