Skip to content
All strategies

Strategies

Pre-FOMC Announcement Drift on SPY: Long Into Scheduled FOMC Statements, Flat Otherwise (USEQ 1-DAY, hard-coded 1994-2026 scheduled FOMC calendar, ~8 trades/yr, long-only, 2 tunables)

Outcome: Abandoned

PreFomcDriftSpyUseqDaily

Outcome Summary

PreFomcDriftSpyUseqDaily tested whether SPY's documented drift before scheduled FOMC statements could be traded on daily bars, holding for one session into each of about 8 events a year and staying flat otherwise. Over the full 1993-2026 history it cleared the cost floor (0.161% per trade over 262 trades, Sharpe 0.41, max drawdown 10.7%) with almost no market beta, and the backtest review sent it on to optimization. The same review found that nearly all of the edge came from before 2016: after 2015 the mean per-trade return was 0.051% with t=0.59, consistent with the attenuation reported in the literature. The analyst abandoned the strategy after one iteration, and it never reached risk review or paper trading.

Hypothesis

Event-driven calendar strategy on SPY.USEQ daily bars, built on the pre-FOMC announcement drift documented by Lucca & Moench (2015, Journal of Finance, 'The Pre-FOMC Announcement Drift'): from 1994 to 2011 the S&P 500 earned roughly 49 bp on average in the 24 hours before scheduled FOMC statements, which is a large share of the total equity premium over that period. The commonly cited explanation is resolution of macro uncertainty and dealer risk-bearing ahead of the announcement. The strategy holds SPY only……Show moreShow less

Event-driven calendar strategy on SPY.USEQ daily bars, built on the pre-FOMC announcement drift documented by Lucca & Moench (2015, Journal of Finance, 'The Pre-FOMC Announcement Drift'): from 1994 to 2011 the S&P 500 earned roughly 49 bp on average in the 24 hours before scheduled FOMC statements, which is a large share of the total equity premium over that period. The commonly cited explanation is resolution of macro uncertainty and dealer risk-bearing ahead of the announcement. The strategy holds SPY only around the 8 SCHEDULED FOMC statement days per year and is in cash otherwise, so it is exposed about 2-4% of sessions. The FOMC calendar is public, known-in-advance history. The developer hard-codes the scheduled statement dates (federalreserve.gov FOMC historical calendars, 1994 to present, plus the published 2026 schedule) as a constant list of dates in the strategy; for two-day meetings the statement date is the second day. Unscheduled or emergency actions (e.g. 2001-09-17, 2008-10-08, 2020-03-03, 2020-03-15) are EXCLUDED because they were not known in advance. No supplementary feed is needed (L189). Execution: USEQ is a session venue, so a decision taken on the close of daily bar N fills at the OPEN of session N+1 (supported next_open_fill). Market-on-close is unsupported, so the literature's exact 14:00-to-14:00 window cannot be replicated on daily bars; the contract instead holds from the open of the session before the statement day to either the open of the statement day or the open of the session after it. Each choice is a tunable. Novelty: the knowledge base has no FOMC/macro-event-calendar hypothesis (searched 'FOMC'), and this is not momentum, mean reversion or trend. The fact that it is flat ~97% of the time makes it uncorrelated with the deployed portfolio. SPY is used deliberately because the documented effect is on the S&P 500, and SPY has 30+ years of daily bars covering about 260 scheduled events. Fee arithmetic: USEQ round trip is about 0.03-0.05% (spread plus impact, zero commission). The literature drift is about 0.49% per event pre-2011 and is reported weaker since (Kurov, Wolfe & Gilbert 2021 find it attenuated after 2015). I expect our open-to-open window to capture 0.15-0.30% per event on average over the full sample, which is 3-6x the round-trip cost. Firing rate: 8 events/yr x ~32 years = ~260 trades; the sandbox's 20k-bar budget covers the whole daily history.

analyst_decision

Implementation

Long SPY.USEQ (daily bars) only around the 8 scheduled FOMC statement days per year (hard-coded 1994-2026 federalreserve.gov calendar, 264 events; unscheduled/emergency actions excluded), flat otherwise. A decision on daily bar N fills at the open of session N+1 (next_open_fill). Entry fills at the open of the session entry_sessions_before (1-3) trading days before the statement day. Exit fills at the open of the statement day (exit_mode=statement_open) or at the open of the session after it (post_statement_open). Events whose held sessions include a US half-day are skipped (skip_half_days). Size is whole shares = 0.95 x equity / price, unlevered.

Implements Lucca-Moench (2015) pre-FOMC drift with next-open execution because market-on-close is unsupported. The hold window is a pure function of the bar's session date, the platform exchange calendar (sessions.next/previous_trading_day, is_early_close; holidays are counted correctly, no weekday arithmetic) and an ex-ante-public date table, so it is identical across restarts, backtests and paper. Signal: +1 when the next session is inside a hold window. Otherwise it is -(calendar days to the next window's……Show moreShow less

