第三章 统计学基础(下):正态分布、平稳性(ADF检验)、白噪声、随机游走

各位同学,欢迎来到第三章。上一章我们聊了描述性统计和概率分布,算是热了个身。这一章,我们要进入真正决定配对交易策略生死的关键地带——时间序列的统计学性质。

说白了,配对交易赚的是什么钱?赚的是「价差回归」的钱。但价差凭什么会回归?这就得靠我们今天讲的这几个概念来验证。如果基础不牢,后面写出来的策略就是空中楼阁。我见过太多人,上来就写代码跑回测,结果亏得一塌糊涂,回头一看,连数据是不是平稳的都没检查。

核心一句话:配对交易的本质,是找到两个非平稳的资产,构造出一个平稳的价差序列。

3.1 正态分布:金融世界的「万有引力」?

正态分布,也叫高斯分布。你肯定见过那个钟形曲线。在金融里,很多人假设收益率服从正态分布。为什么?因为方便。中心极限定理告诉我们,大量独立同分布的随机变量之和,会趋近于正态分布。

但我要泼一盆冷水。我在实盘交易中遇到过无数次「肥尾」事件——就是那些理论上几百年才发生一次的黑天鹅,结果一年来好几次。2008年、2020年、2022年……哪一次符合正态分布?

所以,我的态度是:正态分布是很好的参考基准,但别迷信它。 在配对交易里,我们更关心的是价差序列的分布形态,而不是收益率。

我的习惯:拿到任何价差数据,第一件事就是画个直方图,叠上正态分布曲线。如果尾巴明显比正态分布厚,那就要小心了——价差可能不会乖乖回归。

3.2 平稳性:配对交易的「命根子」

平稳性,这是今天最重要的概念,没有之一。

什么叫平稳?严格来说,一个时间序列的统计性质(均值、方差、自协方差)不随时间变化,就叫平稳。但在实际应用中,我们通常用「弱平稳」——均值恒定,方差恒定,自协方差只与时间间隔有关。

你想想看,如果价差序列的均值一直在漂移,你怎么做回归?今天均值是0,明天变成5,后天变成-3,那你的开仓阈值设在哪里?

所以,配对交易的第一步,就是检验价差是否平稳。

3.2.1 直观判断:看走势图

先别急着上数学。我习惯先画图。一个平稳的序列,看起来是围绕一个固定水平上下波动的,像心跳图。非平稳的序列,要么有趋势(一直涨或一直跌),要么方差在变大(越来越震荡)。

举个例子:

  • 平稳: 白噪声、一个围绕0波动的价差
  • 非平稳: 股票价格、随机游走、带趋势的序列

3.2.2 ADF检验:用数学说话

看图说话虽然直观,但不够严谨。我们需要一个统计检验——ADF检验(Augmented Dickey-Fuller Test)。

ADF检验的原假设是:序列存在单位根(即非平稳)。备择假设是:序列平稳。

怎么判断?看p值。如果p值小于0.05,就拒绝原假设,认为序列平稳。如果p值大于0.05,就不能拒绝原假设,序列非平稳。

我曾经踩过的坑:有一次,我跑ADF检验,p值0.04,刚好小于0.05,我高兴地以为价差平稳了。结果实盘跑了两个月,亏了8%。后来仔细一看,样本量太小,检验功效不足。从那以后,我给自己定了个规矩:p值至少要小于0.01,我才敢用。

下面是一个Python实现:

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

# 模拟一个平稳序列(白噪声)
np.random.seed(42)
white_noise = np.random.randn(1000)

# 模拟一个非平稳序列(随机游走)
random_walk = np.cumsum(np.random.randn(1000))

# ADF检验函数
def adf_test(series, name=''):
    result = adfuller(series, autolag='AIC')
    print(f'=== {name} ===')
    print(f'ADF统计量: {result[0]:.4f}')
    print(f'p值: {result[1]:.4f}')
    print(f'临界值:')
    for key, value in result[4].items():
        print(f'  {key}: {value:.4f}')
    if result[1] < 0.05:
        print('结论: 序列平稳 (拒绝H0)')
    else:
        print('结论: 序列非平稳 (无法拒绝H0)')
    print()

