Python机器学习—时间序列

介绍

ARIMA(差分自回归移动平均模型)是一种经典的时间序列分析方法,常用于预测和分析时间变化的数据。核心思想是通过对历史数据进行分析和建模,然后使用该模型对未来的数据进行预测。对于给定的时间序列数据,可以使用最小二乘法、极大似然估计等方法来估计模型的参数。主要包括三个部分:自回归AR、差分I和移动平均MA。

  1. 差分(I): 差分操作用于处理非平稳时间序列数据,将其转化为平稳序列。平稳序列的特点是均值和方差保持不变,且时间间隔上的相关性不会随时间发生改变。差分操作通过减去相邻时间点的值,将原始序列转化为平稳序列。一般会迭代进行差分操作,直到得到平稳序列。将差分操作应用于非平稳时间序列后可以表示为ARIMA(p,d,0)。

  2. 自回归(AR): 模型中当前值与前面的观测值之间的线性关系,用来描述数据之间的依赖关系。AR模型假设当前值的线性组合由前p个历史观测值决定。AR§模型的数学表示为:

    Y t = c + φ 1 ∗ Y t − 1 + φ 2 ∗ Y t − 2 + . . . + φ p ∗ Y t − p + ε t Y_t = c + φ_1 * Y_{t-1} + φ_2 * Y_{t-2} + ... + φ_p * Y_{t-p} + ε_t Yt=c+φ1Yt1+φ2Yt2+...+φpYtp+εt

    其中 Y t Y_t Yt表示当前值, φ 1 , φ 2 , . . . , φ p φ_1, φ_2, ..., φ_p φ1,φ2,...,φp表示相关系数, ε t ε_t εt表示误差项,c是一个常数。

  3. 移动平均(MA): 移动平均模型用于描述当前值与过去的随机误差之间的线性关系,用来描述数据中的随机波动。。MA模型将当前值的线性组合表示为过去q个误差项的加权和。MA(q)模型的数学表示为:

    Y t = c + ε t + θ 1 ∗ ε t − 1 + θ 2 ∗ ε t − 2 + . . . + θ q ∗ ε t − q Y_t = c + ε_t + θ_1 * ε_{t-1} + θ_2 * ε_{t-2} + ... + θ_q * ε_{t-q} Yt=c+εt+θ1εt1+θ2εt2+...+θqεtq

    其中 ε t ε_t εt表示当前时刻的误差项, θ 1 , θ 2 , . . . , θ q θ_1, θ_2, ..., θ_q θ1,θ2,...,θq表示相关系数,c是一个常数。

ARIMA模型是根据时间序列数据的自相关性和差分操作来建立模型。根据数据的特点和趋势选择适当的参数,一般使用ARIMA(p,d,q)来表示,其中p表示自回归项的阶数,d表示差分操作的次数,q表示移动平均项的阶数:

Y t = c + φ 1 ∗ Y t − 1 + φ 2 ∗ Y t − 2 + . . . + φ p ∗ Y t − p + ε t + θ 1 ∗ ε t − 1 + θ 2 ∗ ε t − 2 + . . . + θ q ∗ ε t − q Y_t = c + φ_1 * Y_{t-1} + φ_2 * Y_{t-2} + ... + φ_p * Y_{t-p} + ε_t + θ_1 * ε_{t-1} + θ_2 * ε_{t-2} + ... + θ_q * ε_{t-q} Yt=c+φ1Yt1+φ2Yt2+...+φpYtp+εt+θ1εt1+θ2εt2+...+θqεtq

模型

自回归模型AR

自回归模型描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。

  • 公式:
    在这里插入图片描述

  • 参数:

    • y t y_t yt:当前值
    • μ μ μ:常数项,序列的均值。
    • p p p:阶数,表示间隔。如p=1代表今天和昨天,p=2代表今天和前天
    • γ i \gamma_i γi:自相关系数
    • e t e_t et:误差,即白噪声序列
  • **本质:**当前值 = 过去值的加权求和。

  • 缺点:

    • 自回归模型是用自身的数据进行预测
    • AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)
    • 时间序列数据必须具有平稳性
    • 自回归只适用于预测与自身前期相关的现象
    • 必须具有相关性,如果自相关系数 γ i \gamma_i γi小于0.5,则不宜采用

移动平均模型MA

  • **公式:**q阶自回归过程的公式定义为,

    在这里插å
