Harness and diagnostics share _filter_liquid_breadth_week_rich. Recompute shows unconditional liquid fip IC -0.017 (mask binds 97%); mom-conditional -0.088/t-4.58 stands. Document +0.0575 as orphaned.
146 lines
5.5 KiB
Markdown
146 lines
5.5 KiB
Markdown
# Broad-universe fip_id IC research (Phase B)
|
||
|
||
**Status:** unconditional fip closed; mom-conditional lead confirmed on single-sourced path.
|
||
**Production impact:** none. Display card remains context-only.
|
||
|
||
## Scope
|
||
|
||
- Research only — production universe, gate, scanner, schedule unchanged.
|
||
- Snapshot: `research.sqlite` (~4,650 tickers = prod + nasdaq_all extend).
|
||
- Liquid mask: top **1,500** by point-in-time 63d median $vol, price ≥ **$5**/week.
|
||
|
||
## Caveats
|
||
|
||
- Survivorship bias (today’s constituents, history backfilled).
|
||
- IEX volume undercount → relative $vol rank only.
|
||
- Pool skew: Nasdaq-heavy; missing pure NYSE mid-caps.
|
||
- Do not mix multi-signal tables across universe baselines.
|
||
|
||
---
|
||
|
||
## Fingerprint (505-name prod)
|
||
|
||
| | Expected | Observed |
|
||
|---|---:|---:|
|
||
| mean IC | −0.045 | **−0.045** |
|
||
| t-stat | −2.9 | **−2.91** |
|
||
| weeks / N / reliable | ≥12 / ~500 / true | 35 / 497.7 / true |
|
||
|
||
**Pass.** Formula + pipeline trustworthy.
|
||
|
||
---
|
||
|
||
## Discrepancy (must not be papered over)
|
||
|
||
| Source | fip IC (liquid ~1500) | t |
|
||
|---|---:|---:|
|
||
| Report `fip-breadth-20260718-211440-breadth.json` | **+0.0575** | **+5.12** |
|
||
| Single-sourced recompute (2026-07-19) | **−0.0168** | **−1.85** |
|
||
|
||
That is a **sign disagreement** on the same intended quantity. Method rule: the number you cannot reconcile is the number you cannot use.
|
||
|
||
### What we did
|
||
|
||
1. **Single-sourced the mask** — diagnostics call harness `_signal_series` + `_filter_liquid_breadth_week_rich` only (no parallel mask).
|
||
2. **Documented avg_cross_section semantics** — always **post-mask** IC sample size.
|
||
3. **Logged pre-mask stats** so “did top-N bind?” is answerable.
|
||
|
||
### Authoritative unconditional liquid fip (post-reconciliation)
|
||
|
||
| metric | value |
|
||
|---|---:|
|
||
| mean_ic | **−0.0168** |
|
||
| ic_t_stat | **−1.85** |
|
||
| weeks | 35 |
|
||
| avg_cross_section (**post-mask**) | 1471.2 |
|
||
| avg_raw_pool | 3214.4 |
|
||
| avg_eligible_pre_mask | **2338.4** |
|
||
| mask_binds_pct | **97.1%** |
|
||
| reliable | true |
|
||
|
||
**Mask binds hard** (eligible ≫ 1500). The hypothesis that “1471 meant the mask never bound / unmasked +5σ” is **false**.
|
||
|
||
Harness `_signal_evaluation` vs manual IC through the same filter: **exact match** (−0.0168 / −1.85).
|
||
|
||
### Verdict on the orphan
|
||
|
||
The **+0.0575 / t +5.12** row is **orphaned**. Do not cite it. Root cause of that single run is not fully forensic-reconstructed (no dual dump from the original process remains), but every single-sourced recompute on this snapshot lands near **−0.017**, and the tier blend (≈800×−0.035 + ≈670×+0.014)/1471 ≈ **−0.013** is internally consistent with that number—not with +0.058.
|
||
|
||
**Iron rule unconditional:** still **not green** (|IC| 0.017 < 0.03), and now with the correct mild-negative sign.
|
||
|
||
Artifact: `reports/fip-reconcile-20260719-000520.json`
|
||
|
||
---
|
||
|
||
## Compositional story (supported)
|
||
|
||
`fip_id = sign(PRET)×(%neg−%pos)` pools:
|
||
|
||
- **Continuous winners** → want **negative** IC
|
||
- **Continuous bleeders** → want **positive** IC
|
||
|
||
| check | IC | t | read |
|
||
|---|---:|---:|---|
|
||
| Prod-universe subset inside liquid | **−0.044** | **−2.88** | Matches fingerprint → compositional, not regime change |
|
||
| Tier 1–800 (senior) | **−0.035** | **−2.99** | Winner leg |
|
||
| Tier 801–1500 (junior) | **+0.014** | +1.25 | More bleeder / junk weight |
|
||
| Lagged membership (prior-week $vol) | −0.010 | −0.93 | Same sign as same-week; not a +5σ leak artifact |
|
||
|
||
**Do not log “on Nasdaq, jumpy paths outperform.”** That would mythologize an orphaned +0.06.
|
||
|
||
---
|
||
|
||
## Platform-relevant test: momentum-conditional fip
|
||
|
||
Among liquid top-1500, keep **mom_12_1 ≥ P80** (~294 names/week):
|
||
|
||
| metric | value |
|
||
|---|---:|
|
||
| mean_ic | **−0.0879** |
|
||
| ic_t_stat | **−4.58** |
|
||
| ic_positive_pct | 22.9% |
|
||
| weeks | 35 |
|
||
| reliable | **true** |
|
||
|
||
Computed on the **same single-sourced path** as the authoritative −0.017. This is the paper’s claim and the only version a gate could consume.
|
||
|
||
| Decision | |
|
||
|---|---|
|
||
| Unconditional fip | **Closed** for production |
|
||
| Mom-conditional fip | **Alive as book-tilt candidate only** — book sim before any gate talk |
|
||
| Display card | Stays |
|
||
| Production change | **None** |
|
||
|
||
---
|
||
|
||
## Vol-tilt / residual-mom warning (any future breadth move)
|
||
|
||
| signal (liquid, single-sourced) | IC | t |
|
||
|---|---:|---:|
|
||
| vol_6m | −0.048 | −1.4 |
|
||
| mom_12_1 | +0.046 | +1.9 |
|
||
| mom_12_1_resid | +0.029 | +1.3 |
|
||
|
||
High-vol names tend to underperform on this pool relative to a clean S&P-like book. Production **80/20 high-vol tilt** was validated on S&P-like names. **If the universe ever broadens in production, re-validate that tilt first** — it can flip from mildly helpful to harmful. Raw momentum also looks stronger than SPY residualization here (noisier fit for small caps).
|
||
|
||
---
|
||
|
||
## How to re-run (research branch only)
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe scripts\run_fip_breadth_diagnostics.py `
|
||
--research-snapshot backtest_snapshots\research.sqlite `
|
||
--prod-snapshot backtest_snapshots\prod.sqlite `
|
||
--workers 6 --allow-spawn
|
||
```
|
||
|
||
---
|
||
|
||
## Bottom line
|
||
|
||
1. Formal iron-rule screen: **not green** either before or after reconciliation.
|
||
2. **+0.0575 / +5.12 is orphaned** — authoritative unconditional liquid fip is **−0.017 / −1.9**; mask binds (~97%).
|
||
3. Compositional tug-of-war is the right story; jumpiness premium is not.
|
||
4. **Mom-conditional −0.088 / −4.6 stands on the single-sourced path** → optional next research step is a **book** A/B, not a gate wire-in.
|
||
5. Log any future reader who sees both numbers: trust the reconcile artifact, not the orphaned breadth headline.
|