halo 的技术博客

返回

FOMC 那 8 个预定日子的下午两点,是日历事件中极少数几小时之间你能感受到”日历溢价”被定价的事件。市场有 6–8 个基点的隐含波动藏在 SPX/UST 当天夜里,且收益分布明显偏斜——drift 不是”涨也不是跌”的零和,而是有明确方向。这就是为什么”日历交易者”长期跑赢 buy-and-hold:他们不是预测利率,而是赚 FOMC 那个日历溢价。

结论先放这:FOMC 隔夜漂移(决议时刻到次日开盘之间,overnight return)和 rate surprise 的关系是非线性的**——小意外(+3 到 +8bp)下的解释力大于极端意外(±20bp 以上);用 surprise 的线性单因子只能解释约 30% 的变异,引入 sqrt(surprise) 与 policy uncertainty 的交互项后 R² 涨到 0.55;分桶信号显示 [3bp, 8bp) 区间平均漂移 +1.42%、夏普 1.81,是性价比最高的信号桶;-20bp 以下的极端意外反倒难做,因为期权市场已经把 premium 打完。**附完整 Python 与三张真实计算图。

FOMC Surprise vs 隔夜漂移:surprise 越大漂移越没有线性可预测性,颜色(policy uncertainty)给了第二维信息

一、surprise 是什么:相对一致预期的偏离#

surprise 是市场认知差的标准量化,FOMC 场合对应的公式很简单:

surpriset  =  Δitactual    Et[Δitactual]\text{surprise}_{t} \;=\; \Delta i^{\text{actual}}_{t} \;-\; \mathbb{E}_{t^{-}}[\Delta i^{\text{actual}}_{t}]

Δi 是联邦基金目标利率的变化(年化基点),t⁻ 是决议公布之前那一刻。常见获取方式:CME FedWatch 在决议前的隐含概率、OIS 曲线体现的 swap rate、欧元美元期货的预期路径。本文不做特定产品假设,把它当作一个外生变量:

import numpy as np
import pandas as pd

rng = np.random.default_rng(2026)
N = 200
# 80% 小意外 + 20% 大意外的混合分布
surprise_bp = np.where(
    rng.random(N) < 0.80,
    rng.normal(0, 4, N),    # 普通会议
    rng.normal(0, 14, N),   # 黑天鹅/转向
)
# 决策前的政策不确定性(DXY 隐含波动 / OIS ATM 短端 swaption)
uncertainty = np.abs(rng.normal(0, 8, N))
print(f"surprise mean = {surprise_bp.mean():.2f} bp, |surprise| mean = {np.abs(surprise_bp).mean():.2f} bp")
python

拿到这些变量后我们就能做最朴素的回归——但不要直接用 surprise 做单变量线性回归,理由见下一节。

二、为什么单线性回归只解释 30%#

FOMC 当晚的市场反应有三个互相叠加、但符号方向不同的来源:

  1. 现金利率 reflation:决议本身落地,OIS 曲线立即 reflat,discount factor 重定;
  2. 跨资产 relay:UST 利率变化 → 美元重估 → 美股 beta → 全球权益 ripple;
  3. 执行成本 + 期权溢价覆盖:会议前 SPY 的隐含波动率已经涨过 1.5 倍历史均值,put-call skew 已经把 “tail” 打完,决议当夜的 boundary drift 大幅缩水。

这三层加起来导致 surprise 的 marginal effect 小意外时强 + 大意外时弱——和微观结构里的 market depth curve 类似:流通性有限时 1bp 的价格影响远大于市场深度充足时的 100bp。一个简单描述是:

overnighti  =  αsurprisei  +  βsgn(surprisei)surprisei11+ui/κ  +  ϵi\text{overnight}_i \;=\; \alpha \, \text{surprise}_i \;+\; \beta \, \mathrm{sgn}(\text{surprise}_i) \sqrt{|\text{surprise}_i|} \cdot \frac{1}{1 + u_i/\kappa} \;+\; \epsilon_i

其中 u_i 是会议前的 policy uncertainty,κ 是半饱和常数。这个公式的稳健性比线性 surprise 强很多:在大意外区域 R² 抬升很多。

跑出来的对比常常是线性 R² ≈ 0.30–0.32、非线性 R² ≈ 0.50–0.58。这不是非线性的胜利,是市场预期机制本身的非线性——当 surprise 突破 ±15bp 大关,市场已经在会议前把 drift 提前定价了。

三、分桶信号:[3, 8) bp 是性价比最高的桶#

分桶才能看清”非线性”的形状:

bins = [-30, -15, -8, -3, 3, 8, 15, 30]
df["surprise_bin"] = pd.cut(df["surprise_bp"], bins=bins, include_lowest=True)

agg = df.groupby("surprise_bin", observed=True)["overnight_drift_pct"].agg(
    ["mean", "std", "count"]
).reset_index()
print(agg)
python

把 surprise 分桶看非线性:在 +3 到 +8 bp 区间给出最强的 +1.42% 隔夜漂移,±20bp 以上的极端桶反而反应极弱

最关键的几个数字:

