一、统计套利基础:从一次实战教训说起
各位同学好,我是老张。在量化圈摸爬滚打十几年,今天咱们聊聊统计套利。
先讲个故事。2015年那会儿,我刚开始做跨市场套利。看到A股和H股的同股同权标的,价差动不动就10%以上。我心想,这不就是捡钱吗?结果呢?价差不仅没收敛,反而越拉越大。亏了钱不说,还被风控叫去喝茶。
后来我才明白——那不是无风险套利,那是统计套利。两者有本质区别。
1.1 什么是统计套利?
统计套利,说白了就是利用统计规律赚钱。它不保证每次都对,但长期来看,胜率能让你盈利。
举个例子。茅台和五粮液,都是白酒龙头。历史上它们的价格走势高度相关。如果某天茅台突然大涨,五粮液没动,价差拉大了。这时候我可能会做多五粮液、做空茅台,赌价差回归。
注意,这不是无风险的。万一茅台继续涨,五粮液继续跌呢?有可能。但统计上,这种偏离大概率会修复。这就是统计套利的核心逻辑。
统计套利的定义:基于历史统计规律,利用资产价格偏离均值的机会,构建多空组合,期望价格回归而获利。
1.2 统计套利 vs 无风险套利
这两者经常被混淆。我当年就吃过这个亏。咱们用表格对比一下:
| 对比维度 | 无风险套利 | 统计套利 |
|---|---|---|
| 确定性 | 100%确定 | 概率性(70%-80%胜率) |
| 风险 | 几乎为零 | 存在模型风险、尾部风险 |
| 机会频率 | 极低(秒级甚至更低) | 较高(分钟级到日级) |
| 资金容量 | 小 | 大 |
| 典型例子 | 股指期货期现套利 | 配对交易、ETF套利 |
无风险套利,比如股指期货和现货之间的价差。理论上,价差超过交易成本就能套。但现实中,这种机会转瞬即逝,而且资金容量有限。
统计套利呢?机会多,容量大,但你要承担风险。我个人的经验是:统计套利赚的是概率的钱,不是确定的钱。你想想看,如果每次都能赚,那市场早就被套平了。
1.3 统计套利的数学基础
搞统计套利,离不开两个核心概念:均值回归和协整性。
1.3.1 均值回归
均值回归,就是价格会围绕某个均值上下波动。高了会跌,低了会涨。听起来简单,但实际应用时坑很多。
我曾经犯过一个错误。2017年做螺纹钢和热卷的套利,看到价差偏离历史均值两个标准差,直接开仓。结果呢?价差继续偏离,最后止损出局。后来复盘发现——均值不是一成不变的。市场结构变了,均值也会变。
判断均值回归,常用的方法有:
- 布林带:价格触及上下轨时,回归概率大
- RSI指标:超买超卖区域
- Z-score:标准化后的偏离程度
这里给个简单的Z-score计算代码:
import numpy as np
import pandas as pd
def calculate_zscore(spread, window=20):
"""
计算价差的Z-score
spread: 价差序列
window: 滚动窗口
"""
mean = spread.rolling(window).mean()
std = spread.rolling(window).std()
zscore = (spread - mean) / std
return zscore
# 使用示例
# zscore = calculate_zscore(spread, window=20)
# 当zscore > 2 或 zscore < -2 时,考虑开仓
个人建议:Z-score阈值不要死板地用2。我一般会根据品种特性调整,比如波动大的品种用2.5,波动小的用1.5。多回测,找到最适合的阈值。
1.3.2 协整性
协整性,是统计套利的灵魂。它描述的是两个或多个时间序列之间是否存在长期稳定的关系。
举个例子。上证50和沪深300,长期来看走势高度一致。但短期可能有偏离。如果它们存在协整关系,那么偏离后大概率会回归。
检验协整性,最常用的是Engle-Granger两步法:
- 对两个序列做线性回归,得到残差
- 对残差做单位根检验(ADF检验)
如果残差是平稳的,说明存在协整关系。
from statsmodels.tsa.stattools import adfuller
import statsmodels.api as sm
def check_cointegration(price1, price2):
"""
检验两个价格序列的协整性
返回: (是否协整, p值)
"""
# 第一步:回归
X = sm.add_constant(price2)
model = sm.OLS(price1, X).fit()
residuals = model.resid
# 第二步:ADF检验
adf_result = adfuller(residuals, maxlag=1)
p_value = adf_result[1]
# p值小于0.05,认为存在协整关系
is_cointegrated = p_value < 0.05
return is_cointegrated, p_value
# 使用示例
# is_coint, p = check_cointegration(price_a, price_b)
# print(f"是否协整: {is_coint}, p值: {p:.4f}")
避坑指南:我曾经遇到过两个序列ADF检验通过,但实际套利效果很差的情况。后来发现,协整关系会随时间变化。建议每3-6个月重新检验一次,或者用滚动窗口检验。
1.4 统计套利的市场逻辑
为什么统计套利能赚钱?这背后有深刻的市场逻辑。
第一,市场不是完全有效的。 如果市场完全有效,价格永远合理,就没有套利空间。但现实中,信息传递有延迟,投资者情绪会波动,导致价格短期偏离。
第二,套利力量的存在。 当价差偏离时,套利者会入场,推动价格回归。这本身就是一种自我实现的预言。你想想看,如果所有人都相信价差会回归,那它真的会回归。
第三,基本面约束。 很多资产之间存在天然的比价关系。比如豆粕和菜粕,都是蛋白饲料,可以相互替代。如果价差过大,饲料厂会调整配方,从而推动价差回归。
下面这张图,展示了统计套利的完整逻辑框架:
这张图把统计套利的逻辑串起来了。从市场非有效出发,到数学基础,再到策略构建和风险控制,最后落到盈利来源。每个环节都不可或缺。
1.5 小结
统计套利不是无风险套利,它赚的是概率的钱。核心在于找到稳定的统计关系,然后耐心等待价格回归。
我个人觉得,做统计套利最难的,不是数学,不是代码,而是心态。当价差持续偏离时,你能不能扛住?当连续亏损时,你还相不相信模型?这些才是真正的考验。
好了,这一章就到这里。记住:统计套利是科学,也是艺术。科学的部分可以量化,艺术的部分需要经验积累。
本章核心要点:
- 统计套利基于概率,不是确定性
- 均值回归和协整性是两大数学基础
- 市场非有效是套利存在的根本原因
- 风险控制比盈利更重要