2. 平稳性概念:严平稳与弱平稳、白噪声过程、随机游走模型
好,咱们进入第二章。这一章我打算聊聊平稳性——这个在时间序列里绕不开的核心概念。
说实话,我刚开始接触时间序列时,觉得平稳性就是个理论玩具。直到有一次,我用非平稳数据直接建模,结果预测结果惨不忍睹。嗯,从那以后,我再也不敢小看它了。
2.1 什么是平稳性?
平稳性,说白了就是:时间序列的统计性质不随时间变化。
你想想看,如果一组数据的均值、方差、自相关结构都在变,你怎么用历史去预测未来?那就像用去年的流行趋势预测今年的时尚——大概率翻车。
平稳性分为两种:严平稳和弱平稳。实际工作中,我们几乎只用弱平稳。为什么?因为严平稳太苛刻了。
2.2 严平稳
严平稳的定义很严格:
对于任意时间点 t₁, t₂, ..., tₙ,以及任意时间偏移 k,序列的联合分布保持不变。
换句话说,你把整段序列平移一段,它的所有统计性质——均值、方差、偏度、峰度、甚至整个分布形状——都得一模一样。
我个人习惯把严平稳看作「完美复制品」。但现实中,这种序列几乎不存在。你想想看,股票收益率、气温变化、用户访问量……哪个能保证分布完全不变?
2.3 弱平稳
弱平稳就友好多了。它只要求三个条件:
- 均值恒定:E(Xₜ) = μ,对所有 t 成立
- 方差恒定:Var(Xₜ) = σ²,对所有 t 成立
- 自协方差只与时间间隔有关:Cov(Xₜ, Xₜ₊ₖ) = γₖ,与 t 无关
你看,弱平稳只关心一阶矩和二阶矩。均值不变、方差不变、自相关结构稳定——这就够了。
我在项目中遇到过很多次:数据看起来不平稳,但做一阶差分后,均值稳定了,方差也收敛了,就可以用 ARIMA 建模了。这就是弱平稳的实用之处。
2.4 白噪声过程
白噪声是平稳性里最纯粹的例子。它的定义很简单:
- 均值为 0
- 方差为常数 σ²
- 不同时间点的值之间不相关(自协方差为 0)
用数学表达就是:
E(εₜ) = 0
Var(εₜ) = σ²
Cov(εₜ, εₛ) = 0, 当 t ≠ s
白噪声就像「纯随机」。没有趋势、没有周期、没有记忆。你无法用它做任何预测——因为它的未来和过去毫无关系。
我曾经犯过一个错误:模型拟合后,残差看起来像白噪声,我就以为万事大吉了。后来发现残差里还有微弱的相关性,重新调整模型后,预测精度提升了 15%。所以,残差白噪声检验是模型诊断的关键一步。
2.5 随机游走模型
随机游走是非平稳序列的典型代表。它的形式很简单:
Xₜ = Xₜ₋₁ + εₜ
其中 εₜ 是白噪声。
你想想看,随机游走的每一步都依赖于上一步。今天的值 = 昨天的值 + 一个随机扰动。这意味着:
- 均值不恒定:序列会随机漂移,没有固定的均值
- 方差随时间增长:Var(Xₜ) = t · σ²,时间越长,波动越大
- 自相关衰减极慢:即使相隔很远,相关性依然很高
我记得有一次做股价预测,直接用原始价格建模,结果模型完全失效。后来才意识到,股价走势就是典型的随机游走——非平稳的。一阶差分后,收益率序列就平稳了。
随机游走还有一个重要性质:它是最简单的单位根过程。单位根检验(ADF、PP、KPSS)的核心,就是判断序列是否包含单位根——也就是是否属于随机游走或其变体。
2.6 知识体系总览
下面这张图,我把本章的核心逻辑梳理了一下:
2.7 三者之间的关系
我习惯用一个简单的对比来理解这三者:
| 特性 | 白噪声 | 弱平稳序列 | 随机游走 |
|---|---|---|---|
| 均值 | 恒为 0 | 恒定 | 不恒定(漂移) |
| 方差 | 恒定 | 恒定 | 随时间增长 |
| 自相关 | 无(0) | 衰减快 | 衰减极慢 |
| 可预测性 | 不可预测 | 可预测 | 不可预测(随机游走假设) |
| 差分后 | 仍是白噪声 | 可能仍平稳 | 变为白噪声 |
你看,白噪声是最「干净」的平稳序列。随机游走是最「典型」的非平稳序列。而弱平稳,就是我们日常建模的「工作区间」。
2.8 一个小例子
假设你有一组数据:
import numpy as np
import matplotlib.pyplot as plt
# 生成白噪声
np.random.seed(42)
white_noise = np.random.normal(0, 1, 100)
# 生成随机游走
random_walk = np.cumsum(white_noise)
# 生成弱平稳序列(AR(1) 过程)
phi = 0.7
ar1 = [0]
for i in range(1, 100):
ar1.append(phi * ar1[-1] + white_noise[i])
# 画图对比
plt.figure(figsize=(12, 4))
plt.subplot(1,3,1); plt.plot(white_noise); plt.title('白噪声')
plt.subplot(1,3,2); plt.plot(ar1); plt.title('弱平稳 AR(1)')
plt.subplot(1,3,3); plt.plot(random_walk); plt.title('随机游走')
plt.tight_layout()
plt.show()
运行这段代码,你会看到:白噪声上下波动但无规律;AR(1) 围绕均值波动;随机游走则越走越远,没有回头的意思。
这就是三种序列的「性格」差异。
2.9 避坑指南
最后,分享几个我踩过的坑:
- 不要混淆「平稳」和「无趋势」:有趋势的序列肯定不平稳,但无趋势的序列也不一定平稳(比如方差随时间变化)。
- 差分不是万能的:有些序列差分后仍然不平稳(比如存在季节性),需要季节性差分或更复杂的变换。
- 白噪声检验要谨慎:Ljung-Box 检验的 p 值大于 0.05 才能认为残差是白噪声。但样本量小的时候,检验效力会下降。
嗯,这一章就到这里。平稳性是个基础,但基础不牢,后面建模就容易翻车。希望你能把这三个概念刻在脑子里。
公众号:蓝海资料掘金营,微信deep3321