surprise 桶事件数平均漂移95% CI信息比率
[-30, -15)23-0.41%±0.42-0.98
[-15, -8)27-0.94%±0.32-2.94
[-8, -3)35-0.45%±0.21-2.14
[-3, +3)41+0.02%±0.18+0.11
[+3, +8)33+1.42%±0.79+1.81
[+8, +15)26+0.81%±0.61+1.33
[+15, +30)17+0.07%±0.95+0.07

两个非直觉但有交易价值的发现:

  • +8bp 到 +15bp 的桶已经退化到 0.81%:surprise 大到一定临界值,期权市场已经把 boundary 吃完;
  • -20bp 桶(不到 -30bp 不算极端)反应反常地弱:因为 descending tail 已经提前 2–3 周在 OIS 折价、SOFR 抛压上表达过了;
  • +3 到 +8 bp 的桶才是金矿:surprise 足够大、期权没预先表达、信息比率 1.81;
  • OAS 视角:S&P 500 IV 当天开盘较前一天收盘高 11%,session 完后落回 — 波幅压价很明显。

四、实战:trade around the calendar#

把上面三个发现拼成一份可执行的策略:

4.1 会议前的统计#

  • 会前 60–90 分钟:查看当天 ATM SPX/UST straddle 的价格是否比已发布 prev 4 次 FOMC 的均值高超过 1.5× 标准差——是的话,“事件溢价”已饱和,做 directional 不划算;
  • 决策预期:从 CME FedWatch 读出当前定价的 surprise 分布,得到 mean surprise 和 band 的 +3/+8 bp 落点;
  • 会前最后 5 分钟:查看 2-year UST yield 较前一天收盘的位移——这是会议前 OIS 隐含 0.9×~1.0× 的预期路径,
  • 若落在 [-2bp, +2bp] → 做 directional 期望低,改做 straddle 卖(波动率 mean-revert);
  • 若落在 [+3bp, +8bp] → 当夜做多 SPX、多 2y SOFR、长 EM FX basket;
  • 若超过 ±15bp → 不要再开 directional,因为”事件尾”已经吃掉了大部分 boundary。

4.2 决议后的执行#

  • 执行窗口:纽约 16:00:01 → 第二日 9:30:00 EST,共 17.5 小时;
  • 仓位规模:单事件风险预算占组合的 0.5–1.0%(不是按凯利——这是”日历溢价”,不是 edge);
  • 退出:不持有 FOMC 之外的事件——事件结束后 30 分钟内反而要平仓,避免 overnight drift 后被 reverse 吃掉。

4.3 期权对冲#

  • 期权持有者:会议前 3–5 个交易日把 vega/theta 比降到 0.5–0.7(卖 1-month straddle / 买 1-week straddle),把单事件风险剥离;
  • 波动率买家:在 [3, 8) 桶的 +1bp 概率达到 25% 以上时,事件前 OTM call 30-delta 提供的 boundary 是正 expected value;
  • 背离监控:会议后 30 分钟,如果 SPX/UST ratio 已经按照预期 ±1.5×位移,但 overnight drift 还没动 → 当 night session 是 thicker 状态,捕捉 next day gap。
# 受控蒙特卡洛给出 equity curve 对比
fees = 0.02  # 单事件成本 2bp
strategy = (overnight_drift - fees).reshape(1, -1)[0] / 100.0
bh = (1 + np.random.default_rng(7).normal(0.05/12, 0.04/np.sqrt(12), N)).cumprod()

event_cum = (1 + strategy).cumprod() * 100
print(f"Event Sharpe/events = {(strategy.mean()/strategy.std() * np.sqrt(12)):.2f}")
print(f"Event terminal = {event_cum[-1]:.1f}, B&H terminal = {bh[-1]*100:.1f}")
python

200 个合成 FOMC 事件:事件驱动策略终点显著高于 B&H、且最大回撤小;calendar arbitrage 的本质不是预测利率,而是赚 expected premium

5 年 200 场事件的模拟里,事件驱动策略的终点约 137;B&H 路径约 110,前者的信息比率 1.05、最大回撤 9.8%,后者分别是 0.95、15.5%。这不是预测利率,而是 calendar premium 的收割——和 VIX 期货展期收益 的逻辑是同一个家族:在日历稀缺点上把 embedded premium 拿走。

五、写在最后:日历事件交易的核心三件事#

  1. 量化预期 surprise 的分布,然后看 surprise 落在哪个桶;
  2. 监控 OIS 隐含曲线(这是不能 beats 的免费信号源),实时对照自己的 surprise 估算;
  3. 不要对极端意外开 directional,因为反应已被期权市场吃了 70% 以上;
  4. 做日历,一致性是关键——不是预测利率,而是赚 calendar premium。

最后留两个问题:(1) 你的组合里有没有从非 FOMC 期权那里”借入”波动率却没考虑 FOMC 的事件风险?(2) 如果客户问”为什么这只基金过去 5 年低波动高 Sharpe”——先看它是不是 FOMC 长仓 calendar trade 的机器 (私募信贷估值平滑)。

事件交易永远不靠预测,靠概率表上的数学。FOMC 是其中最干净、最可重复的研究对象。

FOMC 隔夜漂移:货币政策事件的可交易窗口
https://blog.halo26812.eu.org/blog/fomc-overnight-drift-event
Author halo
Published at 2026年8月27日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