统计套利动态对冲: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) 后:
- 算残差
spread = A − β·B − c - 用滚动均值/标准差把残差标准化成
zscore |z|超过开仓阈值建仓,回到平仓阈值附近了结
ZSCORE 把“偏离多少算极端”变成与波动自适应的统计量,而不是拍一个绝对价差。β 直接当数量对冲比:等合约乘数时精确,跨乘数为近似——这个取舍在代码注释里显式写明,不藏着。
四、回测与实盘共用一个估计器
统计套利最容易翻车的地方,是研究用 Python 估一套 β、实盘用 Java 估另一套。EasyQuant 让回测(SpreadBacktestService)和实盘引擎(SpreadTradingEngine)共用 SpreadDynamicHedge:
- 同样的 KALMAN/OLS 参数、同样的无前视口径、同样的预热处理
- 回测验证过的 β 行为,实盘拿到的是同一套数字
这与价差一等公民(见 27 价差套利一等公民)叠加,构成一条从合成到对冲到执行的完整统计套利链路。
结语
统计套利的门槛不在“会不会算 β”,而在“β 是不是无前视、回测和实盘是不是同一个 β”。
把动态对冲比做成回测实盘共用、严格无前视的估计器,是 EasyQuant 把配对交易从“固定比例”推进到统计套利的关键一步。