跳转到内容

主成分残差交易

Avellaneda & Lee (2010) 的统计套利流程:

  1. 解释收益:对每只股票,用前 KK 个主成分(或行业 ETF)回归其日收益,吸收系统性成分;
  2. 残差建模:对回归残差 sts_t 建 OU 过程,估计回归速度与半衰期;
  3. 交易残差:残差偏离 ±bσ\pm b\sigma 时反向建仓,回归 μ\mu 时平仓。

直观理解:把股票价格里的"市场共性"剥掉,剩下的个体偏离如果呈现均值回归,就交易这个偏离。等价于一个"对市场中性化的相对价值"策略。

KK 的选择影响残差的平稳性:

  • KK 太小:残差仍含系统性成分,回归"回归"的是市场本身的风险暴露,价差与市场同涨跌;
  • KK 太大:残差被过度清洗,信号变弱、噪声占比升高;
  • 实践:前 10–15 个主成分已能解释 40–60% 的方差(截面股票数几百时),用滚动窗口重估主成分与暴露——主成分本身随时间漂移,见协整与价差构造。
residual-signal.py
import numpy as np
def residual_scores(R: np.ndarray, K: int = 15) -> np.ndarray:
"""R: T×N 收益矩阵。返回每只股票最新残差的 z 分数。"""
Xc = R - R.mean(axis=0)
U, S, Vt = np.linalg.svd(Xc, full_matrices=False)
F = U[:, :K] * S[:K] # 前K个主成分
resid = Xc - F @ Vt[:K] # 残差
cum = np.cumsum(resid, axis=0) # 残差累计 → 价差
return (cum[-1] - cum[-252:].mean(0)) / cum[-252:].std(0)

2007 年 8 月的"量化崩盘"是残差类策略的集体教训:多家多空市场中性基金同时平仓,仓位相似的策略互相踩踏,几天内出现历史级亏损——每个单独的策略都"正常",集体行为导致崩溃。

教训:

  1. 容量有限:残差信号的容量天然小于因子类策略,规模上去后冲击成本非线性增长,见最优执行与交易成本;
  2. 拥挤是系统性风险:监控自己的策略与同类(其他中性基金、相似信号)的持仓重叠度;
  3. 去杠杆是连锁的:别人平仓造成的价差爆炸不给你时间等"回归"。
  • 主成分数量滚动重估,KK 的敏感性写入稳健性检查;
  • 严格的成本与冲击模型是前提,不是事后修正;
  • 残差信号的规模上限按冲击成本的拐点设定。
  • 残差信号的容量有限,拥挤时集体去杠杆造成极端亏损
  • 主成分数量的选择影响残差的平稳性,需滚动重估
  • 需要严格的成本与冲击模型,规模按冲击成本拐点设定