一、统计套利策略概述:什么是统计套利、配对交易原理、均值回归假设

大家好,我是老张。今天咱们聊聊统计套利。说实话,这玩意儿在量化圈里算是「老炮儿」级别的策略了。我2015年刚入行时,带我的师傅就说:「小子,把统计套利吃透了,你就能在市场上活下来。」 这么多年过去,我越发觉得这话有道理。

1.1 什么是统计套利?

统计套利,说白了就是「找亲戚」。你想想看,市场上那么多股票、期货、ETF,有些品种天生就「长得像」——比如茅台和五粮液、中国平安和中国人寿。它们价格走势高度相关,就像一对双胞胎。

但双胞胎也有闹别扭的时候。今天茅台涨了3%,五粮液只涨了1%。这时候,统计套利就会告诉你:「嘿,这俩兄弟走散了,赶紧做多那个落后的,做空那个超前的,等它们重新走到一起。」

我个人习惯把统计套利分为三类:

  • 配对交易:最经典,两只股票一多一空
  • 篮子套利:多只股票组合,比如做多一篮子银行股,做空一篮子保险股
  • ETF套利:利用ETF净值与市价的偏差

核心要点:统计套利不是无风险套利。它赚的是「大概率回归」的钱,而不是「确定回归」的钱。这一点,我踩过坑,后面会细说。

1.2 配对交易原理

配对交易是统计套利里最接地气的玩法。它的逻辑其实很简单:

  1. 找一对相关性高的品种(比如相关系数 > 0.8)
  2. 计算价差(Spread)= 品种A价格 - 品种B价格 × 对冲比率
  3. 设定阈值:价差偏离均值2倍标准差时开仓
  4. 等待回归:价差回到均值附近平仓

我记得2017年做螺纹钢和热卷的配对交易,那叫一个爽。这两个品种同属黑色系,相关性高达0.92。我设了个2.5倍标准差的阈值,一年下来夏普比率干到了2.8。但后来2018年贸易战一来,相关性直接崩到0.6,亏得我差点怀疑人生。

为什么会这样?因为配对交易的前提是「关系稳定」。一旦基本面变了,这对「亲戚」可能就翻脸不认人了。

我的经验:选配对时,别只看统计相关性。最好看看它们是不是同一个行业、有没有共同的驱动因子。比如,同属「地产链」的螺纹钢和玻璃,比螺纹钢和热卷更靠谱——因为热卷还受汽车行业影响。

1.3 均值回归假设

均值回归,是统计套利的「信仰」。它假设:价格或价差在偏离均值后,最终会回到均值附近。

嗯,这里要注意:均值回归不是必然的。它更像是一种统计规律——就像你扔硬币,连续10次正面后,第11次正面的概率还是50%。但如果你扔100万次,正反面比例会趋近50%。

在金融市场里,均值回归的「时间尺度」很关键:

时间尺度 均值回归强度 典型例子
日内(分钟级) 股指期货与现货的价差
日间(1-5天) 中等 同行业股票的价差
周度以上 跨品种价差(如金银比)

我曾经犯过一个错误:用日线数据做配对交易,设了3倍标准差阈值。结果价差偏离后,整整两个月没回归,账户回撤了15%。后来复盘发现,那段时间两个品种的基本面发生了根本性变化——一个在扩产,一个在减产。均值回归?不存在的。

避坑指南:均值回归假设成立的前提是「结构稳定」。如果基本面变了、市场环境变了、政策变了,均值可能已经「漂移」了。我曾经在2015年股灾期间做配对交易,结果所有股票一起暴跌,价差根本不回归——因为流动性都没了。

1.4 知识体系框架

下面这张图,是我自己总结的统计套利知识体系。你看一眼,心里就有谱了:

统计套利策略知识体系 统计套利 配对交易 篮子套利 ETF套利 相关性分析 (找亲戚) 均值回归假设 (等回归) 价差计算 → 阈值设定 → 开仓信号 → 回归平仓

这张图把统计套利的「骨架」画出来了。从上到下,先理解什么是统计套利,再掌握三种具体玩法,然后吃透两个核心原理,最后落实到具体操作步骤。嗯,你按这个顺序学,不会乱。

1.5 一个简单的配对交易示例

光说不练假把式。我写个最简单的配对交易代码,帮你理解整个过程:

import numpy as np
import pandas as pd
import statsmodels.api as sm

# 假设我们有两支股票的历史价格
# stock_a 和 stock_b 是 pandas Series
def calculate_spread(stock_a, stock_b):
    # 1. 计算对冲比率(用OLS回归)
    X = sm.add_constant(stock_b)
    model = sm.OLS(stock_a, X).fit()
    hedge_ratio = model.params[1]
    
    # 2. 计算价差
    spread = stock_a - hedge_ratio * stock_b
    
    # 3. 标准化价差(Z-score)
    z_score = (spread - spread.mean()) / spread.std()
    
    return z_score, hedge_ratio

# 设定交易信号
def generate_signals(z_score, entry_threshold=2.0, exit_threshold=0.5):
    signals = []
    position = 0  # 0:空仓, 1:做多价差, -1:做空价差
    
    for z in z_score:
        if position == 0:
            if z > entry_threshold:
                position = -1  # 价差过高,做空
            elif z < -entry_threshold:
                position = 1   # 价差过低,做多
        else:
            if abs(z) < exit_threshold:
                position = 0   # 回归均值,平仓
        signals.append(position)
    
    return signals

这段代码虽然简单,但核心逻辑都在里面了。我刚开始做配对交易时,就用这个框架,后来慢慢加了止损、动态阈值、协整检验等等。但万变不离其宗——找关系、算价差、等回归

一个小技巧:别直接用价格算价差,用对数价格。因为对数价格更符合正态分布,而且能消除量纲影响。我早期用价格直接算,结果茅台和五粮液的价差波动大得吓人,后来换成对数价格,世界清净了。

好了,这一章就到这里。统计套利的核心就是「找亲戚、等回归」——听起来简单,但里面的坑不少。下一章我会详细讲怎么选配对、怎么检验协整关系,以及那些年我踩过的坑。


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