¥å›¾ç‰‡æè¿°

    • q:阶数,和p类似,也是表示时间的间隔。
  • **本质:**过去的白噪声序列的移动平均

  • 移动平均过程其实可以作为自回归过程的补充,解决自回归方差中白噪声的求解问题

  • 移动平均具有滞后性

  • 优点:能有效地消除预测中的随机波动。

自回归移动平均模型ARMA

自回归模型AR和移动平均模型MA模型相结合,我们就得到了自回归移动平均模型ARMA(p,q)

  • 公式:

    在这里插å
¥å›¾ç‰‡æè¿°

  • 该式表明:

    • 一个随机时间序列可以通过一个自回归移动平均模型来表示,即该序列可以由其自身的过去或滞后值以及随机扰动项来解释。
    • 如果该序列是平稳的,即它的行为并不会随着时间的推移而变化,那么我们就可以通过该序列过去的行为来预测未来。
  • 优点:自回归过程负责量化当前数据与前期数据之间的关系,移动平均过程负责解决随机变动项的求解问题。因此,该模型更为有效和常用。

差分自回归移动平均模型ARIMA

AR/MA/ARMA模型适用于平稳时间序列的分析,当时间序列存在上升或下降趋势时,这些模型的分析效果就大打折扣了,这时差分自回归移动平均模型也就应运而生。

  • 参数ARIMA(p,d,q):

    • p:自回归项数,代表预测模型中采用的时序数据本身的滞后数(lags) ,也叫AR项
    • d:使之成为平稳序列所做的差分次数(阶数)
    • q:滑动平均项数,代表预测模型中采用的预测误差的滞后数(lags),也叫做MA项
  • 与ARMA模型的区别

    • ARMA模型是针对平稳时间序列建立的模型。

    • ARIMA模型是针对非平稳时间序列建模。

    • 换句话说,非平稳时间序列要建立ARMA模型,首先需要经过差分转化为平稳时间序列,然后建立ARMA模型。

    • 公式左边的x变成差分算子,保证数据的稳定性。img

      • 差分算子:

      img w t w_t wt为: w t = Δ d x t = ( 1 − L ) d x t w_t=\Delta^dx_t=(1-L)^dx_t wt=Δdxt=(1L)dxt ,则ARIMA可写成

      w t = ϕ 1 w t − 1 + ϕ 2 w t − 2 + . . . + ϕ p w t − p + μ t + θ 1 μ t − 1 + θ 2 μ t − 2 + . . . + θ q μ t − q w_t=\phi_1w_{t-1}+\phi_2w_{t-2}+...+\phi_pw_{t-p}+\mu_t+\theta_1\mu_{t-1}+\theta_2\mu_{t-2}+...+\theta_q\mu_{t-q} wt=ϕ1wt1+ϕ2wt2+...+ϕpwtp+μt+θ1μt1+θ2μt2+...+θqμtq

  • 优点: 模型简单,只需要内生变量而不需要借助其他外生变量

  • 缺点: 要求时序数据是稳定的,或者通过差分化之后是稳定的;本质上只能捕捉线性关系,不能捕捉非线性关系

自相关性

概述

  • 通常来讲,时间序列一般由固定趋势、季节性变动和随机因素组成。如果时间序列的随机因素在各时间点上完全独立没有任何联系,那么我们很难对这一部分进行建模。幸运的是,对于一般的时间序列,在剔除固定趋势和季节效应后,时间序列在不同时点上是存在相关性的,这种自相关特征是我们对时间序列建模的基础。
  • 在统计学中,我们用相关系数表示两个变量之间的相关性,在时间序列中一个重要问题是研究序列之间是如何相互影响的。与统计学的相关系数类似,在时序分析中采用相似的方法来表示时间序列的自相关特征。通过自相关函数图可以清楚地看到时间序列的自相关特征,这种特征是建模的基础。
  • 如果没有了自相关性,那么就成了白噪声。
  • 相关性:
    • 两个自变量x、y若变化趋势相同,则为+1
    • 若变化趋势相反,则为-1
    • 若变量间没有关系,则为0

ACF函数

自相关函数,描述的是时间序列观测值性相关性,反映了同一序列在不同时序的取值之间的相关性

  • 公式: A C F ( k ) = p k = C o v ( r t , r t − k ) V a r ( r t ) V a r ( r t − k ) = C o v ( r t , r t − k ) V a r ( r t ) ACF(k)=p_k=\frac{Cov(r_t,r_{t-k})}{\sqrt{Var(r_t)Var(r_{t-k})}}=\frac{Cov(r_t,r_{t-k})}{Var(r_t)} ACF(k)=pk=Var(rt)Var(rtk) Cov(rt,rtk)=Var(rt)Cov(rt,rtk)

    • k:滞后期数,若k=2,表示 r t r_t rt r t − 2 r_{t-2} rt2
    • p k p_k pk取值范围:[-1,1]1表示正相关,-1表示负相关,0表示无关
    • 这里运用到了弱平稳序列的性质 V a r ( r t ) = V a r ( r t − k ) Var(r_t)=Var(r_{t-k}) Var(rt)=Var(rtk)
  • 置信区间(蓝色虚线):置信区间为95%,即当前样本有一百个,其中95个样本符合当前的逻辑

    在这里插å
