Python 中的 Arima 模型

2025年3月17日 | 阅读13分钟

时间序列预测简介

在恒定时间间隔内记录一个指标的序列被称为时间序列

根据频率,时间序列可以分为以下几类

  1. 年度(例如,年度预算)
  2. 季度(例如,费用)
  3. 月度(例如,空中交通)
  4. 周度(例如,销售数量)
  5. 每日(例如,天气)
  6. 每小时(例如,股票价格)
  7. 分钟级(例如,呼叫中心的呼入电话)
  8. 秒级(例如,网络流量)

一旦我们完成了时间序列分析,我们就必须对其进行预测,以预测该序列未来的值。

然而,为什么需要预测?

因为预测时间序列,如销售和需求,通常具有巨大的商业价值,这增加了预测的需求。

时间序列预测通常在许多制造公司中使用,因为它驱动着主要的业务规划、采购和生产活动。任何预测的错误都会在供应链或任何业务框架中波动。因此,获得准确的预测对于节省成本和成功至关重要。

时间序列预测背后的概念和技术也可以应用于任何业务,包括制造业。

时间序列预测可以大致分为两类

  1. 单变量时间序列预测: 单变量时间序列预测是一种时间序列预测,我们仅利用时间序列的先前值来猜测未来的值。
  2. 多变量时间序列预测: 多变量时间序列预测是一种时间序列预测,我们利用该序列以外的预测变量(也称为外生变量)来进行预测。

在下面的教程中,我们将理解一种特定的方法,称为ARIMA建模

自回归整合移动平均(Auto Regressive Integrated Moving Average),缩写为ARIMA,是一种基于时间序列的先前值本身可以用来预测未来值的概念的预测算法。

让我们详细了解ARIMA模型。

ARIMA模型简介

ARIMA,是“自回归整合移动平均”('Auto Regressive Integrated Moving Average')的缩写,是一类模型,它根据给定的时间序列的先前值——其滞后值和预测中的滞后误差来“展示”该时间序列,以便该方程可以用于预测未来值。

我们可以使用ARIMA模型对任何非季节性、表现出模式且不是随机白噪声的时间序列进行建模。

一个ARIMA模型由三个项来表征

p, q, 和 d

其中,

  • p = AR项的阶数
  • q = MA项的阶数
  • d = 使时间序列平稳所需的差分次数

如果一个时间序列具有季节性模式,我们必须插入季节性周期,它就变成了SARIMA,即“季节性ARIMA”('Seasonal ARIMA')的简称。

现在,在理解“AR项的阶数”之前,让我们先讨论'd'项。

ARIMA模型中的'p', 'q', 和'd'是什么?

为了建立ARIMA模型,首要步骤是使时间序列平稳。这是因为ARIMA中的“自回归”一词意味着一个使用其滞后值作为预测变量的线性回归模型。而我们已经知道,线性回归模型对于独立且不相关的预测变量效果很好。

为了使序列平稳,我们将使用最常见的方法,即从当前值中减去过去的值。有时,根据序列的复杂性,可能需要多次减法。

因此,d的值是使序列平稳所需的最小减法次数。如果时间序列已经是平稳的,那么d就为0。

现在,让我们来理解'p'和'q'这两个项。

'p'是“AR”(自回归)项的阶数,这意味着要用作预测变量的Y的滞后数。同时,'q'是“MA”(移动平均)项的阶数,这意味着在ARIMA模型中应使用的滞后预测误差的数量。

现在,让我们详细了解什么是'AR'和'MA'模型。

理解自回归(AR)和移动平均(MA)模型

在以下部分,我们将讨论AR和MA模型以及这些模型的实际数学公式。

一个纯AR(仅自回归)模型是一个只依赖于自身滞后值的模型。因此,我们也可以得出结论,它是'Yt的滞后值'的函数

Arima Model in Python

其中,Yt-1是序列的lag1。β1是lag1的系数,α是模型计算的截距项。

类似地,一个纯MA(仅移动平均)模型是一个Yt仅依赖于滞后预测误差的模型。

Arima Model in Python

其中,误差项是相应滞后的AR模型的误差。误差ϵt和ϵt-1来自以下方程

Arima Model in Python

因此,我们分别总结了自回归(AR)和移动平均(MA)模型。

现在让我们来理解ARIMA模型的方程。

一个ARIMA模型是时间序列为了使其平稳而至少被减去一次,并且我们结合了自回归(AR)和移动平均(MA)项的模型。因此,我们得到以下方程

