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.
By intervention family
-
Baseline
1 arm-
Baseline · long-short cross-sectional momentum sharpe 1.24XsMomentumLiveStrategy · pnl +67.2k1.24
-
-
Factor composition
4 arms-
Two-factor · momentum + z-score sharpe -0.14XsTwoFactorStrategy · pnl -8.2k-0.14
-
Four-factor · adds skew sharpe -0.23XsFourFactorStrategy · pnl -12.1k-0.23
-
Three-factor · momentum + z-score + vol sharpe -0.27XsThreeFactorStrategy · pnl -16.1k-0.27
-
Four-factor · tuned weights sharpe -0.53XsFourFactorStrategy · pnl -29.0k-0.53
-
-
Weighted variants
1 arm-
Vol-weighted momentum sharpe 0.58XsVolWeightedMomentumStrategy · pnl +30.1k0.58
-
-
Constrained variants
2 arms-
Long-only · top-quantile momentum sharpe 1.88XsLongOnlyMomentumStrategy · pnl +147.1k1.88
-
Equal-risk long-only sharpe 1.88EqualWeightLongStrategy · pnl +104.4k1.88
-
-
Time-series momentum
1 arm-
Time-series momentum · absolute-threshold sharpe 0.63TimeSeriesMomentumStrategy · pnl +33.4k0.63
-
-
Event gates
2 arms-
FOMC blackout · flatten 24h pre-event sharpe 1.13XsMomentumWithFomcBlackoutStrategy · pnl +59.8k1.13
-
Event damping · continuous risk-off near FOMC sharpe 1.11XsMomentumWithEventDampingStrategy · pnl +58.2k1.11
-
-
Event capture
2 arms-
Post-FOMC drift · capture 4h after release sharpe 0.64XsMomentumPostFomcDriftStrategy · pnl +7.4k0.64
-
Post-FOMC reversal · sign-flipped drift sharpe -0.64XsMomentumPostEventReversalStrategy · pnl -7.4k-0.64
-
-
Regime gates
2 arms-
Spread filter · gate on cross-sectional dispersion sharpe 1.24XsMomentumWithSpreadFilterStrategy · pnl +67.2k1.24
-
Spread filter · tuned threshold sharpe 0.83XsMomentumWithSpreadFilterStrategy · pnl +37.2k0.83
-
reproduce this comparison
$ uv run python scripts/build_compare_fixture.py
wrote examples/fomc_blackout_compare/results.json (15 arms)
The script holds the pinned config (seed = 7, days = 200, fomc_vol_multiplier = 3.0000, fomc_drift_bps = 50.0000) and rewrites results.json. Each arm's Sharpe / PnL / drawdown is a real backtest number — no fixture fudge-factor. Bumping a config value in the script is a deliberate rotation of these on-site numbers.