时序分析 32

时序预测 从ARIMA到SARIMAX

    上一篇文章中我们介绍了SARIMA模型,相比于ARIMA模型,SARIMA考虑了季节性因素。读过上篇文章的细心读者会发现,python的statsmodels对sarima的支持对象名为SARIMAX。事实上,确实存在一个时序分析模型称为SARIMAX(Seasonal Auto-Regressive Integrated Moving Average with eXogenous factors),对比于SARIMA,所多的这个’X’代表exogenous,也就是说SARIMAX可考虑其他外部变量来协助对该时序数据进行建模。这种情况也是经常会出现的。

    本篇博文会结合一个例子来重新梳理一下时序分析预测中,从ARIMA -> SARIMA -> SARIMAX的整个过程。顺便说一下,另外一个时序模型名为ARIMAX;不言而喻,该模型就是在ARIMA模型的基础上增加了可考虑外部变量。

    本篇博文中所采用的数据是沃尔玛的销售数据集,可以从kaggle(https://www.kaggle.com/competitions/demand-forecasting-kernels-only)上获得。 此数据集中有5年的销售数据,分位train.csv和test.csv。本节我们的任务就是对此数据集进行时序建模并预测。

理论回顾

    上篇关于SARIMA的文章中,笔者并没有详细介绍SARIMA背后的数学模型。本文我们对比ARIMA模型简单介绍一下。这里面的数学比较复杂,读者不用太过在意,对此无兴趣的读者可略过这段内容。

加性模型和乘性模型

我们先简单介绍一下加性模型和乘性模型。

  • 加性模型: x t = T r e n d + S e a s o n a l + R a n d o m x_t=Trend+Seasonal+Random xt​=Trend+Seasonal+Random
  • 乘性模型: x t = T r e n d ∗ S e a s o n a l ∗ R a n d o m x_t=Trend*Seasonal*Random xt​=Trend∗Seasonal∗Random
    这里的 Random 项在时序分解中经常被认为是不规则项,不一定就是随机因素。
    加性模型一般适用于季节性波动随着时间保持稳定;而乘性模型相对适用于季节波动随着时间会变大。

A R I M A ( 1 , 1 , 1 ) ARIMA(1,1,1) ARIMA(1,1,1):

   ARIMA是一个加性模型(Additive Model),ARIMA(1,1,1)可以被下式描述,
Δ y t = c + ϕ 1 Δ y t − 1 + θ 1 ϵ t − 1 + ϵ t \Delta y_t = c + \phi_1 \Delta y_{t-1} + \theta_1 \epsilon_{t-1} + \epsilon_{t} Δyt​=c+ϕ1​Δyt−1​+θ1​ϵt−1​+ϵt​
上式中 Δ \Delta Δ 是一阶差分操作符, ϵ t ∼ N ( 0 , σ 2 ) \epsilon_{t} \sim N(0, \sigma^2) ϵt​∼N(0,σ2)
,上式可以改写成 ( 1 − ϕ 1 L ) Δ y t = c + ( 1 + θ 1 L ) ϵ t (1 - \phi_1 L ) \Delta y_t = c + (1 + \theta_1 L) \epsilon_{t} (1−ϕ1​L)Δyt​=c+(1+θ1​L)ϵt​
L L L是滞后算子(lag operator),其运算规则为 L y t = y t − 1 , L 2 y t = y t − 2 Ly_t=y_{t-1},L^2y_t=y_{t-2} Lyt​=yt−1​,L2yt​=yt−2​

S A R I M A ( p , d , q ) × ( P , D , Q ) s SARIMA(p,d,q)\times (P,D,Q)_s SARIMA(p,d,q)×(P,D,Q)s​

   大多数SARIMA模型是一个乘性模型(Multiplicative Model),可以泛化为下式:
ϕ p ( L ) ϕ ~ P ( L s ) Δ d Δ s D y t = A ( t ) + θ q ( L ) θ ~ Q ( L s ) ϵ t \phi_p (L) \tilde \phi_P (L^s) \Delta^d \Delta_s^D y_t = A(t) + \theta_q (L) \tilde \theta_Q (L^s) \epsilon_t ϕp​(L)ϕ~​P​(Ls)ΔdΔsD​yt​=A(t)+θq​(L)θ~Q​(Ls)ϵt​
或者
ϕ p ( L ) ϕ ~ P ( L s ) y t ∗ = A ( t ) + θ q ( L ) θ ~ Q ( L s ) ϵ t \phi_p (L) \tilde \phi_P (L^s) y_t^* = A(t) + \theta_q (L) \tilde \theta_Q (L^s) \epsilon_t ϕp​(L)ϕ~​P​(Ls)yt∗​=A(t)+θq​(L)θ~Q​(Ls)ϵt​
y t ∗ = Δ d Δ s D y t y_t^* = \Delta^d \Delta_s^D y_t yt∗​=ΔdΔsD​yt​

这里,

  • ϕ p ( L ) \phi_p (L) ϕp​(L) 是非季节性自回归滞后多项式 :捕获非季节性自回归因素。
  • ϕ ~ P ( L s ) \tilde \phi_P (L^s) ϕ~​P​(Ls)是季节性自回归滞后多项式:捕获季节性回归因素。
  • Δ d Δ s D y t \Delta^d \Delta_s^D y_t ΔdΔsD​yt​ 是时序数据 d d d 阶差分;季节性 D D D 阶差分:提供时序平稳化功能。
  • A ( t ) A(t) A(t) 为趋势多项式:包括截距项
  • θ q ( L ) \theta_q (L) θq​(L) 是非季节性移动平均滞后多项式:
  • θ ~ Q ( L s ) \tilde \theta_Q (L^s) θ~Q​(Ls) 是季节性移动平均滞后多项式

假设我们有一个 S A R I M A ( 2 , 1 , 0 ) × ( 1 , 1 , 0 ) 1 2 SARIMA(2,1,0)\times (1,1,0)_12 SARIMA(2,1,0)×(1,1,0)1​2 包含截距项, 我们有

  • ϕ p ( L ) = ( 1 − ϕ 1 L − ϕ 2 L 2 ) \phi_p (L) = (1 - \phi_1 L - \phi_2 L^2) ϕp​(L)=(1−ϕ1​L−ϕ2​L2)
  • ϕ ~ P ( L s ) = ( 1 − ϕ 1 L 1 2 ) \tilde \phi_P (L^s) = (1 - \phi_1 L^12) ϕ~​P​(Ls)=(1−ϕ1​L12)
  • d = 1 , D = 1 , s = 12 d = 1, D = 1, s=12 d=1,D=1,s=12 意味着 y t ∗ y_t^* yt∗​ 是经过一阶差分和季节性(12个月)差分所得到的
  • A ( t ) = c A(t) = c A(t)=c 意味着趋势多项式就是一个截距项。
  • θ q ( L ) = θ ~ Q ( L s ) = 1 \theta_q (L) = \tilde \theta_Q (L^s) = 1 θq​(L)=θ~Q​(Ls)=1 无移动平均效果

那么,SARIMA泛化公式就会变为
( 1 − ϕ 1 L − ϕ 2 L 2 ) ( 1 − ϕ ~ 1 L 12 ) Δ Δ 12 y t = c + ϵ t (1 - \phi_1 L - \phi_2 L^2) (1 - \tilde \phi_1 L^{12}) \Delta \Delta_{12} y_t = c + \epsilon_t (1−ϕ1​L−ϕ2​L2)(1−ϕ~​1​L12)ΔΔ12​yt​=c+ϵt​
= > => =>
( 1 − ϕ 1 L − ϕ 2 L 2 − ϕ ~ 1 L 12 + ϕ 1 ϕ ~ 1 L 13 + ϕ 2 ϕ ~ 1 L 14 ) y t ∗ = c + ϵ t (1 - \phi_1 L - \phi_2 L^2 - \tilde \phi_1 L^{12} + \phi_1 \tilde \phi_1 L^{13} + \phi_2 \tilde \phi_1 L^{14} ) y_t^* = c + \epsilon_t (1−ϕ1​L−ϕ2​L2−ϕ~​1​L12+ϕ1​ϕ~​1​L13+ϕ2​ϕ~​1​L14)yt∗​=c+ϵt​
= > => =>
y t ∗ = c + ϕ 1 y t − 1 ∗ + ϕ 2 y t − 2 ∗ + ϕ ~ 1 y t − 12 ∗ − ϕ 1 ϕ ~ 1 y t − 13 ∗ − ϕ 2 ϕ ~ 1 y t − 14 ∗ + ϵ t y_t^* = c + \phi_1 y_{t-1}^* + \phi_2 y_{t-2}^* + \tilde \phi_1 y_{t-12}^* - \phi_1 \tilde \phi_1 y_{t-13}^* - \phi_2 \tilde \phi_1 y_{t-14}^* + \epsilon_t yt∗​=c+ϕ1​yt−1∗​+ϕ2​yt−2∗​+ϕ~​1​yt−12∗​−ϕ1​ϕ~​1​yt−13∗​−ϕ2​ϕ~​1​yt−14∗​+ϵt​

   我们可以看到,最后的结果也类似于加性模型,但是系数实际上是非季节性和季节性参数的乘性组合。

SARIMAX

   虽然本篇文章旨在引出SARIMAX,但其基本原理与ARIMAX类同,只是多了季节性因素而已。为了简单介绍引入外部变量的原理和方法,我们在理论部分着重介绍ARMAX,先忽略季节因素和差分(假设时序平稳)。
   模型名称中的’X’,主要是指外部变量。也就是说,你需要实时知道 t t t 时刻的外部变量的值 x t x_t xt​。
   ARMAX模型最简单的方案就是把外部变量 x t x_t xt​ 当成一个依赖变量,加入到ARMA的回归方程中,如下:
y t = β x t + ϕ 1 y t − 1 + ⋯ + ϕ p y t − p − θ 1 z t − 1 − ⋯ − θ q z t − q − z t y_t = \beta x_t + \phi_1 y_{t-1} + \cdots + \phi_p y_{t-p} - \theta_1 z_{t-1} - \dots - \theta_q z_{t-q} - z_t yt​=βxt​+ϕ1​yt−1​+⋯+ϕp​yt−p​−θ1​zt−1​−⋯−θq​zt−q​−zt​
这里的减号其实并没有关系,只是为了后续推导便利。
    x t x_t xt​ 就是外部变量, β \beta β 为其回归系数。这种方式看上去很直接,但是最大的缺点是回归系数 β \beta β 很难解释。 β \beta β 的值不能解释为 x t x_t xt​ 增加1, y t y_t yt​ 所增加的值。回归方程中的滞后项表示 β \beta β 只能被解释为条件于响应变量前面的值,这非常不直观。

   我们使用滞后算子来改写一下,
ϕ ( L ) y t = β x t + θ ( L ) z t or y t = β ϕ ( L ) x t + θ ( L ) ϕ ( L ) z t , \phi(L)y_t = \beta x_t + \theta(L)z_t \qquad\text{or}\qquad y_t = \frac{\beta}{\phi(L)}x_t + \frac{\theta(L)}{\phi(L)}z_t, ϕ(L)yt​=βxt​+θ(L)zt​oryt​=ϕ(L)β​xt​+ϕ(L)θ(L)​zt​,
这里, ϕ ( L ) = 1 − ϕ 1 L − ⋯ − ϕ p L p \phi(L)=1-\phi_1L -\cdots - \phi_pL^p ϕ(L)=1−ϕ1​L−⋯−ϕp​Lp,且 θ ( L ) = 1 − θ 1 L − ⋯ − θ q L q \theta(L)=1-\theta_1L-\cdots-\theta_qL^q θ(L)=1−θ1​L−⋯−θq​Lq

注意到自回归系数(AR)混入了外部变量系数和误差项系数。
我们可以考虑回归ARMA模型的误差,
y t = β x t + n t y_t = \beta x_t + n_t yt​=βxt​+nt​
n t = ϕ 1 n t − 1 + ⋯ + ϕ p n t − p − θ 1 z t − 1 − ⋯ − θ q z t − q + z t n_t = \phi_1 n_{t-1} + \cdots + \phi_p n_{t-p} - \theta_1 z_{t-1} - \dots - \theta_q z_{t-q} + z_t nt​=ϕ1​nt−1​+⋯+ϕp​nt−p​−θ1​zt−1​−⋯−θq​zt−q​+zt​
这种形势下,回归系数就可以以其通用解释方法来解释。以滞后算子表示如下,
y t = β x t + θ ( L ) ϕ ( L ) z t . y_t = \beta x_t + \frac{\theta(L)}{\phi(L)}z_t. yt​=βxt​+ϕ(L)θ(L)​zt​.

Box和Jenkis带来一个使用转换函数的泛化模型,
y t = β ( L ) v ( L ) x t + θ ( L ) ϕ ( L ) z t . y_t = \frac{\beta(L)}{v(L)} x_t + \frac{\theta(L)}{\phi(L)}z_t. yt​=v(L)β(L)​xt​+ϕ(L)θ(L)​zt​.
这种形式允许外部变量或称为协变量的作用恨到(通过 β ( L ) \beta(L) β(L),或者使协变量的衰减效果很大(通过 V ( L ) V(L) V(L))

有时我们将这种回归方式称为动态回归模型(dynamic regression models).
对于非平稳时序,我们只需要将公式中的 ϕ ( B ) \phi(B) ϕ(B) 替换成 ∇ d ϕ ( B ) \nabla^d\phi(B) ∇dϕ(B),这里 ∇ = ( 1 − B ) \nabla=(1-B) ∇=(1−B),模型就转变成了ARIMAX; 最后我们只需要增加季节性因子就变成了SARIMAX,模型方程如下:
y t = β t x t + u t y_t = \beta_t x_t + u_t yt​=βt​xt​+ut​
ϕ p ( L ) ϕ ~ P ( L s ) Δ d Δ s D u t = A ( t ) + θ q ( L ) θ ~ Q ( L s ) ϵ t \phi_p (L) \tilde \phi_P (L^s) \Delta^d \Delta_s^D u_t = A(t) + \theta_q (L) \tilde \theta_Q (L^s) \epsilon_t ϕp​(L)ϕ~​P​(Ls)ΔdΔsD​ut​=A(t)+θq​(L)θ~Q​(Ls)ϵt​

未完,待续…

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