2. 平稳性检验(上):单位根检验原理,ADF检验的数学推导与直觉理解

各位好,欢迎来到协整分析实战的第二讲。

上一章我们聊了协整的基本概念,说白了就是找两个“同床异梦”的资产,看它们长期能不能走到一块儿去。但有个前提——你得先确认这些时间序列是“平稳”的,或者至少是“同阶单整”的。否则,你做的回归可能就是“伪回归”,看着相关系数挺高,其实全是假象。

我刚开始做量化那会儿,就吃过这个亏。记得有一次,我把上证指数和某只消费股的日收益率直接做了个回归,R方高达0.85,我兴奋得不行,以为发现了圣杯。结果实盘一跑,亏得亲妈都不认识。后来复盘才发现,两个序列都是非平稳的,那个高相关性纯粹是“数据挖掘”出来的幻觉。从那以后,我每次做配对交易前,第一件事就是老老实实做平稳性检验。

2.1 什么是平稳性?直觉理解

平稳性,说白了就是一个时间序列的统计性质不随时间变化。你想想看,如果一只股票的价格序列,它的均值、方差、自协方差都随着时间飘忽不定,那你拿什么去预测它?

严格来说,我们通常要求的是弱平稳(也叫协方差平稳):

  • 均值恒定:序列的期望值不随时间变化,比如长期围绕一个常数波动。
  • 方差恒定:序列的波动幅度不随时间变化,不能今天波动1%,明天波动10%。
  • 自协方差只与时间间隔有关:比如今天和昨天的相关性,与昨天和前天的相关性,应该是一样的模式。

举个例子,白噪声序列就是最典型的平稳序列。它像什么?就像你扔硬币,每次正反面的结果独立同分布,均值是0,方差是常数。而股票价格呢?它通常是非平稳的,因为它有趋势,有随机游走,均值一直在变。

核心要点: 非平稳序列做回归,容易产生“伪回归”。检验平稳性,是协整分析的第一步,也是最重要的一步。

2.2 单位根:非平稳的“罪魁祸首”

为什么很多金融时间序列是非平稳的?答案往往藏在“单位根”里。

我们来看一个最简单的模型——一阶自回归模型 AR(1)

y_t = ρ * y_{t-1} + ε_t

其中 ε_t 是白噪声,均值为0,方差为常数。

这个模型描述的是:当前值 y_t 等于上一期值 y_{t-1} 乘以一个系数 ρ,再加上一个随机扰动。

那么,这个序列的平稳性取决于 ρ 的取值:

  • 如果 |ρ| < 1:序列是平稳的。比如 ρ=0.5,那么冲击会逐渐衰减,序列会围绕0均值波动。你想想看,就像你推一个秋千,推一下它晃几下,但最终会停下来。
  • 如果 |ρ| > 1:序列是爆炸性的。比如 ρ=1.5,那么序列会指数级增长或衰减,现实中很少见。
  • 如果 ρ = 1:这就是单位根过程!序列是随机游走,非平稳。冲击是永久性的,永远不会衰减。你推一下秋千,它就一直晃下去,不会停。

嗯,这里要注意:ρ=1 就是单位根。为什么叫“单位根”?因为特征方程 1 - ρz = 0 的根是 z = 1/ρ,当 ρ=1 时,根正好等于1,所以叫“单位根”。

我的经验: 在实际项目中,我见过很多新手把 ρ 接近1的序列误判为平稳。比如 ρ=0.99,虽然理论上它是平稳的,但衰减速度极慢,样本量不够大的时候,检验结果往往不显著。这时候我会建议先用更长的时间窗口,或者做差分处理。

2.3 ADF检验:从直觉到数学推导

好了,现在我们知道了单位根是“坏东西”。那怎么检验一个序列有没有单位根呢?最常用的方法就是ADF检验(Augmented Dickey-Fuller Test)。

它的核心思想其实很简单:我们直接去估计 AR(1) 模型中的 ρ,然后看它是不是等于1。

但直接检验 ρ=1 有个问题——在单位根假设下,统计量的分布不是标准的 t 分布,而是 Dickey-Fuller 分布。所以我们需要用专门的临界值。

2.3.1 基本模型

ADF检验通常考虑三种形式:

  1. 无常数项、无趋势项:Δy_t = γ * y_{t-1} + ε_t
  2. 有常数项:Δy_t = α + γ * y_{t-1} + ε_t
  3. 有常数项和趋势项:Δy_t = α + β*t + γ * y_{t-1} + ε_t

其中 Δy_t = y_t - y_{t-1},γ = ρ - 1。原假设 H0: γ = 0(即 ρ=1,有单位根),备择假设 H1: γ < 0(即 ρ<1,平稳)。

