【时间序列分析】自相关、偏自相关、协整基础理论与Python实现

在时间序列分析中,我们常常要通过分析数据的内部关系和结构,来揭示时间序列的趋势、季节性、周期性等特征。这其中,自相关、偏自相关和协整是非常重要的概念,它们在识别时间序列中的规律、建立合适的预测模型以及分析变量间的关系方面发挥着关键作用。

1. 自相关

1.1 自相关定义

自相关(也叫自相关函数,ACF)是用来度量时间序列中某个时刻的值与它前一时刻值之间的相关性的统计量。它揭示了序列内在的时间依赖关系。简单来说,自相关告诉我们当前的数据点与之前的数据点之间是否有相似性或关联性。

比如:

  • 假设我们有一个温度序列数据: T 1 , T 2 , T 3 , . . . . , T n T_1, T_2, T_3,....,T_n T1,T2,T3,....,Tn,其中 T t T_t Tt 代表在 t t t 时刻的温度值。自相关告诉我们,某一时刻的温度和之前某时刻的温度之间的关系。如果当前温度 T t T_t Tt 与前一天的温度 T t − 1 T_{t-1} Tt1 有高度的相似性,那么他们之间的自相关性就很强。

1.2 自相关的计算方法

自相关的计算一般使用自相关函数(AFC),对于时间序列 X t X_t Xt 的自相关计算公式为:

ρ ( k ) = C o v ( X t , X t + k ) V a r ( X t ) V a r ( X t + k ) \rho(k) = \frac {Cov(X_t,X_{t+k})}{\sqrt {Var(X_t)Var(X_{t+k})}} ρ(k)=Var(Xt)Var(Xt+k) Cov(Xt,Xt+k)

其中:

  • ρ ( k ) \rho(k) ρ(k) 表示滞后 k k k 的相关系数
  • C o v ( X t , X t + k ) Cov(X_t,X_{t+k}) Cov(Xt,Xt+k) 是序列 X t X_t Xt X t + k X_{t+k} Xt+k 的协方差
  • V a r ( X t ) Var(X_t) Var(Xt) V a r ( X t + k ) Var(X_{t+k}) Var(Xt+k) X t X_t Xt X t + k X_{t+k} Xt+k 的方差

自相关系数的值通常在 [ − 1 , 1 ] [-1,1] [1,1] 之间:

  • ρ ( k ) = 1 \rho(k) = 1 ρ(k)=1,表示完全正相关
  • ρ ( k ) = − 1 \rho(k) = -1 ρ(k)=1,表示完全负相关
  • ρ ( k ) = 0 \rho(k) = 0 ρ(k)=0,表示没有任何线性关系

2. 偏自相关

2.1 偏自相关的定义

偏自相关(PACF)是一个衡量时间序列中滞后项之间关系的统计量,但它不同于自相关,因为它排除了时间序列中其他滞后项的影响。偏自相关度量的是在已知前面某些滞后值(例如,滞后 1、滞后 2 等)后,当前时刻与某个特定滞后时刻之间的相关性。换句话说,它告诉我们两个时间点之间的“直接”关系,而不是通过其他滞后期的间接影响。

为什么需要偏自相关?

  • 当分析时间序列时,序列的当前值不仅可能与前一个时刻的值相关,还可能与多个前面的时刻有关系。例如,当前的股票价格不仅可能与昨天的价格相关,也可能与前两天、前三天的价格相关。然而,在许多情况下,后面的滞后期对当前值的影响已经被前面的滞后期所解释。因此,偏自相关的作用就是在剔除掉这些间接影响后,给出每个滞后期的“净”影响。

2.2 偏自相关计算方法

偏自相关的计算比自相关要复杂一些。自相关函数(ACF)衡量的是两个时间点之间的线性相关性,而偏自相关函数(PACF)则是在控制了其他滞后项影响的情况下,计算两个时间点之间的相关性。

通常来说,计算偏自相关可以通过回归方法来实现。假设我们有一个时间序列 Y t Y_t Yt, 那么对于滞后 k k k, 偏自相关 ϕ k \phi_k ϕk 可以通过以下步骤计算:

  • 使用线性回归模型拟合 Y t Y_t Yt 与其滞后值 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 Y_t Yt 与滞后 k k k 时刻 Y t − k Y_{t-k} Ytk 之间的残差,去除掉前面所有滞后项的影响
  • 通过残差来计算当前值和滞后 k k k 之间的相关性

偏自相关的数学公式可以表示为:

ϕ k = Cov ( Y t , Y t − k ∣ Y t − 1 , Y t − 2 , … , Y t − k + 1 ) Var ( Y t ) ⋅ Var ( Y t − k ∣ Y t − 1 , Y t − 2 , … , Y t − k + 1 ) \phi_k = \frac{\text{Cov}(Y_t, Y_{t-k} \mid Y_{t-1}, Y_{t-2}, \dots, Y_{t-k+1})}{\sqrt{\text{Var}(Y_t) \cdot \text{Var}(Y_{t-k} \mid Y_{t-1}, Y_{t-2}, \dots, Y_{t-k+1})}} ϕk=Var(Yt)Var(YtkYt1,Yt2,,Ytk+1) Cov(Yt,YtkYt1,Yt2,,Ytk+1)

  • ϕ k \phi_k ϕk 是滞后 k k k 的偏自相关系数,可以看出偏自相关在计算时需要剔除掉其他滞后期的影响,显示的是“净”相关性。、

