第二.03章 统计套利与协整策略

📘 本章重点

  • 理解统计套利的核心思想:利用资产间长期均衡关系的短期偏离获利
  • 掌握协整关系的数学定义与经济含义——从“两只股票”扩展到“多只股票”
  • 学会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组,哪组出信号做哪组,这样才能平滑收益曲线。

    💡 思考题

    1. 协整(Cointegration)和相关性(Correlation)有什么区别?为什么统计套利需要协整而不是相关性?
    2. 配对交易(第二.02)和统计套利(第二.03)的核心区别是什么?在什么情况下应该从配对交易“升级”到统计套利?
    3. 在A股市场融券受限的情况下,你会如何调整统计套利策略?请给出至少两种替代方案。
    4. 统计套利策略中,资产数量越多,协整关系的统计显著性往往越高。但资产数量过多也会带来什么问题?你认为一个“最优”的协整组合应该包含多少只资产?请从统计稳健性和交易成本两个角度分析。
    5. 统计套利策略有明确的容量限制——资金规模超过组合日均成交量的5%时,自身交易行为会消灭价差。如果你管理一个10亿元的资金池,你会如何设计统计套利策略来应对这一限制?
    6. 协整关系破裂的事前预警信号有哪些?如果组合中某只资产的基本面发生了重大变化(如并购、监管处罚),即使协整检验的p值仍然<0.05,你应该怎么做?
    7. (展望题) 随着机器学习技术的发展,未来可能出现“自动发现协整关系”的算法——机器可以在一千只股票中自动找出最优的协整组合。你认为这会增强还是削弱统计套利策略的有效性?请从“策略发现”和“策略拥挤”两个角度分析。

    八、引用/参考出处

    网上内容

    学术论文与图书(元信息)

    • 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日
    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞15 分享
    评论 抢沙发

    请登录后发表评论

      暂无评论内容

    欢迎注册,发表评论

    邀请码为:wt4YbMZCmSRwTrA