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 theXsMomentumLiveStrategybaseline.
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- leaderLong-only · top-quantile momentumXsLongOnlyMomentumStrategyΔsharpe +0.64 · Δpnl +79.9kdrill in →constrained · pnl +147.1k · max-dd -36.0k1.88
- Equal-risk long-onlyEqualWeightLongStrategyΔsharpe +0.64 · Δpnl +37.3kdrill in →constrained · pnl +104.4k · max-dd -25.5k1.88
- baselineBaseline · long-short cross-sectional momentumXsMomentumLiveStrategydrill in →baseline · pnl +67.2k · max-dd -33.1k1.24
- Spread filter · gate on cross-sectional dispersionXsMomentumWithSpreadFilterStrategyΔsharpe +0.00 · Δpnl +0.0kdrill in →regime-gate · pnl +67.2k · max-dd -33.1k1.24
- FOMC blackout · flatten 24h pre-eventXsMomentumWithFomcBlackoutStrategyΔsharpe -0.11 · Δpnl -7.4kdrill in →event-gate · pnl +59.8k · max-dd -33.1k1.13
- Event damping · continuous risk-off near FOMCXsMomentumWithEventDampingStrategyΔsharpe -0.14 · Δpnl -8.9kdrill in →event-gate · pnl +58.2k · max-dd -33.1k1.11
- Spread filter · tuned thresholdXsMomentumWithSpreadFilterStrategyΔsharpe -0.41 · Δpnl -30.0kdrill in →regime-gate · pnl +37.2k · max-dd -31.1k0.83
- Post-FOMC drift · capture 4h after releaseXsMomentumPostFomcDriftStrategyΔsharpe -0.60 · Δpnl -59.8kdrill in →event-capture · pnl +7.4k · max-dd -5.0k0.64
- Time-series momentum · absolute-thresholdTimeSeriesMomentumStrategyΔsharpe -0.61 · Δpnl -33.8kdrill in →time-series · pnl +33.4k · max-dd -53.0k0.63
- Vol-weighted momentumXsVolWeightedMomentumStrategyΔsharpe -0.67 · Δpnl -37.1kdrill in →weighted · pnl +30.1k · max-dd -29.3k0.58
- Two-factor · momentum + z-scoreXsTwoFactorStrategyΔsharpe -1.39 · Δpnl -75.4kdrill in →factor · pnl -8.2k · max-dd -66.9k-0.14
- Four-factor · adds skewXsFourFactorStrategyΔsharpe -1.47 · Δpnl -79.3kdrill in →factor · pnl -12.1k · max-dd -65.3k-0.23
- Three-factor · momentum + z-score + volXsThreeFactorStrategyΔsharpe -1.51 · Δpnl -83.3kdrill in →factor · pnl -16.1k · max-dd -64.8k-0.27
- Four-factor · tuned weightsXsFourFactorStrategyΔsharpe -1.77 · Δpnl -96.1kdrill in →factor · pnl -29.0k · max-dd -79.8k-0.53
- Post-FOMC reversal · sign-flipped driftXsMomentumPostEventReversalStrategyΔsharpe -1.88 · Δpnl -74.6kdrill 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 across5 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 leaderTime-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
- baselineBaseline · 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 seed7 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 momentumsharpe 1.24XsMomentumLiveStrategy · pnl +67.2k1.24
Factor composition
4 arms- Two-factor · momentum + z-scoresharpe -0.14XsTwoFactorStrategy · pnl -8.2k-0.14
- Four-factor · adds skewsharpe -0.23XsFourFactorStrategy · pnl -12.1k-0.23
- Three-factor · momentum + z-score + volsharpe -0.27XsThreeFactorStrategy · pnl -16.1k-0.27
- Four-factor · tuned weightssharpe -0.53XsFourFactorStrategy · pnl -29.0k-0.53
Weighted variants
1 arm- Vol-weighted momentumsharpe 0.58XsVolWeightedMomentumStrategy · pnl +30.1k0.58
Constrained variants
2 arms- Long-only · top-quantile momentumsharpe 1.88XsLongOnlyMomentumStrategy · pnl +147.1k1.88
- Equal-risk long-onlysharpe 1.88EqualWeightLongStrategy · pnl +104.4k1.88
Time-series momentum
1 arm- Time-series momentum · absolute-thresholdsharpe 0.63TimeSeriesMomentumStrategy · pnl +33.4k0.63
Event gates
2 arms- FOMC blackout · flatten 24h pre-eventsharpe 1.13XsMomentumWithFomcBlackoutStrategy · pnl +59.8k1.13
- Event damping · continuous risk-off near FOMCsharpe 1.11XsMomentumWithEventDampingStrategy · pnl +58.2k1.11
Event capture
2 arms- Post-FOMC drift · capture 4h after releasesharpe 0.64XsMomentumPostFomcDriftStrategy · pnl +7.4k0.64
- Post-FOMC reversal · sign-flipped driftsharpe -0.64XsMomentumPostEventReversalStrategy · pnl -7.4k-0.64
Regime gates
2 arms- Spread filter · gate on cross-sectional dispersionsharpe 1.24XsMomentumWithSpreadFilterStrategy · pnl +67.2k1.24
- Spread filter · tuned thresholdsharpe 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 rewritesresults.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.