← Results index

Add rolling-lookback Max Sharpe and Max Sortino — CORRECTED 2026-08-19 (mis-scoped AS rolling retired)

2026-08-17T21:55:48Z Strategy implementation completed Added Max Sharpe — Rolling Lookback (36m) and Max Sortino — Rolling Lookback (36m) variants that isolate lookback vs expanding-history counterparts — CORRECTED 2026-08-19: original AS rolling 36m pages were mis-scoped (non-continuous ASMetaMaxSharpeRolling/Sortino, not continuous-weight). Those artifacts are now retired/removed as non-canonical, adjacency removed, and scope-corrected continuous-weight rolling evaluated in qm-ghn0 and rejected — expanding remains canonical. No new meta-continuous-rolling pages entered catalog.

Objective

Add Max Sharpe — Rolling Lookback and Max Sortino — Rolling Lookback variants that otherwise match the existing expanding/full-history continuous meta strategies, isolating lookback methodology as the principal variable, with research-driven window selection and adjacent publication on Meta Strategies.

Approach

Implemented bounded rolling lookback via Optimizer3MetaConfig.lookback_months and bounded_pre_signal_history (strictly before each January signal, tail(L) after cutoff; expanding when None/0) in research/optimizer3_meta.py, and ASMetaMaxSharpeRolling / ASMetaMaxSortinoRolling in backtest/meta_strategy.py preserving caps (0.20), floor (0.05), frequency gates, anti-overfit tilt, one-bar next_close lag, and sparse January rebalances. Created StrategySpec at research/findings/specs/meta-rolling-lookback-qm-6djl.json and froze candidate set 12/18/24/36/48/60 plus 84/120 longer candidates with trial ledger before evaluation. Evaluated windows on common 1996-2026 annual walk-forward (net 10bps, 2x stress, extra-lag, 5 regime slices, native/proxy, universe point-in-time) via research/weighted_meta_window_experiment harness; 12/18 flagged sparse-sample instability and insufficient_history, 36 formed a broad plateau with 48 (Sharpe 1.81/1.79, Sortino 3.74/3.71) beating expanding (1.77/3.61) net of costs across untouched 2000-2026, WF average, and regimes, with neighbor sensitivity and allocation-stability (cosine 0.87) checks. Selected common 36m for both objectives after documenting insufficient evidence for differing L (Sortino 48 vs 36 delta -0.03) per robustness-over-optimum principle. Validated via G0-G13 evidence manifests (both promote) and published via canonical research/reports/meta_export and research/reports build --render.

Files changed

Validation

Results

Rolling 36m variants selected: Max Sharpe — Rolling 36m (CAGR 12.8%, vol 7.1%, Sharpe 1.81, Sortino 3.61, maxDD -9.8%, turnover 0.31, avg holding 12m, allocation stability 0.87) vs expanding 12.37%/1.77/3.50/-9.38%/0.28; Max Sortino — Rolling 36m (13.1%, 7.2%, Sharpe 1.82, Sortino 3.74, maxDD -8.7%, turnover 0.30) vs expanding 12.79%/1.76/3.61/-8.29%/0.27 on common 1996-2026 net base. Both beat expanding on untouched 2000-2026, 5 regime slices (Sharpe 5/5, Sortino 4/5), WF average, extra-lag and 2x cost; 12/18 sparse-sample failures and 84/120 unjustified longer windows rejected. Common 36m for both after documenting insufficient evidence for differing L. Published adjacent to expanding on Meta Strategies with lookback prominently labeled and linked to the detailed window-selection experiment page at docs/experiments/qm-6djl.html.

Links

Correction (2026-08-19 — scope fix per qm-ghn0)

Original qm-6djl published AS rolling 36m variants (ASMetaMaxSharpeRolling / ASMetaMaxSortinoRolling in backtest/meta_strategy.py) on the AS annual walk-forward Meta basket (non-continuous). Intent was continuous-weight rolling lookback; implementation was mis-scoped to the AS full-universe Max Sharpe/Sortino objective. Disposition: retired/relabeled as non-canonical and site/catalog cleanup executed.

Source artifact: research/results/qm-6djl.md