Files
signal-platform/docs/research/history-depth-extension.md
T
2026-07-19 11:39:43 +02:00

199 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# History-depth extension (Tier-1 alpha research)
**Status:** sector-resid deep test **FAIL** — see supersession section. PENDING_HUMAN beyond PASS/FAIL.
**Branch:** `research/earnings-gap-and-sue` (MacBook commit `f6e0ca7`)
**Superseded artifact (do not cite):** `reports/history-depth-20260719-103315.json`**UNMASKED, TWO-TIER SNAPSHOT**
**Production impact:** none. **Do not retune any production knob on deep history.**
---
## Pre-registration (locked before rebuild)
### Motivation
All current conclusions rest on ~35 non-overlapping weekly windows in essentially
one post-2021 regime. Extending history toward max Alpaca daily-bar depth adds
the 2018 vol shock and full 2020 crash (where the feed allows).
### Protocol
1. **Empirical coverage first** — bars per calendar year per symbol; document
where the feed thins out. Do **not** assume a uniform start date.
2. **Rebuild the research snapshot completely** from prod source + max history
per symbol (`Adjustment.SPLIT`, ~200 req/min pacing via existing extender).
3. **Race guard (rule 6)** — refuse analysis until completion manifest is
`complete=true` and live counts match.
4. **Re-run full signal harness** (all existing signals incl. sector residual /
SUE if present) on the extended window.
5. **Report per signal:** mean IC, t, window count, and **era split**
(pre-/post-2021) — diagnostic only, **not a tuning input**.
6. **Log prominently:** survivorship bias grows with depth (todays constituents
backfilled). Absolute Sharpe/CAGR on deep history is optimistic; payload is
**relative** signal comparisons and IC stability, not levels.
7. **Do not retune** production knobs. If a knobs confirmation looks
overturned on deep history → report only; human decides.
### Success / interpretation (not promotion of a new signal)
| outcome | meaning |
|---|---|
| Sector residual still ≥ market residual on deep IC + stable sign | strengthens Task 1 PROMOTE case |
| Sector residual collapses pre-2021 | **PARK** Task 1 wire-in |
| SUE remains weak after full earnings + depth | **DEAD** SUE for this stack |
| Any production knob looks worse deep | report; no auto-retune |
---
## Data provenance
| check | result |
|---|---|
| Snapshot | MacBook `research.sqlite` |
| Manifest `complete` | **true** (finished 2026-07-19T08:19Z) |
| Live counts match | yes — 4655 tickers / 6,609,926 OHLCV / 4149 rank_only |
| `history_days` | 5000 |
| fetch_ok / fail | 4152 / 0 |
| Race guard | **pass** |
> **SURVIVORSHIP BIAS:** todays constituents backfilled historically. Absolute
> Sharpe/CAGR levels on deep history are optimistic. Use **relative** signal IC
> comparisons and era stability only — not levels.
**Coverage JSON was empty in the auto-written doc** (harness-only phase after
rebuild). Manifest is the race-guard source of truth for this run.
Earlier MacBook files `history-depth-20260719-093853``095156` are intermediate
/ incomplete passes — **do not cite**. Only **103315** is authoritative.
---
## Results (authoritative: 103315)
### Full-window signal IC (broad research universe, deep bars)
| signal | mean_ic | t | weeks | avg_N | notes |
|---|---:|---:|---:|---:|---|
| high_52w | **0.111** | **6.41** | 84 | 2280 | strong on deep breadth |
| mom_12_1 | **0.066** | **5.11** | 83 | 2278 | raw momentum strong |
| trend_200 | 0.055 | 4.30 | 85 | 2308 | |
| mom_6_1 | 0.049 | 4.91 | 88 | 2376 | |
| mom_3_1 | 0.036 | 3.58 | 90 | 2426 | |
| fip_id | **+0.027** | **3.25** | 83 | 2278 | **sign flip vs prod fingerprint** |
| mom_12_1_resid | 0.026 | 2.21 | 83 | 2278 | market residual still + but weaker than raw |
| reversal_1m | ~0 | 0.31 | 91 | 2443 | dead |
| vol_6m | **0.123** | **6.34** | 88 | 2376 | low-vol anomaly strong |
| mom_12_1_sector_resid | 0.058 | 2.34 | **35** | **498** | **not deep-sample — see caveats** |
| mom_12_1_sector_demeaned | 0.034 | 1.32 | **35** | **497** | same short fingerprint |
### Era split (diagnostic only — not a tuning input)
| signal | pre-2021 IC / t / w / N | post-2021 IC / t / w / N |
|---|---|---|
| mom_12_1 | +0.041 / 2.94 / 36 / 1425 | +0.079 / 3.64 / 48 / 2913 |
| mom_12_1_resid | +0.023 / 1.68 / 36 / 1425 | +0.027 / 1.37 / 48 / 2913 |
| fip_id | +0.012 / 1.35 / 36 / 1425 | +0.037 / 2.91 / 48 / 2913 |
| vol_6m | 0.056 / 2.16 / 40 / 1461 | 0.162 / 4.94 / 48 / 3123 |
| high_52w | +0.049 / 2.0 / 36 / 1422 | +0.138 / 4.34 / 48 / 2915 |
| **sector_resid** | **absent** | 0.058 / 2.34 / 35 / 498 (short only) |
| **sector_demeaned** | **absent** | 0.034 / 1.32 / 35 / 497 (short only) |
---
## Critical caveats (must read)
### 1. Sector residual did **not** get a deep-history stress test
`mom_12_1_sector_resid` / `_demeaned` still show **exactly** the Task1 short-window
fingerprint: **35 weeks, N≈498, IC 0.0578, t 2.34**.
On the same run, raw `mom_12_1` has **83 weeks, N≈2278**. So depth worked for
price-only signals, but sector residual is still limited to the **~505 labeled
prod names × short factor calendar** (sector map only covers prod; and/or sector
ETF / two-factor path did not extend usable residual weeks).
**Pre-registered rule:** “Sector residual collapses pre-2021 → PARK Task 1
wire-in.” Pre-2021 sector residual is **absent** from the era table. That is a
**PARK**, not a confirmation of the short-window PROMOTE.
Do **not** claim “sector residual beats market residual on deep history” from
this table — the two rows are **not the same cross-section or window count**.
### 2. `fip_id` sign flips vs production fingerprint
| sample | fip mean IC | t |
|---|---:|---:|
| Prod 505, ~5y (fingerprint) | **0.045** | 2.91 |
| Research breadth, deep (this run) | **+0.027** | +3.25 |
This does **not** authorize resurrecting unconditional FIP as a book filter. It
confirms earlier PhaseB caution: FIP edge is **universe- and sample-dependent**.
Production display card can stay context-only. Nested lookbacks still not OOS.
### 3. Market residual vs raw momentum on deep breadth
On deep broad IC, **raw 121 (0.066 / t 5.1) ≫ market residual (0.026 / t 2.2)**.
That does **not** by itself overturn production residual ranking (book A/B was
on 505 + GTL gate, not pure factor IC), but it is a yellow flag for “residual is
always the better rank key” stories on broad history. **No auto-retune.**
### 4. Low-vol anomaly is the cleanest deep-history result
`vol_6m` IC 0.12 / t 6.3 full; stronger post-2021. Consistent sign across eras.
Production already blends **high**-vol (not low-vol) into the 80/20 rank — this
report does not change that without a separate A/B. Flag for human awareness only.
---
## Verdicts (vs pre-registration)
| question | verdict |
|---|---|
| Task 1 sector residual wire-in | **PARK** — no pre-2021 sector residual; deep-sample IC not established; short-window PROMOTE stays “human design only,” **not strengthened** by this run |
| Sector demean | still **DEAD** for promotion (t 1.32, short only) |
| SUE | **not re-scored here** (no `sue_latest` in harness table) — leave Task 2 **PARK** until full earnings backfill |
| fip unconditional book filter | remains **rejected / parked** despite sign flip on broad deep sample |
| Production residual / 80/20 / trail knobs | **no retune** from this report |
| Overall Task 3 | **COMPLETE as diagnostic** — payload is relative IC + caveats above |
---
## What a human must decide next
1. **Sector residual:** keep research-only until either
(a) sector ETF + sector map cover the full deep window **and** IC is re-run
with weeks ≫ 35 on a documented universe, or
(b) explicitly accept short-window-only evidence (weaker case).
2. **Do not** merge sector residual into production from this depth run.
3. **Do not** retune residual vs raw, FIP, or vol blend from these IC tables
without a pre-registered book A/B on the intended universe.
4. Optional follow-up: extend sector ETF history + sector labels to nasdaq_all,
re-run **only** sector residual IC on deep research.sqlite with race guard.
5. Optional: finish earnings backfill (48→506) and re-run SUE; depth alone did
not include SUE.
---
## Artifacts
| file | role |
|---|---|
| `reports/history-depth-20260719-103315.json` | **authoritative** |
| `reports/history-depth-20260719-103315.md` | companion dump |
| `reports/history-depth-20260719-093853``095156` | **ignore** (partial) |
---
## Supersession notice (2026-07-19 sector-resid deep test)
The table and interpretation from **`history-depth-20260719-103315`** are **UNMASKED, TWO-TIER SNAPSHOT — superseded, directional only, do not cite**. Prod-universe names (and sector residual coverage) were left shallow while breadth names were deepened; sector residual weeks=35 was a data gap.
### Sector-residual deep test outcome: **FAIL**
Task 1 CLOSED — sector residual dead on deep evidence.
- Reason: failed one or more pre-registered checks (see checks)
- Artifact: `reports/sector-resid-deep-20260719-113319.json`
- Mechanical checks: see that report.
**Future snapshot rebuilds must verify per-symbol depth** (earliest-bar uniformity across the intended universe) — guard is a to-do, not part of this order.