From b9828e5e06e9d0cfc5370e695b7866605ab1a257 Mon Sep 17 00:00:00 2001 From: momentum dev Date: Sat, 18 Jul 2026 09:26:50 -0500 Subject: [PATCH] =?UTF-8?q?plans(017)=20Phase=200:=20GO=20=E2=80=94=20ask-?= =?UTF-8?q?overhang-above-break=20separates=20winners=20AUC=200.80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First genuine selection signal in the project. 40 real fires, Databento XNAS.ITCH book at each trigger: naive imbalance = noise (AUC 0.45/0.50), but ask-size resting within 1% ABOVE the break separates winners at AUC 0.80 (winner median 0.276 vs loser 0.005; median split 27% vs 67% win). Inverted from supply-trap intuition = absorption/fuel mechanism, invisible in OHLCV. n=23 single-day sniff -> GO to Phase 1 recorder, not to trading. Cost: pennies. Co-Authored-By: Claude Fable 5 --- plans/017-l2-depth-recorder.md | 18 ++++++++++++++++++ plans/README.md | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/plans/017-l2-depth-recorder.md b/plans/017-l2-depth-recorder.md index 781e3f2..30b8c1c 100644 --- a/plans/017-l2-depth-recorder.md +++ b/plans/017-l2-depth-recorder.md @@ -133,6 +133,24 @@ trials and free tiers only. write the negative result in `plans/README.md`, recommend the human-selector fork instead. This is a legitimate, cheap, correct place to end.** +> **PHASE 0 RESULT — 2026-07-18 — GO. First genuine signal in the project.** +> Ran the sniff on 40 real v1 fires ($2-20, 07-17), pulled the actual Databento +> XNAS.ITCH order book at each trigger (23/40 covered; 17 missing = NYSE names +> needing DBEQ.BASIC — a Phase-1 coverage fix). Total spend: pennies. +> - Naive book imbalance (full + near-touch): **NOISE** (AUC 0.45 / 0.50) — the +> obvious "bid-heavy = good" idea is dead, as it was in bar data. +> - **Ask-overhang above the break: AUC 0.80.** Winners' median resting ask-size +> within 1% above the break = 0.276 vs losers' 0.005 (~50x). Median split: +> low-overhang fires won 27%, high-overhang 67% (+40pts, robust to outliers). +> - Direction is INVERTED from the supply-trap intuition: a thick ask wall above +> the break predicts WINNING — the absorption/fuel mechanism (a break that +> clears visible resting supply ignites; a break into thin air fizzles). This +> is invisible in OHLCV — the first feature that needed the order book to see. +> CAVEATS: n=23, single day (regime confound); must rule out price/liquidity +> proxying at Phase 3 (stratify by price/rvol); a sniff, NOT a verdict. GO to +> Phase 1 (build recorder), NOT to trading. The lead feature to record and test: +> `ask_overhang = Σ ask_sz at px in (break, break*1.01] / Σ bid_sz`. + ### Phase 1 — Build the recorder against the free/trial feed, log-only ($0 or trial credit) If Phase 0 passed the sniff test, build the pipe — still on free/trial data diff --git a/plans/README.md b/plans/README.md index a150d4b..1339884 100644 --- a/plans/README.md +++ b/plans/README.md @@ -33,7 +33,7 @@ your row when done. | 014 | Live decision trace — gate-receipt feed (value→threshold per gate) + chart reject markers | P2 | M | 013 (chart overlay half; feed panel standalone) | **DONE (2026-07-17, review-APPROVED first pass, zero revisions; commit dd81dbb on `worktree-agent-acb00535650deac1a` — awaiting owner merge). Decision Trace panel (lazy-load + SSE-throttled), /api/decisions (clamped 500, case-insensitive, server-side epoch), collapsed reject markers merged into the chart's single markers primitive.** | | 015 | Backtest replay dashboard (/backtest) — theoretical entries/exits over past sessions under CURRENT settings, via Experiment-OS replay | P2 | L | 013 (chart component) | **DONE (2026-07-17, review-APPROVED first pass; commit 8ac222a on `worktree-agent-ae4d3f36e18c6e7a5` — awaiting owner merge). replay_window = assembly-only over harness primitives (same _entry_index/adverse-fill/R math); /api/backtest 45-session clamp + 10-min cache behind a dedicated lock; /backtest page with THEORETICAL banner + X-of-Y coverage line + per-trade drill-in (blue entry/purple exit markers). Deviations accepted: /api/chart gained backward-compatible date= anchor (72h cap couldn't reach old sessions); batching idiom taken from regime.py (plan's run() pointer was wrong).** | | 016 | EDGAR dilution enrichment — unbreak silent nightly refresh (UTC current_date bug + missing float_cache DDL) + pre-register dilution_veto_v1 keep-or-zero experiment | P2 | M | 006 | **DONE (2026-07-17, review-APPROVED first pass; f6999c7 merged). iv_dilution_gate keep-or-zero (fail-open on unfetched symbols, early results biased toward zero never inflated), dilution_veto_v1 self-registers via the experiments/*.json glob, nightly adjudication live. Prod backfill seeded same day (304 symbols swept, 245 filings / 91 symbols). FIRST ADJUDICATION 2026-07-17: **FAIL** (n=2044, expR_delta +0.0012 vs +0.05 bar) — but only 64/2069 fires (3%) had filing coverage (backfill covers recent actives only; historical fires read unflagged by fail-open design), AND the flagged fires ran BETTER than unflagged (baseline −0.038 vs −0.377, n=64): early evidence points AGAINST the dilution-trap thesis, not merely underpowered. Bar-design lesson: min_n counted ALL fires not flagged ones. Verdict terminal (no goalpost-moving); filings keep accruing nightly. IF revisited: dilution_veto_v2 with a flagged-fire min_n metric, after ~3-4 weeks coverage.** | -| 017 | L2 order-book depth recorder — the one untested selection axis; FREE-first (Phase 0-1 = $0 sniff test + recorder), paid feed only after the data earns it, pre-registered verdict before any live use | P1 | L | 006 | TODO (owner-approved to plan, no spend yet) | +| 017 | L2 order-book depth recorder **[Phase 0 DONE 2026-07-18: GO — ask-overhang-above-break AUC 0.80 on 23 fires, first real signal; needs recorder+n>=300 to confirm]** — the one untested selection axis; FREE-first (Phase 0-1 = $0 sniff test + recorder), paid feed only after the data earns it, pre-registered verdict before any live use | P1 | L | 006 | TODO (owner-approved to plan, no spend yet) | Status values: TODO | IN PROGRESS | DONE | BLOCKED (with one-line reason) | REJECTED (with one-line rationale)