算法交易3-均值回归策略的运行机制
Ernie Chan《算法交易:制胜策略与原理》第三章读书笔记。
第三章:均值回归策略的运行机制
一、 对冲比率的精确计算(OLS回归法)
在构建协整投资组合时,对冲比率(Hedge Ratio, 即 $\beta$)的计算方式直接决定了组合是否真正平稳。根据交易意图的不同,必须严格区分价格与对数价格的使用场景:
- 固定股数对冲(按数量交易)
- 方法:直接对两个资产的价格序列 $Y$ 和 $X$ 进行普通最小二乘法(OLS)线性回归:$Y = \beta X + \epsilon$。
- 实战意义:回归得到的斜率 $\beta$ 即为对冲比率。意味着每交易1股 $X$ 资产,需要交易 $\beta$ 股 $Y$ 资产来构建平稳价差。
- 固定市值对冲(按金额交易)
- 方法:对两个资产价格序列的自然对数 $\ln(Y)$ 和 $\ln(X)$ 进行OLS回归。
- 数值样例:假设我们要配对交易贵州茅台(Y)和五粮液(X)。茅台价格1700元,五粮液价格150元。
- 错误做法(用价格OLS):假设算出 $\beta = 2$。策略要求“买1股五粮液,卖2股茅台”。实际资金占用:做多 150元,做空 3400元。资金占比极度失衡,组合收益完全被茅台的单边风险主导,并非真正的均值回归。
- 正确做法(用对数价格OLS):对 $\ln(1700)$ 和 $\ln(150)$ 回归。假设算出 $\beta = 1.2$(代表价格弹性)。实盘中,我们设定总资金为100万元,则做多五粮液分配50万(买入3333股),做空茅台分配50万(卖出294股)。此时无论两者绝对价格差多远,组合中多空两边的市值是完全对等的。
- 货币对的特殊处理
- 原则:货币对(如EUR/USD)本质已经是相对报价,其“价差”没有直接的经济学意义。
- 实战指标:应直接使用价格比率(Price Ratio, $P_A / P_B$)或对数价差($\ln(P_A) - \ln(P_B)$)作为均值回归的指标,而非算术价差($P_A - P_B$)。
二、 参数漂移与卡尔曼滤波
静态的协整检验假设对冲比率 $\beta$ 是恒定的,但这在实盘中不存在。初级做法是用“移动窗口(如20天)”,但存在断崖式跳变的问题。高级做法是引入卡尔曼滤波。
- 卡尔曼滤波动态对冲样例
假设我们在交易AMD(Y)和英伟达(X)的价差。- 状态方程(预测):$\beta_t = \beta_{t-1} + \omega$ (假设今天的对冲比率等于昨天,加上微小随机噪声 $\omega$)
- 观测方程(实测):$Y_t = \beta_t X_t + v$ (实际价格关系,$v$ 为观测噪声)
- 卡尔曼增益(核心公式):$K_t = \frac{P_{t|t-1}}{P_{t|t-1} + R}$
(注:$P_{t|t-1}$ 是预测误差方差,$R$ 是市场观测噪声方差。$K_t$ 决定了我们多大程度上相信新数据) - 数据推演:
- T-1日:模型估算 $\beta_{t-1} = 0.5$(即1股NVDA对冲0.5股AMD)。预测误差方差 $P = 0.01$,市场噪声方差设定为 $R = 1.0$。
- T日新Tick到来:NVDA暴涨,$X_t = 800$;AMD跟涨,$Y_t = 450$。
- 计算卡尔曼增益:$K_t = 0.01 / (0.01 + 1.0) \approx 0.0098$ (因为市场价格噪声极大,所以 $K$ 很小,模型选择“不信谣不传谣”)。
- 计算残差(意外幅度):实际AMD价格 - 预测AMD价格 = $450 - (0.5 \times 800) = 50$ 美元。
- 更新对冲比率:$\beta_{new} = 0.5 + 0.0098 \times 50 = 0.5 + 0.49 = 0.99$。
- 实战优势:如果用静态20天窗口,$\beta$ 会突然从0.5跳变到1.0,导致巨量换手;而卡尔曼滤波通过 $K_t$ 的调节,将其平滑过渡到了0.99,完美解决了参数漂移引发的实盘冲击成本问题。
三、 仓位管理与波动率自适应
标准线性Z-Score策略(仓位 = $-k \times Z$)假设方差恒定。实盘中必须引入布林带(动态标准差),并深刻理解“加仓”在动态系统中的双刃剑效应。
- 布林带与被动加仓的数值推演
假设我们交易一个股指期货价差组合,历史均值 = 0点。- 初始建仓(T1):过去20天标准差 $\sigma = 10$ 点。价差突然扩大到 $+20$ 点。
- 静态Z-Score = $(20-0)/10 = 2.0$。触发做空信号,建立空头底仓。
- 极端行情演化(T2):价差继续单边发散,涨到了 $+30$ 点。此时实盘波动率剧增,布林带带宽被撑大,最近10天的实际标准差变成了 $\sigma = 15$ 点。
- 策略分化:
- 静态模型的灾难:如果死板使用历史 $\sigma=10$,此时的 $Z = 30/10 = 3.0$。模型认为“偏离更大了,更值得做空”,从而盲目加仓。这往往是实盘爆仓的元凶(逆势死扛)。
- 布林带模型的自救:使用动态 $\sigma=15$,此时 $Z = 30/15 = 2.0$。Z-Score并没有进一步放大,模型拒绝加仓,甚至如果均值发生微小漂移,还会发出减仓信号。
- 何为“被动加仓的有效性”?
在上述T2场景中,如果交易员采用网格交易法(不依赖Z-Score,而是设定每上涨5点手动加仓一次)。当价格从20涨到30时,交易员“被动”地在25和30加了空单。- 为何回测中无效? 回测假设波动率恒定,一次性在20点做空是最优的,后续加仓增加了手续费且拉低了平均收益。
- 为何实盘中有效? 因为实盘的波动率和概率分布实时变化。如果在30点被动加仓后,价差真的从30点回归到0点,这种分批建仓法有效降低了整体持仓的平均成本(从20点降至了25点左右),提高了安全垫。
- 致命前提:这种“被动加仓”必须配合严格的止损线(例如价差突破40点无条件全部平仓)。因为如果价差从30点涨到100点,网格加仓会让你在错误方向上越陷越深。
- 初始建仓(T1):过去20天标准差 $\sigma = 10$ 点。价差突然扩大到 $+20$ 点。
四、 数据误差对均值回归的致命影响
数据质量是均值回归策略的生死线,其对数据的敏感度远高于动量策略。
- 均值回归 vs. 动量:对误差的容忍度
- 动量策略:只关心价格的方向(今天涨还是跌),对绝对数值的误差不敏感。即使某个价格点被错误记录,只要趋势方向对,策略依然有效。
- 均值回归策略:极其依赖价格的绝对水平(当前价格偏离均值有多远)。
- 误差的“膨胀效应”数值案例
- 案例:某股票因除权除息,价格在一天内从 100元 真实下跌到 90元。但你的数据供应商漏掉了这笔分红,未做后复权处理。
- 后果:
- 动量策略:看到一根-10%的大阴线,视为一次普通的下跌趋势,可能不做交易或顺势做空,影响有限。
- 均值回归策略:假设该股与另一只平稳股票的价差历史均值为 5元,标准差为 2元。由于未复权,价差瞬间变成了 $-5$ 元。Z-Score计算为 $(-5 - 5) / 2 = -5.0$。策略会认为出现了“千年一遇”的极度低估,触发满仓逆势做多信号,最终造成灾难性亏损。
- 实战铁律:在运行基于价差的均值回归策略前,必须对输入数据进行极其严格的异常值剔除(如MAD法)和复权处理。即使是非常微小的数据误差(如几分钱的偏差),在高频或高杠杆的价差交易中也会被急剧放大。