# Pre-FOMC overnight drift — forward shadow-grading spec **Frozen 2026-08-26, before any forward observation exists.** Desk rule: forward-only track records are never silently rewritten. Origin study: `2026-08-25-fundamentals-results.md` (secondary finding). Grader: `fp-backtest/prefomc_shadow.py`. Track record: `prefomc-shadow-track.jsonl`. Automation: `com.fpstudies.prefomc` (Sundays 12:30 local). --- ## The rule under test > On each **US FOMC decision day D**, go long 1 NQ at the **18:00 ET bar open of the prior trading > day**, exit at the **09:30 ET RTH open on D**. ~15.5-hour hold, one continuous Globex session, > no stop. Cost **1.0 index point** round trip (desk `COST_PTS`, MBP-10 fill audit 2026-07-26). Graded each run: gross bps, net bps, net points, and — the honest number — **excess over the contemporaneous non-FOMC overnight baseline**, since the desk already knows overnight NQ carries a positive drift (+4.15 bps here; the Close Read study independently measured +4.28 bps, t = 3.32). ## Seed — historical evidence as of 2026-08-26 n = **85** FOMC observations, 2016-01-27 → 2026-07-29: | | value | |---|---| | mean net | **+24.34 bps** | | t | **+3.45** | | hit rate | **67.1 %** | | median net | +13.63 bps | | non-FOMC overnight baseline | +4.15 bps | | **excess over baseline** | **+21.2 bps** | Robustness (gross, from the origin study, recomputed on the corrected calendar): 2016–2019 +10.16 (t = 2.12) · 2020–2026 +34.57 (t = 3.21) · **ex-2020 +21.34 (t = 2.90)** · **dropping the single largest observation (+380 bps, 2022-01-26) raises t to 3.71.** Present in both eras, median positive, not outlier-driven. The 67.1 % hit rate over 85 trials has binomial p ≈ 0.001, so this is not a pure-tail effect — which is what separates it from the Close Read survivor (51.5 % hit, tail-driven). **Calendar correction applied 2026-08-26.** The origin study reported n = 82. Two data bugs were found and fixed while building this grader: (1) `econ-calendar-2026.json` was missing January–April entirely because FMP's endpoint **silently truncates a long window** — the file looked healthy at 7,114 rows but began in May; backfilled by monthly chunks to 19,169 rows, recovering FOMC dates 2026-01-28, 03-18, 04-29; (2) FMP renamed the event from `Fed Interest Rate Decision` to `Interest Rate Decision` mid-2026, and the country column must be filtered to US or UK/EU/JP decisions are swept in (which inflated a draft run to n = 176). The grader matches both names and filters US. `fp_data_sync.mjs` now pulls the calendar in monthly chunks (backup `.bak-20260826`). ## Phases - **`historical`** — observation date ≤ **2026-08-25** (the origin study's freeze date). These 85 rows are the prior. They can never promote the rule. - **`forward`** — after that date. Currently **0**. The next scheduled FOMC meeting will be the first genuine out-of-sample test. ## Promotion bar (frozen 2026-08-26) All four required: 1. **forward n ≥ 8** — one full FOMC year, so ~2027-08 at the earliest; 2. **forward mean net > 0 and forward hit rate ≥ 55 %**; 3. **pooled t (historical + forward) still > 3.0**; 4. **forward excess over the contemporaneous non-FOMC baseline > 0**. Failing any of these once n ≥ 8 ⇒ the rule is **refuted forward** and dropped. Meeting all four ⇒ review for sizing; it is still not automatic. **Why the bar is slow:** FOMC meets 8×/year, so this accrues ~8 observations a year and cannot be rushed. That is a feature — the alternative is sizing a t = 3.45 result that sits inside a cumulative family of ~544 pre-counted cells, where the expected maximum |t| under the pure null is ≈ 3.3. The historical edge clears that frontier, but only just. ## Known risks, stated before forward data exists - **Overnight gap risk with no stop.** The worst historical observation is −84.75 points (2026-03-18). A stop would change the distribution and is deliberately *not* modelled — adding one is a different rule needing its own study. - **Overnight margin** is required; this is not a day trade and does not fit a PDT-style account the way the desk's intraday work does. - **Regime dependence.** The effect is roughly 3× larger post-2020 (+34.6 vs +10.2 bps). If the driver is policy uncertainty, a quiet Fed should shrink it toward the baseline — a fall in the forward series is therefore expected behaviour, not necessarily refutation. Criterion 4 (excess over the contemporaneous baseline) exists precisely to absorb that. - **This contradicts published work.** Kurov–Wolfe–Gilbert report the pre-FOMC drift *disappearing* after 2015. This series says it has not, on NQ, in this window. Treat the disagreement as a reason for caution, not as a claim of having overturned them — their window is SPX and the 24 hours before the 14:00 print, whereas this is the overnight leg only. - **Shadow only.** Never sized, never fed into the Desk Read synthesis context, and not to be referenced as an edge in any brief until the bar above is met. ## Operating it ```sh # refresh + print the track record (idempotent, safe any time) "/venv/bin/python" \ "/prefomc_shadow.py" # machine-readable … prefomc_shadow.py --json # scheduled weekly (Sundays 12:30 local); log at /Library/Logs/prefomc-shadow.log launchctl kickstart -k gui/501/com.fpstudies.prefomc # run now launchctl bootout gui/501/com.fpstudies.prefomc # stop tracking ``` The grader is **idempotent** — it recomputes every observation from the fp-data archive and rewrites the JSONL, so a re-run can never double-count. It depends on the weekly `com.fpdata.sync` for fresh bars, so a new FOMC observation lands within ~a week of the meeting. Nothing is time-critical: no decision depends on this file.