1. 统计套利基础:什么是统计套利?它与无风险套利的区别
大家好,我是你们的老朋友。今天咱们聊聊统计套利。
说实话,我刚入行那会儿,听到「套利」两个字,第一反应就是「稳赚不赔」。后来真金白银砸进去,才发现事情没那么简单。
统计套利,说白了就是靠概率赚钱。它不是100%确定的事,而是「大概率会回归」的赌注。我习惯把它比作钓鱼——你知道鱼迟早会上钩,但具体哪一秒咬钩,没人说得准。
1.1 什么是统计套利?
先给个定义:统计套利是利用统计模型,寻找资产价格之间暂时偏离的规律,然后押注它们会回归正常关系。
举个例子。我做过一个经典的配对交易:可口可乐 vs 百事可乐。这两家公司业务高度相似,股价走势长期同步。但偶尔,比如某天百事出了个利好消息,股价猛涨,可口可乐没跟上。这时候,两者的价差就拉大了。
我的做法是:做空涨太多的百事,做多没跟上的可口可乐。等它们价差回归正常,两边平仓,赚差价。
你看,这里没有「确定」二字。万一百事继续涨,可口可乐继续跌呢?有可能。但统计上,这种偏离大概率会修复。我们赌的就是这个「大概率」。
1.2 统计套利 vs 无风险套利
这两者的区别,我经常用一个比喻来解释:
- 无风险套利:好比你在A市场花1块钱买苹果,同时在B市场2块钱卖掉。差价1块钱,稳赚。只要你能同时交易,没有滑点,这就是确定的利润。
- 统计套利:好比你觉得苹果和梨的价格比长期是1:2。今天苹果1块,梨3块,你觉得梨贵了,于是买苹果、卖梨。但梨可能继续涨到4块,你亏钱。你赌的是「回归」,不是「确定」。
我整理了一个表格,方便大家对比:
| 对比维度 | 无风险套利 | 统计套利 |
|---|---|---|
| 确定性 | 100%确定 | 概率性(通常60%-80%) |
| 风险来源 | 执行风险(滑点、延迟) | 模型风险、市场风险 |
| 持仓时间 | 极短(秒级到分钟级) | 较长(小时级到天级) |
| 资金容量 | 通常较小 | 可以很大 |
| 典型例子 | 跨交易所价差、ETF套利 | 配对交易、均值回归 |
嗯,这里要注意:无风险套利在现实中几乎不存在。为什么?因为交易成本、滑点、延迟,这些都会吃掉利润。我见过太多人以为自己在做无风险套利,结果亏得底裤都不剩。
1.3 统计套利的底层逻辑
统计套利能成立,靠的是三个核心假设:
- 价格存在长期均衡关系:比如两只同行业股票,长期走势高度相关。
- 短期偏离会均值回归:偏离不会永远持续,迟早会回来。
- 历史规律在未来依然有效:这是最大的假设,也是最容易翻车的地方。
我曾经踩过一个坑。2018年,我用一个统计套利模型做原油相关品种的配对交易。历史回测漂亮得很,年化收益30%+,最大回撤不到5%。结果2019年沙特油田被袭击,价差直接崩了,一周亏掉半年的利润。
1.4 一个简单的统计套利流程
我习惯把统计套利拆成四个步骤:
- 第一步:筛选资产——找相关性高的品种。比如同行业、同板块、同产业链的。
- 第二步:建立模型——用协整检验、回归分析等方法,确定它们之间的均衡关系。
- 第三步:设定阈值——当价差偏离到一定程度(比如2倍标准差),触发交易信号。
- 第四步:执行与风控——开仓、止损、止盈,动态调整。
下面我用Python演示一个最简单的配对交易模型。别紧张,代码不长:
import numpy as np
import pandas as pd
import statsmodels.api as sm
# 模拟两只股票的价格数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=500, freq='D')
price_a = 100 + np.cumsum(np.random.randn(500) * 0.5)
price_b = price_a * 1.5 + np.random.randn(500) * 2 # 有噪声的线性关系
# 计算价差
spread = price_a - price_b / 1.5 # 假设均衡比是1:1.5
# 计算均值和标准差
mean_spread = np.mean(spread)
std_spread = np.std(spread)
# 设定阈值:2倍标准差
upper_threshold = mean_spread + 2 * std_spread
lower_threshold = mean_spread - 2 * std_spread
# 生成交易信号
signals = []
for s in spread:
if s > upper_threshold:
signals.append(-1) # 做空价差
elif s < lower_threshold:
signals.append(1) # 做多价差
else:
signals.append(0) # 观望
print(f"价差均值: {mean_spread:.2f}")
print(f"价差标准差: {std_spread:.2f}")
print(f"触发信号次数: {sum(1 for s in signals if s != 0)}")
你看,代码很简单。但实际项目中,选品种、定参数、控风险才是真正的难点。我见过有人把参数优化到极致,回测曲线漂亮得像假的一样,结果实盘一跑就崩。为什么?过拟合了。
1.5 统计套利的常见误区
最后,我总结几个新手容易犯的错:
- 把相关性当因果——两只股票相关,不代表它们有稳定的套利关系。可能是巧合,也可能是共同受某个因子驱动。
- 忽略交易成本——统计套利通常交易频繁,手续费、滑点会吃掉大量利润。我建议回测时至少加2-3个滑点。
- 过度优化参数——为了追求回测漂亮,把阈值、持仓周期调得刚刚好。实盘一换数据,立马失效。
- 不设止损——统计套利不是100%胜率。遇到黑天鹅,不设止损可能一次亏光。
我曾经有个同事,做统计套利三年没亏过钱,觉得自己找到了圣杯。结果2015年A股股灾,他做多银行、做空券商,价差直接反向走了两个月,爆仓了。嗯,从那以后,我每次开仓都必设止损。
好了,这一章就聊到这儿。统计套利是个好东西,但别把它当印钞机。记住:它赚的是概率的钱,不是确定的钱。下一章咱们聊聊具体的配对交易策略,到时候我会带大家手把手写一个完整的回测框架。