¥å›¾ç‰‡æè¿°

  • 缺点:自相关系数 p k p_k pk里实际掺杂了其他变量对x(t)与x(t-k)的影响

PACF函数

偏自相关函数,描述的是在给定中间观测值的条件下,时间序列观测值预期过去的观测值之间的线性相关性。

  • 假设k=3,则描述的是 y t y_t yt y t − 3 y_{t-3} yt3之间的相关性,但是这个相关性还受到 y t − 1 y_{t-1} yt1 y t − 2 y_{t-2} yt2的影响。
  • 优点:剔除了中间 k − 1 k-1 k1个随机变量 y t − 1 , y t − 2 . . . y t − k + 1 y_{t-1},y_{t-2}...y_{t-k+1} yt1,yt2...ytk+1的干扰之后, y t − k y_{t-k} ytk y t y_t yt影响的相关程度,所以最终得到的结果这两个变量之间严格的相关性

拖尾和截尾

  • 拖尾指序列以指数率单调递减或震荡衰减,而截尾指序列从某个时点变得非常小(不显著非0)

    • 图中的横线是 0 ± 两倍标准差 0±两倍标准差 0±两倍标准差
  • 拖尾判定:出现以下情况,通常视为(偏)自相关系数拖尾:

    • 如果有超过5%的样本(偏)自相关系数都落入2倍标准差范围之外
    • 有显著非0的(偏)自相关系数衰减为小值波动的过程比较缓慢或非常连续。
      -
  • **截尾判定:**出现以下情况,通常视为(偏)自相关系数d阶截尾,

    • 在最初的d阶明显大于2倍标准差范围
    • 之后几乎95%的(偏)自相关系数都落在2倍标准差范围以内
    • 且由非零自相关系数衰减为在零附近小值波动的过程非常突然
      -

白噪声

  • 白噪声是由一组0均值,不变方差,相互独立的元素构成,当然可以对该元素的分布进行假设(如高斯分布)。白噪声如同他的名字听起来一样是杂乱无章的,各元素之间没有任何联系。由白噪声组成的序列是随机游走,随机游走序列的自相关特点是其自相关函数几乎为1并且衰减很慢,这种特征我们称为长记忆性。
  • 白噪声表示数据之间没有相关性,如果时间序列都是由白噪声数据构成的,那么时间序列的数据就不能是自相关的。
  • 如果数据没有自相关性,那么就成了白噪声。
  • **随机噪声:**它是时间序列中除去趋势、季节变化和自相关性之后的剩余随机扰动。由于时间序列存在不确定性,随机噪声总是夹杂在时间序列中,致使时间序列表现出某种震荡式的无规律运动。

平稳性

平稳性就是要求经由样本时间序列所得到的拟合曲线在未来一段时间内仍能顺着现有的形态惯性地延续下去。平稳性要求序列的均值和方差不发生明显变化

平稳性概述

  • 事件序列的平稳性可以分为强平稳和弱平稳。为什么平稳性对事件序列建模如此重要?为什么要有强、弱两种平稳?
  • 严(强)平稳:
    • 严平稳表示的分布不随时间的改变而改变,是事实上的平稳,它要求时间序列的点同分布。如白噪声(正态)无论怎么取,都是期望为0,方差为1
    • 缺点:它过于严格而且不好验证和使用
  • 宽(弱)平稳: 一般说的"平稳"其实就是"弱平稳"
    • 期望与相关系数(依赖性)不变。未来某时刻的t的值 X t X_t Xt就要依赖于它的过去信息,所以需要依赖性。这种依赖性不能有明显的变化。
    • 弱平稳的时间序列需满足两个条件:均值函数是常数函数且协方差函数仅与时间差相关。平稳性的实质是对时间平移的不变性做了假设,有了这种假设通过历史数据去预测未来才有了基础,否则历史数据的统计特征对未来预测毫无作用。
    • 优点:退而求其次只要求前两阶矩平稳(均值和方差),这样使得弱平稳有了明显的统计意义。
  • 因此,为了能够对时间序列进行建模,必须进行平稳性检验,检验方法有ADF、平稳序列的自相关和偏自相关。若非平稳,则通过差分去除趋势,直到通过平稳性检验。
  • **经典回归分析的一个重要假设是:数据是平稳的。**非平稳数据往往导致“虚假回归”,表现为两个没有任何因果关系的变量,却有很高的相关性。比如在时间序列中,本来没有自相关性的两个时间点,产生了相关性。因此平稳性是时间序列分析的基础。