你可能会问:为什么要加常数项和趋势项?说白了,是为了处理不同形式的非平稳性。比如股价有长期上涨趋势,你就得用带趋势项的模型,否则检验结果会偏误。

2.3.2 数学推导:为什么是 γ 而不是 ρ?

我们来看一下推导过程。从 AR(1) 模型开始:

y_t = ρ * y_{t-1} + ε_t

两边同时减去 y_{t-1}:

y_t - y_{t-1} = ρ * y_{t-1} - y_{t-1} + ε_t
Δy_t = (ρ - 1) * y_{t-1} + ε_t
Δy_t = γ * y_{t-1} + ε_t

为什么要这么变换?因为直接估计 ρ 时,如果 ρ=1,那么 y_t 的方差会随时间发散,导致 OLS 估计量的分布不正常。而变换成 Δy_t 后,在单位根假设下,Δy_t 是平稳的(因为随机游走的差分是白噪声),这样统计性质就好处理多了。

然后我们用 OLS 估计 γ,计算 t 统计量:

t_γ = γ_hat / SE(γ_hat)

但这个 t 统计量不服从标准的 t 分布。Dickey 和 Fuller 通过蒙特卡洛模拟给出了临界值表。所以,我们查的是 DF 分布,而不是 t 分布。

避坑指南: 我曾经犯过一个错误——直接用 Python 的 statsmodels 跑 ADF 检验,看到 p-value 小于 0.05 就认为序列平稳。但后来发现,如果序列有结构性突变(比如金融危机前后的数据),ADF 检验的效力会大幅下降。这时候我会改用 Zivot-Andrews 检验,它允许在未知时间点发生结构性变化。

2.4 ADF检验的实战步骤

好了,理论讲完了,我们来看看实际怎么操作。我个人习惯用 Python 的 statsmodels.tsa.stattools.adfuller 函数。

2.4.1 代码示例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller

# 生成一个随机游走序列(非平稳)
np.random.seed(42)
n = 200
y = np.cumsum(np.random.randn(n))  # 随机游走

# ADF检验
result = adfuller(y, autolag='AIC')
print(f'ADF Statistic: {result[0]:.4f}')
print(f'p-value: {result[1]:.4f}')
print(f'Critical Values:')
for key, value in result[4].items():
    print(f'  {key}: {value:.4f}')

# 判断
if result[1] < 0.05:
    print("拒绝原假设,序列平稳")
else:
    print("不能拒绝原假设,序列非平稳")

2.4.2 输出解读

假设输出如下:

ADF Statistic: -1.2345
p-value: 0.6543
Critical Values:
  1%: -3.4567
  5%: -2.8765
  10%: -2.5678
不能拒绝原假设,序列非平稳

这里 ADF 统计量是 -1.2345,比 5% 临界值 -2.8765 要大(注意是负数,绝对值越小越不显著)。p-value 是 0.6543,远大于 0.05。所以不能拒绝原假设,序列有单位根,非平稳。

我的小技巧: 在实际项目中,我一般会同时看 ADF 统计量和 p-value。如果 p-value 接近 0.05 但统计量刚好在临界值附近,我会再跑一个 KPSS 检验(原假设是平稳)做交叉验证。两个检验结果一致,我才放心。

2.5 知识体系总览

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

平稳性检验(上)知识体系 平稳性检验 平稳性概念 单位根原理 ADF检验 均值恒定 方差恒定 自协方差稳定 AR(1)模型 ρ=1 即单位根 冲击永久性 三种模型形式 γ = ρ-1 DF分布临界值 核心结论:非平稳 → 差分 → 平稳 ADF检验 p<0.05 拒绝单位根假设

2.6 本章小结

好了,我们来捋一捋今天的内容:

  • 平稳性是时间序列分析的基础,非平稳会导致伪回归。
  • 单位根(ρ=1)是非平稳的常见原因,冲击永久存在。
  • ADF检验通过检验 γ = ρ-1 是否等于0来判断单位根,统计量服从DF分布。
  • 实战中要注意模型形式的选择(有无常数项、趋势项),以及滞后阶数的确定(通常用AIC或BIC)。

我个人觉得,平稳性检验就像做手术前的消毒工作——虽然繁琐,但绝对不能跳过。你想想看,如果连序列是不是平稳的都没搞清楚,后面做的协整回归、配对交易,那不就是空中楼阁吗?

下一章我们会继续深入,讲一讲单位根检验的进阶话题,包括如何选择滞后阶数、如何处理结构性突变,以及如何用多个检验方法交叉验证。到时候我会分享一些我在实盘中踩过的坑,保证让你少走弯路。

课后练习: 找一只你熟悉的股票日收盘价数据(比如贵州茅台),用 Python 的 adfuller 函数检验其对数价格序列是否平稳。如果不平稳,试试一阶差分后再检验。看看结果有什么变化?

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