Arima Model in Python

用文字描述的ARIMA模型

预测的 Yt = 常数 + Y的滞后值的线性组合(最多p个滞后) + 滞后预测误差的线性组合(最多q个滞后)

因此,该模型的目标是找到p、qd的值。但是,我们如何找到它们呢?

让我们从找到ARIMA模型中的'd'开始。

在ARIMA模型中找到差分阶数'd'

ARIMA模型中差分的主要目的是使时间序列平稳。

然而,我们必须注意不要过度差分序列,因为过度差分的序列也可能是平稳的,这将在之后影响模型的参数。

现在,让我们来理解合适的差分阶数。

最合适的差分阶数是获得一个围绕确定均值波动的近似平稳序列,并且ACF图相对较快地达到零所需的最小差分。

如果自相关对于多个滞后(通常是十个或更多)是正的,那么序列需要进一步差分。相反,如果滞后1的自相关本身是相当负的,那么该序列可能被过度差分了。

在无法确定两个差分阶数之间的情况下,我们必须选择在差分序列中提供较小标准差的阶数。

让我们考虑一个例子来检查序列是否平稳。我们将使用Python编程语言statsmodels包中的增强迪基-福勒检验(adfuller())

示例

输出

Augmented Dickey-Fuller Statistic: -2.464240
p-value: 0.124419

说明

在上面的例子中,我们导入了adfuller模块以及numpy的log模块和pandas。然后我们使用pandas库读取CSV文件。接着我们使用了adfuller方法并将值打印给用户。

有必要检查序列是否平稳。如果不是,我们必须使用差分;否则,d变为

增强迪基-福勒(ADF)检验的原假设是时间序列不平稳。因此,如果ADF检验的p值小于显著性水平(0.05),那么我们将拒绝原假设并推断时间序列绝对是平稳的。正如我们可以观察到的,p值比显著性水平大得多。因此,我们可以对序列进行差分并检查自相关图,如下所示。

示例

输出

Arima Model in Python

说明

在上面的例子中,我们导入了所需的库和模块。然后我们导入了数据并绘制了不同的图表。我们绘制了原始序列图、一阶差分图和二阶差分图,以及它们的自相关图。我们可以观察到,时间序列在两次差分后达到了平稳性。然而,当我们查看二阶差分的自相关图时,滞后很快进入了远负区域,这表明序列可能被过度差分了。

因此,我们将暂时固定差分阶数,因为序列不是完全平稳的,或者我们可以说序列具有弱平稳性。

这可以如下所示完成。

示例

输出

ADF Test = 2
KPSS Test = 0
PP Test = 2

说明

在上面的例子中,我们导入了pmdarima模块的ndiffs方法。然后我们导入了数据集并定义了'X'作为包含数据集中值的对象。我们使用ndiffs方法执行ADF、KPSS和PP检验,并将其结果打印给用户。

寻找自回归(AR)项的阶数(p)

在下面的部分,我们将讨论检查模型是否需要任何自回归(AR)项的步骤。所需的AR项数量可以通过研究偏自相关(PACF)图来找到。

我们可以将偏自相关视为在排除了中间滞后的贡献后,序列与其滞后之间的相关性。因此,PACF倾向于传达序列与其滞后之间的纯粹相关性。因此,我们可以确定该滞后是否需要在自回归(AR)项中。

一个序列的滞后(k)的偏自相关是Y的自回归方程中该滞后的系数。

Arima Model in Python

现在,让我们了解如何找到AR项的数量?

正如我们所知,平稳序列中的任何自相关都可以通过插入足够的AR项来纠正。因此,我们最初可以将自回归(AR)项的阶数等同于在PACF图中超过显著性限制的滞后数量。

示例

输出

Arima Model in Python

说明

在上面的例子中,我们导入了所需的库、模块和数据集。然后我们绘制了图表来表示一阶差分及其偏自相关。

结果,我们可以观察到PACF滞后1在显著性线上方非常显著。滞后2似乎也很重要,完全维持在显著性限制(蓝色区域)之上。然而,我们将保守地将p暂定为1。

寻找移动平均(MA)项的阶数(q)

与我们之前查看PACF图以确定自回归(AR)项数量类似,我们可以使用ACF图来找到移动平均(MA)项的数量。移动平均(MA)项在理论上是滞后预测的误差。

ACF图表示了消除平稳序列中自相关所需的移动平均(MA)项的数量。

让我们考虑以下示例来理解差分序列的自相关图。

示例

输出

