进阶篇 第 2 篇:自相关性深度解析 - ACF 与 PACF 图完全指南
(图片来源: Negative Space on Pexels)
欢迎来到进阶系列的第二篇!在上一篇,我们探讨了更高级的时间序列分解技术和强大的指数平滑 (ETS) 预测模型。ETS 模型通过巧妙的加权平均捕捉了序列的演变。然而,还有另一大类经典模型——ARIMA 家族,它们直接对序列的自相关性 (Autocorrelation) 进行建模。
要深入理解并有效使用 ARIMA 模型,我们必须成为解读序列“内部记忆”的专家。而揭示这种记忆的关键工具,就是我们曾在入门篇初步接触过的自相关函数 (ACF) 和偏自相关函数 (PACF) 图。
本篇,我们将对 ACF 和 PACF 进行一次深度解析:
- 温故知新: 为什么先要关注平稳性?
- ACF 深度解读: 它真正告诉我们什么?MA(q) 过程的典型模式。
- PACF 深度解读: 为何需要它?AR§ 过程的典型模式。
- 结合运用: 如何利用 ACF/PACF 图识别潜在的 ARMA(p,q) 结构?
- 实战演练: 使用 Python 绘制并解读 ACF/PACF 图。
掌握 ACF/PACF 的精髓,是解锁 ARIMA 模型强大能力的前提。
温故知新:为何先要平稳?
在深入研究 ACF/PACF 之前,必须再次强调平稳性的重要性。
- ACF/PACF 的前提: ACF 和 PACF 分析的是序列与其滞后项之间的相关性结构。这种结构只有在序列的统计特性(均值、方差)稳定时才有意义且易于解读。
- 非平稳序列的 ACF: 如果一个序列包含趋势或强季节性(即非平稳),它的 ACF 图通常会显示出非常缓慢的衰减。许多滞后项的相关系数都会很高,并缓慢地趋向于零。这种缓慢衰减的 ACF 模式本身就强烈暗示了非平稳性,它会掩盖掉序列可能存在的短期自相关结构。
结论: 在使用 ACF/PACF 图来识别潜在的 ARMA 模型结构之前,务必先确保你的时间序列是平稳的(通过检验和必要的差分处理)。我们分析的是平稳化后序列的 ACF/PACF 图。
ACF (自相关函数) 深度解读
ACF (Autocorrelation Function) 衡量的是时间序列 y(t)
与其自身滞后值 y(t-k)
之间的相关系数。它回答的问题是:“当前值与 k 期前的值有多相关?”
- 包含间接影响: ACF 包含了所有滞后项的直接和间接影响。例如,
y(t)
与y(t-2)
的相关性可能部分是通过y(t-1)
这个中间环节传递的。ACF 度量的是总体相关性。 - MA(q) 过程的特征:
- 一个移动平均 (Moving Average) MA(q) 过程定义为:
y(t) = μ + ε(t) + θ₁ε(t-1) + ... + θ<0xE1><0xB5><0x97>ε(t-q)
,其中ε
是白噪声(误差项)。 - 关键特性:
y(t)
的值仅依赖于当前和过去 q 个误差项。 - ACF 表现: 因此,
y(t)
只会与y(t-1), y(t-2), ..., y(t-q)
相关(因为它们共享部分误差项)。当滞后阶数k > q
时,y(t)
和y(t-k)
将不再共享任何共同的误差项,理论上它们的自相关系数为 0。 - 图形模式: MA(q) 过程的 ACF 图会在滞后 q 阶之后突然截断 (Cuts off),变为 0(在实际图形中,是在置信区间内波动)。
- 一个移动平均 (Moving Average) MA(q) 过程定义为:
PACF (偏自相关函数) 深度解读
如果 ACF 包含了间接影响,那我们如何衡量 y(t)
和 y(t-k)
之间纯粹的、直接的相关性,即排除了中间滞后项 y(t-1), ..., y(t-k+1)
的影响之后的相关性?这就是 PACF (Partial Autocorrelation Function) 要解决的问题。
-
AR§ 过程的特征:
- 一个自回归 (AutoRegressive) AR§ 过程定义为:
y(t) = c + φ₁y(t-1) + φ₂y(t-2) + ... + φ<0xE1><0xB5><0xBD>y(t-p) + ε(t)
。 - 关键特性:
y(t)
的值直接依赖于过去 p 个自身的观测值。y(t)
对y(t-k)
(当 k > p 时) 的依赖关系完全是通过中间的p
个值传递的。 - PACF 表现: 一旦我们移除了
y(t-1)
到y(t-p)
的影响(这正是 PACF 所做的),y(t)
与y(t-k)
(k > p) 之间的偏自相关系数理论上就为 0。 - 图形模式: AR§ 过程的 PACF 图会在滞后 p 阶之后突然截断 (Cuts off)。
- 一个自回归 (AutoRegressive) AR§ 过程定义为:
-
对比 ACF: AR§ 过程的 ACF 通常是拖尾 (Tails off) 的,即它会按指数或正弦波形式缓慢衰减,而不是截断。这是因为
y(t)
通过y(t-1)
与y(t-2)
相关,通过y(t-2)
与y(t-3)
相关,等等,这种影响会传递下去。
结合运用:识别 ARMA(p,q) 模式
现在我们有了识别纯 AR§ 和纯 MA(q) 过程的利器:
- MA(q) 过程: ACF 在 q 阶截尾,PACF 拖尾。
- AR§ 过程: ACF 拖尾,PACF 在 p 阶截尾。
那如果一个过程同时具有 AR 和 MA 的特性,即 ARMA(p,q) 过程呢?
- ARMA(p,q) 过程的特征:
y(t)
同时依赖于过去的观测值和过去的误差项。 - ACF/PACF 表现: 通常,ARMA(p,q) 过程的 ACF 和 PACF 图都会表现出拖尾(按指数或正弦波形式衰减)。识别具体的 p 和 q 值会比纯 AR 或纯 MA 过程更困难,需要更多经验或借助信息准则(如 AIC/BIC,我们将在下一篇讨论)。
模型识别速查表 (基于平稳序列):
模型 | ACF 图模式 | PACF 图模式 |
---|---|---|
AR§ | 拖尾 (Tails off) | p 阶截尾 (Cuts off at p) |
MA(q) | q 阶截尾 (Cuts off at q) | 拖尾 (Tails off) |
ARMA(p,q) | 拖尾 (Tails off) | 拖尾 (Tails off) |
实战演练:Python 绘制与解读
让我们用 statsmodels
库来实际绘制和解读 ACF/PACF 图。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima_process import ArmaProcess
# 设置绘图风格
plt.style.use('seaborn-v0_8-whitegrid')
# --- 1. 模拟 MA(1) 过程 ---
# y(t) = ε(t) + 0.7 * ε(t-1)
ma1_process = ArmaProcess(ma=[1, 0.7]) # 注意 ArmaProcess 的 ma 参数包含 lag 0 (系数为1)
ma1_data = ma1_process.generate_sample(nsample=500)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
plot_acf(ma1_data, ax=axes[0], lags=20, title='MA(1) Process ACF')
plot_pacf(ma1_data, ax=axes[1], lags=20, title='MA(1) Process PACF', method='ywm') # 'ywm' is often stable
axes[0].set_ylim(-1.1, 1.1) # 统一 y 轴范围
axes[1].set_ylim(-1.1, 1.1)
plt.suptitle('ACF and PACF for Simulated MA(1) Data', fontsize=16)
plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # 调整布局防止标题重叠
plt.show()
# --- 2. 模拟 AR(2) 过程 ---
# y(t) = 0.8 * y(t-1) - 0.5 * y(t-2) + ε(t)
ar2_process = ArmaProcess(ar=[1, -0.8, 0.5]) # 注意 ar 参数包含 lag 0 (系数为1), 符号与公式相反
ar2_data = ar2_process.generate_sample(nsample=500)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
plot_acf(ar2_data, ax=axes[0], lags=20, title='AR(2) Process ACF')
plot_pacf(ar2_data, ax=axes[1], lags=20, title='AR(2) Process PACF', method='ywm')
axes[0].set_ylim(-1.1, 1.1)
axes[1].set_ylim(-1.1, 1.1)
plt.suptitle('ACF and PACF for Simulated AR(2) Data', fontsize=16)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
# --- 3. 应用于真实数据 (示例:对 CO2 数据的一阶差分) ---
# 加载并差分数据 (确保已平稳化)
co2_data = sm.datasets.co2.load_pandas().data['co2']
co2_data = co2_data.interpolate().resample('M').mean()
co2_diff = co2_data.diff().dropna() # 一阶差分使其近似平稳
print("\n--- Analyzing Differenced CO2 Data ---")
# 检验平稳性 (可选,但推荐)
adf_test = sm.tsa.stattools.adfuller(co2_diff)
print(f'ADF Statistic: {adf_test[0]:.3f}')
print(f'p-value: {adf_test[1]:.3f}') # p-value 应该很小
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
plot_acf(co2_diff, ax=axes[0], lags=40, title='Differenced CO2 ACF') # 观察季节性周期 (lag 12, 24...)
plot_pacf(co2_diff, ax=axes[1], lags=40, title='Differenced CO2 PACF', method='ywm')
axes[0].set_ylim(-1.1, 1.1)
axes[1].set_ylim(-1.1, 1.1)
plt.suptitle('ACF and PACF for Differenced Monthly CO2 Data', fontsize=16)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
解读要点:
- 模拟 MA(1): 观察其 ACF 是否在 lag=1 后截尾,而 PACF 是否拖尾。
- 模拟 AR(2): 观察其 PACF 是否在 lag=2 后截尾,而 ACF 是否拖尾。
- 真实数据 (差分 CO2):
- 真实数据的图形通常不会像模拟数据那样完美“干净”。会有噪声。
- 重点观察是否有明显的截尾或清晰的拖尾模式。
- 注意置信区间(通常是蓝色区域):只有显著超出置信区间的柱状图才被认为是统计上显著不为零的。
- 对于 CO2 差分数据,你可能会看到 ACF 在 lag=1 处显著,然后在 lag=12, 24 等季节性位置再次显著,暗示可能需要季节性模型 (SARIMA)。PACF 可能也在早期滞后和季节性滞后处显著。这表明真实数据的模式识别可能比理论更复杂。
注意事项与最佳实践
- 平稳性优先! 重复强调,分析前确保数据平稳。
- 图形是向导,非圣经: ACF/PACF 图提供了关于模型结构的线索,但不是绝对的规则,尤其对于混合的 ARMA 过程或有噪声的真实数据。
- 关注置信区间: 不要过度解读在置信区间内的小波动。
- 模式可能模糊: 有时图形模式并不清晰,可能指向多个候选模型。
- 结合信息准则: ACF/PACF 图通常用于初步定阶,最终的模型选择往往需要结合 AIC/BIC 等信息准则(下一篇内容)以及模型诊断。
总结与下一步
通过本次深度解析,我们掌握了如何更精细地解读 ACF 和 PACF 图,理解了它们与 AR§ 和 MA(q) 过程的内在联系。这为我们识别(平稳)时间序列的潜在结构,特别是为下一篇的 ARIMA 模型定阶打下了坚实的基础。
ACF/PACF 图是时间序列分析师工具箱中的瑞士军刀,熟练运用它们将极大提升你对序列动态的洞察力。
下一篇预告:
准备好将今天的知识付诸实践了吗?下一篇,我们将正式进入 ARIMA 模型的世界,学习如何利用 ACF/PACF 图进行模型识别(定阶 p, q),如何估计模型参数,如何进行模型诊断,并最终用它来进行预测!
敬请期待!
(尝试用不同的 AR 和 MA 参数模拟数据,观察 ACF/PACF 图的变化。你手中的其他平稳时间序列数据呈现出怎样的 ACF/PACF 模式?欢迎在评论区分享你的观察!)