Skip to main content
2026-05-22 · 4 min read · ← 1 · events · research · counterfactual

Drift vs reversal: the cleanest counterfactual for a post-event regime

what you'll learn · Why the sign of `drift − reversal` is the cleanest counterfactual for asking whether a post-event regime is continuation- or reversion-flavored, and what it doesn't tell you.

Running the drift strategy and its sign-flipped twin on the same data, in the same window, with the same lookback — that's not two strategies. It's a thermometer. The sign of `drift − reversal` is the answer to 'does this event lead to continuation or over-correction?'

The post-event-drift wrapper longs recent winners in the N-hour window after an event fires. The post-event-reversal wrapper does the opposite: shorts recent winners, longs recent losers, in the same N-hour window, on the same event table. The two strategies differ in one line — a sign flip on the bare panel weights.

That one-line difference makes them the cleanest counterfactual you can run on a single dataset. The sign of drift_sharpe − reversal_sharpe answers a single concrete question:

Inside the post-event window, does the panel signal’s prediction direction agree with the data, or does the data reverse it?

If drift > reversal, the regime is continuation-flavored — recent winners keep winning into the window. If reversal > drift, the regime is reversion-flavored — recent winners mean-revert. If the two are within stdev, the regime has no directional structure the panel signal can predict (the most common case on isotropic-shock synthetic data).

Why this beats other counterfactual shapes

The the-baseline-arm-you-forgot note named the 3-arm shape: baseline + gate + gate-inverse. That shape answers “does the gate move the PnL number?” Drift-vs-reversal is a different question: it’s about the regime inside the window, not the wrapper’s cost. Both shapes can be run on the same A/B harness; they’re orthogonal questions.

The 3-arm shape compares wrapped to unwrapped. Drift-vs-reversal compares two wrappings of the same signal. The drift wrapper makes a directional claim — “I expect the panel signal to predict the event-window return direction.” The reversal wrapper makes the opposite claim — “I expect the panel signal’s prediction to be inverted in the event window.” Both wrappers fail on the non-directional case (both lose, both flat); their delta is the load-bearing measurement.

What the synthetic isotropic-shock result tells you

Run examples/fomc_blackout_compare.py --n-seeds 5 --fomc-drift-bps 50 and you get:

drift:     -0.117  Δ -1.118  vs baseline
reversal:  +0.117  Δ -0.884  vs baseline

Drift and reversal are exact mirrors — drift − reversal = -0.234, the simulator has no directional preference. The bare panel signal captures the directional shock through its regular cadence; both event-window wrappers are below baseline because they only trade inside the window (sparse exposure to a signal the baseline already absorbs).

This is the correct answer on a simulator with no continuation/ reversion bias. The fomc_drift_bps parameter adds proportional-to- recent-momentum drift on FOMC days, which the panel signal catches — but neither narrow-window wrapper does, because the signal smears across the day and the wrappers only trade a slice.

What a real-data result would tell you

Replace the synthetic simulator with real S&P 500 daily bars, real FOMC release timestamps from the calendar adapter, and the same 4-hour drift window. The literature is split:

  • Continuation regimes: Lucca & Moench (2015) found systematic pre-FOMC drift. Cieslak, Morse, Vissing-Jorgensen (2019) characterised the post-FOMC return pattern.
  • Reversion regimes: Heston, Korajczyk, Sadka (2010) on intraday seasonality. Lou, Polk, Skouras (2019) on overnight-vs- intraday return decomposition.

The sign of drift − reversal on real data tells you which of those regimes your specific event-kind exhibits on your universe, with your lookback, in your window. It’s a measurement, not a citation.

Three things drift-vs-reversal does NOT tell you

  1. Whether the regime is statistically distinguishable from noise. Inside a single seed, drift − reversal ≠ 0 is the baseline-noise condition for any pair of sign-flipped strategies on a finite sample. The multi-seed dispersion view (--n-seeds N) tells you if the delta exceeds the per-arm stdev.

  2. Whether the regime is capturable at scale. A drift_sharpe = 1.0 on a 7-event sample is a hint, not a deployment signal. The dont-pay-for-caution-you-cant-justify discipline applies in both directions — does the regime clear the cost-of-capital bar after slippage, financing, and crowding effects?

  3. Whether the regime persists. A 5-seed window over the last 6 months can be the opposite of a 5-seed window from 3 years ago. The stale-thesis-policy ADR exists for this reason — a continuation regime found in 2019 isn’t a continuation regime in 2025 unless re-measured.

The harness

examples/fomc_blackout_compare.py ships the 7-arm A/B with drift and reversal as adjacent arms. The single-seed output already prints a drift − reversal line at the bottom with a (continuation|reversion)-flavored annotation; the multi-seed output extends the same comparison across seeds.

Two strategy classes, one sign-flip line of code apart, and a counterfactual measurement that the 3-arm shape can’t produce. The discipline rule the platform encodes: when shipping any wrapper that makes a directional claim about a window, also ship its sign-flip. The delta is the evidence.

deskgdfindgfstrategiesgsfeaturesgepromotionsgpapigabotgbwritinggw

Shortcuts are no-ops while typing in an input or textarea.