平稳性检查

  • 平稳就是围绕着一个常数上下波动且波动范围有限,即有常数均值和常数方差。如果有明显的趋势或周期性,那它通常不是平稳序列。时间序列必须是平稳的,才能建立计量模型。平稳是指数据围绕着一个常数上下波动且波动范围有限,即有常数均值和常数方差。如果有明显的趋势或周期性,那它通常不是平稳序列。平稳性是指经由样本时间序列所得到的拟合曲线在未来一段时间内仍能顺着现有的形态惯性地延续下去。平稳性要求序列的均值、方差和协方差不发生明显变化,常从三个方面分析:均值,方差和协方差, 这三个指标都不会随着时间而发生明显的变化。

  • 性质:

    • 均值: 均值不应该是关于时间t的函数,而应该是一个固定常数。

      • E ( x t ) = E ( x t − s ) = u E(x_t)=E(x_{t-s})=u E(xt)=E(xts)=u
        在这里插入图片描述
    • 方差:方差不应该是时间的函数、为常数,且方差需要有同方差性

      • V a r ( x t ) = V a r ( x t − s ) = σ 2 Var(x_t)=Var(x_{t-s})=\sigma^2 Var(xt)=Var(xts)=σ2
      • 同方差性:其干扰项必须服从随机分布,即均值为 0 0 0,方差为 σ 2 \sigma^2 σ2的正态分布。
        在这里插入图片描述
    • **协方差:**协方差只和间隔s有关,与t无关

      • C o v ( x t , x t − s ) = γ s Cov(x_t,x_{t-s})=\gamma_s Cov(xt,xts)=γs
        在这里插入图片描述
  • 检验平稳性

    1. (常用)直接画出时间序列的趋势图,看趋势判断。
    2. (常用)画自相关和偏自相关图:平稳的序列的ACF自相关图和PACF偏相关图要么拖尾,要么是截尾。
    3. (少用)单位根检验:检验序列中是否存在单位根,如果存在单位根就是非平稳时间序列。
      • 理论基础:如果序列是平稳的,那么序列中所有的特征根都应该在单位圆内

      • 对时间序列进行单位根检验,如果是非平稳序列,那么需要通过差分转化为平稳序列,不稳定的数据,是无法捕捉到时序规律的。

      • 单位根(unit root)检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了。单位根就是指单位根过程,可以证明,序列中存在单位根过程就不平稳,会使回归分析中存在伪回归。而扩展迪基-福勒检验(Augmented Dickey-Fuller test可以测试一个自回归模型是否存在单位根,通过ADF检测的ADF值和p_value<0.05值看是否满足平稳性要求。

        1)ADF值判断平稳性需要根据1%、%5、%10不同程度拒绝原假设的统计值:

        • 1%:严格拒绝假设;
        • 5%:拒绝原假设;
        • 10%类推。

        ADF值越小,越拒绝原假设,越说明序列不存在单位根,那么时间序列越平稳。
        2)p_value值要小于一个显著值,时间序列就是平稳的,一般以0.01为显著值。

差分法

时间序列在t与t-1时刻的差值,可将序列平稳,并确定参数d

在这里插入图片描述
一阶差分就可趋于平稳,即d=1

  • 差分是求时间序列 r t r_t rt t t t时刻和 t − 1 t-1 t1时刻的差值,把 r t r_t rt r t − 1 r_{t-1} rt1时刻的值 r ( t − 1 ) r(t-1) r(t1)的差值记做dt,则得到了一个新序列{dt},为一阶差分;对新序列{dt}再做同样的操作,则为二阶差分。通常非平稳序列可以经过d次差分,处理成弱平稳或者近似弱平稳时间序列。d就是差分的阶数,d阶差分就是相距d期的两个序列值之间相减。
  • 如果一个时间序列经过差分运算后具有平稳性,则该序列为差分平稳序列,可以使用ARIMA模型进行分析。也就是说,如果对时间序列做d次差分后得到一个平稳序列,那么可以使用ARIMA(p,d,q)模型,其中d是差分次数。
  • 首先通过ADF检验,检查原始时间序列的平稳性,如果原始时间序列是平稳的,那么d=0;如果原始数据不平稳,那么做差分运算,通过ADF检验直到时间序列平稳,一般差分次数不超过2次。