Implements Lucca-Moench (2015) pre-FOMC drift with next-open execution because market-on-close is unsupported. The hold window is a pure function of the bar's session date, the platform exchange calendar (sessions.next/previous_trading_day, is_early_close; holidays are counted correctly, no weekday arithmetic) and an ex-ante-public date table, so it is identical across restarts, backtests and paper. Signal: +1 when the next session is inside a hold window. Otherwise it is -(calendar days to the next window's entry session)/60, floored at -1, so it varies continuously. should_enter BUY when signal>0; should_exit when signal<=0. Risk control is route (b): a calendar/time exit (holds 1-4 sessions) plus capped size of 95% of equity. 2020-03-18 is kept as a scheduled date because it was published in advance; the 2020-03-15 emergency action is not used. With the default k=1/statement_open, skip_half_days removes 1 event (1996-07-03 window). Expected about 263 trades over SPY's history. Tunables follow the plan exactly (entry_sessions_before int 1-3, exit_mode categorical); skip_half_days/position_fraction/include_unscheduled are fixed. Caveat: Kurov et al. report the drift weakened after 2015, so the recent-period edge may be thin against ~0.03-0.05% round-trip costs.

Verification Results

Remove (2020, 3, 18) from _SCHEDULED_FOMC, since there was no scheduled statement on that day, or document it as a deliberate ex-ante-calendar choice.

2020-03-18 is kept as a 'scheduled' statement date. The 17-18 March 2020 meeting was cancelled and replaced by the 2020-03-15 emergency action, so no statement was released on 2020-03-18. With k=1 the entry decision is taken at the close of 2020-03-16, when the cancellation was already public. A trader could therefore not have treated 03-18 as a pending statement day. This affects one event (or up to three held sessions in the most volatile week of the sample) and does not change the strategy's structure.

Before 2027, add the 2027 schedule the Fed has published, or log a warning when the calendar is exhausted.

When the hard-coded calendar is exhausted (after 2026-12-09), the strategy returns -1 and stays flat for good. Live or paper trading in 2027 would silently stop trading.

The sandbox covers about 6.5 years (2020-2026, 52 events) and shows avg_trade_return_pct of 0.094%. That is above the ~0.03-0.05% USEQ round-trip cost but below the 0.15-0.30% the hypothesis expects. Modelled impact is 20% of gross. This fits the post-2015 attenuation reported by Kurov et al. The full 1994-2026 backtest should be split pre-2011, 2011-2015 and post-2015. If the whole edge sits in the Lucca-Moench sample period, it is an in-sample replication with no live edge.

Backtest Review

Sharpe
0.41
Total return
47.71%
Max drawdown
10.74%
Trades
262
Win rate
60.3%
Profit factor
1.62

The mechanism is implemented as written. There are 262 long-only trades over 1994-2026 (about 8 per year, matching the scheduled calendar). Each is a one-session open-to-open hold into the statement day, with no shorts and exposure of 2.2%. The hard-coded calendar excludes the unscheduled actions.

Economics clear the USEQ floor on full history. avg_trade_return_pct is 0.161% against the 0.05% floor (prefer above 0.10%). PF is 1.62, win rate 0.60, and per-trade t is about 2.4. Max drawdown is 10.7% against the 20% contract limit. Accounting reconciles and nothing is left unrealized at the end.

Beta is 0.047 and correlation to buy-and-hold is 0.26, so the result is not beta. Alpha should be read against 2% exposure, not against buy-and-hold return.

Both tunables have mechanical reasons. entry_sessions_before (1-3) sets how far ahead of the event to enter. exit_mode (statement_open vs post_statement_open) decides whether the window includes the announcement day itself, the closest daily-bar proxy for the literature's 14:00-to-14:00 window. That makes 6 combinations in total, so the search budget is small.

QA's concern is partly borne out. Per-trade mean by era: 1994-2011 is 0.192% (n=144, t=1.74); 2012-2015 is 0.321% (n=32, t=4.36); 2016-2026 is 0.051% (n=86, t=0.59). After 2015 the edge sits at the USEQ floor and cannot be told apart from zero, consistent with the attenuation Kurov et al. report. Most of the full-history edge comes from before 2016.

The full-history design reserves the holdout from the end of the data, roughly the last 6.5 years where the edge is weakest. Expect a thin or inconclusive holdout. That is the honest test of whether the drift survives today.

The executed-signal IC diagnostic is 0.029 (t=1.34). It is weak, but the forecast is a calendar indicator and the per-trade t-stat is the more relevant measure.

Sharpe is 0.41 at 2% exposure. Max drawdown lasted about 2,293 days.

Outcome Summary

An edge from the published literature can look strong over the full history because of its pre-publication years, so test the per-trade return on recent data (here post-2015) before spending effort on a long-sample calendar anomaly.

The backtest review approved optimization, but the analyst then abandoned the run (abandon_reason: analyst_decision) after one iteration. The input has no optimization report and no written analyst rationale. The decisive weakness on record is that the edge faded after 2015 to an estimate that cannot be told apart from zero, and that recent period is exactly the data the end-of-sample holdout would test.

Capture the Lucca & Moench pre-FOMC announcement drift: hold SPY (USEQ, daily bars, long-only) open-to-open only into the scheduled FOMC statement days in a hard-coded 1994-2026 calendar that leaves out unscheduled actions, and stay in cash the rest of the time.

Over 1993-2026 the initial backtest made 262 long trades with 2.2% exposure. It returned 47.7% in total with Sharpe 0.41, avg_trade_return_pct 0.161%, profit factor 1.62, win rate 60%, max drawdown 10.7% and beta 0.047. By the backtest reviewer's era split, the post-2015 per-trade mean was only 0.051% (t=0.59), against 0.192% for 1994-2011 and 0.321% for 2012-2015.

Backtest and paper results are hypothetical. Trading involves risk of loss.