统计套利动态对冲:Kalman 与 OLS 估 β,加 ZSCORE 触发

固定比例的价差套利有个隐藏假设:两条腿的关系一成不变。
现实里 β 会漂——行业轮动、基本面变化、流动性迁移,都会让“1 手 A 对冲多少 B”随时间变。用昨天的 β 对冲今天的价差,残差里混的其实是 β 漂移,不是可回归的错价。

结论先行:EasyQuant 的统计套利用动态 β 替代固定比例——SpreadDynamicHedge 逐点无前视地估计 β 与截距,残差经 ZSCORE 标准化后触发开平。回测与实盘共用同一估计器,口径一致。


一、为什么要动态 β

价差残差写成 A − β·B − c。如果 β 用固定值:

  • β 偏了,残差就系统性偏离 0,均值回归的“中枢”是假的
  • 看似的“错价”可能只是 β 慢慢变了,做反了方向
  • 不同市场状态下 β 不同,一个静态数字覆盖不了全样本

所以 β 必须随数据更新,而且只能用过去的数据估计——否则就是用了未来信息,回测虚高、实盘打脸。


二、无前视是硬约束

SpreadDynamicHedge 的合同写得很清楚:索引 i 处返回的 (β_i, c_i) 只依赖 < i 的数据,预热期返回 null。

  • KALMAN 模式:用截至 i−1 的后验状态递推,把 β、c 当作随机游走的隐状态,状态噪声由 δ 控制
  • ROLLING_OLS 模式:用窗口 [i−W, i−1] 做滚动回归

两种模式都严格不看当前及未来 bar。这条约束是统计套利可信度的生命线:一旦漏进未来信息,再漂亮的回测都作废。


三、从 β 到信号:ZSCORE

估出 (β, c) 后:

  1. 算残差 spread = A − β·B − c
  2. 用滚动均值/标准差把残差标准化成 zscore
  3. |z| 超过开仓阈值建仓,回到平仓阈值附近了结

ZSCORE 把“偏离多少算极端”变成与波动自适应的统计量,而不是拍一个绝对价差。β 直接当数量对冲比:等合约乘数时精确,跨乘数为近似——这个取舍在代码注释里显式写明,不藏着。


四、回测与实盘共用一个估计器

统计套利最容易翻车的地方,是研究用 Python 估一套 β、实盘用 Java 估另一套。EasyQuant 让回测(SpreadBacktestService)和实盘引擎(SpreadTradingEngine共用 SpreadDynamicHedge

  • 同样的 KALMAN/OLS 参数、同样的无前视口径、同样的预热处理
  • 回测验证过的 β 行为,实盘拿到的是同一套数字

这与价差一等公民(见 27 价差套利一等公民)叠加,构成一条从合成到对冲到执行的完整统计套利链路。


结语

统计套利的门槛不在“会不会算 β”,而在“β 是不是无前视、回测和实盘是不是同一个 β”。

把动态对冲比做成回测实盘共用、严格无前视的估计器,是 EasyQuant 把配对交易从“固定比例”推进到统计套利的关键一步。