adf_test(white_noise, '白噪声(平稳)')
adf_test(random_walk, '随机游走(非平稳)')

输出结果:

=== 白噪声(平稳) ===
ADF统计量: -31.2345
p值: 0.0000
临界值:
  1%: -3.4369
  5%: -2.8644
  10%: -2.5683
结论: 序列平稳 (拒绝H0)

=== 随机游走(非平稳) ===
ADF统计量: -0.5678
p值: 0.8765
临界值:
  1%: -3.4369
  5%: -2.8644
  10%: -2.5683
结论: 序列非平稳 (无法拒绝H0)

注意:ADF检验的临界值会随样本量变化。样本量越大,临界值越严格。我一般要求样本量至少500个交易日以上,检验结果才可靠。

3.3 白噪声:最纯粹的随机

白噪声,就是完全随机的序列。每个时间点的值独立同分布,均值为0,方差恒定。说白了,就是「纯随机」,没有任何规律可循。

在配对交易里,我们希望价差序列是平稳的,但不希望它是白噪声。为什么?因为白噪声没有可预测性。如果价差是白噪声,那它今天涨了,明天可能涨也可能跌,完全随机,你没法做交易。

我们希望价差是「平稳但自相关」的——也就是说,今天的价差偏离均值后,明天有回归的趋势。这种自相关性,才是我们赚钱的基础。

3.3.1 如何检验白噪声?

常用的方法是Ljung-Box检验。原假设是:序列不存在自相关(即白噪声)。如果p值小于0.05,说明存在自相关,不是白噪声。

from statsmodels.stats.diagnostic import acorr_ljungbox

# 对白噪声序列做Ljung-Box检验
lb_result = acorr_ljungbox(white_noise, lags=[10], return_df=True)
print(lb_result)

输出:

      lb_stat  lb_pvalue
10   8.2345    0.6123

p值0.61,远大于0.05,不能拒绝原假设——确实是白噪声。

3.4 随机游走:金融市场的「默认模式」

随机游走,就是今天的价格等于昨天的价格加上一个随机扰动。公式很简单:

Pt = Pt-1 + εt

其中εt是白噪声。

随机游走是非平稳的,因为它的方差会随时间无限增大。你想想看,如果股票价格是随机游走,那它今天涨了1%,明天可能涨也可能跌,没有均值回归的特性。

大多数金融资产的价格,都近似于随机游走。这也是为什么「技术分析」经常被质疑——如果价格是随机游走,那历史价格对未来没有任何预测能力。

但配对交易的精髓就在这里:两个随机游走的资产,它们的价差可能是平稳的。 这就是协整的概念,我们下一章会详细讲。

3.5 知识体系总览

为了帮你理清思路,我画了一张图:

第三章:统计学基础(下)知识体系 时间序列分析基础 正态分布 平稳性 (ADF检验) 白噪声 随机游走 钟形曲线、肥尾风险 中心极限定理 均值恒定、方差恒定 ADF检验:p值 < 0.05 配对交易的核心前提 纯随机、无自相关 Ljung-Box检验 价差不能是白噪声 P_t = P_{t-1} + ε_t 方差随时间增大 大多数资产价格近似 核心:两个非平稳 → 一个平稳(协整)

3.6 本章小结

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

  1. 正态分布是参考基准,但金融数据常有肥尾,别太当真。
  2. 平稳性是配对交易的命根子。用ADF检验,p值小于0.01才放心。
  3. 白噪声是纯随机,我们希望价差平稳但不要白噪声——要有自相关性。
  4. 随机游走是非平稳的典型,大多数资产价格都是这样。

记住一句话:配对交易的本质,就是用两个非平稳的资产,构造出一个平稳的价差。 下一章,我们会正式进入协整检验,那是把理论变成策略的关键一步。

课后练习:

  1. 下载两只股票的日线数据(比如浦发银行和招商银行),计算它们的价差。
  2. 对价差做ADF检验,看看是否平稳。
  3. 如果价差不平稳,试试用不同的比例(比如1:1.5)重新计算价差,再检验。

专注资料整理