1. 时间序列基础回顾:平稳性、白噪声、ACF与PACF
各位同学,咱们今天聊点实在的。时间序列分析,说白了就是跟数据的时间顺序较劲。你想想看,股票价格、气温变化、网站访问量——这些东西都有一个共同点:过去会影响未来。嗯,这就是时间序列的核心。
我个人习惯,在开始任何建模之前,先做三件事:画图、检验平稳性、看自相关。这三步走完,数据大概什么脾气,我心里就有数了。今天咱们就把这三个基础概念掰开揉碎了讲清楚。
1.1 平稳性:时间序列的“定海神针”
什么叫平稳?我打个比方。你站在海边看浪,虽然每个浪头高低不同,但整体来看,海平面是稳定的,浪的起伏幅度也差不多。这就是平稳——统计性质不随时间变化。
严格来说,平稳性分两种:
- 严平稳:整个序列的联合分布不随时间平移而改变。这条件太苛刻,现实中基本不存在。
- 弱平稳(宽平稳):均值恒定、方差恒定、自协方差只与时间间隔有关。这是咱们实际用的。
核心条件(弱平稳):
- 均值 E(Yt) = μ(常数)
- 方差 Var(Yt) = σ²(常数)
- 协方差 Cov(Yt, Yt-k) = γk(只与滞后阶数 k 有关)
我在项目中遇到过一件事。有一次分析某电商平台的日销售额,数据看起来挺正常,但模型预测总是不准。后来一查——销售额有明显的季节性波动,方差在双十一期间暴涨。这就是非平稳的典型表现。解决办法?取对数、做差分,或者用季节调整。
避坑指南:我曾经犯过一个低级错误——直接用非平稳数据做回归。结果R²高达0.95,但残差自相关严重,这就是典型的“伪回归”。记住:非平稳数据做回归,结果再漂亮也是假的。
1.2 白噪声:最“干净”的时间序列
白噪声,说白了就是纯随机。每个观测值独立同分布,均值为0,方差恒定。你无法从过去预测未来,因为压根就没有规律可循。
数学定义很简单:
- E(εt) = 0
- Var(εt) = σ²
- Cov(εt, εt-k) = 0(k ≠ 0)
你想想看,如果残差不是白噪声,说明模型没把信息提取干净。我个人的习惯是:模型建完后,第一件事就是检查残差是不是白噪声。如果是,模型基本合格;如果不是,继续调参。
小技巧:用Ljung-Box检验判断残差是否为白噪声。p值大于0.05,基本可以接受。我一般会看滞后10阶和20阶的结果,两个都通过才算数。
1.3 自相关函数(ACF):序列与自己的“过去”对话
ACF衡量的是当前值与过去值之间的线性相关性。比如,今天的股价和昨天的股价有没有关系?和前天呢?
公式不复杂:
ρ(k) = Cov(Y_t, Y_{t-k}) / Var(Y_t)
其中 ρ(k) 就是滞后 k 阶的自相关系数。取值范围在 -1 到 1 之间。
怎么看ACF图?我总结了几条经验:
- 缓慢衰减:序列可能是非平稳的,或者有趋势
- 快速截尾:在某个滞后阶数后突然降到0附近,这通常是AR(p)模型的信号
- 周期性波动:存在季节性成分
实战经验:有一次我分析某城市每日用电量数据,ACF图显示滞后7阶、14阶、21阶都有显著峰值。嗯,这就是典型的周周期效应。后来我用季节性ARIMA模型,效果立竿见影。
1.4 偏自相关函数(PACF):剔除“中间人”后的真实关系
ACF有个问题——它会把间接相关也算进去。比如,Yt和Yt-2的相关性,可能完全是通过Yt-1传递的。PACF就是剔除中间变量后的“净”相关。
怎么理解?我举个例子。你和你的二大爷长得像,但仔细一看,你更像你爸。ACF看的是你和二大爷的相似度(可能通过你爸传递),PACF看的是去掉你爸的影响后,你和二大爷还有几分像。
PACF的解读规则:
- 截尾:在p阶后突然降到0,提示AR(p)模型
- 拖尾:缓慢衰减,提示MA(q)模型
我的习惯:看ACF和PACF图时,我会同时画两条虚线(±1.96/√n),这是95%置信区间。超出虚线的点才值得关注。别被那些刚好擦边的点迷惑——样本量小的时候,偶尔超出是正常的。
1.5 知识体系总览
说了这么多,咱们用一张图把关系理清楚。下面这张SVG图展示了本章的核心逻辑:
1.6 实战:用Python快速上手
光说不练假把式。咱们用Python跑一遍基础检验。我习惯用statsmodels库,它把ACF、PACF、平稳性检验都封装好了。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf, pacf, adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 生成示例数据:AR(1)过程 + 白噪声
np.random.seed(42)
n = 200
phi = 0.7
epsilon = np.random.normal(0, 1, n)
y = np.zeros(n)
for t in range(1, n):
y[t] = phi * y[t-1] + epsilon[t]
# 1. 平稳性检验(ADF检验)
adf_result = adfuller(y)
print(f'ADF统计量: {adf_result[0]:.4f}')
print(f'p值: {adf_result[1]:.4f}')
# p值小于0.05,拒绝非平稳原假设 → 序列平稳
# 2. 绘制ACF和PACF
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(y, lags=20, ax=ax1)
plot_pacf(y, lags=20, ax=ax2)
plt.tight_layout()
plt.show()
输出解读:
- ADF检验p值小于0.05 → 序列平稳
- ACF图:缓慢衰减(因为AR(1)的ACF是指数衰减的)
- PACF图:在滞后1阶处显著,之后截尾 → 提示AR(1)模型
嗯,这里要注意一点。ADF检验的p值如果接近0.05,别急着下结论。我一般会再跑一个KPSS检验做交叉验证。两个检验结果一致,我才放心。
1.7 常见误区与避坑
做时间序列分析这些年,我踩过不少坑。挑几个典型的说说:
- 误区一:ACF衰减慢就一定是非平稳。不一定!强自相关的平稳序列(比如AR(1)的φ接近1)ACF也会衰减很慢。要结合ADF检验看。
- 误区二:白噪声就是正态分布。白噪声只要求独立同分布,不要求正态。t分布、均匀分布都可以是白噪声。
- 误区三:只看ACF不看PACF。我见过有人只看ACF就定了模型阶数,结果模型残差还有自相关。ACF和PACF要配合着看,就像左右手一样。
我曾经踩过的坑:有一次做金融数据建模,ACF图显示滞后5阶显著,我直接定了MA(5)模型。结果模型拟合效果很差。后来仔细看PACF,发现滞后5阶也显著——其实是AR(5)才对。ACF和PACF一起看,才能避免这种误判。
好了,这一章的内容就到这里。平稳性、白噪声、ACF、PACF——这四个概念是时间序列分析的基石。你想想看,如果连数据稳不稳定、有没有规律都搞不清楚,后面的建模就是空中楼阁。下一章咱们会深入讨论单位根检验,那才是真正检验平稳性的“照妖镜”。