3、统计套利入门:均值回归、协整关系与配对交易

说实话,很多刚入行的朋友一听到「统计套利」,就觉得这东西高深莫测。其实没那么玄乎。

我个人的理解,统计套利就是——找到两个会「互相拉扯」的资产,然后在它们走偏的时候下注,赌它们会回来

嗯,说白了,就是赚「均值回归」的钱。

3.1 均值回归:市场里的「橡皮筋」

先聊聊均值回归。这个概念其实很朴素:价格涨多了会跌,跌多了会涨

你想想看,一只股票不可能永远涨上天,也不可能永远跌到零。它总有一个「内在价值」或者「均衡位置」。当价格偏离这个位置太远时,市场力量会把它拉回来。

我在早期做CTA策略时,就吃过「趋势跟踪」的亏。有一年行情特别好,我满仓追涨,结果一个回调把我半年的利润全吞了。后来我反思:趋势策略赚的是「动量」的钱,而均值回归赚的是「反转」的钱。两者没有优劣,但你要知道自己在赚什么钱。

核心要点: 均值回归策略的核心假设是——价格序列是平稳的。如果序列不平稳,你所谓的「回归」可能只是幻觉。

怎么判断一个序列是否平稳?最直观的方法就是看它的均值和方差是否随时间变化。如果一只股票的价格长期在50到60之间晃悠,那它大概率是平稳的。但如果它从50涨到500,那显然不平稳。

3.2 协整关系:比相关性更「铁」的关系

好,问题来了。单只股票的均值回归,其实很难做。为什么?因为大多数股票的价格序列是非平稳的,你根本不知道它的「均值」在哪里。

这时候,协整关系就派上用场了。

我打个比方。两个人用一根绳子拴在一起走路。虽然每个人都在乱晃,但他们的相对位置是固定的。这就是协整——两个非平稳的时间序列,它们的线性组合却是平稳的

避坑指南: 我曾经犯过一个低级错误——只看相关性就去做配对交易。结果呢?两只股票相关性高达0.9,但它们的价差越走越远,最后爆仓了。记住:相关性 ≠ 协整性。相关性衡量的是线性关联,协整衡量的是长期均衡关系。两者完全不是一回事。

举个具体的例子。假设你有两只银行股——招商银行和兴业银行。它们各自的价格走势可能都是非平稳的(长期向上),但它们的价差(或者某个线性组合)可能是平稳的。这意味着,当价差扩大到一定程度时,大概率会缩回来。

检验协整关系,最常用的方法是Engle-Granger两步法

  1. 先用OLS回归估计两个序列的线性关系:Y = α + βX + ε
  2. 然后对残差ε做单位根检验(比如ADF检验)。如果残差是平稳的,就说明存在协整关系。

嗯,这里要注意:ADF检验的p值要小于0.05,才能拒绝「残差非平稳」的原假设。我一般习惯把阈值设到0.01,更保守一些。

3.3 配对交易:把理论变成钱

协整关系找到了,怎么赚钱?这就是配对交易要做的事。

配对交易的流程其实很简单:

  1. 选对:找到一对协整的股票(比如贵州茅台和五粮液)
  2. 建仓:当价差偏离均值超过某个阈值(比如2倍标准差)时,做多被低估的那只,做空被高估的那只
  3. 平仓:当价差回归到均值附近时,两边同时平仓,赚取价差收敛的利润
  4. 止损:如果价差继续扩大,超过3倍标准差,果断止损

我个人的习惯是,用Z-score来标准化价差。Z-score = (当前价差 - 价差均值) / 价差标准差。当Z-score超过2时开仓,回到0附近时平仓,超过3时止损。

重要提醒: 配对交易不是无风险套利。它面临的主要风险包括:
- 协整关系可能失效(比如公司基本面发生变化)
- 交易成本可能吃掉利润(尤其是做空成本)
- 极端行情下价差可能持续扩大(比如2008年金融危机)

下面是我常用的一个配对交易回测框架,用Python写的:

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

def find_cointegrated_pairs(data, p_value_threshold=0.05):
    """
    寻找协整对
    data: DataFrame, 每列是一只股票的价格序列
    """
    n = data.shape[1]
    p_value_matrix = np.ones((n, n))
    pairs = []
    
    for i in range(n):
        for j in range(i+1, n):
            # 取两只股票的价格序列
            stock1 = data.iloc[:, i]
            stock2 = data.iloc[:, j]
            
            # OLS回归
            result = sm.OLS(stock2, sm.add_constant(stock1)).fit()
            residuals = result.resid
            
            # ADF检验
            adf_result = adfuller(residuals)
            p_value = adf_result[1]
            
            p_value_matrix[i, j] = p_value
            
            if p_value < p_value_threshold:
                pairs.append((data.columns[i], data.columns[j], p_value))
    
    return pairs, p_value_matrix

# 使用示例
# pairs, p_matrix = find_cointegrated_pairs(price_data)
# print(f"找到 {len(pairs)} 对协整关系")

这段代码的核心逻辑就是:遍历所有可能的股票对,做回归、算残差、跑ADF检验。如果p值小于阈值,就认为存在协整关系。

实际项目中,我一般会加上一个滚动窗口。因为协整关系不是一成不变的。比如,我用过去60天的数据来估计协整关系,然后每天滚动更新。这样能及时捕捉到关系的变化。

3.4 一张图看懂统计套利

下面这张图,是我自己总结的统计套利核心流程。你可以把它当成一个「路线图」:

统计套利核心流程 步骤1:数据准备 获取价格序列,清洗数据 步骤2:协整检验 ADF检验,筛选协整对 步骤3:策略设计 设定阈值、仓位 步骤4:回测验证 评估收益、风险 步骤5:实盘执行 自动化交易、风控 步骤6:监控优化 滚动更新、参数调整 持续循环优化 关键指标说明: • 开仓阈值:Z-score > 2 或 < -2 • 平仓阈值:Z-score 回归到 0 附近 • 止损阈值:Z-score > 3 或 < -3 • 协整检验:ADF p值 < 0.05 • 滚动窗口:通常60-120个交易日 • 资金分配:每对不超过总资金5%

这张图把整个流程串起来了。从数据准备到协整检验,再到策略设计、回测、实盘、监控优化,形成一个闭环。我个人觉得,最容易被忽视的是「监控优化」这一步。很多人跑完回测就以为万事大吉了,结果实盘一跑就崩。记住:市场在变,协整关系也在变,你的策略必须跟着变。

3.5 几个实战中的坑

最后,分享几个我在实战中踩过的坑:

  • 坑一:幸存者偏差。回测时只用了现在还活着的股票,忽略了那些退市的。这会让回测结果看起来比实际好很多。我现在的做法是,回测时用「当时存在的全部股票」。
  • 坑二:交易成本被低估。尤其是做空成本,有些股票融券费率高达年化8%以上。如果价差收敛需要一个月,光利息就能吃掉大部分利润。
  • 坑三:过度优化。我曾经为了追求高夏普比,把参数调得特别精细。结果呢?实盘一跑,完全不是那么回事。后来我学乖了:参数越少越好,阈值越简单越好

嗯,统计套利入门的内容就这些。记住一句话:协整是基础,均值回归是信仰,风控是底线。把这三点吃透了,你就能在市场上找到属于自己的「印钞机」。

专注资料整理