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
-
Whether the regime is statistically distinguishable from noise. Inside a single seed,
drift − reversal ≠ 0is 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. -
Whether the regime is capturable at scale. A
drift_sharpe = 1.0on a 7-event sample is a hint, not a deployment signal. Thedont-pay-for-caution-you-cant-justifydiscipline applies in both directions — does the regime clear the cost-of-capital bar after slippage, financing, and crowding effects? -
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-policyADR 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.