Files
signal-platform/docs/research/history-depth-extension.md
T
dennisthiessen 9717d8176b research: archive Task 1 sector residual as CLOSED/REJECTED
Deep masked retest failed the iron IC bar (0.027 < 0.03). Log as rejected #13 in
research README; close sector-residual and history-depth docs. Production market
residual unchanged.
2026-07-19 11:45:15 +02:00

204 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:** **CLOSED.** Sector-residual deep test **FAIL** — Task 1 archived as rejected (see supersession).
**Branch:** `research/earnings-gap-and-sue`
**Superseded artifact (do not cite):** `reports/history-depth-20260719-103315.json`**UNMASKED, TWO-TIER SNAPSHOT**
**Authoritative sector grade:** `reports/sector-resid-deep-20260719-113319.json`
**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 — decided:** CLOSED / REJECTED (archive complete). No wire-in.
2. **Do not** retune residual vs raw, FIP, or vol blend from deep IC tables
without a pre-registered book A/B on the intended universe.
3. Optional (separate threads only): finish earnings backfill and re-run SUE;
snapshot per-symbol depth guard as tooling.
---
## 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** (archived)
**Task 1 CLOSED / REJECTED** — sector residual dead on deep evidence. Archived in
the research log rejected table (#13). Do not resurrect without a new
pre-registered protocol.
| check | result |
|---|---|
| weeks | **83** (data fix worked) |
| mean IC | **0.0268** (below 0.03 bar) → FAIL |
| t vs resid same CS | 1.69 ≥ 1.30 pass |
| era signs | both + pass |
- Artifact: `reports/sector-resid-deep-20260719-113319.json`
- Summary write-up: [sector-residual-momentum.md](sector-residual-momentum.md)
**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.