一、统计套利基础:从一次失败的交易说起
我记得刚入行那会儿,做过一个自以为很聪明的策略。发现茅台和五粮液的股价走势几乎一模一样,于是果断做多茅台、做空五粮液。结果呢?一周后茅台跌了3%,五粮液涨了2%,两边打脸。后来我才明白——这不叫统计套利,这叫「看着像就上了」。
统计套利,说白了就是利用历史数据找到两个或多个资产之间的统计关系,当这种关系暂时偏离时入场,赌它迟早会回归。嗯,这里要注意:不是所有「长得像」的股票都能做配对。
1.1 什么是统计套利?
统计套利(Statistical Arbitrage,简称Stat Arb)是一种基于数学模型和统计方法的交易策略。它不追求无风险收益,而是寻找高概率的价差回归机会。
核心思想: 资产价格之间长期存在某种统计关系,短期偏离是暂时的,最终会回归均值。
我个人习惯把统计套利分成三个层次:
- 第一层: 找关系——哪些资产之间存在稳定的统计关联?
- 第二层: 度量偏离——当前价差偏离了多少个标准差?
- 第三层: 执行交易——什么时候入场?什么时候止损?
你想想看,如果两个资产完全无关,那谈何套利?所以第一步永远是相关性检验和协整检验。
1.2 配对交易 vs 统计套利
很多人把这两个概念混为一谈。我在项目中遇到过不少面试者,一上来就说「我做过配对交易,就是统计套利」。其实不然。
| 维度 | 配对交易 | 统计套利 |
|---|---|---|
| 资产数量 | 通常2个 | 2个或多个(可扩展到篮子) |
| 关系假设 | 价差平稳 | 残差平稳(协整关系) |
| 交易信号 | 价差突破阈值 | Z-score、回归残差等 |
| 风险控制 | 简单止损 | 多因子风险拆解 |
| 适用场景 | 同行业、同板块 | 跨行业、跨市场、跨品种 |
配对交易是统计套利的一种特例。说白了,配对交易是「两个人跳舞」,统计套利是「一群人合唱」。你如果只盯着两个股票,那叫配对;如果你用PCA、因子模型去分析一篮子资产,那才是真正的统计套利。
避坑指南: 我曾经犯过一个错误——看到两只股票相关性高达0.95就直接上配对。结果发现它们只是同涨同跌,根本没有协整关系。相关性高 ≠ 可套利,切记。
1.3 统计套利的数学基础
搞统计套利,数学绕不开。但别怕,我尽量用大白话讲清楚。
1.3.1 平稳性
一个时间序列是平稳的,意味着它的均值、方差、自协方差不随时间变化。为什么重要?因为统计套利本质上是在赌「偏离会回归」,如果序列本身就不平稳,那回归到哪去?
常用的检验方法是ADF检验(Augmented Dickey-Fuller Test)。
# Python示例:ADF检验
from statsmodels.tsa.stattools import adfuller
# 假设price_A和price_B是两个价格序列
spread = price_A - price_B
result = adfuller(spread)
if result[1] < 0.05:
print("价差序列平稳,可以做配对")
else:
print("不平稳,别急着上")
1.3.2 协整关系
两个非平稳序列,如果它们的线性组合是平稳的,就称它们具有协整关系。这是统计套利的核心数学基础。
举个例子:
- 股票A和股票B各自的价格都是随机游走(非平稳)
- 但A - 2×B 这个组合是平稳的
- 那么A和B就存在协整关系
我个人习惯用Engle-Granger两步法来检验协整:
- 第一步:用OLS回归 A = α + β×B + ε
- 第二步:对残差ε做ADF检验
# 协整检验示例
import statsmodels.api as sm
# 第一步:回归
X = sm.add_constant(price_B)
model = sm.OLS(price_A, X).fit()
residuals = model.resid
# 第二步:检验残差平稳性
result = adfuller(residuals)
print(f"协整检验p值: {result[1]:.4f}")
小技巧: 我建议用Johansen检验替代Engle-Granger,尤其是当你处理3个以上资产时。Johansen能一次性检验多个协整向量,效率高得多。
1.3.3 均值回归与Ornstein-Uhlenbeck过程
统计套利中,价差的运动通常用Ornstein-Uhlenbeck(OU)过程来建模:
dXt = θ(μ - Xt)dt + σdWt
这个公式看着吓人,其实意思很简单:
- θ:回归速度(越大越快)
- μ:长期均值
- σ:波动率
- dWt:随机扰动
说白了,价差就像一根被弹簧拉着的球——偏离越远,拉回来的力越大。θ就是弹簧的弹性系数。
1.3.4 交易信号的生成
有了模型,怎么生成信号?我常用的方法是Z-score:
# Z-score计算
import numpy as np
def zscore(series, window=20):
mean = series.rolling(window).mean()
std = series.rolling(window).std()
return (series - mean) / std
# 当Z-score > 2时做空价差,< -2时做多价差
z = zscore(spread, window=60)
long_signal = z < -2
short_signal = z > 2
关键点: 阈值的选择直接影响策略表现。2倍标准差是经典值,但我建议根据历史回测调整。我在一个商品期货策略中试过1.5倍标准差,夏普比率反而更高——因为市场没那么快回归。
知识体系总览
下面这张图是我自己整理的统计套利知识框架,你可以把它当作本章的「地图」:
这张图把本章的核心内容串起来了。从最上层的统计套利,往下拆成三种主要形式,再到具体的数学工具和检验方法。你学完这一章,应该能看懂这张图的每一个节点。
我的建议: 初学者先从配对交易入手,跑通一个完整的回测流程。等理解了价差回归的逻辑,再扩展到多资产和因子模型。别一上来就想搞PCA,容易把自己绕晕。
公众号:蓝海数据掘金营,微信deep3321