Does the event gate earn its cost?
15 cross-sectional momentum variants run against the same synthetic universe, same FOMC vol shocks, same 200-bar window. Every arm consumes the identical price stream — the only difference is the rule the strategy applies. Bars below sort Sharpe-descending; deltas anchor to the XsMomentumLiveStrategy baseline.
Synthetic data — no claim of an edge that transfers to real markets. The point is to show every arm under the same conditions so an operator can read the *relative* shape, not the absolute number.
All arms · Sharpe on one axis
sorted high → low-
leader Long-only · top-quantile momentum XsLongOnlyMomentumStrategyΔsharpe +0.64 · Δpnl +79.9k drill in →constrained · pnl +147.1k · max-dd -36.0k1.88
-
Equal-risk long-only EqualWeightLongStrategyΔsharpe +0.64 · Δpnl +37.3k drill in →constrained · pnl +104.4k · max-dd -25.5k1.88
-
baseline Baseline · long-short cross-sectional momentum XsMomentumLiveStrategydrill in →baseline · pnl +67.2k · max-dd -33.1k1.24
-
Spread filter · gate on cross-sectional dispersion XsMomentumWithSpreadFilterStrategyΔsharpe +0.00 · Δpnl +0.0k drill in →regime-gate · pnl +67.2k · max-dd -33.1k1.24
-
FOMC blackout · flatten 24h pre-event XsMomentumWithFomcBlackoutStrategyΔsharpe -0.11 · Δpnl -7.4k drill in →event-gate · pnl +59.8k · max-dd -33.1k1.13
-
Event damping · continuous risk-off near FOMC XsMomentumWithEventDampingStrategyΔsharpe -0.14 · Δpnl -8.9k drill in →event-gate · pnl +58.2k · max-dd -33.1k1.11
-
Spread filter · tuned threshold XsMomentumWithSpreadFilterStrategyΔsharpe -0.41 · Δpnl -30.0k drill in →regime-gate · pnl +37.2k · max-dd -31.1k0.83
-
Post-FOMC drift · capture 4h after release XsMomentumPostFomcDriftStrategyΔsharpe -0.60 · Δpnl -59.8k drill in →event-capture · pnl +7.4k · max-dd -5.0k0.64
-
Time-series momentum · absolute-threshold TimeSeriesMomentumStrategyΔsharpe -0.61 · Δpnl -33.8k drill in →time-series · pnl +33.4k · max-dd -53.0k0.63
-
Vol-weighted momentum XsVolWeightedMomentumStrategyΔsharpe -0.67 · Δpnl -37.1k drill in →weighted · pnl +30.1k · max-dd -29.3k0.58
-
Two-factor · momentum + z-score XsTwoFactorStrategyΔsharpe -1.39 · Δpnl -75.4k drill in →factor · pnl -8.2k · max-dd -66.9k-0.14
-
Four-factor · adds skew XsFourFactorStrategyΔsharpe -1.47 · Δpnl -79.3k drill in →factor · pnl -12.1k · max-dd -65.3k-0.23
-
Three-factor · momentum + z-score + vol XsThreeFactorStrategyΔsharpe -1.51 · Δpnl -83.3k drill in →factor · pnl -16.1k · max-dd -64.8k-0.27
-
Four-factor · tuned weights XsFourFactorStrategyΔsharpe -1.77 · Δpnl -96.1k drill in →factor · pnl -29.0k · max-dd -79.8k-0.53
-
Post-FOMC reversal · sign-flipped drift XsMomentumPostEventReversalStrategyΔsharpe -1.88 · Δpnl -74.6k drill in →event-capture · pnl -7.4k · max-dd -11.7k-0.64
Sharpe domain -1.00 → 2.00. Pnl values in synthetic dollars (the universe starts at $100 base). Max drawdown is peak-to-trough over the 200-bar window.
Across 5 seeds · mean ± stdev
seeds 7..11The single-seed leaderboard above can be a fluke. This table re-runs the same 15 arms across 5 consecutive seeds and sorts by *mean* Sharpe — what's consistent across the sweep, not what happened to lead on one seed. The bar shows the mean; the numbers beside it show the 5-seed stdev and min/max range.
-
mean leader Time-series momentum · absolute-thresholdstdev 0.78 · range 0.63 → 2.14time-series · mean 1.27 · +0.27 vs baseline1.27
-
Vol-weighted momentumstdev 0.74 · range 0.26 → 2.15weighted · mean 1.05 · +0.05 vs baseline1.05
-
FOMC blackout · flatten 24h pre-eventstdev 0.48 · range 0.36 → 1.61event-gate · mean 1.03 · +0.03 vs baseline1.03
-
Spread filter · tuned thresholdstdev 1.00 · range -0.26 → 2.10regime-gate · mean 1.02 · +0.02 vs baseline1.02
-
Event damping · continuous risk-off near FOMCstdev 0.49 · range 0.34 → 1.62event-gate · mean 1.01 · +0.01 vs baseline1.01
-
baseline Baseline · long-short cross-sectional momentumstdev 0.58 · range 0.17 → 1.66baseline · mean 1.00 · +0.00 vs baseline1.00
-
Spread filter · gate on cross-sectional dispersionstdev 0.58 · range 0.17 → 1.66regime-gate · mean 1.00 · +0.00 vs baseline1.00
-
Long-only · top-quantile momentumstdev 1.49 · range -0.93 → 2.45constrained · mean 0.81 · -0.20 vs baseline0.81
-
Equal-risk long-onlystdev 1.49 · range -0.93 → 2.45constrained · mean 0.81 · -0.20 vs baseline0.81
-
Post-FOMC reversal · sign-flipped driftstdev 0.77 · range -0.64 → 1.14event-capture · mean 0.12 · -0.88 vs baseline0.12
-
Four-factor · adds skewstdev 1.03 · range -1.29 → 1.51factor · mean -0.05 · -1.06 vs baseline-0.05
-
Post-FOMC drift · capture 4h after releasestdev 0.77 · range -1.14 → 0.64event-capture · mean -0.12 · -1.12 vs baseline-0.12
-
Three-factor · momentum + z-score + volstdev 0.57 · range -0.88 → 0.39factor · mean -0.22 · -1.22 vs baseline-0.22
-
Two-factor · momentum + z-scorestdev 0.68 · range -1.14 → 0.37factor · mean -0.28 · -1.28 vs baseline-0.28
-
Four-factor · tuned weightsstdev 0.39 · range -0.59 → 0.35factor · mean -0.29 · -1.29 vs baseline-0.29
What this reading changes: an arm that led on seed 7 but has stdev >1.0 across the sweep is high-variance, not actually better — the wide min/max range tells you which seed got which luck. An arm near the top with stdev under 0.58 (baseline's noise floor on this sweep) is the consistent leader.
regenerate this snapshot
$ uv run python scripts/build_compare_fixture.py
wrote examples/fomc_blackout_compare/results.json (15 arms)
These results are a committed synthetic comparison snapshot. The script uses the pinned config (seed = 7, days = 200, fomc_vol_multiplier = 3.0000, fomc_drift_bps = 50.0000) and rewrites both result files. Changes to the harness or config can change the regenerated numbers; review the diff before updating this snapshot. For other seeds or configurations, run examples/fomc_blackout_compare.py --help.