# IDMOM02 — market intraday momentum on US100 / NQ, last half hour (PREREG)

**Frozen:** 2026-10-10, before any run. **Author:** Claude. **Trial:** +1 (one hypothesis, zero free parameters).
[withheld: a line that refers to the lab's private live strategy]

## Why this, and why it is not a silent reopen
- Mechanism (Baltussen, Da, Lammers, Martens 2021, JFE "Hedging demand and market intraday momentum"; Gao, Han, Li, Zhou 2018):
  option dealers who are short gamma and leveraged ETFs must trade in the direction of the day's move before the close.
  The return from the previous close to 15:30 ET predicts the return of the last 30 minutes with the same sign.
[withheld: a line that refers to the lab's private live strategy]
- **Prior lab tests of the family (disclosed):** P28 (Gao first-half-hour spec, SPY/QQQ ETF M1 2015–2026, open-to-10:00 signal, t −1.2 to −2.4),
  P32 (15:45–16:00 SPY/QQQ), P73 (14:00–15:30 NQ/ES, 2 + 2 years), MOCTRN01 (15:00–15:55, 2 years, t +1.13).
  None used the rest-of-day signal, none ran on NQ with the audited true clock, none had more than 11 years.
  This test is admitted under the "new data" clause: NAS100 CFD on the true clock 2005–2026, LSE `NQ.F` 2016–2026 (downloaded today),
  Databento 1s NQ/ES 2013–2018. Because the family already failed once, a FLAG is the best outcome short of t >= 3.43, and the sign may not be flipped after the fact.

## Rule (one, frozen)
- Day d is used only if its regular session has >= 360 one-minute bars in 09:30–15:59 ET and the 15:29, 15:30 and 15:59 bars exist.
- `prev_close` = close of the last regular-session bar of the previous trading day (in the data).
- `signal = sign(close of the 15:29 bar / prev_close − 1)`. Zero -> no trade.
- Entry: open of the 15:30 bar (first price after the signal is known). Exit: close of the 15:59 bar (16:00:00 ET).
[withheld: a line that refers to the lab's private live strategy]
  If the stop price trades inside 15:30–15:59, the trade is booked at −1R. No take-profit. One trade per day.
- Deployment note: exit at 16:00 breaks the project's own "flat 15:45 ET" invariant (it is before the 17:00 ET swap and inside Topstep's 16:10 ET limit). A pass would need Kaloyan's explicit approval of that change. Report-only variant: exit at the close of the 15:44 bar.

## Data and clock
1. PRIMARY: `nas100usd_m1.parquet`, America/Chicago stamps, end-of-minute -> index − 1 min (`shifted(cfd, −1)`), 2005–2026-08. Phases −3..+3 report-only.
2. REPLICATION A: LSE `NQ.F` M1 2016-06 -> 2026-10 (minute-start UTC; verified today against L1-built CME bars).
3. REPLICATION B: Databento 1s NQ 2013–2018 -> M1 (front contract by daily volume; previous close taken from the same contract).
4. REPORT-ONLY: Databento 1s ES 2013–2018 (mechanism check: the hedging flow is largest in S&P).

## Cost
CFD model of the lab: 1.70 pt round trip at the reference price, scaled by price level. 2x = double.
Futures model: (0.50 pt spread + 0.225 pt commission) scaled the same way. Report-only: real bid/ask of the file from 2012-03.

## Gates (verdict on dataset 1, CFD cost)
- K0: n >= 2,000.
- K1: net 1x t >= 3.43 -> CANDIDATE; 2.0 <= t < 3.43 -> FLAG (forward paper only); t < 2.0 -> KILL.
- K2: 2005–2015 and 2016–2026 both net t >= 1.0, and the post-publication window 2019–2026 net t >= 1.0.
- K3: 2x cost t >= 1.0.
- K4: placebo. Yesterday's signal applied today: |t| < 2. Random signs (10,000 draws, same days): p < 0.01. Always-long is reported so drift is visible.
[withheld: a line that refers to the lab's private live strategy]
- K6 (independent data): replication A net (futures cost) has the same sign with t >= 1.0, and daily R correlates >= 0.90 with dataset 1 on common days.
- Smell test: t > 5 is treated as a bug until the lag and join checks pass.
- FAIL ANYWHERE = FAIL.

## Power
One trade per day: ~5,300 trades on dataset 1. An edge of +0.03R at SD 0.8R gives t ~ 2.7; +0.04R gives t ~ 3.6.
