docs: lock execution-recovery decisions and ops constraints

Record monotone fill-timing gradient, live [1.57,1.77] bracket, recover-flag
interpretation, gap-cap as third tail-trim, and pre-scheduler ops checklist.
This commit is contained in:
2026-07-18 17:07:22 +02:00
parent 99860dbd13
commit 5a61b164f6
3 changed files with 190 additions and 13 deletions
+28 -7
View File
@@ -115,10 +115,24 @@ Full write-up: **[phase-a-matrix.md](phase-a-matrix.md)** ·
| Max-hold {45,60,90} | **Note and move on** — validation glitter, train collapse (regime interaction) |
| Equity-curve vol targeting | **Reject as edge** on this sample; park vt25 as optional DD insurance only |
| Correlation caps | **Reject**; sector caps stay Phase B with reduced expectations |
| Next-open fill | **Discovery, not reject** — honest deployable ~Sharpe 1.2 / CAGR 30%. Decision baseline for future promotion = `next_open` |
| Next-open fill | **Discovery, not reject** — honest deployable ~Sharpe 1.2 / CAGR 30% under overnight scanner. Decision baseline until near-close ships = `next_open` |
| `fip_id` re-derive | **Validated** (IC 0.045, t = 2.92) |
**Highest-leverage open work:** near-close execution recovery (scheduling, not a new signal). Simulator: `scripts/run_execution_recovery_matrix.py` (`stale_close` + gap-cap).
### Execution recovery (same day) — closed as evidence
Full write-up: **[execution-recovery.md](execution-recovery.md)** ·
`reports/execution_recovery_matrix.json`.
| Finding | Decision |
|---|---|
| Monotone fill timing (next_open → stale → close) + DD recovery | **When you fill**, not decaying alpha |
| Live bracket **[1.57, 1.77]** full Sharpe | Near-close expected near top of bracket; no more fill-timing sim |
| Gap-cap | **Dead** — third tail-trim instance |
| Auto-`recover: false` | Not a null — bar hit the lower-bound arm by 0.03 train SE |
**Highest-leverage open work:** **ops** — move the single daily R:R scan to
`America/New_York` near-close (checklist in execution-recovery.md). Not more research
knobs.
---
@@ -126,10 +140,10 @@ Full write-up: **[phase-a-matrix.md](phase-a-matrix.md)** ·
| Lead | Why it's interesting | Blocker |
|---|---|---|
| **Near-close / MOC execution** | Recovers the overnight momentum drift a 07:00-Berlin scanner leaves on the table (~0.5 Sharpe / ~18pp CAGR vs close-fill) | Prove with `stale_close` arm; then schedule change |
| **`fip_id`** (information discreteness over the 12-1 window) | **Strongest cross-sectional signal measured on this universe** — IC 0.045, t = 2.91, correct sign; re-derived fingerprint matched Phase A | Doesn't improve *this* book. Revisit when the universe broadens |
| **Broader universe** (`nasdaq_all`) | Strengthens every week's cross-section and the IC t-stat | Also where `fip_id` could become tradeable |
| **Forward paper-trade record** | The only true out-of-sample evidence the snapshot cannot give | Time |
| **Near-close / MOC execution (ops)** | Recovers overnight momentum drift left on the table by a morning EU scan; evidence closed | Implement schedule + partial-bar scan path; one qualifying scan/day only |
| **`fip_id`** (information discreteness over the 12-1 window) | **Strongest cross-sectional signal measured on this universe** — IC 0.045, t = 2.91, correct sign; re-derived fingerprint matched Phase A | Doesn't improve *this* book. Revisit when the universe broadens **after** execution path is decided |
| **Broader universe** (`nasdaq_all`) | Strengthens every week's cross-section and the IC t-stat | Grade under the fill mode you will trade |
| **Forward paper-trade record** | The only true out-of-sample evidence the snapshot cannot give | Time; mark entries at actual near-close fill once ops ships |
| **Better target model for clear-air names** | The return is demonstrably there (#2 wins on raw CAGR in *both* train and test); it's the *flat* 3× ATR target that makes it too expensive in risk | Needs a per-name model, not a constant k×ATR |
---
@@ -138,7 +152,8 @@ Full write-up: **[phase-a-matrix.md](phase-a-matrix.md)** ·
1. **Nested lookback windows are NOT out-of-sample.** The clear-air result (#2) was
clean, large, and consistent across five nested windows — and still died on a
proper train/test split by entry date. Use `BACKTEST_HOLDOUT_SPLIT`.
proper train/test split by entry date. Use `BACKTEST_HOLDOUT_SPLIT` / a named
validation window — and do not pretend a repeatedly opened window is pristine.
2. **Check what population an ablation actually admits.** The blanket fallback (#3)
looked like it tested the "resistance famine" hypothesis. It didn't — 65% of the
setups it let in were a different population entirely, and they drove the result.
@@ -148,6 +163,12 @@ Full write-up: **[phase-a-matrix.md](phase-a-matrix.md)** ·
4. **The iron rule:** a signal earns its way into selection *only* through the
factor harness — |mean IC| ≳ 0.03, consistent sign, `reliable: true` (≥ 12
non-overlapping windows). Never let an unvalidated score gate setups.
5. **Momentum filters are guilty of tail-trimming until proven otherwise.**
Independent failures: take-profit exits, FIP as an in-book filter, gap-up entry
caps. Cosmetic quality up, P&L down — the right tail *is* the edge.
6. **Fill timing is part of the strategy.** Close-fill reports are not deployable
numbers for an overnight scanner. Grade promotion under the fill mode you will
actually trade.
---