| name | statistical-arbitrage |
| description | 统计套利策略的完整指南,包括配对交易、协整分析、主成分策略和行业轮动套利。适用于需要构建市场中性策略、对冲系统性风险并获取稳定Alpha收益的量化投资场景。 |
统计套利
概述
统计套利是一种基于数学模型和历史统计规律的风险套利策略。它利用证券价格的历史统计规律进行套利,与无风险套利不同,统计套利存在历史规律失效的风险。其核心思想是通过构建多头和空头组合来对冲市场风险,获取与市场无关的稳定Alpha收益。
何时使用此技能:
- 当需要构建市场中性策略时
- 当需要寻找相关性强的资产对进行配对交易时
- 当需要在熊市或震荡市中获取稳定收益时
- 当需要利用行业或区域间的相关性进行套利时
核心概念
1. 统计套利定义
Morgan Stanley将统计套利定义为:一种基于模型的投资过程,在不依赖于经济含义的情况下,运用数量手段构建资产组合,根据证券价格与数量模型所预测的理论价值进行对比,构建证券投资组合的多头和空头,从而对市场风险进行规避,获取一个稳定的Alpha。
2. 统计套利 vs 无风险套利
| 特征 | 统计套利 | 无风险套利 |
|---|
| 理论基础 | 历史统计规律 | 价格必然收敛 |
| 风险 | 历史规律可能失效 | 理论无风险 |
| 收益 | 概率性Alpha | 确定性收益 |
| 适用范围 | 相关性资产对 | 期货到期收敛 |
3. 主要方法分类
统计套利主要有两大方法:
- β中性策略:基于日收益率建模,目标是在组合β值为零的前提下获取Alpha收益
- 协整策略:基于股价序列的协整关系建模,利用累计收益率的偏离进行套利
推荐策略:协整策略更优,因为:
- 直接利用原始变量(股价)建模
- 更容易把握累计收益率的偏离
- 错误信号较少
配对交易策略
配对交易原理
配对交易(Pairs Trading)是最经典的统计套利方法:
- 选取业务相似、股价具备均衡关系的上市公司股票
- 做空近期相对强势股,做多相对弱势股
- 等两者价差恢复均衡时平仓了结
关键特点:
- 投资标的是两只股票的价差(相对价值而非绝对价值)
- 多空同时建仓,对冲掉绝大部分市场风险
- 属于市场中性策略,与大盘走势相关性低
配对筛选流程
Step 1: 行业划分
└─ 在同一行业内筛选股票对,保证主营业务相似
Step 2: 收益率相关性检验
└─ 要求配对股票历史收益率相关系数 > 阈值(建议 > 0.85)
Step 3: 协整关系检验
└─ 检验两只股票价格序列是否存在长期均衡关系
Step 4: 价差形态过滤
└─ 筛选价差回归速度快的股票对,获得更多交易机会
协整检验方法
两只股票存在协整关系的条件:
- 两者的历史股价序列都是一阶单整(非平稳,但一阶差分后平稳)
- 这两个序列的某种线性组合是平稳的
协整方程:
Pa,t = α + β × Pb,t + εt
其中 εt(残差)必须是平稳序列。
检验步骤:
- 计算任意两只股票的相关系数
- 筛选相关系数较高的股票对(> 0.85)
- 对筛选后的股票对进行协整检验(EG两步法或Johansen检验)
- 选择残差平稳的股票对作为候选配对
交易策略设计
核心参数设置
| 参数 | 含义 | 推荐范围 |
|---|
| δ1 | 建仓阈值 | 1.0 ~ 1.3(σ倍数) |
| δ2 | 平仓阈值 | -1.0 ~ -0.7(σ倍数) |
| δ3 | 止损阈值 | 2.0 ~ 3.0(σ倍数) |
交易信号
入场条件:
- 当
spreadt > δ1 × σt:股票A相对高估,股票B相对低估
- 当
spreadt < -δ1 × σt:股票A相对低估,股票B相对高估
平仓条件:
- 当
spreadt > δ2 × σt 或 spreadt < -δ2 × σt:价差回归,平仓获利
止损条件:
- 当
spreadt > δ3 × σt 或 spreadt < -δ3 × σt:协整关系破坏,立即止损
阈值优化原则
- δ1 越大:潜在套利空间越大,但交易次数减少
- δ1 越小:潜在套利空间越小,但交易次数增加
- δ2 越接近0:平仓收益越高,但可能错失交易机会
最优阈值确定方法: 回测优化,在样本内寻找收益最大化的参数组合
残差建模
模型I:独立同分布假设
εt ~ N(0, σ²)
模型II:均值回复过程(推荐)
dε(t) = m(ε(t) - m)dt + σdW(t)
模型III:AR(1)模型
模型IV:GARCH(1,1)模型
- 考虑残差的异方差性
- 注意:实证表明效果较差,不推荐使用
主成分套利策略
基本原理
- 从成分股股价历史信息中提取主成分
- 捕捉所有成分股的主要趋势
- 当某成分股与主要趋势产生较大偏离时,入场套利
实现步骤
Step 1: 股价矩阵标准化
└─ PT×n → 标准化矩阵 P'T×n
Step 2: 计算相关系数矩阵
└─ P'n×n 的相关系数矩阵 Rn×n
Step 3: 特征分解
└─ 计算特征根 λ1, λ2, ..., λn
└─ 计算特征向量 V1, V2, ..., Vn
Step 4: 构建主成分组合
└─ fi = P'T×n × Vi
└─ 通常取前k个主成分(累计贡献率 ≥ 80%~90%)
Step 5: 回归分析
└─ 将单只股票收益率表达为主成分组合的线性方程
└─ 根据残差偏离进行套利
主成分策略 vs 协整策略
| 特征 | 协整策略 | 主成分策略 |
|---|
| 样本内收益 | 40%~50%/年 | 更高 |
| 样本外收益 | ~8%/半年 | 更高、更稳健 |
| 可靠性 | 基于个股对 | 基于股票组合 |
| 推荐程度 | 一般 | 强烈推荐 |
行业轮动套利
基本原理
利用同一市场环境下不同行业股票波动不同步性,获取市场中性Alpha收益。
策略设计
案例:农林 / 制造行业轮动
1. 归一化行业指数
└─ 以某基准日的指数值为1
2. 计算行业比值
└─ 农林指数 / 制造指数
3. 设置交易区间
└─ 比值 < 0.9:卖空制造,买入农林
└─ 比值 ≈ 1.0:平仓
└─ 比值 > 1.1:卖空农林,买入制造
行业轮动特征
- 在一轮上涨/下跌行情中,板块轮动明显
- 即使在单边下跌行情中,也可能存在行业轮动机会
- 策略收益与市场走势呈负相关性
样本外检验
三种外推方法
| 方法 | 描述 | 特点 |
|---|
| 固定窗口 | 协整参数固定,用新数据计算残差 | 假定协整关系不变 |
| 滚动窗口 | 每天平移,参数动态更新 | 捕捉参数变化 |
| 扩展窗口 | 窗口长度不断增加 | 可能过于滞后 |
推荐方法:滚动窗口方法(方法二)在样本外表现最好
样本外注意事项
- 样本外收益显著低于样本内(这是正常的)
- 最佳样本外收益约为 8%~10%/半年
- 建议采用保守的参数设置
- 持续监控协整关系是否被破坏
策略改进
改进1:延后开仓策略
不等价差突破阈值就建仓,而是等价差反向回归穿越阈值时才建仓。
优点:
改进2:延后开仓 + 提前平仓
- 建仓:等价差反向穿越阈值时
- 平仓:不等价差回归到均值,而是在离均值一定距离处(δ2)就平仓
注意: 实证表明提前平仓对收益影响可能是负面的
改进3:动态调整阈值
- 根据市场环境调整阈值
- 波动加大时适当提高阈值
- 波动减小时适当降低阈值
融券套利(补充)
股票-融券套利
利用负溢价认股权证进行无风险套利:
案例:江铜权证的套利
1. 买入负溢价认股权证
2. 融券卖空标的正股
3. 到期行权归还股票
4. 锁定权证的负溢价收益
可转债-融券套利
当可转债转股溢价为负时:
1. 买入可转债
2. 融券卖出标的股票
3. 转股后归还融券
4. 获取转股价值与转债价格差额
股指期货-融券套利
券商对冲融券风险:
1. 向投资者融券卖出股票
2. 同时做空股指期货对冲系统性风险
3. 获取稳定的融券利息收益
脚本工具
配套脚本
| 脚本 | 功能 | 使用场景 |
|---|
scripts/pairs_trading.py | 协整检验、配对交易信号生成、回测 | 配对交易策略开发与验证 |
环境要求
uv venv .venv
source .venv/bin/activate
uv pip install pandas numpy statsmodels matplotlib
python scripts/pairs_trading.py --help
快速开始
python scripts/pairs_trading.py test --price-a data/stock_a.csv --price-b data/stock_b.csv
python scripts/pairs_trading.py signals --price-a data/stock_a.csv --price-b data/stock_b.csv --entry-threshold 1.2 --exit-threshold -0.8
python scripts/pairs_trading.py backtest --price-a data/stock_a.csv --price-b data/stock_b.csv --entry-threshold 1.2 --exit-threshold -0.8
数据格式要求
CSV 文件必须包含以下列:
date: 日期(YYYY-MM-DD 格式)
close: 收盘价
示例:
date,close
2020-01-02,10.50
2020-01-03,10.55
...
实施要点
数据要求
- 历史数据:至少2年以上日线数据
- 数据质量:需剔除长期停牌股票
- 更新频率:建议每日更新
计算资源
- 协整检验计算量大(数千对股票)
- 建议使用向量化计算(NumPy/Pandas)
- 可采用并行计算加速
风险管理
- 设置止损:价差长期偏离时及时止损
- 头寸管理:避免过度集中
- 协整监控:定期检验协整关系是否保持
- 流动性风险:选择高流动性股票
交易成本
- 每次套利成本约 0.5%
- 融券费用约年化 10%
- 需在收益预测中充分考虑
注意事项
- 历史规律不代表未来:统计套利不是无风险策略
- 样本外表现关键:重视样本外稳健性
- 避免过度拟合:模型应简洁有效
- 做空机制依赖:国内需融资融券支持
- 容量限制:适合中小资金,大资金难以实施
错误处理与故障排查
常见错误及解决方案
| 错误场景 | 可能原因 | 解决方案 |
|---|
| 协整检验 p 值 > 0.05 | 两股票不存在长期均衡关系 | 更换股票对,确保同行业、业务相似 |
| ADF 检验失败 | 残差序列不平稳 | 重新回归计算,或使用滚动窗口 |
| 样本外收益为负 | 协整关系在样本外失效 | 缩短滚动窗口期,增加止损频率 |
| 交易信号过于频繁 | 阈值 δ1 设置过低 | 提高 δ1 至 1.2~1.5 |
| 价差长期不回归 | 行业基本面发生重大变化 | 缩短持仓周期,及时止损 |
脚本执行故障
问题:运行 pairs_trading.py 报错 "ModuleNotFoundError"
# 解决方案:使用 uv 创建并激活环境
uv venv .venv
source .venv/bin/activate
uv pip install pandas numpy statsmodels
# 运行脚本
python scripts/pairs_trading.py --help
问题:协整检验结果不稳定
# 原因:数据时间窗口过短
# 解决:确保使用2年以上日线数据
# 推荐:使用滚动窗口方法更新参数
问题:回测收益与实盘差异大
# 可能原因:
# 1. 回测未考虑滑点 - 建议设置滑点成本 0.1%~0.2%
# 2. 流动性不足 - 选择日均成交额 > 1亿的股票
# 3. 融券成本未计入 - 融券年化成本约 8%~12%
相关技能
quant-stock-selection-intro: 量化选股入门
multi-factor-model: 多因子选股模型
timing/trend-following-timing: 趋势追踪择时