📘 本章重点
- 理解统计套利的核心思想:利用资产间长期均衡关系的短期偏离获利
- 掌握协整关系的数学定义与经济含义——从“两只股票”扩展到“多只股票”
- 学会Engle-Granger两步法检验协整关系的基本流程
- 掌握多资产组合的构建方法(对冲比率β的计算与资金配比)
- 了解统计套利与配对交易的异同——从“一对一”到“多对多”
⚠️ 本章难点
- 区分“相关性”与“协整性”——两只股票走势相似不一定存在可交易的协整关系
- 理解协整关系从“两只股票”到“多只股票”的扩展逻辑
- 掌握多资产组合中β系数矩阵的含义与计算
- 理解统计套利“市场中性”的本质——收益与大盘涨跌无关
- 认识统计套利策略的容量限制——资金规模过大时自身会消灭价差
⏱️ 预估学习时间
- 50~70分钟
一、策略简述与一句话定性
一句话定性:统计套利与协整策略是一种市场中性的量化交易方法——通过识别一组资产之间的长期均衡关系(协整关系),在价格短期偏离均衡时构建多空组合,等待价差回归均衡时平仓获利。
统计套利(Statistical Arbitrage)是量化投资中最重要的策略流派之一。与配对交易(第二.02)的“一对一”模式不同,统计套利与协整策略将视野从“两只股票”扩展到“多只股票”——它不再局限于寻找一对协整的股票,而是利用协整理论在一组资产中寻找稳定的线性关系,构建一个由多只股票组成的投资组合。
统计套利的理论基础可以追溯到1987年Engle和Granger提出的协整理论。该理论指出:即使多个非平稳的时间序列各自随机游走,它们之间可能存在一个长期稳定的线性关系。Engle和Granger因协整理论的贡献共同获得了2003年诺贝尔经济学奖。
把“配对”变成“组合”——一个直观的比喻:
配对交易就像双人三足跑——两个人的腿绑在一起,步调必须一致。统计套利就像多人划龙舟——多名桨手的节奏必须协调一致,船才能直线前进。如果某个桨手划得太快或太慢(价格偏离均衡),整条船就会偏航,但最终大家会调整回一致的节奏(价差回归)。
协整关系就是这多条船桨之间的“节奏协议”——它规定了每支桨应该用多大的力气、以多快的频率划动,船才能保持直线前进。
龙舟上的每一位桨手,都对应组合中的一只资产;他们共同的“节奏”,就是协整向量所定义的长期均衡关系。
如果说配对交易(第二.02)是“一对一”的协整套利,那么统计套利与协整策略就是“多对多”的协整套利——它不再满足于找两只协整的股票,而是利用协整理论在一组资产中寻找一个稳定的线性组合。配对交易是统计套利的“特例”,统计套利是配对交易的“一般化”。
配对交易 vs 统计套利:
配对交易通常依赖交易员人工筛选股票对(如同行业的两只龙头股),而统计套利则依赖算法自动搜索——在大规模的股票池中,用计算机穷举所有可能的组合,找出协整关系最显著的那一组。配对交易是“手工艺”,统计套利是“工业化生产”。
老陈点评:
从数学角度看,配对交易是统计套利在“两只资产”这个特殊情况下的应用。当我们将协整关系从两只股票扩展到多只股票时,我们实际上是在寻找一个最优的线性组合——这个组合的价差(残差)是平稳的,具有均值回归特性。多资产的协整套利,本质上是在更高维度上寻找更稳定的价差关系。
老王补充:
统计套利最吸引人的地方是它的市场中性——它不关心大盘涨跌,只关心资产之间的相对关系。在2008年金融危机中,标普500下跌了38%,而许多统计套利策略实现了正收益——不是因为它们预测了市场,而是因为它们根本不关心市场往哪个方向走。统计套利赌的是“关系回归”,不是“方向正确”。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 股票、ETF、期货、外汇、加密货币 | 需要有足够的历史价格数据用于协整检验 |
| 品种要求 | 同行业、同板块、或有经济关联的资产 | 协整关系需要有经济逻辑支撑,而非纯数据挖掘 |
| 交易机制 | 支持做多与做空(或融券) | A股融券受限是最大障碍 |
| 适用周期 | 日线、小时线 | 价差回归通常需要数天至数周 |
| 资金门槛 | 中等至高(多资产组合需同时持有多个头寸) | 随着资产数量增加,资金需求上升 |
| 不适合的市场状态 | 协整关系破裂、市场结构突变 | 价差可能永久性偏离,不再回归 |
适用品种举例:
- 同行业股票:银行股组合(工商银行、建设银行、招商银行、农业银行)
- 指数成分股:沪深300中同板块的股票组合
- 商品期货:豆油、棕榈油、菜籽油(油脂三兄弟)
- 跨市场套利:A+H股配对(如招商银行A股与H股)——同一公司不同市场的价差套利
- 加密货币:BTC、ETH、BNB等主流币种
不适用品种:
- 流动性极差的小盘股(无法有效执行多空组合)
- 基本面差异巨大的跨行业组合(缺乏协整的经济逻辑)
- ST股或面临退市风险的股票(协整关系随时可能破裂)
A股融券的现实困境:截至2024年7月底,A股信用账户(可融资融券)共有663.23万个,仅占2亿A股总账户数的3%。融券余额仅占A股流通市值的0.1%。此外,2024年监管层进一步收紧了融券业务,包括全面暂停限售股出借、转融券由实时可用调整为次日可用等措施。统计套利在A股的实际操作空间极为有限。
失效案例:2015年A股股灾期间,许多原本高度协整的同行业股票对出现了价差永久性偏离——银行股因护盘资金介入而相对抗跌,而券商股因市场暴跌而跌幅更深,原有的协整关系被打破,统计套利策略出现大面积亏损。
老陈点评:
统计套利策略的最大风险不是“价差没有回归”,而是“协整关系本身已经不存在了”。协整关系的稳定性需要持续监控——用滚动窗口定期检验协整关系是否仍然成立。一旦p值从小于0.05变为大于0.05,说明这个组合已经“散伙”了,必须立即清仓离场。
三、因子拆解与原理
3.1 协整关系——策略的统计基础
统计套利策略的核心假设是:一组资产的价格存在长期均衡关系,短期偏离终将回归。
协整的数学定义:
如果有k个价格序列 X₁, X₂, …, Xk 都是非平稳的(I(1)过程),但存在一个线性组合:
Z_t = X₁_t - β₂X₂_t - β₃X₃_t - ... - βkXk_t
使得 Z_t 是平稳的(I(0)过程),则称这k个序列具有协整关系。Z_t就是“价差”,它会在某个均值附近波动,不会无限偏离。
协整 ≠ 相关:
| 维度 | 相关性(Correlation) | 协整性(Cointegration) |
|---|---|---|
| 衡量什么 | 两个序列同步变动的程度 | 两个序列长期均衡的关系 |
| 对趋势的反应 | 两个上升序列可能高度相关 | 价差必须是有界的、稳定的 |
| 时间维度 | 短期(同期或滞后几期) | 长期(整个样本期) |
| 交易意义 | 不足以构成套利依据 | 可直接用于构建交易信号 |
两只股票可能因为同属一个板块而走势相似(高相关),但如果价差本身有趋势(即价差在不断拉大),则它们不协整——这种“高相关但不协整”的股票对,恰恰是配对交易和统计套利中最危险的陷阱。
协整关系从“两只”到“多只”的扩展:
| 资产数量 | 策略名称 | 协整形式 | 复杂度 |
|---|---|---|---|
| 2只 | 配对交易(第二.02) | X = βY + Z | 低 |
| 3只以上 | 统计套利 | X₁ = β₂X₂ + β₃X₃ + … + Z | 高 |
多资产协整的优势在于:资产数量越多,协整关系的统计显著性往往越高(因为更多的资产提供了更多的信息来估计协整向量),但这不意味着协整关系更不容易破裂——任何一只资产的基本面发生变化,都可能破坏整个组合的协整关系。
老陈点评:
从统计学的角度看,多资产协整的稳定性来自于分散化效应——资产越多,单个资产的特质风险被分散得越充分,组合的价差越稳定。这就是为什么机构投资者的统计套利策略通常包含10只甚至更多的股票——不是为了分散风险,而是为了让协整关系更持久、更可靠。
⚠️ 协整检验不能替代经济逻辑
两只股票可能在统计上高度协整,但如果它们之间没有经济上的关联(如同行业、同产业链、同市场),这种协整关系很可能是数据挖掘的产物——它可能在样本内成立,但在样本外迅速失效。
正确的做法是:先用经济逻辑筛选候选资产(如银行股之间、油脂三兄弟之间),再用协整检验来验证这个逻辑是否在统计上成立。经济逻辑是“因”,协整检验是“果”——不要倒过来。
实例:银行股组合的协整逻辑
工商银行、建设银行、农业银行是中国银行业的三大国有行。它们面临相同的宏观环境(利率政策、信贷周期)、相同的监管框架(资本充足率要求、不良贷款认定标准)、相似的业务结构(存贷利差为主要收入来源)。这种经济上的同质性,使得它们的股价在长期中保持稳定的相对关系——这就是协整关系的经济基础。
3.2 协整检验——筛选可交易组合
找到具有协整关系的资产组合,需要经过严格的统计检验。最常用的方法是Engle-Granger两步法。
Step 1:OLS回归
对k个资产的价格序列做线性回归,选择一个资产作为“被解释变量”,其余作为“解释变量”:
X₁_t = α + β₂X₂_t + β₃X₃_t + ... + βkXk_t + ε_t
其中β₂、β₃、…、βk就是对冲比率——它们告诉你构建一个“中性组合”需要各配置多少。
Step 2:ADF单位根检验
对残差ε_t进行ADF检验。如果检验结果显著(p值 < 0.05),说明残差序列是平稳的,这组资产存在协整关系。
from statsmodels.tsa.stattools import adfuller
# 对残差序列进行ADF检验
result = adfuller(residuals)
# p值 < 0.05 表示残差平稳,即存在协整关系(标准阈值,可根据品种调整)
# 但协整显著不等于交易可盈利,还需考虑价差半衰期、波动率和交易成本
Johansen检验:当资产数量较多(3只以上)时,建议使用Johansen检验。它可以同时检验多个资产之间的协整关系,并给出协整向量的数量。
from statsmodels.tsa.vector_ar.vecm import coint_johansen # Johansen协整检验(多资产) result = coint_johansen(price_data, det_order=0, k_ar_diff=1) # 特征值 > 临界值 表示存在协整关系
老王补充:
协整检验的p值只是“入场券”,不是“保证书”。p值显著只说明“历史上存在协整关系”,不保证“未来还会存在”。我每三个月重新做一次协整检验,如果p值不再显著,就果断把这个组合从策略池中剔除。
四、仓位、买卖点与风险管理
4.1 价差计算与标准化
找到协整关系后,需要计算当前的价差并将其标准化,以便生成交易信号。
价差计算:
价差 = X₁ - β₂X₂ - β₃X₃ - ... - βkXk
Z-Score标准化:
Z-Score = (价差 - mean(价差)) / std(价差)
4.2 入场信号
| 信号类型 | 触发条件 | 操作 |
|---|---|---|
| 开仓(做多价差) | Z-Score < -阈值(如-2.0) | 买入被低估的资产,做空被高估的资产 |
| 开仓(做空价差) | Z-Score > +阈值(如+2.0) | 做空被高估的资产,买入被低估的资产 |
阈值的设定:
- 经典值:±2.0倍标准差
- 激进值:±1.5(信号多,但假突破也多)
- 保守值:±2.5(信号少,但每笔胜率更高)
4.3 平仓信号
| 平仓方式 | 触发条件 | 说明 |
|---|---|---|
| 回归平仓 | Z-Score回归至0附近(如±0.5) | 最常用,逻辑自洽 |
| 分批平仓 | Z-Score回归至±1.0时平一半,至0时平另一半 | 锁定部分利润 |
| 时间止损 | 持仓超过N个交易日仍未回归 | 防止资金长期被占用 |
| 协整破裂止损 | 滚动窗口协整检验p值>0.05 | 统计关系已失效 |
4.4 仓位管理
统计套利的仓位管理比配对交易更复杂——因为它涉及多只股票的同时持仓:
- 等风险配比:根据对冲比率β调整每只股票的持仓,使每只股票对组合的风险贡献相等
- 资金分配:每笔交易分配固定比例资金(如总资金的2%-5%)
- 组合分散:同时运行5-10组协整组合,分散单组失效的风险
资金配比计算:
做多市值 = Σ(买入股数 × 价格)
做空市值 = Σ(做空股数 × 价格)
做多市值 ≈ 做空市值(市场中性)
4.5 止损设计
| 止损方式 | 触发条件 | 说明 |
|---|---|---|
| Z-Score阈值止损 | Z-Score超过历史最大值(如3.5)仍未回归 | 协整关系可能已破裂 |
| 时间止损 | 持仓超过预设周期(如20个交易日) | 资金效率考虑 |
| 协整检验止损 | 滚动窗口内协整检验p值>0.05 | 统计关系已失效 |
协整关系破裂的事前预警信号(非止损触发条件,但应主动关注):
| 预警信号 | 表现 | 应对建议 |
|---|---|---|
| 价差持续偏离 | Z-Score超过±3.0且持续多日未回归 | 主动减仓50%,观察市场 |
| 波动率突变 | 价差的标准差突然放大至历史均值的2倍以上 | 暂停新增开仓,等待波动率回归正常 |
| 基本面变化 | 组合中某只资产出现重大事件(并购、退市风险、监管处罚) | 立即平仓该组合,重新评估协整关系 |
当出现以上信号时,即使协整检验的p值仍然<0.05,也应主动减仓或平仓,而不是等到p值变差再行动。
4.6 策略容量——统计套利的“天花板”
统计套利的盈利来源是“价差回归”——但如果资金规模过大,你的买卖行为本身就会推动价差回归,从而消灭了自己的盈利空间。这就是策略容量限制。
举例:如果一个统计套利组合每天的成交量只有1亿元,而你管理着10亿元的资金,你的每一次调仓都会对市场产生显著冲击——买入时推高价格,卖出时压低价格,滑点成本会吞噬全部利润。
对策:分散到多个低相关性的组合中,每个组合的资金规模控制在市场日均成交量的5%以内。这是机构投资者管理统计套利策略的核心原则。
五、策略的来历、设计者与趣闻
统计套利策略的诞生,是一段从“程序员的无意发现”到“量化团队的精密仪器”的传奇旅程。
Bamberger的发现:统计套利作为一种交易策略,最早可追溯到20世纪80年代的摩根士丹利。当时,一位名叫Gerry Bamberger的程序员在为大宗交易部门编写软件时,无意中发现了一个规律:两只同行业的股票在价格上存在稳定的相对关系,当这种关系被短暂打破时,往往会在不久后恢复。这一发现引起了摩根士丹利量化团队的注意。
Tartaglia的团队:随后,由Nunzio Tartaglia领导的一支由数学家、物理学家和计算机科学家组成的团队,将这一直觉系统化为可编程的交易策略。他们在1980年代中期将策略投入实战,开启了统计套利的量化时代。Tartaglia的团队由至少12名量化专家组成,每年为摩根士丹利贡献数百万美元的利润——这在当时是惊人的业绩。
协整理论的奠基:几乎在同时——1987年——两位经济学家Robert Engle和Clive Granger在《Econometrica》杂志上发表了协整理论的奠基性论文《Co-integration and Error Correction: Representation, Estimation, and Testing》。他们发现:即使多个非平稳的时间序列各自随机游走,它们之间可能存在一个长期稳定的线性关系。这一发现彻底改变了金融时间序列分析的方法论。
协整理论的早期萌芽:实际上,Granger在1981年就已经提出了协整概念的雏形,但1987年的论文才是完整理论框架的正式发表。2003年,Engle和Granger因协整理论的贡献共同获得了诺贝尔经济学奖——这是量化金融领域少数几个获得诺贝尔奖认可的理论之一。
Gatev的实证验证:1999年,三位学者Gatev、Goetzmann和Rouwenhorst发表了关于配对交易的经典研究(NBER Working Paper 7032),后于2006年正式发表于《Review of Financial Studies》。他们用1962年至2002年的美股数据验证了配对交易策略的盈利能力,发现一个简单的配对交易规则可以产生高达11%的年化超额收益。这项研究让配对交易从“华尔街的秘密”变成了“学术界的常识”。
现代统计套利:2010年,Avellaneda和Lee发表了《Statistical Arbitrage in the US Equities Market》,将统计套利策略与因子模型结合,提出了更为系统的框架。这一研究至今仍是量化对冲基金的重要参考。
趣闻:Engle和Granger在1987年发表协整理论论文时,可能并没有想到这个理论会被华尔街的交易员用来赚钱。Granger后来在一次采访中说:“我们当时只是想解决计量经济学中的一个技术问题——如何避免‘伪回归’(spurious regression)。我们没想到这个工具会被用来做交易。”科学家发明工具,交易员用它来赚钱——这可能是量化金融领域最经典的“跨界”故事之一。
老陈点评:
协整理论获得诺贝尔奖,说明了学术界对“长期均衡关系”这一概念的高度认可。但诺贝尔奖级别的理论,不等于可以直接用来赚钱。协整检验只是告诉你“历史上存在过这个关系”,不保证“未来还会存在”。 统计套利的核心不是“找到一个协整组合”,而是“持续监控这个组合是否仍然协整”。
老王补充:
我认识一个专门做统计套利的基金经理,他的策略池里有50组协整组合,每组包含5-10只股票。他说:“单组协整的胜率也就50%-60%,但50组同时运行,胜率就上去了。统计套利不是一个‘赌一把’的策略,而是一个‘赌很多把’的策略。 分散化就是它的护城河。”
六、Python回测示例
以下代码演示统计套利策略在3只银行股上的完整回测。采用Engle-Granger两步法检验协整关系,滚动窗口计算对冲比率,Z-Score阈值±2.0开仓、回归均值平仓。
import pandas as pd
import numpy as np
import yfinance as yf
import statsmodels.api as sm
from statsmodels.tsa.stattools import coint, adfuller
from statsmodels.tsa.vector_ar.vecm import coint_johansen
from datetime import datetime, timedelta
# 若yfinance无法获取数据,可使用akshare或聚宽数据源
def find_cointegrated_assets(data_dict, lookback_days=252):
"""
在多个资产中寻找协整关系(使用Engle-Granger两步法)
参数:
data_dict: {名称: DataFrame(含'Close'列)} 的字典
lookback_days: 协整检验的回看窗口
返回:协整组合信息(资产列表、对冲比率、p值)
注意:本函数以第一只资产为因变量,其余为自变量。因变量的选择会影响协整检验结果和β系数的含义。
建议调用时将经济逻辑上最核心的资产放在第一位(如银行股组合中,将工商银行放在第一位)。
如需更稳健的结果,建议交换因变量和自变量做双向验证。
"""
# 合并价格数据
prices = pd.DataFrame()
for name, df in data_dict.items():
prices[name] = df['Close']
prices = prices.dropna()
# 取最近lookback_days天的数据
prices = prices.iloc[-lookback_days:]
# 选择一个资产作为因变量,其余作为自变量
y = prices.iloc[:, 0]
X = prices.iloc[:, 1:]
X = sm.add_constant(X)
# OLS回归
model = sm.OLS(y, X).fit()
residuals = model.resid
# ADF检验(检验残差是否平稳)
adf_result = adfuller(residuals, autolag='AIC')
p_value = adf_result[1]
# 对冲比率(β系数)
hedge_ratios = model.params[1:].values
print(f"协整检验p值:{p_value:.4f}")
print(f"对冲比率:{dict(zip(prices.columns[1:], hedge_ratios))}")
return {
'assets': prices.columns.tolist(),
'hedge_ratios': hedge_ratios,
'p_value': p_value,
'is_cointegrated': p_value < 0.05 # 标准阈值,可根据品种调整
}
def statistical_arbitrage_strategy(data_dict,
lookback_days=252,
entry_zscore=2.0,
exit_zscore=0.5,
stop_loss_zscore=3.5,
cost_rate=0.001):
"""
统计套利策略(多资产协整)- 完整回测函数
参数:
data_dict: {名称: DataFrame(含'Close'列)} 的字典
lookback_days: 协整检验的回看窗口(252天约1年交易日,可根据品种波动特性调整)
entry_zscore: 开仓阈值
exit_zscore: 平仓阈值
stop_loss_zscore: 止损阈值
cost_rate: 双边交易成本(含滑点)
返回:添加了持仓和净值的DataFrame
"""
# 1. 合并价格数据
prices = pd.DataFrame()
for name, df in data_dict.items():
prices[name] = df['Close']
prices = prices.dropna()
# 2. 初始化结果
dates = prices.index
asset_names = prices.columns.tolist()
n_assets = len(asset_names)
result = pd.DataFrame(index=dates)
result['Spread'] = np.nan
result['ZScore'] = np.nan
result['Hedge_Ratios'] = '' # 存储对冲比率
# 持仓记录(每个资产的持仓数量)
result['Position'] = 0 # 0=空仓,1=做多价差,-1=做空价差
for asset in asset_names:
result[f'Pos_{asset}'] = 0
position = 0
entry_spread = 0
hedge_ratios = np.ones(n_assets) / n_assets # 初始等权重
for i in range(lookback_days, len(dates)):
# 取窗口数据
window = prices.iloc[i-lookback_days:i]
# 以第一只股票为因变量
y = window.iloc[:, 0]
X = window.iloc[:, 1:]
X_const = sm.add_constant(X)
try:
# OLS回归
model = sm.OLS(y, X_const).fit()
residuals = model.resid
# 计算当前价差和Z-Score
current_prices = prices.iloc[i].values
beta = model.params[1:].values
# 价差 = 第一只股票 - Σ(β_i × 其他股票)
current_spread = current_prices[0] - np.sum(beta * current_prices[1:])
# 计算历史价差的均值和标准差(使用lookback_days窗口)
spread_history = window.iloc[:, 0].values - np.sum(beta * window.iloc[:, 1:].values, axis=1)
spread_mean = np.mean(spread_history)
spread_std = np.std(spread_history)
zscore = (current_spread - spread_mean) / spread_std if spread_std > 0 else 0
result.loc[dates[i], 'Spread'] = current_spread
result.loc[dates[i], 'ZScore'] = zscore
result.loc[dates[i], 'Hedge_Ratios'] = str(beta.tolist())
hedge_ratios = beta
except Exception as e:
# 回归失败时使用前值
if i > 0:
result.loc[dates[i], 'Spread'] = result.loc[dates[i-1], 'Spread']
result.loc[dates[i], 'ZScore'] = result.loc[dates[i-1], 'ZScore']
result.loc[dates[i], 'Hedge_Ratios'] = result.loc[dates[i-1], 'Hedge_Ratios']
continue
# 交易逻辑
if position == 0:
if zscore < -entry_zscore:
position = 1
entry_spread = current_spread
# 做多价差:买入第一只股票,做空其他股票(按β比例)
result.loc[dates[i], f'Pos_{asset_names[0]}'] = 1
for j, asset in enumerate(asset_names[1:]):
result.loc[dates[i], f'Pos_{asset}'] = -hedge_ratios[j]
elif zscore > entry_zscore:
position = -1
entry_spread = current_spread
# 做空价差:做空第一只股票,买入其他股票(按β比例)
result.loc[dates[i], f'Pos_{asset_names[0]}'] = -1
for j, asset in enumerate(asset_names[1:]):
result.loc[dates[i], f'Pos_{asset}'] = hedge_ratios[j]
else:
# 价差回归平仓
if abs(zscore) < exit_zscore:
position = 0
for asset in asset_names:
result.loc[dates[i], f'Pos_{asset}'] = 0
# 止损
elif abs(zscore) > stop_loss_zscore:
position = 0
for asset in asset_names:
result.loc[dates[i], f'Pos_{asset}'] = 0
result.loc[dates[i], 'Position'] = position
# 4. 计算每日收益率
result['Daily_Return'] = 0.0
for i in range(1, len(result)):
daily_ret = 0
for asset in asset_names:
pos_col = f'Pos_{asset}'
if pos_col in result.columns:
ret = (prices[asset].iloc[i] - prices[asset].iloc[i-1]) / prices[asset].iloc[i-1]
daily_ret += result[pos_col].iloc[i-1] * ret
# 扣除交易成本(调仓时)
position_changed = (result['Position'].iloc[i] != result['Position'].iloc[i-1])
if position_changed:
daily_ret -= cost_rate
result.loc[result.index[i], 'Daily_Return'] = daily_ret
result['Net_Value'] = (1 + result['Daily_Return']).cumprod()
# 5. 统计指标
total_return = (result['Net_Value'].iloc[-1] - 1) * 100
max_drawdown = ((result['Net_Value'].cummax() - result['Net_Value']) / result['Net_Value'].cummax()).max() * 100
# 夏普比率(年化)
sharpe = result['Daily_Return'].mean() / result['Daily_Return'].std() * np.sqrt(252) if result['Daily_Return'].std() > 0 else 0
print(f"总收益率:{total_return:.2f}%")
print(f"最大回撤:{max_drawdown:.2f}%")
print(f"夏普比率:{sharpe:.2f}")
return result
if __name__ == "__main__":
# 下载三只银行股数据
stocks = {
'ICBC': yf.download('601398.SS', start='2018-01-01', end='2024-12-31', progress=False),
'CCB': yf.download('601939.SS', start='2018-01-01', end='2024-12-31', progress=False),
'ABC': yf.download('601288.SS', start='2018-01-01', end='2024-12-31', progress=False)
}
# 寻找协整关系
coint_result = find_cointegrated_assets(stocks, lookback_days=252)
if coint_result['is_cointegrated']:
print("✓ 资产组合存在协整关系,可以进行统计套利")
# 运行策略
result = statistical_arbitrage_strategy(stocks, lookback_days=252)
print(result[['ZScore', 'Position', 'Net_Value']].tail(10))
else:
print("✗ 资产组合不存在协整关系,请更换组合")
回测结果参考(基于银行股组合的历史回测,不同品种和时段结果存在差异):
| 指标 | 参考值 |
|---|---|
| 年化收益率 | 8%-15% |
| 最大回撤 | 5%-10% |
| 夏普比率 | 1.0-2.0 |
| 与沪深300相关性 | 接近0(市场中性) |
注:以上数据为基于银行股组合的历史回测参考值,不同品种、不同时间段的结果可能存在显著差异。建议读者使用自己的数据源进行验证。
代码说明:
本代码为完整的统计套利回测函数,包含以下核心功能:
find_cointegrated_assets:利用Engle-Granger两步法检验协整关系(以第一只资产为因变量)statistical_arbitrage_strategy:完整的回测框架,含滚动窗口计算β、Z-Score信号、止损止盈- 支持多资产(3只以上)的协整套利
实际应用中,建议同时运行多组协整组合以分散风险,并加入更精细的交易成本模型。
老陈点评:
回测时要注意:多资产协整的稳定性可能比两只股票的协整更强,但计算也更复杂。 建议使用滚动窗口(如每次用过去252天数据重新计算β和Z-Score),而不是固定参数。代码中的协整检验可以帮助你及时发现协整关系的变化。
老王补充:
实盘中最大的问题是执行成本。统计套利涉及多只股票的同时买卖,如果资金规模较大,冲击成本会显著影响收益。建议先小资金测试,确认策略在扣除交易成本后仍有正收益,再逐步放大资金。 另外,A股融券难是个大问题——如果做空工具受限,统计套利的“市场中性”优势就打了折扣。
七、本章小结与思考题
小结
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 统计套利 / 均值回归,基于多资产协整 |
| 核心逻辑 | 一组资产的价差偏离均值时开仓,回归时平仓 |
| 统计基础 | Engle-Granger协整检验(1987),2003年诺贝尔经济学奖 |
| 与配对交易的区别 | 配对交易=2只资产;统计套利=3只及以上 |
| 核心优势 | 市场中性,与大盘涨跌无关,收益来源多样化 |
| 最大风险 | 协整关系破裂,价差永久性偏离 |
| 资金门槛 | 中等偏高(需同时持有多只股票的多头和空头) |
| 策略容量 | 组合日均成交量的5%以内,超量则自身消灭价差 |
统计套利与协整策略是配对交易的“升级版”——它从“两只股票”的协整扩展到“多只股票”的协整,利用更多资产构建更稳定的价差组合。资产越多,协整关系的统计显著性往往越高,但同时资金需求也越大,执行也越复杂。
老陈总结:
统计套利的灵魂不是“找到协整关系”,而是“持续验证协整关系仍然存在”。协整关系不是永恒的——公司的基本面会变化,行业的竞争格局会变化,市场的定价逻辑也会变化。协整检验不是“一次通过、终身有效”的考试,而是“每季度重考一次”的持续认证。
老王总结:
如果你在A股做统计套利,我的建议是:先解决做空工具的问题。 ETF、期货、期权都可以作为替代方案。没有做空工具,统计套利就是“一条腿走路”。另外,别只盯着一组协整组合——同时监控10-20组,哪组出信号做哪组,这样才能平滑收益曲线。
💡 思考题
- 协整(Cointegration)和相关性(Correlation)有什么区别?为什么统计套利需要协整而不是相关性?
- 配对交易(第二.02)和统计套利(第二.03)的核心区别是什么?在什么情况下应该从配对交易“升级”到统计套利?
- 在A股市场融券受限的情况下,你会如何调整统计套利策略?请给出至少两种替代方案。
- 统计套利策略中,资产数量越多,协整关系的统计显著性往往越高。但资产数量过多也会带来什么问题?你认为一个“最优”的协整组合应该包含多少只资产?请从统计稳健性和交易成本两个角度分析。
- 统计套利策略有明确的容量限制——资金规模超过组合日均成交量的5%时,自身交易行为会消灭价差。如果你管理一个10亿元的资金池,你会如何设计统计套利策略来应对这一限制?
- 协整关系破裂的事前预警信号有哪些?如果组合中某只资产的基本面发生了重大变化(如并购、监管处罚),即使协整检验的p值仍然<0.05,你应该怎么做?
- (展望题) 随着机器学习技术的发展,未来可能出现“自动发现协整关系”的算法——机器可以在一千只股票中自动找出最优的协整组合。你认为这会增强还是削弱统计套利策略的有效性?请从“策略发现”和“策略拥挤”两个角度分析。
八、引用/参考出处
网上内容:
- 百度开发者《基于协整关系的配对量化交易策略:R语言实现全解析》:https://developer.baidu.com/article/detail.html?id=3792438
学术论文与图书(元信息):
- Engle, R. F., & Granger, C. W. J. (1987). “Co-integration and error correction: Representation, estimation, and testing.” Econometrica, 55(2), 251-276.(协整理论的奠基之作,2003年诺贝尔经济学奖)
- Gatev, E., Goetzmann, W. N., & Rouwenhorst, K. G. (2006). “Pairs Trading: Performance of a Relative-Value Arbitrage Rule.” Review of Financial Studies, 19(3), 797-827.(配对交易策略的经典实证研究)
- Avellaneda, M., & Lee, J. H. (2010). “Statistical Arbitrage in the US Equities Market.” Quantitative Finance, 10(7), 761-782.(现代统计套利的系统框架)
- Vidyamurthy, G. (2004). Pairs Trading: Quantitative Methods and Analysis. John Wiley & Sons.(配对交易与统计套利的经典著作)
- 海通证券《统计套利之股票配对交易策略》,2011年6月10日


















暂无评论内容