halo 的技术博客

返回

引言:均值回归的量化验证#

统计套利的核心假设是”价格终将回归均值”。但如何科学验证两个资产价格是否真的存在均值回归关系?仅凭肉眼观察价格走势是危险的——看似明显的均值回归可能是巧合,而真正的套利机会往往隐藏在统计显著性之中。

本文将深入探讨三种核心验证方法:ADF检验(Augmented Dickey-Fuller Test)Hurst指数协整分析,并提供完整的Python实战代码。

一、ADF检验:平稳性检验的黄金标准#

原理与假设#

ADF检验用于判断一个时间序列是否平稳(stationary)。对于配对交易,我们需要验证:

  • 零假设(H0):序列存在单位根(非平稳)
  • 备择假设(H1):序列平稳(均值回归)

如果p值小于0.05,拒绝零假设,认为序列平稳,存在均值回归特性。

Python实战:ADF检验#

ADF检验的实战要点#

  1. 滞后阶数选择:使用AIC或BIC自动选择最优滞后阶数
  2. 样本周期选择:不同市场状态下,均值回归特性可能变化
  3. 多重检验问题:如果测试100对股票,5对 falsely 显著(p<0.05)

二、Hurst指数:衡量均值回归强度#

Hurst指数的经济学含义#

Hurst指数(H)量化了时间序列的”记忆性”:

  • H < 0.5:均值回归(anti-persistent)
  • H = 0.5:随机游走(布朗运动)
  • H > 0.5:趋势延续(persistent)

Python计算Hurst指数#

三、协整分析:配对交易的统计学基础#

协整 vs 相关性#

很多量化新手混淆协整相关性

  • 相关性:衡量同一时刻两个序列的同步程度
  • 协整:衡量两个非平稳序列的线性组合是否平稳

协整是配对交易的真正统计学基础。

Python协整检验#

四、综合实战:构建均值回归验证系统#

完整验证流程#

五、风险管理与实战建议#

1. 统计显著性与经济显著性#

即使统计检验显著,也要考虑:

  • 交易成本:频繁交易可能吞噬所有利润
  • 执行滑点:尤其是对流动性差的股票
  • 资金容量:策略能容纳多少资金而不影响价格

2. 样本外测试#

3. 动态验证与监控#

均值回归特性可能随时间衰减:

  • 滚动窗口验证:每3个月重新检验一次
  • 衰减监测:Hurst指数逐渐接近0.5时警惕
  • 结构断裂检测:使用Chow检验或CUSUM检验

结语:科学验证,稳健套利#

均值回归验证是统计套利成功的基石。通过整合ADF检验Hurst指数协整分析,我们可以:

  1. 过滤虚假信号:避免”看起来像”但实际不存在的均值回归
  2. 量化回归强度:Hurst指数提供回归速度的度量
  3. 建立统计基础:协整分析提供严谨的理论支撑
  4. 管理模型风险:样本外测试和动态监控确保稳健性

记住:统计显著性不等于经济显著性。在实盘交易前,务必进行严格的样本外测试和交易成本分析。

ADF检验与价格比 ADF检验示例:中国平安与中国人寿的价格比平稳性检验

Hurst指数比较 三类时间序列的Hurst指数:随机游走(H=0.5)、均值回归(H<0.5)、趋势延续(H>0.5)

参考文献#

  1. Engle, R. F., & Granger, C. W. (1987). “Co-integration and error correction: Representation, estimation, and testing.” Econometrica.
  2. Alexander, C. (2001). “Market Models: A Guide to Financial Data Analysis.” John Wiley & Sons.
  3. 中国量化投资学会 (2025). 《统计套利与配对交易实战》.
  4. 张维等 (2024). 《均值回归的量化验证方法研究》. 金融工程期刊.

附录:完整代码仓库#

本文所有代码示例已上传至GitHub: https://github.com/halo/quant-tools/mean-reversion-validation

包含:

  • 数据下载脚本
  • ADF检验函数
  • Hurst指数计算
  • 协整分析工具
  • 完整回测框架
统计套利中的均值回归验证:ADF检验、Hurst指数与协整分析实战
https://blog.halo26812.eu.org/blog/2026-06-03-mean-reversion-validation
Author halo
Published at 2026年6月3日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