建立ARIMA模型

在这里插入图片描述

模型识别和粗略定阶

参数:

  • p:参照"规则",第几阶落入置信区间(阴影)。由显著不为0的偏自相关系数的数目决定,此时序列的偏自相关函数表现为拖尾性,即当k>p时,偏自相关系数的值都在置信区间以内;
  • d:参照"差分法",不超过2。
  • q:参照"规则",第几阶落日置信区间(阴影)。由显著不为0的自相关系数的数目决定,此时序列的自相关函数表现为截尾性,即当k>p时,自相关系数的值都在置信区间内。

参数确定规则:

在这里插入图片描述

示例

import statsmodels.api as sm
fig = plt.figure(figsize=(12,8))

ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(train, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()

ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(train, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()

在这里插入图片描述

准确的参数估计

通过拖尾和截尾对模型进行定阶的方法,往往具有很强的主观性。回想我们之前在参数预估的时候往往是怎么做的,不就是损失和正则项的加权么?我们这里能不能结合最终的预测误差来确定p,q的阶数呢?在相同的预测误差情况下,根据奥斯卡姆剃刀准则,模型越小是越好的。那么,平衡预测误差和参数个数,我们可以根据信息准则函数法,来确定模型的阶数。预测误差通常用平方误差即残差平方和来表示。

AIC准则

全称是"最小化信息量准则",适合在被观察样本数据较少的情况下使用,是信息准则函数法之一

  • 公式: A I C = 2 × ( 模型参数的个数 ) − 2 l n ( 模型的极大似然函数 ) AIC = 2×(模型参数的个数)-2ln(模型的极大似然函数) AIC=2×(模型参数的个数)2ln(模型的极大似然函数)
  • 缺点:样本容量很大时,在AIC准则中拟合误差提供的信息就要受到样本容量的放大,而参数个数的惩罚因子却和样本容量没关系(一直是2),因此当样本容量很大时,使用AIC准则选择的模型不收敛与真实模型,它通常比真实模型所含的未知参数个数要多

BIC准则

全称是"贝叶斯信息准则",是信息准则函数法之一

  • 公式: B I C = l n ( n ) × ( 模型中参数的个数 ) − 2 l n ( 模型的极大似然函数值 ) BIC = ln(n)×(模型中参数的个数)-2ln(模型的极大似然函数值) BIC=ln(n)×(模型中参数的个数)2ln(模型的极大似然函数值)
    • n:样本容量
  • 优点: 弥补了AIC的不足
  • 一般来说,BIC准则得到的ARMA模型的阶数较AIC的低。
  • BIC的绘制:先从AC和PAC图得出p、q最大最小值,再对不同的p、q进行遍历,得到下图。
    在下图中选择最小的值(即为简单的模型),即可选择合适的p、q(横纵轴为p、q)
    在这里插入图片描述

示例

train_results = sm.tsa.arma_order_select_ic(train, ic=['aic', 'bic'], trend='nc', max_ar=8, max_ma=8)
print('AIC',train_results.aic_min_order)	# AIC (1, 0)
print('BIC',train_results.bic_min_order)	# BIC (1, 0)
# 应该选择AR(1)模型

模型检验

种类

  1. 检验参数估计的显著性(t检验
  2. 检验残差序列的随机性,即残差之间是独立的
    • ARIMA模型的残差是否是平均值为0且方差为常数的正态分布
    • 在这里插å
¥å›¾ç‰‡æè¿° (正态分布图)

示例

model = sm.tsa.ARIMA(train, order=(1, 0, 0))
results = model.fit()
resid = results.resid # 赋值
fig = plt.figure(figsize=(12,8))
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40)
plt.show()

在这里插入图片描述

模型预测

预测主要有两个函数,一个是predict函数,一个是forecast函数,predict中进行预测的时间段必须在我们训练ARIMA模型的数据中,forecast则是对训练数据集末尾下一个时间段的值进行预估。

model = sm.tsa.ARIMA(sub,order=(1,0,0))
res = model.fit()
predict_sunspots = res.predict(start=str('2014-04'),end=str('2014-05'),dynamic=False)
print(predict_sunspots)
fig,ax = plt.subplots(figsize=(12, 8))
ax = sub.plot(ax=ax)
predict_sunspots.plot(ax=ax)
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值