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.md as 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 in phd/factor-models-and-benchmarks.md and 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’s ops.risk_factor_return series — 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

  1. Write the query/script computing t_naive and t_HAC per factor_id and fill in the PENDING fields in phd/factor-catalog.md.
  2. Resolve the two duplicate pairs (beta/market_beta_252d, momentum_12_1/momentum_12m_1m) before republishing.
  3. Regenerate against the first post-F-136/137/138 NIGHTLY_FULL/RESEARCH_DAY run.
  4. 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.