# The pre-FOMC announcement drift on SPY, daily closes - specification (RIP Backtest protocol v1.0 plus the 8 Oct 2026 rules and the 4 Nov 2026 calendar-control rule)

Specification written and **frozen 2026-11-04 (approved by the owner the same day: "Da, rulează"; draft 1 unchanged)**. No FOMC-day trade, return or equity curve of this test has been computed. Looked at before writing it: the list of scheduled FOMC announcement days (below), which uses no price.

## Why this test, and where the rule comes from
- **Chosen by the owner** on 2026-11-04 ("hai sa-l facem") after the turn-of-the-month and pre-holiday tests, from the proposals of that day.
- **The effect.** David Lucca and Emanuel Moench ("The Pre-FOMC Announcement Drift", Journal of Finance, 2015) found that from 1994 to 2011 the S&P 500 rose on average by about half a percent in the 24 hours before scheduled FOMC announcements, a large share of the equity premium of those years, while the announcements themselves moved it little on average. Later work reported the drift much weaker after 2015 (for example Kurov, Wolfe and Gilbert, "The disappearing pre-FOMC announcement drift", Finance Research Letters, 2021).
- **Why it could work:** investors demand a premium to hold stocks into an uncertain policy event, or buy ahead of an expected supportive Fed; the papers do not settle why.
- **Why it might not (written before the run):** the effect is well known since 2011-2015; our daily closes also include the reaction after the 2:00/2:15 p.m. announcement, which adds noise to a one-day hold; a one-day trade pays a full cost.
- **Looked at before on the site:** the same SPY file in four tests (SMA 200, Accumulation/Distribution, turn of the month, pre-holiday), so the holdout below is already used. This is the first test under the 4 Nov 2026 rule that a calendar rule's control matches the weekday as well as the month.

## Instrument and data
- **SPY**, daily bars 1993-01-29 to 2026-10-20 with 136 dividends, the files of the SMA 200 test (hashes: spy_daily.csv 8de2b35662134fe5, spy_dividends.csv f6a7857257bbd23c, dtb3_fred_raw.csv 0ba63bf126e01aa6). Total return: each dividend reinvested at its ex-date close.
- **Scheduled FOMC announcement days:** `data_fomc/fomc_scheduled.csv`, built by `pf_dates.js` from the Federal Reserve's calendar pages saved on 4 Nov 2026 (fomchistorical1994.htm .. fomchistorical2020.htm and fomccalendars.htm). A scheduled meeting is a "Meeting" entry not marked unscheduled, cancelled or a notation vote; conference calls are not meetings; the announcement day is the meeting's last day. Eight a year from 1994 to 2026 except 2020 (seven: the March meeting was cancelled and replaced by unscheduled ones). One hand correction, logged in `pf_dates.js`: the 2003 page lists a "September 15 Meeting" beside that meeting's agenda, but the statement came on 16 September 2003. The first announcement is 4 February 1994, the first meeting after which the Committee announced its decision the same day. Weekdays: 176 Wednesdays, 85 Tuesdays, 9 Thursdays, 1 Friday (1994-2027).

## Rule (one variant, fixed now)
- **PF:** buy at the **close of the trading day before** each scheduled announcement day and sell at the **close of the announcement day**. Fills at the close; the dates are published in advance. Long only, one day, no stop.
- A day that is not in the file, or whose previous trading day is not, is not traded (none is expected).
- Growth of a trade bought at the close of day j and sold at the close of day k = j+1: (close[k] + dividend[k]) / close[j].

## Costs
- **0.04% of the price per round trip**, as in the other SPY tests; 0.10% shown as a scenario. The verdict is that of 0.04%.

## Results, periods, gates, control
- **Unit:** net % per trade.
- **Periods (by entry date):** development 1993 .. 2005; validation 2006 .. 2015; holdout 2016 .. 2026-10-20 (**already used** by four earlier SPY tests).
- **Six gates:** validation profit factor >= 1.2; at least 50 trades in each period; development **t >= 2.0** (one variant of a strategy not tested before on the site); above the 95th percentile of 500 runs of the matched control; positive without the 10 best trades; holdout net positive (flagged used). Fewer than 30 trades: Inconclusive.
- **Matched control (the 4 Nov 2026 calendar rule):** for each real trade, a one-day hold whose held day is drawn at random, uniformly, from the trading days of the **same calendar month and the same weekday** as the real announcement day, **excluding every scheduled announcement day**, bought at the close of the trading day before it; same costs. 500 runs, seeds 1000 + run. If a month has no such day the real trade's draw falls back to any non-announcement trading day of the same weekday in the same quarter (logged, not expected). Statistic: average net % per trade.

## Also reported (descriptive, after the gates; nothing here can change the rule or the verdict)
- Each trade split into its overnight part (previous close to the announcement day's open, dividend included) and its day part (open to close), before costs.
- Neighbouring holds: the day before the announcement day (close of day -2 to close of day -1), two days (close of day -2 to close of the announcement day), and the day after (close of the announcement day to the next close).
- All other days of the file; the whole strategy with T-bill interest while out against buy-and-hold; year by year; by period; without the 10 and the 20 best trades; win rate with its Wilson interval; by weekday of the announcement.

## Engine and self-test (before the run)
New engine `pf_lib.js`, an independent re-implementation `pf_ref.js`, and `pf_selftest.js`, which must pass before any result is printed: the date list (eight a year, 2020 at seven, the 2003 correction, cross-month meetings), hand-built days (a dividend on the announcement day, a Tuesday and a Thursday announcement, the ends of the file), the control's draws (same month and weekday, never an announcement day, the fallback), the engine equal to the reference trade by trade on the real data, and a control run whose draws are the real days reproducing the real trades. `pf_run.js` refuses to run unless the self-test passed on the current code and this file is frozen.

## Before the article
Results go to the owner first (in Romanian), with every gate. One article, only with the owner's agreement.

## Reading the result
"Buried" or "Inconclusive" mean a statistically convincing edge per trade was not demonstrated; neither is proof that none exists. A "Survivor" passed our six gates on one ETF with a holdout already used; it is not a promise. One ETF, one data source, the published rule only.

## Log
- 2026-11-04: draft 1 written. Nothing computed.
- 2026-11-04: frozen (draft 1 unchanged), approved by the owner. SHA-256 of the frozen text (before this log grew): 37731098bcd88baea51165f8cd0f6dd46967748a174292ef57d3b5f4875009df.
- 2026-11-04, before any result: pf_selftest.js passed (the announcement list, hand-built days, the control's pools and draws, engine = reference on the real data, control with the real days drawn). Counts only: 261 trades (development 96, validation 80, holdout 85); announcements on Tuesday 85, Wednesday 166, Thursday 9, Friday 1; no control fallback needed.
- 2026-11-04, the run (`node pf_run.js`, once, outputs in `pf_out/`): **PF Buried, 4 of 6** (fails development t 1.59 and the holdout -0.82% PF 0.98; passes validation PF 2.61, the trade counts, the control at the 99.8th percentile and without the 10 best +18.46%). No control fallback was needed. The neighbouring holds were looked at only after the gates, as written above: the two-day hold passed 6 of 6 there, which is a post-hoc reading and **not** a pass. Nothing was rerun or changed.
- 2026-11-06: the owner asked for the article ("poti sa il faci", after "Mâine" on 4 Nov). Published from the outputs of the single run, unchanged.
