22 Experiment: Empirical Results for the Canonical Factor Catalogue
Date: 2026-08-03 Status: partially run — theory/config fields populated; two statistical fields (naive and HAC t-stat) specified but not yet computed First entry under the experiments/ convention (see experiments/README.md)
2026-08-03 update: the per-factor results this experiment produced now live in
phd/factor-catalog.mdas a single, self-contained, per-family catalog (justification + style + platform wiring + empirical results in one place per factor), at the operator’s request — rather than split between the §10 table inphd/factor-models-and-benchmarks.mdand this file. This entry now holds the provenance record: what was run, what was looked up, and the exact method for the two fields still pending. Read the catalog for current numbers; read this for how they were (or will be) produced.
22.1 Question this tests
phd/factor-catalog.md (formerly §10 of phd/factor-models-and-benchmarks.md) lists the platform’s canonical factors with their economic justification and style, but that alone is no evidence the platform’s own implementation of each one actually carries a signal. This experiment supplies that evidence.
It also bears directly on research-platform/04-factor-layer-as-multiplex-layer-1.md: these factors are the proposal’s Layer 1 (the factor-exposure bipartite layer of the multiplex network). A network built on factors with no real predictive content is a network built on noise — so this is a prerequisite check for the PhD proposal’s L1, not just a platform-hygiene exercise.
22.2 What was run
The empirical fields in the catalog are drawn from the existing five-sidecar diagnostic run 260526_6ddcd9 (2026-05-26), synthesized in platform/factors.md — factor diagnostics (ADF/entropy), per-factor IC, factor contribution, Alphalens, and MCPT. No new run was executed for this entry; this re-projects that run’s results onto the catalog, plus fresh config lookups against config/factors/*.yaml in SBFoundation for style, hypothesis_class, expected_sign, source_table/source_column, and current status.
That config lookup surfaced a correction, folded into the catalog: bb_lower_20, ma_50d, ma_200d, and vwap_20d were the four factors the 260526_6ddcd9 synthesis called out as having “real” pre-fix MCPT significance — but all four were deprecated for cause on 2026-07-20 (F-289/LH-25, run 260718_31a51e) for a CF-1 look-ahead defect in their raw price-level source columns. The “cleanest MCPT result in the library” turned out to be a look-ahead artifact two months later — see the bb_lower_20 entry in the catalog for the detail. That is exactly the kind of thing re-grounding against live config catches and a stale narrative wouldn’t.
Caveat carried forward: 260526_6ddcd9 predates three fixes that materially affect these numbers — F-136 (MCPT nightly permutations 100 → 1000, corrected null construction), F-137 (Alphalens forward-return winsorization), and F-138 (composite contribution rescaling). The catalog’s MCPT fields are provisional until regenerated against a post-fix NIGHTLY_FULL/RESEARCH_DAY run.
22.3 Method for the two pending fields
Neither t-stat exists in any current sidecar — compute_ic, compute_factor_mcpt, and compute_factor_diagnostics don’t compute a mean-return significance test, and sbattribution.ols_hac is currently wired only to strategy NAV streams (beta_attribution_service.py), not to the per-factor return panel. The exact method (so it’s reproducible once run) lives in the catalog’s Method section:
- Naive t-stat:
mean(F) / (std(F) / sqrt(T))on each factor’sops.risk_factor_returnseries — the classic Fama–MacBeth / Fama–French second-pass report. - HAC (Newey–West) t-stat: same series, intercept-only OLS via the platform’s existing
sbattribution.ols.ols_hac(src/sbattribution/ols.py:79-125) — the same kernel already used for CAPM/attribution alpha. - Why both: comparing naive vs. HAC on the same series is itself diagnostic — how much of the naive “significance” is just serial correlation from overlapping-window/slow-moving characteristics.
- Neither is a promotion gate — per research-platform/08-validation-and-anti-overfitting.md, the platform’s actual gate is IC-IR + MCPT against an honest trial count.
22.4 Next steps
- Write the query/script computing
t_naiveandt_HACperfactor_idand fill in thePENDINGfields inphd/factor-catalog.md. - Resolve the two duplicate pairs (
beta/market_beta_252d,momentum_12_1/momentum_12m_1m) before republishing. - Regenerate against the first post-F-136/137/138
NIGHTLY_FULL/RESEARCH_DAYrun. - Once stable, promote the catalog’s empirical layer from provisional to publication-quality (
research-platform/findings/-grade confidence), noting that in the catalog’s provenance section rather than moving the content again.
22.5 Journal
Motivated by and recorded in journal/2026/2026-08-03.md.