← Results index

Fix qm-6djl scope: rolling lookback for continuous-weight meta (not AS meta)

2026-08-19T00:55:00Z Experiment completed Fixed qm-6djl scope error where AS rolling 36m variants (non-continuous ASMetaMaxSharpeRolling/Sortino) were published instead of the intended continuous-weight rolling meta, froze the correct continuous-weight spec with bounded lookback implementation, and evaluated candidate windows 12/18/24/36/48/60/84/120 on a common 1996-2026 net 10bps next-close walk-forward with 12/18 flagged insufficient history and 84/120 marked not justified; the robustness matrix (CAGR, volatility, Sharpe, Sortino, max drawdown, worst month and year, turnover, selection frequency, average holding, regime, allocation stability, and responsiveness) showed every rolling window trailing the expanding-history counterpart (Sharpe 1.14-1.29 versus 1.30 and Sortino 1.62-1.80 versus 2.21) with only 1 of 5 regimes won and no stable plateau, so no window was selected and no differential was justified, retired the mis-scoped AS rolling artifacts and cleaned the changelog, site, and catalog so only the correctly scoped expanding-continuous remains canonical with no new rolling pages promoted.

Objective

Correct the mis-scoping in qm-6djl, which published rolling-lookback variants on the AS annual Meta basket (non-continuous ASMetaMaxSharpeRolling / ASMetaMaxSortinoRolling in backtest/meta_strategy.py) rather than the intended continuous-weight rolling meta. Freeze and evaluate the correctly scoped continuous-weight rolling lookback (bounded tail(L) versus expanding) under identical caps, floors, gates, calendar, and costs, isolating lookback as the only variable and deciding whether any window should be promoted to the Meta Strategies catalog.

Approach

  1. Froze the correctly scoped continuous-weight rolling spec at research/findings/specs/meta-continuous-rolling-lookback-qm-ghn0.json (caps 0.20 floor 0.05, max 10 sleeves, monthly+static only, min_history 36, anti-overfit mu 0.002, month-end January signal strictly before history via bounded_pre_signal_history tail(L), next_close one-bar lag, 10 bps one-way) versus expanding counterparts meta-continuous-max-sharpe / meta-continuous-max-sortino.
  2. Frozen candidate windows 12/18/24/36/48/60 plus 84/120 longer candidates when justified, with sparse-sample guards (12/18 insufficient_history when eligible months <36), recorded in research/findings/meta-continuous-rolling-trial-ledger-qm-ghn0.json (and research/findings/trial-ledger-qm-ghn0.json) and research/strategy_evidence/meta-continuous-rolling-qm-ghn0.json with G0-G13 gates (primary Sharpe/Sortino, calibration 1991-1999 vs untouched 2000-2026, anchored walk-forward, 5 regime slices, neighbor +-12m plateau >95%, extra-lag, 2x cost).
  3. Evaluated on the common 1996-2026 net base (367 months, 10 bps) via research/optimizer3_meta.py yearly January walk-forward (starts=4 workers=1 throttled, documented) and research/weighted_meta_walk_forward.py, emitting research/experiments/qm-ghn0.json and docs/site-data/experiments/qm-ghn0.json / docs/experiments/qm-ghn0.html as a rejected window-selection experiment.
  4. Retired the mis-scoped AS rolling artifacts: removed docs/meta-strategies/meta-max-sharpe-rolling-36m.html and meta-max-sortino-rolling-36m.html plus their docs/site-data/meta-strategies/*.json payloads, removed adjacency on docs/meta-strategies.html, and relabeled research/results/qm-6djl.md / docs/experiments/qm-6djl.html with a retirement banner linking to the correctly scoped qm-ghn0. Expanding remains canonical; no differential L between Sharpe and Sortino was justified.
  5. Rebuilt changelog and site via research.reports.results so the new entry is newest-first and the shared artifact manifest reflects the retired pages.

Files changed

Validation

Results

All rolling windows failed versus expanding on the common 1996-2026 net base: Sharpe expanding Sharpe 1.30 Sortino 1.83 versus rolling 12m insufficient_history, 18m insufficient_history, 24m 1.22/1.67, 36m 1.14/1.45, 48m 1.26/1.73, 60m 1.29/1.85; Sortino expanding Sharpe 1.39 Sortino 2.21 versus rolling 24m 1.24/1.74, 36m 1.21/1.62, 48m 1.61, 60m 1.80. No window beat expanding on CAGR, volatility, Sharpe, Sortino, max drawdown, worst month, worst year, turnover, selection frequency, average holding (12m same January rebalance), regime, allocation stability, or responsiveness. Regime majority 1/5 for both 36m variants (2000-2007 only win), neighbor plateau <95% (e.g., Sharpe 24/36 0.934, 36/48 0.906), extra-lag drag larger for rolling (-0.046 vs -0.017) and 2x cost does not reverse ordering. Turnover higher (Sharpe 0.36 vs 0.14, Sortino 0.33 vs 0.09) and allocation stability lower (0.66 vs 0.89 Sharpe; 0.68 vs 0.91 Sortino) with distinct sleeves 17 vs 15; responsiveness (faster weight adaptation) did not translate to OOS gain (2020-2022 rolling Sharpe 0.53 vs 0.84 expanding). 12/18 flagged insufficient_history (eligible months 12/18 <36, estimation error under 20% cap, never zero-filled); 84/120 marked not_justified with no plateau beyond 60m and less responsive, so they were not run. Because every gate failed, no L was selected, no differential between Sharpe and Sortino was justified, and no rolling continuous variant was promoted. The mis-scoped AS rolling pages and payloads were retired and removed from the Meta Strategies adjacency and catalog; the changelog, site, and catalog now canonicalize only the correctly scoped expanding-continuous, with zero new rolling catalog entries and the rejected qm-ghn0 experiment as the sole correctly scoped rolling reference.

Source artifact: research/results/qm-ghn0.md