一、统计套利基础:均值回归、协整关系、配对交易的核心思想
大家好,我是你们的讲师。今天咱们聊聊统计套利的基础。说实话,我刚入行那会儿,觉得套利就是「低买高卖」这么简单。后来真金白银砸进去,才发现事情没那么简单。
统计套利的核心,说白了就是找「亲戚」。两只股票,如果它们长期走势像亲兄弟一样同步,偶尔闹别扭分开了,那这就是机会。等它们和好如初,咱们就能赚差价。
嗯,这个思路听着很美好。但怎么找「亲戚」?怎么判断「闹别扭」?这就是我们今天要讲的内容。
1.1 均值回归:万物皆可「回归」
先讲均值回归。这个概念其实很朴素——价格涨多了会跌,跌多了会涨。就像橡皮筋,拉长了总会弹回去。
我在项目中遇到过一只股票,连续跌了5天,我心想「该反弹了吧」,结果第6天继续跌。为什么?因为均值回归不是简单的「跌多了就涨」,它需要一个「均值」作为锚点。
核心要点:均值回归的前提是价格围绕某个「均值」上下波动。这个均值可以是移动平均线,也可以是某个统计量。
举个例子:
import numpy as np
import pandas as pd
# 模拟一个均值回归过程
np.random.seed(42)
mu = 100 # 均值
theta = 0.1 # 回归速度
sigma = 2 # 波动率
prices = [mu]
for t in range(1, 1000):
# 均值回归模型:dX = theta * (mu - X) * dt + sigma * dW
dx = theta * (mu - prices[-1]) + sigma * np.random.randn()
prices.append(prices[-1] + dx)
# 你看,价格始终围绕100上下波动
print(f"均值: {np.mean(prices):.2f}")
print(f"标准差: {np.std(prices):.2f}")
为什么会这样?因为均值回归过程有一个「拉力」——当价格偏离均值时,回归项 theta * (mu - X) 会把它往回拽。theta越大,回归越快。
个人经验:我建议你在实盘前,先用历史数据算一下回归半衰期。半衰期 = ln(2) / theta。如果半衰期是3天,那这个策略适合短线;如果是30天,那就得有点耐心了。
1.2 协整关系:比相关性更「铁」的关系
很多人把相关性和协整搞混。相关性高,不代表协整。比如两只股票都跟大盘涨,它们相关性很高,但可能没有协整关系。
协整是什么?它描述的是两个时间序列的「长期均衡关系」。说白了,就是它们虽然各自随机游走,但它们的线性组合是平稳的。
我记得有一次,一个学员问我:「老师,我找了两只相关性0.9的股票做配对,为什么亏钱了?」我让他画个价差图看看。结果价差越走越远,根本不回归。这就是典型的「伪回归」——相关性高,但没协整。
避坑指南:我曾经吃过这个亏。2018年,我用相关性筛选了10对股票做配对交易,结果只有3对真正赚钱。后来我才知道,必须用协整检验(比如Engle-Granger两步法)来验证。
协整检验的步骤:
- 用OLS回归:Y = alpha + beta * X + epsilon
- 对残差epsilon做单位根检验(ADF检验)
- 如果残差平稳,说明Y和X协整
import statsmodels.api as sm
# 假设我们有两只股票的价格序列
# stock_a 和 stock_b
# 第一步:回归
X = sm.add_constant(stock_b)
model = sm.OLS(stock_a, X).fit()
residuals = model.resid
# 第二步:ADF检验
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(residuals)
print(f"ADF统计量: {adf_result[0]:.4f}")
print(f"p值: {adf_result[1]:.4f}")
# 如果p值小于0.05,说明残差平稳,存在协整关系
if adf_result[1] < 0.05:
print("恭喜!存在协整关系")
else:
print("没有协整关系,换个组合试试")
1.3 配对交易的核心思想:从「找亲戚」到「赚差价」
好了,有了均值回归和协整这两个工具,配对交易就水到渠成了。
核心思想就三步:
- 找亲戚:用协整检验找到两只长期均衡的股票
- 等闹别扭:当价差偏离均值超过某个阈值(比如2倍标准差)
- 赚差价:做多被低估的,做空被高估的,等价差回归
你想想看,这就像两个双胞胎。平时身高差不多,有一天弟弟突然比哥哥矮了5厘米。你赌他们最终会长回一样高。怎么赌?买矮的那个长高(做多),买高的那个变矮(做空)。
关键公式:
价差 = 股票A价格 - beta * 股票B价格
其中beta是协整回归的系数。注意,不是1:1配对,而是按beta比例配对。
我个人的习惯是,用Z-score来标准化价差:
# 计算价差
spread = stock_a - beta * stock_b
# 计算Z-score
z_score = (spread - spread.mean()) / spread.std()
# 交易信号
entry_threshold = 2.0 # 开仓阈值
exit_threshold = 0.5 # 平仓阈值
if z_score > entry_threshold:
print("做空价差:卖A,买B")
elif z_score < -entry_threshold:
print("做多价差:买A,卖B")
elif abs(z_score) < exit_threshold:
print("平仓")
这里要注意一个细节:阈值怎么设?我见过有人用1.5倍标准差,有人用2.5倍。没有标准答案。我的建议是回测时多试几个值,找到最适合你交易频率的那个。
实战技巧:别只看价格,还要看成交量。如果价差偏离很大但成交量很小,可能是流动性问题,别急着进场。我曾经因为忽略成交量,在价差偏离3倍标准差时进场,结果等了两个月才回归,资金成本都亏进去了。
知识体系总览
下面这张图,是我自己总结的统计套利知识体系。你把它存下来,学完这章再回头看,会更有感觉。
这张图把今天的内容串起来了。你仔细看,均值回归是理论基础,协整关系是筛选工具,配对交易是最终策略。三者缺一不可。
最后说一句:统计套利不是印钞机。它需要你耐心等待机会,严格执行纪律。我见过太多人,策略回测时赚得盆满钵满,实盘时却因为拿不住单子而亏损。记住,统计套利的利润,来自于对「均值回归」这个信念的坚持。