03-套利策略类型 (Arbitrage Strategy Types)
预计学习时间:1.5 小时
难度:⭐⭐⭐
核心问题:除了配对交易,还有哪些套利方式?
从一个直觉出发
配对交易是最经典的统计套利形态——两只股票之间的价差回归。但在实际市场中,“稳定的统计关系”远不止两支股票之间。
期货和现货之间有定价关系,同一品种不同到期日的合约之间有关系,同一产业链上下游之间有关系,ETF 和它持有的一篮子股票之间有关系。
这一章的目标是:让你看到统计套利这个框架的广度,理解每种套利策略的定价基础、风险来源和适用场景。
一、期现套利(现货 vs 期货)
1.1 定价公式
期货的理论价格由持有成本模型(Cost of Carry)决定:
其中:
- :期货价格
- :现货价格
- :无风险利率
- :连续股息收益率(或存储成本)
- :到期时间
白话解释:期货价格 = 现货价格 + 持有成本(资金成本 - 股息收益)。
1.2 基差来源
基差 = 现货价格 - 期货价格
理论上基差应该等于持有成本。但实际上,基差会因为以下原因偏离理论值:
| 偏离来源 | 说明 |
|---|---|
| 市场情绪 | 现货涨了但期货反应慢,或反过来 |
| 流动性差异 | 期货和现货的流动性结构不同 |
| 交易限制 | 融券限制、涨跌停等 |
| 分红预期变化 | 除权除息日临近 |
| 借贷成本 | 实际借贷利率偏离无风险利率 |
1.3 正向套利 vs 反向套利
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def simulate_cash_and_carry_arbitrage():
"""
模拟期现套利(现货-期货定价偏离修复)
场景:当期货价格 > 理论价格时,
做空期货 + 做多现货 → 到期时基差收敛获利
"""
np.random.seed(42)
n_days = 120 # 4 个月
r = 0.04 # 年化无风险利率 4%
q = 0.02 # 年化股息率 2%
# 现货价格(随机游走)
spot_returns = np.random.normal(0.0005, 0.015, n_days)
spot = 100 * np.cumprod(1 + spot_returns)
dates = pd.date_range(start='2025-01-01', periods=n_days, freq='B')
# 到期日(第 120 天)
T_remaining = np.arange(n_days, 0, -1) / 252 # 剩余时间(年)
# 理论期货价格
futures_theoretical = spot * np.exp((r - q) * T_remaining)
# 模拟市场期货价格(加上噪声和系统性偏差)
# 假设前 30 天期货被高估,之后逐步修复
mispricing = np.zeros(n_days)
mispricing[:30] = np.linspace(0, 2.5, 30) # 逐渐高估到 2.5%
mispricing[30:] = 2.5 * np.exp(-0.08 * np.arange(n_days - 30)) # 逐步修复
futures_market = futures_theoretical * (1 + mispricing / 100)
# 基差(百分比)
basis_pct = (spot - futures_market) / spot * 100
# 交易信号
entry_threshold = 1.5 # 基差偏离超过 1.5% 时入场
positions = pd.Series(0.0, index=dates)
current_pos = 0
for t in range(n_days):
if current_pos == 0 and basis_pct[t] < -entry_threshold:
# 基差为负(期货高估)→ 正向套利:做空期货 + 做多现货
current_pos = 1
elif current_pos == 1 and basis_pct[t] > -0.2:
# 基差修复 → 平仓
current_pos = 0
positions.iloc[t] = current_pos
# 计算套利收益
# 正向套利收益 ≈ 基差修复幅度
strategy_returns = pd.Series(0.0, index=dates)
for t in range(1, n_days):
if positions.iloc[t-1] == 1:
# 套利收益 = 基差的变化(近似)
strategy_returns.iloc[t] = -(basis_pct[t] - basis_pct[t-1]) / 100
cumulative = (1 + strategy_returns).cumprod()
# 可视化
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
axes[0].plot(dates, spot, label='现货', alpha=0.8)
axes[0].plot(dates, futures_market, label='期货(市场)', alpha=0.8)
axes[0].plot(dates, futures_theoretical, label='期货(理论)',
linestyle='--', alpha=0.5)
axes[0].set_title('期现套利:现货 vs 期货价格')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[1].plot(dates, basis_pct, color='red')
axes[1].axhline(y=-entry_threshold, color='orange',
linestyle=':', label=f'入场阈值 -{entry_threshold}%')
axes[1].axhline(y=-0.2, color='green',
linestyle=':', label='出场阈值 -0.2%')
axes[1].axhline(y=0, color='gray', linestyle='--', alpha=0.5)
axes[1].set_title('基差(现货 - 期货)')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
axes[2].plot(dates, cumulative, color='green')
axes[2].set_title('期现套利策略累计收益')
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
return cumulative
print("=== 期现套利模拟 ===")
cumulative = simulate_cash_and_carry_arbitrage()
print(f"总收益: {(cumulative.iloc[-1] - 1):.2%}")| 方向 | 条件 | 操作 | 获利来源 |
|---|---|---|---|
| 正向套利 | 期货 > 理论价 | 做空期货 + 做多现货 | 到期时基差收敛 |
| 反向套利 | 期货 < 理论价 | 做多期货 + 做空现货 | 到期时基差收敛(需要融券) |
1.4 什么时候有风险
- 交割风险:现货无法顺利交割
- 保证金风险:期货端可能被强平
- 分红预期变化:公司突然改变分红政策
- 利率变化:持有成本发生意外变化
二、跨期套利(近月 vs 远月)
2.1 日历价差
同一品种不同到期日的期货合约之间的价差,称为日历价差。
理论上:
远月合约比近月合约贵(如果 r > q),因为需要承担更多的持有成本。
2.2 价差的均值回归特性
跨期价差通常比期现价差更稳定、更容易预测,因为:
- 两张合约受同一现货驱动,系统性风险被大幅对冲
- 价差主要取决于利率和存储成本,变化相对缓慢
- 到期日临近时,价差有确定的收敛方向
def simulate_calendar_spread():
"""
模拟跨期套利(近月 vs 远月价差回归)
"""
np.random.seed(42)
n_days = 250
# 现货价格
spot = 100 * np.cumprod(1 + np.random.normal(0.0005, 0.012, n_days))
r = 0.04
q = 0.01
# 近月合约:30 天后到期
T_near = np.clip(np.arange(n_days, -30, -1) / 252, 0.001, 1)
# 远月合约:90 天后到期
T_far = np.clip(np.arange(n_days + 60, 30, -1) / 252, 0.001, 1)
F_near = spot * np.exp((r - q) * T_near)
F_far = spot * np.exp((r - q) * T_far)
# 日历价差
calendar_spread = F_far - F_near
# 加入均值回归扰动(模拟市场摩擦导致的价差异常)
noise = np.zeros(n_days)
noise[50:80] = np.sin(np.linspace(0, np.pi, 30)) * 0.8 # 临时偏差
noise[150:170] = -np.sin(np.linspace(0, np.pi, 20)) * 0.6
calendar_spread += noise
# 理论价差
theoretical_spread = spot * np.exp((r - q) * T_near) * (np.exp((r - q) * 0.06) - 1)
dates = pd.date_range(start='2025-01-01', periods=n_days, freq='B')
fig, axes = plt.subplots(2, 1, figsize=(14, 8), sharex=True)
axes[0].plot(dates, calendar_spread, label='实际价差', color='blue')
axes[0].plot(dates, theoretical_spread, label='理论价差',
color='gray', linestyle='--')
axes[0].set_title('跨期套利:远月 - 近月 价差')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# Z-score
spread_series = pd.Series(calendar_spread)
rolling_z = (spread_series - spread_series.rolling(30).mean()) / spread_series.rolling(30).std()
axes[1].plot(dates, rolling_z, color='red', alpha=0.7)
axes[1].axhline(y=2, color='red', linestyle=':', label='入场')
axes[1].axhline(y=-2, color='red', linestyle=':')
axes[1].axhline(y=0, color='gray', linestyle='--')
axes[1].set_title('价差 Z-score')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print("=== 跨期套利模拟 ===")
simulate_calendar_spread()2.3 常见跨期套利策略
| 策略 | 操作 | 适用场景 |
|---|---|---|
| 牛市价差 | 做多近月 + 做空远月 | 预期近月涨幅更大(如供需紧张) |
| 熊市价差 | 做空近月 + 做多远月 | 预期远月跌幅更小(如高库存) |
| 蝶式价差 | 做多近月 + 做空中间月 + 做多远月 | 预期价差曲线维持稳定 |
三、跨品种套利(铁矿 vs 螺纹等)
3.1 替代品关系
跨品种套利的基础是产业链关系或替代关系:
产业链示例(钢铁):
铁矿石 ──→ 炼铁 ──→ 炼钢 ──→ 螺纹钢 / 热卷板
↑ ↓
焦煤/焦炭 下游需求(房地产、基建)
关键关系:
- 铁矿石和螺纹钢:上下游关系,有成本传导
- 螺纹钢和热卷板:替代关系,竞争同一需求
- 铁矿石和焦炭:互补投入品
3.2 比价套利
最常见的跨品种套利方式是比价回归:
当比价偏离历史区间时,做多低估品种、做空高估品种。
def simulate_cross_commodity_arbitrage():
"""
模拟跨品种套利(铁矿石 vs 螺纹钢 比价回归)
"""
np.random.seed(42)
n_days = 500
# 铁矿石价格
iron_ore = 700 + np.cumsum(np.random.normal(0.1, 8, n_days))
# 螺纹钢价格(与铁矿石有协整关系,但传导有延迟和噪声)
steel_beta = 0.35 # 每吨铁矿石对应约 0.35 吨螺纹钢
steel_base = iron_ore * steel_beta
steel_noise = np.cumsum(np.random.normal(0, 2, n_days)) # 传导偏差
rebar = steel_base + steel_noise + 200 # 加上加工费和利润
# 比价
ratio = iron_ore / rebar
dates = pd.date_range(start='2024-01-01', periods=n_days, freq='B')
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
# 价格
ax1 = axes[0]
ax1.plot(dates, iron_ore, label='铁矿石', color='brown')
ax1.set_ylabel('铁矿石 (元/吨)', color='brown')
ax2 = ax1.twinx()
ax2.plot(dates, rebar, label='螺纹钢', color='gray')
ax2.set_ylabel('螺纹钢 (元/吨)', color='gray')
axes[0].set_title('铁矿石 vs 螺纹钢 价格')
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
axes[0].grid(True, alpha=0.3)
# 比价
axes[1].plot(dates, ratio, color='blue')
ratio_mean = ratio.mean()
ratio_std = ratio.std()
axes[1].axhline(y=ratio_mean, color='gray', linestyle='--')
axes[1].axhline(y=ratio_mean + 2 * ratio_std, color='red',
linestyle=':', label=f'±2σ')
axes[1].axhline(y=ratio_mean - 2 * ratio_std, color='red', linestyle=':')
axes[1].set_title(f'铁矿石/螺纹钢 比价 (均值={ratio_mean:.2f}, σ={ratio_std:.2f})')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
# Z-score
ratio_series = pd.Series(ratio)
rolling_z = (ratio_series - ratio_series.rolling(60).mean()) / ratio_series.rolling(60).std()
axes[2].plot(dates, rolling_z, color='red')
axes[2].axhline(y=2, color='red', linestyle=':', label='入场')
axes[2].axhline(y=-2, color='red', linestyle=':')
axes[2].axhline(y=0, color='gray', linestyle='--')
axes[2].set_title('比价 Z-score (滚动60日)')
axes[2].legend()
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print("=== 跨品种套利模拟 ===")
simulate_cross_commodity_arbitrage()3.3 跨品种套利的风险
| 风险 | 说明 |
|---|---|
| 产业结构变化 | 比如废钢替代铁矿石 |
| 政策干预 | 限产政策改变供需关系 |
| 传导延迟 | 上游涨价到下游涨价有时间差 |
| 比例关系漂移 | 技术进步改变原料消耗比 |
| 事件冲击 | 矿难、罢工等影响单个品种 |
四、ETF 套利(折溢价)
4.1 基本原理
ETF 的市场价格和它的**净值(NAV)**之间会有偏差:
当 ETF 市场价格 > NAV 时,称为溢价;反之称为折价。
套利逻辑:
- 溢价时:买入一篮子成分股 → 申购 ETF → 卖出 ETF
- 折价时:买入 ETF → 赎回 ETF → 卖出一篮子成分股
4.2 模拟 ETF 折溢价套利
def simulate_etf_premium_arbitrage():
"""
模拟 ETF 折溢价套利
"""
np.random.seed(42)
n_days = 500
# ETF 净值(基于成分股计算)
nav = 100 * np.cumprod(1 + np.random.normal(0.0003, 0.008, n_days))
# ETF 市场价格(围绕 NAV 波动,有时有系统性偏离)
# 折溢价 = 市场价格 - NAV
premium_base = np.random.normal(0, 0.001, n_days) # 日常微小折溢价
# 模拟系统性偏离(情绪驱动)
premium_spike = np.zeros(n_days)
premium_spike[100:130] = np.sin(np.linspace(0, np.pi, 30)) * 0.015 # 溢价 1.5%
premium_spike[250:275] = -np.sin(np.linspace(0, np.pi, 25)) * 0.012 # 折价 1.2%
premium_spike[380:400] = np.sin(np.linspace(0, np.pi, 20)) * 0.020 # 溢价 2%
premium = premium_base + premium_spike
market_price = nav * (1 + premium)
premium_pct = premium * 100 # 百分比
dates = pd.date_range(start='2024-01-01', periods=n_days, freq='B')
# 套利信号
entry_threshold = 0.5 # 折溢价超过 0.5% 时入场
exit_threshold = 0.1 # 回到 0.1% 以内出场
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
# 价格
axes[0].plot(dates, nav, label='NAV', alpha=0.8)
axes[0].plot(dates, market_price, label='市场价格', alpha=0.7)
axes[0].set_title('ETF 净值 vs 市场价格')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 折溢价率
colors = ['red' if p > entry_threshold else ('green' if p < -entry_threshold else 'blue')
for p in premium_pct]
axes[1].bar(dates, premium_pct, color=colors, alpha=0.7, width=1)
axes[1].axhline(y=entry_threshold, color='red', linestyle=':',
label=f'入场 +{entry_threshold}%')
axes[1].axhline(y=-entry_threshold, color='green', linestyle=':',
label=f'入场 -{entry_threshold}%')
axes[1].axhline(y=0, color='gray', linestyle='--')
axes[1].set_title('折溢价率 (%)')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
# 累计套利利润
# 假设每次套利捕获 80% 的折溢价(考虑执行延迟)
arbitrage_pnl = np.zeros(n_days)
for t in range(1, n_days):
if abs(premium_pct[t-1]) > entry_threshold and abs(premium_pct[t]) < exit_threshold:
# 折溢价修复,平仓获利
arbitrage_pnl[t] = abs(premium_pct[t-1] - premium_pct[t]) * 0.8
elif abs(premium_pct[t-1]) > entry_threshold and abs(premium_pct[t]) > entry_threshold:
# 持仓中,浮盈变化
arbitrage_pnl[t] = (abs(premium_pct[t-1]) - abs(premium_pct[t])) * 0.8
cum_pnl = np.cumsum(arbitrage_pnl)
axes[2].plot(dates, cum_pnl, color='green')
axes[2].set_title('累计套利利润 (基点)')
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print("=== ETF 折溢价套利模拟 ===")
simulate_etf_premium_arbitrage()4.3 ETF 套利的限制
| 限制 | 说明 |
|---|---|
| 申购赎回门槛 | 多数 ETF 有最小申赎单位(通常 100 万份以上) |
| 成分股停牌 | 一篮子中某只股票停牌,无法完成套利 |
| 申赎费率 | 申赎本身有成本 |
| 执行延迟 | 从发现信号到完成套利,折溢价可能已经修复 |
| 交易时段 | 申赎通常只能用收盘价,限制了日内套利 |
五、可转债套利
5.1 基本概念
可转债是一种可以转换为股票的债券。它同时具有债券属性和期权属性。
两个关键价值:
- 纯债价值:把可转债当作普通债券的现值(用贴现率算)
- 转换价值:按当前转股价把可转债转成股票后的价值
5.2 套利逻辑
def simulate_convertible_bond_arbitrage():
"""
模拟可转债套利(简要示例)
当 转换价值 > 可转债价格 时:
买入可转债 → 转换成股票 → 卖出股票 → 获利
"""
np.random.seed(42)
n_days = 250
# 股票价格
stock_price = 10 * np.cumprod(1 + np.random.normal(0.001, 0.025, n_days))
# 转股价(固定):12 元
conversion_price = 12.0
# 面值:100 元
face_value = 100
# 转换比例
conversion_ratio = face_value / conversion_price # ≈ 8.33 股
# 转换价值
conversion_value = conversion_ratio * stock_price
# 纯债价值(简化:用固定贴现率)
coupon_rate = 0.02 # 票面利率 2%
maturity = 5 # 剩余期限 5 年
yield_to_maturity = 0.04 # 到期收益率 4%
# 简化的纯债价值(不考虑还本,只算票息现值 + 面值现值)
bond_value = (coupon_rate * face_value * (1 - (1 + yield_to_maturity) ** -maturity) / yield_to_maturity
+ face_value * (1 + yield_to_maturity) ** -maturity)
# 可转债市场价格(取 max(纯债价值, 转换价值) + 溢价)
cb_floor = np.maximum(bond_value, conversion_value)
cb_premium = np.random.normal(0.02, 0.015, n_days) # 2% 平均溢价
cb_premium = np.clip(cb_premium, -0.01, 0.08)
cb_market_price = cb_floor * (1 + cb_premium)
# 套利机会:当 转换价值 - 可转债价格 > 交易成本 时
cost_pct = 0.005 # 0.5% 交易成本
arbitrage_spread = conversion_value - cb_market_price
has_arbitrage = arbitrage_spread > cost_pct * cb_market_price
dates = pd.date_range(start='2025-01-01', periods=n_days, freq='B')
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
# 价格
axes[0].plot(dates, cb_market_price, label='可转债价格', color='blue')
axes[0].plot(dates, conversion_value, label='转换价值', color='orange')
axes[0].axhline(y=bond_value, color='green', linestyle='--',
label=f'纯债价值={bond_value:.1f}')
axes[0].set_title('可转债价格、转换价值与纯债价值')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 套利空间
axes[1].bar(dates, arbitrage_spread, color=['red' if a else 'gray' for a in has_arbitrage],
alpha=0.7, width=1)
axes[1].axhline(y=cost_pct * 100, color='orange', linestyle=':',
label=f'成本线 ≈{cost_pct*100:.1f}元')
axes[1].set_title('套利空间(转换价值 - 可转债价格)')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
# 股价
axes[2].plot(dates, stock_price, color='purple')
axes[2].axhline(y=conversion_price, color='red', linestyle='--',
label=f'转股价={conversion_price}')
axes[2].set_title('标的股票价格')
axes[2].legend()
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
n_arb_days = has_arbitrage.sum()
print(f"有套利机会的天数: {n_arb_days} / {n_days} ({n_arb_days/n_days:.1%})")
print("=== 可转债套利模拟 ===")
simulate_convertible_bond_arbitrage()5.3 可转债套利的风险
| 风险 | 说明 |
|---|---|
| 转股限制 | 可能有锁定期的转股限制 |
| 股价波动 | 买入后股价下跌导致转换价值缩水 |
| 下修博弈 | 公司可能下修转股价,影响套利逻辑 |
| 流动性 | 部分可转债流动性差 |
| 强制赎回 | 当股价超过转股价 130% 时,公司可能强制赎回 |
六、各策略对比表
| 策略 | 风险等级 | 容量 | 频率 | 资金需求 | 定价基础 | 典型 Sharpe |
|---|---|---|---|---|---|---|
| 期现套利 | 低 | 大 | 日/周 | 高 | 持有成本模型 | 1-2 |
| 跨期套利 | 低-中 | 中 | 周/月 | 中 | 持有成本模型 | 1-3 |
| 跨品种套利 | 中 | 中 | 周/月 | 中 | 产业链关系 | 0.5-2 |
| ETF 套利 | 低 | 中 | 日 | 高 | 净值定价 | 1-2 |
| 可转债套利 | 中 | 小 | 周/月 | 中 | 期权定价 | 0.5-1.5 |
| 配对交易 | 中 | 中 | 日/周 | 中 | 协整关系 | 0.5-2 |
常见失败模式
| 策略 | 最常见的失败原因 |
|---|---|
| 期现套利 | 交割失败、保证金不足 |
| 跨期套利 | 价差结构突变(Contango → Backwardation) |
| 跨品种套利 | 产业链关系断裂、政策干预 |
| ETF 套利 | 成分股停牌、申赎限制 |
| 可转债套利 | 股价大幅下跌、强制赎回 |
| 配对交易 | 协整关系断裂(最常见) |
七、套利的共同风险
不管是哪种套利策略,都面临一些共同的系统性风险。
7.1 结构断裂
这是统计套利最大的敌人。
“两只股票之间的稳定关系”不会永远存在。公司并购、管理层变更、行业格局改变、技术革命——都可能让曾经的”完美配对”彻底失效。
现实案例:2008 年金融危机期间,大量历史协整关系同时断裂。配对交易基金(如 Quantitative Investment Management)在短期内遭遇了巨大亏损。
7.2 Regime 变化
市场环境会切换——牛市到熊市、低波动到高波动、宽松到紧缩。在一种 Regime 下有效的套利关系,在另一种 Regime 下可能完全失效。
def demonstrate_regime_change():
"""
演示 Regime 变化对套利策略的影响
"""
np.random.seed(42)
n = 1000
# Regime 1:正常环境(有协整关系)
regime1_spread = np.zeros(500)
for t in range(1, 500):
regime1_spread[t] = (regime1_spread[t-1]
+ (-0.08 * regime1_spread[t-1])
+ 1.0 * np.random.normal())
# Regime 2:关系断裂(价差开始漂移)
regime2_spread = np.zeros(500)
regime2_spread[0] = regime1_spread[-1]
for t in range(1, 500):
regime2_spread[t] = (regime2_spread[t-1]
+ (-0.005 * regime2_spread[t-1]) # 回归力极弱
+ 2.0 * np.random.normal()) # 波动率翻倍
spread = np.concatenate([regime1_spread, regime2_spread])
dates = pd.date_range(start='2022-01-01', periods=n, freq='B')
fig, axes = plt.subplots(2, 1, figsize=(14, 8), sharex=True)
axes[0].plot(dates, spread, color='blue')
axes[0].axvline(x=dates[499], color='red', linestyle='--', linewidth=2,
label='Regime 切换点')
axes[0].axhline(y=0, color='gray', linestyle='--')
axes[0].set_title('Regime 变化前后的价差行为')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 滚动 Z-score(用前期参数计算)
spread_series = pd.Series(spread)
rolling_z = (spread_series - spread_series.rolling(60).mean()) / spread_series.rolling(60).std()
axes[1].plot(dates, rolling_z, color='red')
axes[1].axvline(x=dates[499], color='red', linestyle='--', linewidth=2)
axes[1].axhline(y=2, color='orange', linestyle=':')
axes[1].axhline(y=-2, color='orange', linestyle=':')
axes[1].set_title('Z-score(注意 Regime 切换后频繁触发但不再回归)')
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print("=== Regime 变化演示 ===")
demonstrate_regime_change()7.3 拥挤交易
当太多人做同一个套利策略时:
- Edge 被压缩:套利机会出现后立即被竞争对手抢走
- 平仓踩踏:所有人同时止损,导致价差进一步恶化
- 流动性枯竭:需要平仓时发现没有对手盘
“套利策略最大的风险不是发现不了机会,而是所有人都发现了同样的机会。” —— 这是 LTCM(长期资本管理公司)崩塌的核心教训。
7.4 成本吞噬微弱 edge
统计套利的 edge 通常很薄(年化 5-15%)。如果交易成本过高,利润会被完全吞噬:
| 成本类型 | 影响 |
|---|---|
| 佣金 + 印花税 | 直接扣减收益 |
| 买卖价差(Bid-Ask Spread) | 实际成交价差于预期 |
| 市场冲击 | 大单推动价格不利变动 |
| 融券成本 | 做空端的额外成本 |
| 滑点 | 信号到执行之间的价格变化 |
7.5 流动性危机
“所有人都想平仓的时候,没有人能平仓。”
2007 年量化危机(Quant Quake)就是一个典型案例:当多个策略同时亏损,基金被迫平仓,而平仓行为又进一步加剧了亏损——一个自我强化的死亡螺旋。
小结
| 策略类型 | 核心逻辑 | 定价基础 | 关键风险 |
|---|---|---|---|
| 期现套利 | 基差修复 | 持有成本模型 | 交割/保证金 |
| 跨期套利 | 价差曲线回归 | 日历价差模型 | 结构变化 |
| 跨品种套利 | 比价回归 | 产业链关系 | 产业政策 |
| ETF 套利 | 折溢价修复 | 净值定价 | 停牌/申赎限制 |
| 可转债套利 | 转换价值偏离 | 期权定价 | 股价下跌/赎回 |
| 配对交易 | 协整价差回归 | 协整关系 | 关系断裂 |
统计套利的终极教训:所有套利策略的 edge 都在持续衰减。机构通过更快的执行、更低的成本、更复杂的模型来维持竞争力。对于个人研究者来说,找到”别人还没发现的套利关系”比”把已知的套利做得更精细”更重要。
模块总结
至此,统计套利模块的三个核心文件已经完成。回顾一下这个模块的核心脉络:
统计套利框架
│
├── 配对交易(01)
│ └── 从"两个相关股票"出发
│ 核心:协整 > 相关性
│ 工具:Engle-Granger, Johansen, Kalman Filter
│
├── 均值回归(02)
│ └── 从"偏离了就会回归"出发
│ 核心:OU 过程建模价差
│ 工具:参数估计, 半衰期, Hurst 指数
│
└── 策略类型(03)
└── 从"除了配对交易还有什么"出发
核心:多种套利形态的统一框架
警告:结构断裂、拥挤交易、成本吞噬
三个文件的核心要点:
- 统计套利 ≠ 均值回归,均值回归只是其中一种建模方式
- 协整 ≠ 相关,配对交易要的是协整
- OU 过程是均值回归的标准数学模型
- 所有套利策略都面临共同风险:关系断裂、成本吞噬、拥挤交易
- 最重要的能力不是找到套利机会,而是及时发现套利关系是否已经失效