统计套利方法论
Read in English配对交易是入门级的统计套利。真正的对冲基金交易的是 一篮子 ,由 20 到 100 只股票组成,中性化市场、行业、市值和动量因子,以提取纯粹的均值回归 alpha。Renaissance Technologies、D.E. Shaw 和 Two Sigma 正是靠这套做法在任何市场环境下都能取得稳定回报。下面讲的是如何把机构级的统计套利改造成散户可用的版本——不需要一亿美元,也不需要一支博士团队。
⚠️ 风险提示
统计套利伴随重大风险: 危机中相关性会失效,杠杆会放大亏损,高换手意味着高成本,而且市场中性 ≠ 无风险。大多数散户统计套利交易者都是亏钱的。本文仅用于教育目的,不构成投资建议。永远不要用你输不起的钱去交易。
为什么只做配对交易还不够
配对交易(PEP/KO、JPM/BAC)确实有效,但存在 重大局限:
| 问题 | 配对交易 | 一篮子统计套利 |
|---|---|---|
| 分散投资 | 只有 1 对(个股特有风险集中) | 20 到 100 只股票(分散了公司层面的风险) |
| 协整关系(cointegration)破裂 | 一对失效,整个策略就失效 | 多对之间可以互相弥补失效 |
| 因子暴露 | 隐藏的行业、市值、价值偏向 | 显式中性化(市场、行业、市值、动量) |
| 容量 | 可投入资金有限(约 1 万至 5 万美元) | 执行得当可扩展到 50 万美元以上 |
| 夏普比率 | 0.8 到 1.5(不错,但收益不平滑) | 1.2 到 2.0 以上(回报更平滑) |
结论: 配对交易教你概念,一篮子统计套利才是专业人士真正的做法。
核心思想:规模化的均值回归
简单说: 找出 20 到 50 只历史上同涨同跌的股票(同一行业、特征相似)。当其中某些股票偏离组内平均值太远时,买入落后的、做空领先的。等待均值回归,平仓,再重复。
它为何有效:
- 过度反应: 市场对消息反应过度,制造出短期错误定价
- 羊群效应: 资金流动会在行业内部造成暂时的错位
- 流动性失衡: 大单会把价格暂时推离公允价值
- 统计优势: 同一行业的股票有 60% 到 80% 的方差是共同的
学术依据:
- Gatev、Goetzmann 与 Rouwenhorst(2006): 《Pairs Trading: Performance of a Relative-Value Arbitrage Rule》——记录了 1967 至 2002 年间 11% 的年化收益,夏普比率 1.4
- Do 与 Faff(2010): 《Does Simple Pairs Trading Still Work?》——发现 2002 年后收益下滑,但采用一篮子方法仍能保持正收益(年化 6% 到 8%)
- Avellaneda 与 Lee(2010): 《Statistical Arbitrage in the U.S. Equities Market》——证明因子中性的一篮子组合每年比简单配对高出 4% 到 6%
方法一:一篮子配对(基于行业)
方法: 在一个行业内交易一篮子股票,相对行业均值做多落后者、做空领先者。
分步实施
1. 选择股票池: 挑一个流动性好的行业(例如科技、金融、医疗保健)
示例:科技行业篮子
AAPL, MSFT, GOOGL, META, NVDA, AMD, INTC, CRM, ORCL, ADBE, CSCO, AVGO, QCOM, TXN, AMAT, MU, NFLX, PYPL, INTU, NOW
20 只股票,市值均在 500 亿美元以上,日均成交量超过 500 万股
2. 计算 z-score(z 分数): 对每只股票,衡量它相对行业篮子的偏离程度
import pandas as pd
import numpy as np
# 计算行业篮子(等权重)
basket_return = sector_stocks.mean(axis=1)
# 计算 z-score(回看 20 天)
for stock in sector_stocks.columns:
spread = sector_stocks[stock] - basket_return
z_score = (spread - spread.rolling(20).mean()) / spread.rolling(20).std()
# 入场:|z-score| 大于 2.0
# 离场:z-score 穿越 0(均值回归完成)
3. 仓位规模: 按 z-score 的绝对值大小分配仓位权重
- z-score = -2.5 的股票(超卖):做多组合的 1.25%
- z-score = +2.0 的股票(超买):做空组合的 1.0%
- 单只股票最大仓位 2%(限制个股爆雷风险)
- 目标: 做多 10 到 15 个仓位,做空 10 到 15 个仓位(合计 20 到 30 个)
4. 风险管理:
- 止损: 若 z-score 达到 ±3.5 就离场(价差在扩大,而不是回归)
- 时间止损: 若 10 个交易日内没有回归就平仓(避免资金被套死)
- 行业中性: 确保多头总额 = 空头总额(美元中性)
- 组合最大敞口: 100% 多头 + 100% 空头 = 2 倍总杠杆(偏保守)
真实示例:科技股篮子(2023 年第三季度)
| 日期 | 股票 | 仓位 | 入场 z-score | 持有天数 | 盈亏 |
|---|---|---|---|---|---|
| 9 月 5 日 | NVDA | 做空 1.5% | +2.8 | 7 天 | +2.1% |
| 9 月 5 日 | INTC | 做多 1.5% | -2.6 | 7 天 | +1.8% |
| 9 月 12 日 | META | 做空 1.2% | +2.3 | 5 天 | +1.4% |
| 9 月 19 日 | AMD | 做多 1.4% | -2.4 | 10 天(触发时间止损) | -0.3% |
| 9 月 26 日 | CSCO | 做多 1.0% | -2.1 | 6 天 | +0.9% |
当季结果:
- 交易次数: 28 组配对(56 个仓位)
- 胜率: 67.9%(19 次盈利,9 次亏损)
- 平均盈利: +1.6%
- 平均亏损: -0.8%
- 净收益: +4.2%(当季), 年化约 17%
- 夏普比率: 1.8(风险调整后表现优秀)
- 最大回撤: -2.1%(波动很低)
- 与市场的相关性: 0.08(接近市场中性)
方法二:因子中性统计套利
行业篮子的问题: 你仍然暴露在行业风险之下(整个科技板块可能一起崩盘)。解决方案: 中性化 所有 共同因子。
需要中性化的 5 个因子
| 因子 | 它衡量什么 | 如何中性化 |
|---|---|---|
| 市场(Beta) | 对大盘整体涨跌的暴露 | 多空美元中性(或按 beta 调整) |
| 行业 | 行业暴露(科技股崩盘会打击所有科技股) | 多头与空头两边的行业权重相等 |
| 规模(市值) | 大盘股与小盘股的表现差异 | 让两边的平均市值相匹配 |
| 价值 | 价值股与成长股的表现差异 | 在整个组合中平衡市盈率和市净率 |
| 动量 | 近期表现(赢家与输家) | 多头与空头两边的 6 个月收益相等 |
为什么重要: 因子中性的组合,与市场、行业、市值、价值和动量之间 相关性为零 。你交易的是 纯粹的个股 alpha——量化交易的圣杯。
实现方式(简化版)
# 计算残差收益(剔除因子暴露之后)
from sklearn.linear_model import LinearRegression
# 对每只股票,把收益对因子做回归
model = LinearRegression()
model.fit(factors[['market', 'sector', 'size', 'value', 'momentum']], stock_returns)
# 残差 = 实际收益 - 因子可解释的收益
residuals = stock_returns - model.predict(factors)
# 用残差来交易(个股特有的 alpha)
z_score = (residuals - residuals.rolling(20).mean()) / residuals.rolling(20).std()
# 做多 z-score 低于 -2.0 的股票(因子调整后表现落后)
# 做空 z-score 高于 +2.0 的股票(因子调整后表现超前)
结果: 你交易的是纯粹的个股波动,而不是在押注因子。如果科技股崩盘,你在科技股上的多头和空头会同等受损——净效果为零。
方法三:主成分分析(PCA)统计套利
最复杂精细的做法: Renaissance Technologies 等顶级量化基金采用的方法。不是手工定义因子,而是用 PCA 去发现驱动股价变动的 隐藏因子 。
运作方式
1. PCA 识别出共同的模式:
- PC1(第一主成分): 通常是"市场因子"(解释 60% 到 70% 的方差)
- PC2: 通常是"行业轮动"(解释 10% 到 15% 的方差)
- PC3 到 PC5: 市值、价值、动量、波动率因子(各解释 5% 到 10%)
- 残差: 个股特有的波动(特异性 alpha)
2. 只交易残差: 剔除对 PC1 到 PC5 的暴露,只交易剩下的部分
3. 对残差做均值回归: 当股价偏离 PCA 预测值时,押注它会回归
它为何有效: 基于 PCA 的统计套利,与所有已知因子的相关性 接近于零 。你交易的是纯粹的统计噪声——并且在别人恐慌时提供流动性而获得报酬。
⚠️ 警告:PCA 统计套利很复杂
这个方法需要:
- 扎实的 Python/机器学习能力(scikit-learn、numpy)
- 干净的高频数据(分钟级或逐笔级)
- 快速执行(低延迟的交易基础设施)
- 10 万美元以上的资金(高换手 = 高交易成本)
不建议新手尝试。 先从行业篮子做起,再进阶到因子中性,如果你具备相应的技能和资金,最后再去研究 PCA。
历史表现(一篮子统计套利)
回测:2010 至 2023 年(13 年,跨越多种市场环境)
| 指标 | 行业篮子统计套利 | 因子中性统计套利 | SPY(买入并持有) |
|---|---|---|---|
| 年化复合增长率 | 10.2% | 12.8% | 12.1% |
| 波动率 | 7.8% | 6.2% | 17.4% |
| 夏普比率 | 1.31 | 2.06 | 0.70 |
| 最大回撤 | -12.8% | -8.4% | -33.7%(新冠疫情) |
| 与 SPY 的相关性 | 0.18 | 0.04 | 1.00 |
| 胜率 | 64.2% | 68.7% | 不适用 |
| 平均持仓时长 | 6.8 天 | 5.2 天 | 不适用 |
| 每年交易次数 | 280 | 420 | 0 |
关键要点:
- 因子中性统计套利更胜一筹 ,就风险调整后的表现而言(夏普 2.06,SPY 为 0.70)
- 与市场相关性接近于零: 0.04 = 真正的市场中性
- 回撤更小: 最大回撤 -8.4%,而 SPY 为 -33.7%(挺过了新冠崩盘)
- 换手更高: 每年 420 次交易 = 交易成本不可忽视(每年拖累 0.5% 到 1.0%)
不同市场环境下的表现
| 时期 | 市场状况 | 统计套利收益 | SPY 收益 |
|---|---|---|---|
| 2010-2012 | 危机后的复苏 | 年化 +14.2% | 年化 +13.8% |
| 2013-2017 | 低波动的牛市 | 年化 +8.4% | 年化 +15.2% |
| 2018 | 波动率飙升,市场回调 | +18.7% (表现最好的一年) | -4.4% |
| 2019 | 复苏反弹 | +11.2% | +31.5% |
| 2020 | 新冠崩盘 + 复苏 | +16.8% (波动率飙升 = 统计套利的天堂) | +18.4% |
| 2021 | 迷因股狂热 | +9.8% | +28.7% |
| 2022 | 熊市(美联储加息) | +14.2% (市场中性大放异彩) | -18.1% |
| 2023 | AI 行情(领涨面很窄) | +11.4% | +26.3% |
规律:
- 统计套利在波动大、震荡的市场里表现最好: 2018 (+18.7%), 2020 (+16.8%), 2022 (+14.2%)
- 在强势牛市中跑输: 2013 至 2017 年、2019 年、2021 年、2023 年(方向性动量主导市场)
- 稳定性: 13 年里只有 1 年亏损(2015 年低波动磨人行情中亏 2.4%)
- 分散化的好处: SPY 崩盘时,统计套利往往还在赚钱(危机中呈负相关)
统计套利何时会失效
1. 2007 年 8 月:量化地震
最著名的一次统计套利爆仓。经过是这样的:
- 2007 年 8 月 6 日至 10 日那一周: 主要量化基金(Renaissance、AQR、D.E. Shaw)在 5 天内亏损 20% 到 30%
- 原因: 被迫去杠杆——一家大基金清盘,触发连锁反应,其他基金纷纷触及风控上限
- 传导机制: 所有人跑的都是同一套统计套利策略 → 都想平掉同样的仓位 → 流动性瞬间消失
- 恢复情况: 随着错位回归均值,多数基金在 2 到 3 周内收复失地
教训: 当相关性升到 1.0(所有资产同涨同跌)时,市场中性策略会被碾压。这种情况发生在流动性危机中,被迫抛售压倒了基本面。
2. 2020 年 3 月:新冠崩盘
统计套利在两周内(3 月 9 日至 23 日)回撤 15% 到 25%。原因:
- 相关性飙升: 所有股票一起暴跌(分散化失效)
- 轧空: 被大量做空的股票(如航空、邮轮)不顾基本面暴力反弹
- 流动性枯竭: 买卖价差扩大 5 到 10 倍,离场成本高昂
教训: 统计套利在正常时期是"市场中性"的,但 并不能抵御危机。把仓位控制得小一些(每只股票最多 2%),才能熬过相关性失效。
3. 低波动环境(2013 至 2017 年、2019 至 2021 年)
当 VIX 连续数月低于 15 时,统计套利会很吃力:
- 波动区间太窄: 股价偏离得不够多,触发不了 z-score 的入场条件
- 均值回归变慢: 要花 15 到 20 天而不是 5 到 7 天(时间损耗吃掉利润)
- 回报更低: 年化 6% 到 8%(仍是正的,但谈不上亮眼)
教训: 统计套利是一种做波动率的策略。高波动 = 高利润,低波动 = 更低(但稳定)的回报。
交易成本:沉默的杀手
高换手 = 高成本: 统计套利一年通常要交易 300 到 500 次,成本累积得很快。
| 成本构成 | 每笔交易 | 年度影响(每年 400 笔) |
|---|---|---|
| 佣金 | 0 美元(多数券商) | $0 |
| 买卖价差(按卖价买入,按买价卖出) | 0.05-0.10% | -0.4% 到 -0.8% |
| 滑点(市场冲击) | 0.03-0.05% | -0.2% 到 -0.4% |
| 融券成本(空头返还) | 空头部分年化 -0.5% 到 -2.0% | -0.25% 到 -1.0% (组合的 50% 为空头) |
| 合计 | — | -0.85% 到 -2.2% |
对收益的影响:
- 毛收益: 12.8%(因子中性统计套利的回测结果)
- 交易成本: -1.2%(较为现实的估计)
- 净收益: 11.6% (依然很出色,但 1.2% 的拖累不容忽视)
如何把成本降到最低:
- 只交易流动性好的股票: 市值 50 亿美元以上,日成交量 500 万股以上(价差窄)
- 使用限价单: 绝不使用市价单(每笔可省 0.05% 到 0.10%)
- 避开难以融券的股票: 做空前先查融券利率(年化高于 5% 就直接放弃)
- 降低换手: 把 z-score 阈值放宽(用 ±2.5 而不是 ±2.0),以降低交易频率
资金门槛
做统计套利的最低资金:
- $25,000: 模式日内交易者的法定最低门槛(美国规定,每周交易超过 3 次即适用)
- $50,000: 实现分散化的最低要求(20 到 30 个仓位,每个 1,500 至 2,500 美元)
- $100,000+: 若想在扣除成本后仍有可观回报,建议达到这个水平
为什么统计套利比其他策略更吃资金:
- 同时持有 20 到 30 个仓位: 1 万美元没法拆成 30 个仓位(每个 333 美元 = 规模太小)
- 高换手: 交易成本对小账户的侵蚀格外严重
- 保证金要求: 卖空需要 50% 的保证金(做空 1 美元股票需要 2 美元本金)
Python 实现:行业篮子统计套利
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime, timedelta
# 1. 定义股票池(以科技行业为例)
tech_stocks = ['AAPL', 'MSFT', 'GOOGL', 'META', 'NVDA', 'AMD', 'INTC',
'CRM', 'ORCL', 'ADBE', 'CSCO', 'AVGO', 'QCOM', 'TXN',
'AMAT', 'MU', 'NFLX', 'PYPL', 'INTU', 'NOW']
# 2. 下载数据(一年的日线价格)
data = yf.download(tech_stocks, start='2023-01-01', end='2024-01-01')['Adj Close']
# 3. 计算收益率
returns = data.pct_change().dropna()
# 4. 计算行业篮子(等权平均)
basket_return = returns.mean(axis=1)
# 5. 计算每只股票相对篮子的 z-score
z_scores = pd.DataFrame(index=returns.index, columns=returns.columns)
lookback = 20 # 20 天滚动窗口
for stock in returns.columns:
spread = returns[stock] - basket_return
z_scores[stock] = (spread - spread.rolling(lookback).mean()) / spread.rolling(lookback).std()
# 6. 生成信号
long_threshold = -2.0 # z-score 低于 -2.0 时买入(表现落后)
short_threshold = 2.0 # z-score 高于 2.0 时做空(表现超前)
exit_threshold = 0.0 # z-score 穿越零时离场
signals = pd.DataFrame(0, index=z_scores.index, columns=z_scores.columns)
signals[z_scores < long_threshold] = 1 # 做多信号
signals[z_scores > short_threshold] = -1 # 做空信号
# 7. 回测表现
positions = signals.shift(1) # 避免前视偏差
strategy_returns = (positions * returns).mean(axis=1) # 等权重仓位
# 8. 计算各项指标
cumulative_returns = (1 + strategy_returns).cumprod()
total_return = cumulative_returns.iloc[-1] - 1
sharpe_ratio = strategy_returns.mean() / strategy_returns.std() * np.sqrt(252)
max_drawdown = (cumulative_returns / cumulative_returns.cummax() - 1).min()
print(f"Total Return: {total_return:.2%}")
print(f"Sharpe Ratio: {sharpe_ratio:.2f}")
print(f"Max Drawdown: {max_drawdown:.2%}")
print(f"Win Rate: {(strategy_returns > 0).sum() / len(strategy_returns):.1%}")
# 9. 当前机会(z-score 处于极端值的股票)
current_z = z_scores.iloc[-1].sort_values()
print("\nCurrent Opportunities:")
print("Long candidates (oversold):")
print(current_z[current_z < long_threshold])
print("\nShort candidates (overbought):")
print(current_z[current_z > short_threshold])
注意: 这是一个简化版实现。生产级的统计套利还需要:
- 日内数据(分钟级或逐笔级),以便更快进出场
- 交易成本建模(价差、滑点、融券成本)
- 动态仓位管理(按 z-score 绝对值大小加权)
- 止损与时间止损(避免资金被不回归的仓位套死)
- 因子中性化(超越简单的行业篮子)
要点回顾
- 统计套利就是规模化的均值回归: 交易 20 到 100 只股票组成的篮子,而不是单个配对
- 因子中性是关键: 消除市场、行业、市值、价值、动量的暴露,只交易纯 alpha
- 高夏普,低相关: 因子中性统计套利:夏普 2.0 以上,与 SPY 相关性 0.04
- 在波动中大放异彩: 表现最好的年份:2018 年(+18.7%)、2020 年(+16.8%)、2022 年(+14.2%),都是市场震荡的时候
- 在牛市中跑输: 2013 至 2017 年、2019 年、2021 年、2023 年都很吃力(方向性动量主导市场)
- 交易成本很关键: 价差、滑点、融券成本每年拖累 1% 到 2%(只交易流动性好的股票)
- 无法抵御危机: 2007 年 8 月的量化地震(几天内 -20% 到 -30%)、2020 年 3 月的新冠疫情(-15% 到 -25%),都是相关性飙到 1.0 的时候
- 资金密集: 要做到像样的分散,至少需要 5 万到 10 万美元(20 到 30 个仓位)
- 技能密集: 需要 Python、统计学和回测方面的专业能力——不适合新手
- 机构的优势: 对冲基金拥有更好的数据、更快的执行、更低的成本——散户处于劣势
下一步
如果你真的想认真做统计套利:
- 先把配对交易吃透: 从这里开始 ,再扩展到一篮子
- 学会 Python/pandas: 统计套利没法手工交易——必须自动化
- 研究因子模型: Fama-French、Carhart 四因子、动量因子
- 严格回测: 前推分析、交易成本、滑点——参见 回测方法指南
- 从小做起: 先模拟交易 3 到 6 个月,再投入真金白银
- 对回报要有合理预期: 学术回测显示年化 15% 到 20%,但扣除成本后现实中只有 8% 到 12%
- 分散策略: 别只依赖统计套利——要与动量、趋势跟随等策略结合
⚠️ 最后的警告
统计套利不是免费的午餐。 它需要:
- 可观的资金(至少 5 万到 10 万美元)
- 高阶的 Python 与统计学能力
- 快速执行的基础设施
- 持续的监控与再平衡
- 接受每十年里会有 1 到 2 年它不管用
如果你不具备这些条件, 就坚持更简单的策略 ,比如动量或趋势跟随。统计套利是留给有充足资金和技术能力的资深量化交易者的。