2.3 偏自相关举例理解

假设我们有一个简单的每日气温数据序列。假设我们关注的是过去几天的气温与今天的气温之间的关系。我们有以下假设的数据:

  • 日期: [ 1 , 2 , 3 , 4 , 5 , 6 ] [1,2,3,4,5,6] [1,2,3,4,5,6]
  • 对应气温: [ 20 , 22 , 21 , 23 , 24 , 25 ] [20,22,21,23,24,25] [20,22,21,23,24,25]

2.3.1 目标:

我们希望了解今天的气温(第6天的气温)与过去几天气温的关系,尤其是是否存在滞后天数之间的独立关系

2.3.2 自相关AFC:

首先,我们计算自相关,它反映的是今天的气温(第6天)与过去几天的气温(第1天到第5天)之间的相关性。例如,简单的自相关计算会显示:

  • 滞后1(第5天和第6天之间的自相关):今天的气温可能受昨天的气温影响较大
  • 滞后2(第4天和第6天之间的自相关):今天的气温可能也受前天的气温影响

但是,自相关没有剔除其他滞后项的影响,因此不能准确反映滞后1天和滞后2天之间的“独立”关系

2.3.2 偏自相关PAFC:

接下来,我们计算 偏自相关,它剔除其他滞后项的影响,专注于某一滞后期与当前时间点之间的“净”关系。

步骤:

  • 滞后1的偏自相关:首先,计算今天的气温(第6天)和昨天的气温(第5天)之间的相关性。但是,这次我们会控制住前面所有的滞后期(即:前两天的气温)。也就是说,我们要测量的是第6天与第5天的关系,去除掉第4天和之前几天对这个关系的干扰。
  • 滞后2的偏自相关:然后,我们计算今天的气温(第6天)和前天的气温(第4天)之间的关系。在计算时,我们会控制住滞后1天的气温的影响,即,确保第5天的气温对第6天的关系的干扰被去除。

通过这些计算,偏自相关帮助我们理解:在已知前几天的气温(如:滞后1天和滞后2天的影响)之后,第6天的气温与前几天气温之间的关系是怎样的。

2.3.4 实际解读:

假设在计算中发现:

  • 滞后1的偏自相关是 0.8,意味着昨天的气温对今天的气温有显著的直接影响
  • 滞后2的偏自相关是 0.2,表示在已经知道昨天气温的情况下,前天的气温对今天的气温的影响变得不那么显著
  • 滞后3的偏自相关接近于 0,表示在控制了前两天的气温之后,三天前的气温对今天的气温没有显著影响

这表明,滞后1天的气温对今天的气温有强烈的影响,而滞后2天的影响相对较小,滞后3天的影响几乎没有

3. 协整

3.1 协整的定义

协整是时间序列中两个或多个非平稳序列之间的一种特殊关系。尽管单个非平稳时间序列可能表现出趋势性或随机游走,但如果多个非平稳序列之间存在协整关系,那么这些序列之间存在某种长期稳定的关系,可以一起建模。协整的核心思想是,如果两个时间序列是非平稳的,但它们的线性组合是平稳的,那么这两个序列就具有协整关系。协整表明,尽管单独的序列可能没有稳定的均值或方差,但它们之间的某种相互关系是稳定的,可以用于预测或建模。

比如:

  • 假设我们分析两个经济指标,比如 GDP 和失业率,假如这两个变量都是非平稳的,但它们之间存在某种长期稳定的关系,比如随着 GDP 增长,失业率可能呈现出一定的变化趋势。尽管这两个变量是非平稳的,但它们之间可能存在协整关系,从而可以通过建立一个包含协整项的回归模型来进行有效预测。

4. 自相关、偏自相关与协整的关系

  • 自相关和偏自相关都是用于分析单个时间序列中不同滞后期之间的依赖关系,它们主要用于选择适当的时间序列模型(如ARMA模型)
  • 协整则是在处理多个非平稳时间序列时非常重要,它帮助我们识别变量之间的长期关系,通常用于构建带有协整项的回归模型(如误差修正模型)

5. Python实现

首先安装 statsmodels

pip install statsmodels

Python代码示例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller, acf, pacf

# 生成一个简单的时间序列数据(例如:AR(1)过程)
np.random.seed(0)
n = 100
phi = 0.8  # AR(1)过程的参数
e = np.random.normal(0, 1, n)  # 随机误差项
y = np.zeros(n)

# 生成AR(1)时间序列
for t in range(1, n):
    y[t] = phi * y[t-1] + e[t]

# 将数据转换为 Pandas Series
data = pd.Series(y)

# 绘制时间序列图
plt.figure(figsize=(10, 4))
plt.plot(data)
plt.title('Time Series')
plt.show()

# 计算并绘制自相关函数 (ACF)
acf_values = acf(data, nlags=20)
plt.figure(figsize=(10, 4))
plt.stem(range(len(acf_values)), acf_values)
plt.title('Autocorrelation Function (ACF)')
plt.xlabel('Lag')
plt.ylabel('ACF')
plt.show()

# 计算并绘制偏自相关函数 (PACF)
pacf_values = pacf(data, nlags=20)
plt.figure(figsize=(10, 4))
plt.stem(range(len(pacf_values)), pacf_values)
plt.title('Partial Autocorrelation Function (PACF)')
plt.xlabel('Lag')
plt.ylabel('PACF')
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值