3. 时间序列基础:平稳性、自相关、偏自相关、白噪声检验

各位同学,咱们今天聊时间序列分析的基础。说实话,这部分内容看着简单,但我在做宏观因子协整策略时,踩过的坑有一半都跟这些基础概念有关。你想想看,如果连数据是不是平稳的都没搞清楚,后面做协整、做回归,那结果基本就是废的。

好,咱们一个一个来。

3.1 平稳性:时间序列的“定海神针”

什么叫平稳?说白了,就是一个时间序列的统计性质不随时间变化。均值稳定、方差稳定、自协方差也只跟时间间隔有关,跟具体时间点无关。

我个人习惯把平稳性分成两种:

  • 严平稳:所有统计性质都不随时间变化。这个条件太强,现实中几乎不存在。
  • 弱平稳:均值恒定、方差有限且恒定、自协方差只依赖于时间间隔。我们平时说的“平稳”,基本都指这个。

为什么平稳性这么重要?

因为非平稳序列会导致“伪回归”。我在2019年做过一个宏观因子组合,当时用GDP和CPI直接做回归,R²高达0.95,结果一检查,两个序列都是非平稳的,纯粹是“假相关”。嗯,从那以后,我每做一个模型,第一步就是检查平稳性。

3.2 平稳性检验:ADF与KPSS

检验平稳性,最常用的就是ADF检验和KPSS检验。我建议两个都做,互相验证。

ADF检验(Augmented Dickey-Fuller)

原假设H₀:序列存在单位根(非平稳)。
备择假设H₁:序列平稳。

如果p值小于0.05,拒绝原假设,认为序列平稳。

# Python实现ADF检验
from statsmodels.tsa.stattools import adfuller

# 假设data是pandas Series
result = adfuller(data, autolag='AIC')
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
print(f'临界值: {result[4]}')

if result[1] < 0.05:
    print('序列平稳')
else:
    print('序列非平稳,需要差分')

KPSS检验

这个跟ADF正好反过来。原假设H₀:序列平稳。如果p值小于0.05,拒绝原假设,认为非平稳。

from statsmodels.tsa.stattools import kpss

result = kpss(data, regression='c')
print(f'KPSS统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')

我的经验:两个检验结果一致时最理想。如果不一致,我会更倾向于ADF的结果,但会多做一些差分尝试。曾经有个客户的数据,ADF说平稳,KPSS说非平稳,最后发现是结构性断点导致的——这种情况需要用Zivot-Andrews检验。

3.3 自相关与偏自相关:序列的“记忆”有多长?

自相关(ACF)衡量的是序列与其滞后值之间的相关性。偏自相关(PACF)则是在剔除了中间滞后项的影响后,衡量两个时间点之间的直接相关性。

你想想看,如果今天的收益率跟昨天的收益率有关系,那这个关系到底能持续多久?ACF和PACF就是回答这个问题的。

ACF图怎么看?

  • 如果ACF缓慢衰减(拖尾),说明序列可能有趋势或单位根。
  • 如果ACF在某个滞后阶数后突然截尾,说明序列可能是MA(q)过程。

PACF图怎么看?

  • 如果PACF在p阶后截尾,说明序列可能是AR(p)过程。
  • 如果PACF缓慢衰减,说明可能是MA过程。
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(data, lags=20, ax=ax1)
plot_pacf(data, lags=20, ax=ax2)
plt.show()

注意:ACF和PACF的置信区间是±1.96/√n。如果某个滞后阶数的值超出了这个范围,才认为显著。我曾经见过有人把刚好在边界上的点也当作显著,结果模型过拟合得一塌糊涂。

3.4 白噪声检验:你的模型“吃饱”了吗?

白噪声,说白了就是纯随机序列。均值0、方差恒定、没有自相关。如果模型拟合后的残差是白噪声,说明模型已经把信息提取干净了。

常用的检验方法是Ljung-Box检验:

  • 原假设H₀:数据是独立分布的(白噪声)。
  • 如果p值大于0.05,不能拒绝原假设,认为残差是白噪声。
from statsmodels.stats.diagnostic import acorr_ljungbox

# 对残差进行白噪声检验
result = acorr_ljungbox(residuals, lags=[10, 20, 30], return_df=True)
print(result)

实战经验:我在做宏观因子协整策略时,每次拟合完模型,第一件事就是检查残差是不是白噪声。如果不是,说明还有信息没被提取,要么是滞后阶数不够,要么是遗漏了重要变量。有一次,残差在滞后5阶时显著自相关,我加了一个滞后项,模型效果立马提升了一个档次。

3.5 知识体系总览

下面这张图,是我自己整理的时间序列基础分析流程。每次做策略前,我都会按这个流程走一遍。

时间序列基础分析流程 原始时间序列 平稳性检验(ADF + KPSS) 非平稳 → 差分 平稳 → 继续 ACF / PACF 分析 模型识别(ARIMA阶数确定) 残差白噪声检验(Ljung-Box)

3.6 实战中的常见陷阱

最后,我分享几个我在项目中踩过的坑:

  1. 季节性误判为趋势:有些序列有明显的季节性,比如季度GDP。如果不做季节调整,ADF检验可能会误判为非平稳。我建议先用X-13ARIMA-SEATS做季节调整。
  2. 差分过度:有些序列差分一次就平稳了,但有人为了“保险”差分两次。结果呢?引入了不必要的移动平均项,模型反而变差了。
  3. 忽略结构性断点:2008年金融危机、2020年疫情,这些事件会导致序列发生结构性变化。普通的ADF检验检测不出来,需要用Chow检验或Zivot-Andrews检验。

我的建议:在做协整策略之前,先把每个宏观因子的时间序列性质摸清楚。平稳的、一阶单整的、二阶单整的,分门别类整理好。这样后面做协整检验时,心里才有底。

好,时间序列基础就聊到这儿。这些内容看着简单,但真到了实战中,每一步都值得反复推敲。记住一句话:基础不牢,地动山摇。


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