Files
signal-platform/docs/research/fip-breadth-ic.md
T
dennisthiessen 7d60e54f5a research: single-source liquid mask; orphan +0.06 fip IC
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.
2026-07-19 00:06:04 +02:00

5.5 KiB
Raw Blame History

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 (todays 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 1800 (senior) 0.035 2.99 Winner leg
Tier 8011500 (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 papers 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)

.\.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.