Arima Model in Python

说明

在上面的示例中,我们导入了所需的库、模块和数据集。然后我们绘制了图表以表示一阶差分及其自相关性。结果,我们可以观察到一些滞后项远高于显著性线。因此,让我们暂定 q 为 2。在有疑问的情况下,我们也可以使用能充分解释 Y 的更简单的模型。

处理轻微欠差分或过差分的时间序列

有时,可能会出现一种情况,即序列轻微欠差分,再多差分一次会使序列变得有些过差分。在这种情况下,对于轻微欠差分的时间序列,我们必须添加一个或多个额外的自回归(AR)项;对于轻微过差分的时间序列,则添加一个额外的移动平均(MA)项。

一旦我们讨论了大部分主题,让我们开始为时间序列预测创建一个ARIMA模型。

构建ARIMA模型

一旦我们确定了p、q和d的值,我们将尝试创建ARIMA模型。ARIMA()模块的实现如下所示

示例

输出

ARIMA Model Results
==============================================================================
Dep. Variable:                D.value   No. Observations:                   99
Model:                 ARIMA(1, 1, 2)   Log Likelihood                -253.790
Method:                       css-mle   S.D. of innovations              3.119
Date:                Thu, 15 Apr 2021   AIC                            517.579
Time:                        21:10:37   BIC                            530.555
Sample:                             1   HQIC                           522.829

=================================================================================
                    coef    std err          z      P>|z|      [0.025      0.975]
---------------------------------------------------------------------------------
const             1.1202      1.290      0.868      0.385      -1.409       3.649
ar.L1.D.value     0.6351      0.257      2.469      0.014       0.131       1.139
ma.L1.D.value     0.5287      0.355      1.489      0.136      -0.167       1.224
ma.L2.D.value    -0.0010      0.321     -0.003      0.998      -0.631       0.629
                                    Roots
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.5746           +0.0000j            1.5746            0.0000
MA.1           -1.8850           +0.0000j            1.8850            0.5000
MA.2          545.5472           +0.0000j          545.5472            0.0000
-----------------------------------------------------------------------------

说明

在上面的示例中,我们从statsmodels类中导入了一个名为ARIMA的新模块,并创建了一个阶数为1、1和2的ARIMA模型。然后我们向用户打印了模型的摘要。正如我们可以观察到的,模型概览揭示了大量细节。中间的表是系数表,其中'coef'值充当相关项的权重。

我们还可以注意到,MA2项的系数趋于零,并且在'P > |z|'列中的P值非常不显著。理想情况下,P值应小于0.05,以使相应的X显著。

现在,让我们尝试在没有MA2项的情况下重建模型。

示例

输出

ARIMA Model Results
==============================================================================
Dep. Variable:                D.value   No. Observations:                   99
Model:                 ARIMA(1, 1, 1)   Log Likelihood                -253.790
Method:                       css-mle   S.D. of innovations              3.119
Date:                Thu, 15 Apr 2021   AIC                            515.579
Time:                        21:34:00   BIC                            525.960
Sample:                             1   HQIC                           519.779

=================================================================================
                    coef    std err          z      P>|z|      [0.025      0.975]
---------------------------------------------------------------------------------
const             1.1205      1.286      0.871      0.384      -1.400       3.641
ar.L1.D.value     0.6344      0.087      7.317      0.000       0.464       0.804
ma.L1.D.value     0.5297      0.089      5.932      0.000       0.355       0.705
                                    Roots
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.5764           +0.0000j            1.5764            0.0000
MA.1           -1.8879           +0.0000j            1.8879            0.5000
-----------------------------------------------------------------------------

说明

在上面的例子中,我们降低了模型的AIC,这实际上是好的。我们还可以观察到AR1和MA1项的P值已经得到改善,并且非常显著(远小于0.05)。

现在,让我们绘制残差图,以确保没有模式,如恒定的均值和方差。

示例

输出

Arima Model in Python

说明

在上面的例子中,我们绘制了残差误差和密度图。我们可以观察到残差误差看起来不错,均值在零附近,方差均匀。让我们借助plot_predict()函数绘制表示实际值与拟合值的图。

示例

输出

Arima Model in Python

说明

在上面的例子中,我们现在绘制了“实际值 vs 拟合值”图,并设置 dynamic = False。结果,样本内的滞后值被用于预测。

因此,模型会一直训练到过去的值做出下一次预测。因此,它可以创建拟合的预测,并且实际值看起来非常精确。


下一个主题Python模运算符