4. 自相关与偏自相关:ACF与PACF的概念、如何解读ACF/PACF图、拖尾与截尾的判断

好,咱们进入时间序列分析里一个非常核心的环节——自相关和偏自相关。

说实话,我刚开始学时间序列那会儿,看到ACF和PACF图,第一反应是:这玩意儿跟心电图似的,能看出啥名堂?后来踩了不少坑,才慢慢摸到门道。今天我就把这点经验掰开揉碎了讲给你听。

4.1 自相关函数(ACF)—— 自己跟自己的“过去”比

先问个问题:今天的股票涨了,明天继续涨的概率大不大?

这个问题,说白了就是在问“今天”和“明天”之间有没有相关性。自相关函数(ACF)干的就是这件事——它衡量的是时间序列在不同滞后阶数下,自己和自己的相关性。

数学上,对于滞后k阶,ACF的计算公式是:

ρ(k) = Cov(Y_t, Y_{t-k}) / Var(Y_t)

嗯,别被公式吓到。你只要记住:ACF看的是“原始值”和“滞后k期的原始值”之间的相关性

关键点:ACF的值在[-1, 1]之间。越接近1,正相关越强;越接近-1,负相关越强;接近0,说明没啥关系。

我在项目中遇到过一件事:有个同学做销售预测,看到ACF在滞后1期高达0.9,兴奋得不行,觉得找到了规律。结果一细看,数据有明显的趋势——销售额一直在涨。这其实是趋势导致的“伪相关”,不是真正的周期规律。所以,看ACF之前,一定要先做平稳性检验,这个坑我替你踩过了。

4.2 偏自相关函数(PACF)—— 剔除“中间人”的影响

ACF有个问题:它会把间接相关也算进去。

举个例子:Y_t和Y_{t-2}的相关性,可能完全是通过Y_{t-1}传递过去的。就像你朋友的朋友,跟你其实没啥直接关系。

偏自相关函数(PACF)就是来解决这个问题的。它衡量的是剔除掉中间滞后项的影响后,Y_t和Y_{t-k}之间的“纯”相关性

怎么算的?说白了就是做回归:

Y_t = φ_{k1} Y_{t-1} + φ_{k2} Y_{t-2} + ... + φ_{kk} Y_{t-k} + ε_t

这里的φ_{kk},就是滞后k阶的偏自相关系数。

我的小技巧:ACF像“总账”,PACF像“明细账”。总账里可能包含了很多间接往来,明细账才告诉你谁跟谁有直接交易。

4.3 如何解读ACF/PACF图?—— 看图说话

好,理论讲完了,咱们来点实战的。拿到一张ACF/PACF图,怎么看?

我一般分三步走:

  1. 看有没有“拖尾”—— 就是相关系数缓慢衰减,像尾巴一样拖得很长
  2. 看有没有“截尾”—— 就是到某个滞后阶数后,突然掉到置信区间内,后面基本为零
  3. 看有没有周期性—— 比如每隔12期出现一个峰值,说明有年度周期

你想想看,这两种形态组合起来,就能告诉我们该用什么模型:

ACF形态 PACF形态 建议模型
拖尾 p阶截尾 AR(p)模型
q阶截尾 拖尾 MA(q)模型
拖尾 拖尾 ARMA(p,q)模型

注意:实际数据很少这么完美。我曾经处理过一组销售数据,ACF和PACF都拖尾,但拖得又不明显。这时候别死磕“截尾还是拖尾”,用AIC/BIC准则去选阶数更靠谱。

4.4 拖尾与截尾的判断标准

怎么判断是拖尾还是截尾?我个人的经验是:

  • 截尾:在某个滞后k之后,所有PACF(或ACF)的值都落在蓝色置信区间内,而且后面没有明显的规律性波动
  • 拖尾:相关系数缓慢衰减,或者呈现周期性波动,或者虽然有些值落在区间内但整体有趋势

嗯,这里要注意:置信区间通常是±1.96/√n,n是样本量。如果样本量小,这个区间会变宽,判断起来就更模糊。

我曾经犯过一个错:看到ACF在滞后2期后突然掉到区间内,就以为是截尾。结果模型拟合效果很差。后来发现,那只是因为样本量太小,区间太宽了。所以,样本量少于50的时候,对截尾的判断要格外谨慎

4.5 实战:用Python画ACF/PACF图

光说不练假把式。咱们用Python的statsmodels库来画图:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 生成示例数据(AR(2)过程)
np.random.seed(42)
n = 200
phi1, phi2 = 0.6, -0.3
y = np.zeros(n)
for t in range(2, n):
    y[t] = phi1 * y[t-1] + phi2 * y[t-2] + np.random.normal(0, 1)

# 画ACF和PACF
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

plot_acf(y, lags=30, ax=ax1, alpha=0.05)
ax1.set_title('自相关函数 (ACF)')

plot_pacf(y, lags=30, ax=ax2, alpha=0.05, method='ywm')
ax2.set_title('偏自相关函数 (PACF)')

plt.tight_layout()
plt.show()

运行这段代码,你会看到:

  • ACF是拖尾的(缓慢衰减)
  • PACF在滞后2阶后截尾(后面基本都在蓝色区间内)

这正好对应AR(2)模型的特征——PACF在2阶截尾,ACF拖尾。

我的习惯:画图时把lags设为数据长度的10%~20%,别设太大。lags太多,后面的估计会不准,容易误导判断。

4.6 知识体系总览

为了让你更直观地理解这一章的知识结构,我画了张图:

ACF与PACF知识体系 ACF(自相关函数) PACF(偏自相关函数) 衡量原始值与滞后值的相关性 剔除中间影响后的纯相关性 拖尾 截尾 拖尾 截尾 ACF拖尾 → MA模型 ACF截尾 → AR模型 PACF拖尾 → AR模型 PACF截尾 → MA模型 组合判断:ACF拖尾+PACF截尾 → AR模型

这张图把整个判断逻辑串起来了。你从ACF和PACF出发,看它们的形态是拖尾还是截尾,然后就能锁定该用AR、MA还是ARMA模型。

最后说一句:ACF和PACF是工具,不是真理。它们给你一个起点,但最终模型好不好,还得靠AIC/BIC、残差检验这些手段来验证。我在实际项目中,经常遇到ACF/PACF图模棱两可的情况,这时候就多试几个阶数,让数据自己说话。


公众号:蓝海资料掘金营,微信deep3321