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图,怎么看?
我一般分三步走:
- 看有没有“拖尾”—— 就是相关系数缓慢衰减,像尾巴一样拖得很长
- 看有没有“截尾”—— 就是到某个滞后阶数后,突然掉到置信区间内,后面基本为零
- 看有没有周期性—— 比如每隔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出发,看它们的形态是拖尾还是截尾,然后就能锁定该用AR、MA还是ARMA模型。
最后说一句:ACF和PACF是工具,不是真理。它们给你一个起点,但最终模型好不好,还得靠AIC/BIC、残差检验这些手段来验证。我在实际项目中,经常遇到ACF/PACF图模棱两可的情况,这时候就多试几个阶数,让数据自己说话。
公众号:蓝海资料掘金营,微信deep3321