Goal: find a usable edge from Google TimesFM (and Jev) beyond the house's validated momentum/PEAD. Result: none found. Every candidate is either insignificant, non-monotone, fails IS/OOS, or dies under the block bootstrap. Trial counter rose K≈110 → 127; nothing survives deflation.
Scope (all PIT-safe, completed bars only)
| axis | data |
|---|---|
| equity 1D monthly | 78 dates × 50 names (2020-01..2026-07) |
| equity 1D weekly | 335 dates × 50 names (new backfill, W-FRI) |
| equity 1H intraday | 70 dates × 50 names |
| crypto 1D monthly | 42 dates × 8 names |
| Jev × TimesFM | 78 dates × 50 names (echo-free Jev state) |
Scripts: validation/timesfm_edges.py, timesfm_edges_validate.py,
timesfm_overlay.py, timesfm_quantile.py, jev_timesfm.py.
Results (weekly equity is the high-power sample)
Selection signals (timesfm_edges.py --cadence week, n=335):
| signal | IC | t | block CI |
|---|---|---|---|
| H0 forecast level | +0.0105 | +1.12 | [−0.015, +0.037] |
| H1 forecast revision | −0.0035 | −0.39 | [−0.020, +0.012] |
| H2 forecast resid vs mom | +0.0161 | +1.78 | [−0.007, +0.041] |
| H3 acceleration | +0.0014 | +0.16 | [−0.012, +0.014] |
| H6 revision resid vs mom | −0.0055 | −0.65 | [−0.021, +0.009] |
| momentum126 | +0.0089 | +0.59 | [−0.040, +0.059] |
H2 (forecast orthogonal to momentum) is the only positive lead — i.i.d. bootstrap p=0.036 — but its block CI includes zero, so it fails the house's conservative test.
Tradable validation (timesfm_edges_validate.py, n=335):
| leg | mean 21-sess fwd | block CI |
|---|---|---|
| EW50 | +1.73% | [+0.81, +2.57] |
| MOM_top | +3.24% | [+1.65, +4.87] |
| RESID_top | +2.43% | [+1.13, +3.74] |
- RESID_top − MOM_top = −0.81% (CI includes 0; IS −0.84%, OOS −0.77%): the residual signal is a weaker momentum proxy, not additive.
- H2 IC halves out of sample (IS +0.021 → OOS +0.010); momentum IC dies OOS (+0.016 → +0.001).
Overlays on the validated momentum signal (timesfm_overlay.py, n=335):
- O1 dispersion gate: mom top-decile fwd low +3.30% / mid +1.75% / high +4.67% — high−low +1.36% (iid p=0.16), non-monotone; positive in both halves but not significant.
- O2 market timing: spearman(mean fc, SPY fwd)=+0.139 (CI [+0.02,+0.25]) but the long/flat rule is inconsistent IS vs OOS and scaling the momentum book by fc>0 loses −1.14% (CI excludes 0).
- O3 double-sort (within momentum top-quintile by residual): high−low −0.23% (p=0.72; IS +0.05%, OOS −0.56%). No additive value.
Other axes: equity 1H — all null (revision negatively significant,
t≈−2.3, but K=127 makes that noise); crypto 1D — all null (H4 high-dispersion
"+20%" is n=14, p=0.12, pure vol). Jev × TimesFM — Jev IC −0.008, ensemble
−0.0001, veto D +0.10% (p=0.45); see reports/jev_timesfm_research.md.
Quantiles (timesfm_quantile.py): no selection lift; forecast width is
error-magnitude calibration (corr +0.28 with |error|), not direction.
The one robust result: width is a volatility forecast (not alpha)
validation/timesfm_voltarget.py, monthly covered-50, n=3900 name-obs:
- spearman(width, realized 21-session vol) = +0.577 pooled; per-date mean ρ = +0.631 (t = +55). TimesFM's forward-looking interval width forecasts realized volatility far better than trailing vol. This is the only statistically overwhelming effect found in the entire hunt.
- But it is a risk-model asset, not a return edge: naive per-name inverse-width weighting lowers mean return (fc book +1.95→+1.77%; mom book +2.59→+2.13%, paired D −0.46%, CI excludes 0) because high-vol names carried the returns in this sample. Correct portfolio vol-targeting (expanding calibration, scale to running-median vol) cut maxDD (−23.9% → −20.1%) but left Sharpe flat (0.89 → 0.90) and exposure at 0.88.
Use: a better vol forecast is genuinely useful for position limits, stop sizing, and portfolio risk targeting — worth a separate vote on that objective. It is not an alpha or Sharpe edge and should never be sold as one.
Verdict
NO (return/Sharpe) EDGE. TimesFM at 21-bar horizon, on any bar size or asset class tested, carries only a weak, momentum-correlated cross-sectional signal that (a) does not beat the momentum decile, (b) fails the block CI, and (c) has no additive value in gate/timing/double-sort form. Jev adds nothing on historical news-less states. Nothing here warrants wiring into a sleeve.
One durable by-product: TimesFM quantile width is a strong volatility forecaster (ρ≈0.63, t≈55) — a risk-model improvement, explicitly not alpha.
Do not redo / what would reopen it
- Don't re-grid thresholds or re-run these signals on the same universe — the
ledger says no (
data/research_trials.jsonl, K=127). - Reopen only with a new mechanism: e.g. a genuinely new model (TimesFM 3.0 is license-barred for production), a different horizon/target (daily path shape, realized-vol forecasting), or a real historical news series to unblock the Jev test. The live forward shadow remains the binding evidence for Jev; TimesFM stays a research shadow (C6) with no consumer.
Follow-up work (2026-09-20) — outcomes
Three actions taken on this hunt's conclusions: two closed null, one shipped an observe-only risk tool.
-
Vol-forecast risk tool — SHIPPED, observe-only.
production/vol_forecast.py(pure:realized_vol,blend_vol_forecast,vol_target_scale; shrink-only, fail-open, never raises) +scripts/vol_forecast_shadow.pyaudit +tests/test_production_vol_forecast.py(7 tests) +tests/test_vol_forecast_shadow.py(3). Not wired into any sleeve — the width series is research-only; adoption is a separate risk-objective vote. Evidence: width→vol ρ≈0.63 (t≈55). -
TimesFM embedding classifier — NULL.
validation/timesfm_embeddings.py(mean-pooledlast_hidden_state, 1280-d, 68 monthly dates) +validation/timesfm_embed_model.py(purged, embargoed walk-forward; LR + LGBM; permutation control). LR AUC 0.492, LGBM 0.490, LR 8-fold 0.511 (permutation ≈0.47–0.48); pooled-OOS IC −0.02..−0.04; top-decile loses to momentum (−0.36..−0.50%). The representation does not predict forwards beyond chance. Tests:tests/test_timesfm_embed_util.py(7). -
Program closed. No further TimesFM/Jev backtesting without a new mechanism (rule above); Jev's binding test is the live forward shadow.