{
  "experiment": {
    "alloc": {
      "labels": [
        "2026-01"
      ],
      "series": [
        {
          "name": "SPY",
          "values": [
            0.6
          ]
        },
        {
          "name": "CASH",
          "values": [
            0.4
          ]
        }
      ]
    },
    "alloc_as": null,
    "alloc_monthly_as": null,
    "alloc_monthly_ours": {
      "labels": [
        "2026-01"
      ],
      "series": [
        {
          "name": "SPY",
          "values": [
            0.6
          ]
        },
        {
          "name": "CASH",
          "values": [
            0.4
          ]
        }
      ]
    },
    "alloc_ours": {
      "labels": [
        "2026-01"
      ],
      "series": [
        {
          "name": "SPY",
          "values": [
            0.6
          ]
        },
        {
          "name": "CASH",
          "values": [
            0.4
          ]
        }
      ]
    },
    "alloc_yearly_as": null,
    "alloc_yearly_ours": {
      "labels": [
        "2026"
      ],
      "series": [
        {
          "name": "SPY",
          "values": [
            0.6
          ]
        },
        {
          "name": "CASH",
          "values": [
            0.4
          ]
        }
      ]
    },
    "analysis_page": null,
    "answer": "No. All rolling windows fail vs expanding on common 1996-2026 net 10bps next_close base: Sharpe rolling 1.14-1.29 vs expanding 1.30, Sortino 1.62-1.80 vs 2.21. Regime wins only 1/5 for both 36m variants, neighbor plateau fails (>95% test), turnover higher and allocation stability lower, 12/18 insufficient_history, 84/120 not justified, broad robustness vs narrow CAGR. Rolling continuous variants NOT promoted; expanding remains canonical.",
    "bead_ids": [
      "qm-ghn0"
    ],
    "cost_variants": {
      "base_bps": 10,
      "extra_lag": "t+2",
      "stress_bps": [
        0,
        20
      ]
    },
    "coverage": {
      "alloc_monthly_labels_n": 12,
      "alloc_yearly_labels_n": 0,
      "as_alloc_rows": 0,
      "as_history_start_year": null,
      "as_returns_n": 0,
      "as_yearly_alloc_rows": 0,
      "coverage_generated_at": "2026-01-01T00:00:00Z",
      "db_path": "data/market.sqlite",
      "db_warm": true,
      "gap_years": null,
      "limiting": {
        "effective_start": "1993-01-29",
        "id": "SPY",
        "kind": "ohlcv",
        "native_start": "1993-01-29",
        "proxied": false,
        "proxy_chain": [],
        "span_basis": "db"
      },
      "macro_meta": [],
      "macros": [],
      "monthly_labels_n": 1,
      "ours_alloc_rows": 1,
      "ours_returns_n": 1,
      "ticker_meta": [
        {
          "end": "2026-07-24",
          "n_rows": 8428,
          "start": "1993-01-29",
          "ticker": "SPY"
        }
      ],
      "tickers": [
        "SPY"
      ]
    },
    "date": "2026-08-19",
    "disposition": "Rejected. Rolling continuous-weight Max Sharpe and Max Sortino variants (12/18/24/36/48/60 plus 84/120 longer candidates when justified) do not beat expanding-history counterparts on the common 1996-2026 net base, calibration 1991-99 vs untouched 2000-26, anchored walk-forward average, 5 regime slices, neighbor +-12m plateau, extra-lag and 2x cost. Both 36m rolling variants fail primary metric net of costs, regime majority <3/5, and narrow-plateau gates; 12/18 flagged insufficient_history (eligible complete months <36, estimation error with n~10 under 20% cap, never zero-filled); 84/120 marked not_justified as no OOS improvement over 60m and less responsive. Allocation stability 0.66 (Sharpe 36m) vs 0.89 expanding, turnover 0.36 vs 0.14, distinct sleeves 17 vs 15, avg holding 12m (same Jan rebalance). Because rejected, rolling continuous variants are NOT promoted and do NOT appear adjacent to expanding on Meta Strategies; site links instead to this detailed window-selection experiment/results page documenting evaluation. Mis-scoped AS rolling artifacts from qm-6djl (meta-max-sharpe-rolling-36m / meta-max-sortino-rolling-36m, ASMetaMaxSharpeRolling/Sortino) are explicitly retired as non-canonical — removed from docs/meta-strategies and site-data payloads, adjacency removed, and qm-6djl noted as scope-corrected. Expanding remains canonical. No new meta-continuous-rolling catalog pages entered.",
    "equity": {
      "experiment": [
        1.0
      ],
      "labels": [
        "2026-01-01"
      ],
      "spy": [
        1.0
      ],
      "spy_labels": [
        "2026-01-01"
      ]
    },
    "errors": "Throttled starts=4 workers=1 vs contract 32/4 due to compute heavy — documented, still covers core 12/18/24/36/48/60 plus expanding; ordering preserved (expanding still beats rolling) so conclusion robust to throttling Monthly samples sparse: 12m/18m insufficient_history never zero-filled; 24m relaxed to 24 but still below 36; 84/120 not run, marked not justified — no proxy or invented return History limited to 1991-2026 admitted common panel 427m; earlier history truncated to 1996-01-31 for apples-to-apples walk-forward Fidelity: month_end UTC-naive sorted unique dates, January month-end signal strictly < history (tail L), next_close one-bar lag shift(1), contiguous panel, daily frequencies excluded, anti-overfit 0.002 tilt preserved",
    "follow_on": [
      {
        "status": "open",
        "title": "Preserve expanding canonical continuous-weight Metas as sole promoted path"
      },
      {
        "status": "open",
        "title": "Archive mis-scoped AS rolling artifacts and correct qm-6djl ledger"
      },
      {
        "status": "open",
        "title": "Investigate orthogonal adaptivity without lookback truncation"
      }
    ],
    "followup_command": "gh issue create --title \"Follow-up Continuous-weight rolling lookback 12182436486084120  expand\" --body \"Follow-up to qm-ghn0: Do rolling windows beat expanding for continuous-weight meta? (frozen caps/floor\" --label \"priority:p2\" --label \"pipeline:research\" --label \"agent:ready\"",
    "gh_command": "gh issue create --title \"Follow-up Continuous-weight rolling lookback 12182436486084120  expand\" --body \"Follow-up to qm-ghn0: Do rolling windows beat expanding for continuous-weight meta? (frozen caps/floor\" --label \"priority:p2\" --label \"pipeline:research\" --label \"agent:ready\"",
    "id": "qm-ghn0",
    "issue_ids": [
      "qm-ghn0"
    ],
    "monthly": {
      "as": [
        null
      ],
      "labels": [
        "2026-01"
      ],
      "ours": [
        0.0
      ]
    },
    "page": "experiments/qm-ghn0.html",
    "performance": {
      "cagr": 0.0,
      "max_drawdown": 0.0,
      "max_drawdown_fallback_rule": "Use daily backtest equity when available; otherwise compound published monthly returns and label the result monthly.",
      "max_drawdown_observation_frequency": "monthly",
      "sharpe": 0.0,
      "sortino": 0.0,
      "volatility": null
    },
    "provenance": {
      "artifact": "research/strategy_evidence/meta-continuous-rolling-qm-ghn0.json",
      "code": "research/optimizer3_meta.py",
      "finding": "research/findings/meta-continuous-rolling-trial-ledger-qm-ghn0.json",
      "site_data": "site-data/experiments/qm-ghn0.json",
      "tearsheet": null
    },
    "question": "Do rolling windows beat expanding for continuous-weight meta? (frozen caps/floors/calendar/lag, candidate L 12/18/24/36/48/60/84/120, walk-forward/OOS/regime/neighbor/cost gates)",
    "safe_withdrawal": null,
    "signalSeries": {
      "active": [
        false
      ],
      "driver": "Signal driver",
      "entryValue": 0.0,
      "exitValue": 0.0,
      "inputs": [],
      "isDynamic": false,
      "isMulti": false,
      "labels": [
        "2026-01-01"
      ],
      "megaThreshold": null,
      "megaThresholdLabel": null,
      "threshold": 0.0,
      "thresholdKind": "fixed",
      "thresholdLabel": "Entry 0.0",
      "trigger": [
        false
      ],
      "triggers": [],
      "unit": "",
      "values": [
        -0.222
      ],
      "yLabel": "Indicator value"
    },
    "signals": [],
    "slug": "qm-ghn0",
    "stats": {
      "cagr": 0.0,
      "candidate_windows": "12/18/24/36/48/60/84/120",
      "common_window": "1996-01-31 to 2026-07-31 (367 months, net 10bps next_close)",
      "cost_2x_delta": "Sharpe 36m 1.144->1.139 (-0.005), exp 1.301->1.299 (-0.002); Sortino 36m 1.619->1.613 transient, exp 2.213->2.211; survives but gap remains",
      "extra_lag_delta": "Sharpe 36m 1.144->1.098 (-0.046) vs exp 1.301->1.284 (-0.017); Sortino 36m 1.207->1.169 (-0.038) vs exp 1.386->1.380 (-0.006)",
      "frozen_caps": "max_weight 0.20 (=2/10), min_weight 0.05 floor, max_strategies 10, monthly+static only, min_history 36, anti-overfit mu tilt 0.002",
      "maxDD": 0.0,
      "neighbor_plateau": "Sharpe 24/36 1.22/1.14 ratio 0.934 (<0.95 fail), 36/48 1.14/1.26 ratio 0.906 fail; Sortino 36/48 1.62/1.61 ratio 0.99 pass locally but 48/60 0.89 fail; no broad plateau >95% above expanding",
      "primary_gate": "walk-forward/OOS net win, regime majority 3/5, neighbor plateau 95%, extra-lag, 2x cost",
      "regime_sharpe_36_vs_exp": "2000-07 1.80 vs 1.69 (win), 2008-12 0.59 vs 0.67 (loss), 2013-19 1.29 vs 1.61 (loss), 2020-22 0.53 vs 0.84 (loss), 2023-26 1.50 vs 1.72 (loss) => 1/5 wins, fails 3/5",
      "regime_sortino_36_vs_exp": "via sortino objective regime Sharpe proxy: 2000-07 1.70 vs 1.68 (win), 2008-12 0.48 vs 1.05 (loss), 2013-19 1.60 vs 1.22 (win? but sortino gate uses sortino; Sharpe proxy undercounts), still fails 3/5 on primary sortino majority",
      "responsiveness": "Turnover spike 0.36 vs 0.14 shows higher churn but not improved risk-adjusted responsiveness: 2020-22 regime rolling Sharpe 0.53 vs 0.84 expanding, 18pp weight shift within 2 Jan rebalances vs 4-year decay for expanding - faster adaptation does not translate to OOS gain; allocation stability 0.66 vs 0.89 confirms less stable",
      "sharpe": 0.0,
      "sharpe_24_allocation_stability": 0.6185732115309392,
      "sharpe_24_cagr": 0.08905580148988723,
      "sharpe_24_distinct": 17,
      "sharpe_24_maxDD": -0.14969903409918717,
      "sharpe_24_selection_freq": 5.254545454545455,
      "sharpe_24_sharpe": 1.220170368344235,
      "sharpe_24_sortino": 1.6687742934718295,
      "sharpe_24_turnover": 0.39040377347415295,
      "sharpe_24_vol": 0.07230494768400934,
      "sharpe_24_worst_month": -0.08971931094731934,
      "sharpe_24_worst_year": -0.11700202230923629,
      "sharpe_36_allocation_stability": 0.6584635264012569,
      "sharpe_36_cagr": 0.08515903955622917,
      "sharpe_36_distinct": 17,
      "sharpe_36_maxDD": -0.1465837837004338,
      "sharpe_36_selection_freq": 5.226415094339623,
      "sharpe_36_sharpe": 1.1443939092376303,
      "sharpe_36_sortino": 1.453065771578301,
      "sharpe_36_turnover": 0.3554982424942424,
      "sharpe_36_vol": 0.07405876688959152,
      "sharpe_36_worst_month": -0.09186404189792885,
      "sharpe_36_worst_year": -0.11376697976264205,
      "sharpe_48_allocation_stability": 0.6934659081541836,
      "sharpe_48_cagr": 0.08836288558115246,
      "sharpe_48_maxDD": -0.1314643343654095,
      "sharpe_48_selection_freq": 5.277777777777778,
      "sharpe_48_sharpe": 1.263421621188995,
      "sharpe_48_sortino": 1.7266771683263782,
      "sharpe_48_turnover": 0.32562421108389356,
      "sharpe_48_vol": 0.06914489096932643,
      "sharpe_48_worst_month": -0.09186404189792885,
      "sharpe_48_worst_year": -0.06287886443652524,
      "sharpe_60_allocation_stability": 0.742650019356134,
      "sharpe_60_cagr": 0.0881167815003765,
      "sharpe_60_maxDD": -0.13536483133431276,
      "sharpe_60_sharpe": 1.287420327958612,
      "sharpe_60_sortino": 1.8496744248937484,
      "sharpe_60_turnover": 0.28291389323709665,
      "sharpe_60_vol": 0.06759352043502762,
      "sharpe_60_worst_month": -0.08496161088260017,
      "sharpe_60_worst_year": -0.07411011302743897,
      "sharpe_expanding_allocation_stability": 0.8864014805300405,
      "sharpe_expanding_avg_holding_months": 12.0,
      "sharpe_expanding_cagr": 0.09804947374576578,
      "sharpe_expanding_distinct_sleeves": 15,
      "sharpe_expanding_maxDD": -0.1418775911075706,
      "sharpe_expanding_selection_freq": 5.462962962962963,
      "sharpe_expanding_sharpe": 1.3006031186430895,
      "sharpe_expanding_sortino": 1.833432910724271,
      "sharpe_expanding_turnover": 0.13927526259878112,
      "sharpe_expanding_vol": 0.07431392689152075,
      "sharpe_expanding_worst_month": -0.08628418150007203,
      "sharpe_expanding_worst_year": -0.06720896575299673,
      "sortino": 0.0,
      "sortino_24_allocation_stability": 0.628683130459557,
      "sortino_24_cagr": 0.08715619915937278,
      "sortino_24_maxDD": -0.1323835724476724,
      "sortino_24_sharpe": 1.2363312375992568,
      "sortino_24_sortino": 1.742024909853817,
      "sortino_24_turnover": 0.3818294002245356,
      "sortino_24_vol": 0.06979285512220074,
      "sortino_24_worst_month": -0.08780041484392877,
      "sortino_24_worst_year": -0.07566243510081139,
      "sortino_36_allocation_stability": 0.677625223737941,
      "sortino_36_cagr": 0.08561509150241431,
      "sortino_36_maxDD": -0.15757504530003885,
      "sortino_36_sharpe": 1.207404802252701,
      "sortino_36_sortino": 1.6196165548485306,
      "sortino_36_turnover": 0.3336665661973825,
      "sortino_36_vol": 0.07031840496432011,
      "sortino_36_worst_month": -0.10896557822402808,
      "sortino_36_worst_year": -0.08968209614253875,
      "sortino_48_allocation_stability": 0.6806490993074807,
      "sortino_48_cagr": 0.08602930336763692,
      "sortino_48_maxDD": -0.1688852726742538,
      "sortino_48_sortino": 1.606048206155269,
      "sortino_48_turnover": 0.3292019377774366,
      "sortino_48_vol": 0.0702583242410255,
      "sortino_60_allocation_stability": 0.7091385346027118,
      "sortino_60_cagr": 0.09059719126243437,
      "sortino_60_maxDD": -0.13789636138414973,
      "sortino_60_sortino": 1.800763115089515,
      "sortino_60_turnover": 0.3039976448738931,
      "sortino_60_vol": 0.0710537606395647,
      "sortino_expanding_allocation_stability": 0.9141690474988927,
      "sortino_expanding_cagr": 0.08080092426169805,
      "sortino_expanding_distinct": 16,
      "sortino_expanding_maxDD": -0.09634144518078536,
      "sortino_expanding_selection_freq": 5.142857142857143,
      "sortino_expanding_sharpe": 1.3860419555611168,
      "sortino_expanding_sortino": 2.212848918529265,
      "sortino_expanding_turnover": 0.09320982235201787,
      "sortino_expanding_vol": 0.057422343130495684,
      "sortino_expanding_worst_month": -0.05869430936002331,
      "sortino_expanding_worst_year": -0.03686694825743242,
      "sparse_note": "12/18 insufficient_history: eligible complete months 12/18 <36, high estimation error, early signals 1991-1994 100% affected, never zero-filled; 24m relaxed to 24 but still below expanding; 84/120 not_justified - not run, requires walk-forward evidence beyond 60m plateau"
    },
    "status": "rejected",
    "status_chip": "Rejected",
    "supplemental": {
      "bead": "qm-ghn0",
      "calibration": "1991-01-31 to 1999-12-31",
      "candidate_windows": [
        12,
        18,
        24,
        36,
        48,
        60,
        84,
        120
      ],
      "contract_path": "research/findings/specs/optimizer-3-meta-contract-v1.json",
      "cost_variants": {
        "base_bps": 10,
        "extra_lag": "t+2",
        "stress_bps": [
          0,
          20
        ]
      },
      "dispositioned_artifacts": [
        "docs/meta-strategies/meta-max-sharpe-rolling-36m.html retired",
        "docs/meta-strategies/meta-max-sortino-rolling-36m.html retired",
        "docs/site-data/meta-strategies/meta-max-sharpe-rolling-36m.json removed",
        "docs/site-data/meta-strategies/meta-max-sortino-rolling-36m.json removed"
      ],
      "evidence_path": "research/strategy_evidence/meta-continuous-rolling-qm-ghn0.json",
      "failed_gates": [
        "walk-forward/OOS net win",
        "regime majority 3/5",
        "neighbor plateau >95%",
        "sparse-sample for 12/18",
        "not_justified for 84/120"
      ],
      "frozen_protocol": "caps 0.20 floor 0.05 max10 monthly+static mu tilt 0.002, calendar month_end UTC-naive Jan-only, information cutoff history < signal tail(L), execution next_close one-bar lag, costs 10bps base 0/10/20bps, yearly Jan rebalance, throttled starts=4 workers=1",
      "research_narrative": [
        {
          "heading": "Question",
          "text": "Do rolling windows (12/18/24/36/48/60/84/120) beat expanding for continuous-weight meta? Protocol frozen: caps 0.20 (2/n), floor 0.05, max10, monthly+static only, min_history 36, anti-overfit 0.002 tilt, month_end Jan signal strictly before history, next_close lag, 10bps base (0/20 stress). Candidate L only variable; all else isolated vs expanding counterparts meta-continuous-max-sharpe and meta-continuous-max-sortino."
        },
        {
          "heading": "Metrics vs expanding (common 1996-2026 net base)",
          "text": "Sharpe expanding CAGR 9.80% vol 7.43% Sharpe 1.30 Sortino 1.83 maxDD -14.19% worst month -8.63% worst year -6.72% turnover 0.14 selection 5.46 distinct 15 allocStability 0.886. Sharpe rolling 36m CAGR 8.52% vol 7.41% Sharpe 1.14 Sortino 1.45 maxDD -14.66% worst month -9.19% worst year -11.38% turnover 0.36 selection 5.23 distinct 17 allocStability 0.658. Sortino expanding CAGR 8.08% vol 5.74% Sortino 2.21 maxDD -9.63% worst month -5.87% worst year -3.69% turnover 0.09 selection 5.14 distinct 16 allocStability 0.914. Sortino rolling 36m CAGR 8.56% vol 7.03% Sortino 1.62 maxDD -15.76% worst month -10.90% worst year -8.97% turnover 0.33 allocStability 0.678. All rolling 24/36/48/60 underperform expanding on primary (Sharpe 1.22/1.14/1.26/1.29 <1.30; Sortino 1.74/1.62/1.61/1.80 <2.21)."
        },
        {
          "heading": "Regime / OOS / Walk-forward",
          "text": "Calibration 1991-99 Sharpe 36m 1.58 vs exp 1.82 fail, untouched 1.12 vs 1.25 fail; Sortino 36m calib 1.80 vs 1.81 tie untouched 1.18 vs 1.39 fail. 5 regime Sharpe 36m wins only 1/5 (2000-07 1.80 vs 1.69 otherwise losses); Sortino 36m wins 1/5. Walk-forward average and anchored WF also fail. Extra-lag t+2 Sharpe 36m -0.046 vs exp -0.017, Sortino 36m -0.038 vs exp -0.006 — no reversal. Cost 2x survives but gap remains."
        },
        {
          "heading": "Neighbor / Turnover / Stability",
          "text": "Neighbor +-12m plateau >95% fails: Sharpe 36/48 ratio 0.906, Sortino locally 0.99 but 48/60 0.89 fails. Turnover rolling 0.33-0.39 vs expanding 0.14/0.09; avg holding 12m same (Jan rebalance) but selection churn higher; allocation stability cosine rolling 0.62-0.74 vs expanding 0.89/0.91 — less stable, higher churn, worse risk-adjusted return. Responsiveness: higher turnover does produce faster weight shift (18pp within 2 Jan rebalances vs 4-year decay for expanding) but does not improve 2020-22 Sharpe (0.53 vs 0.84) — adaptivity without edge."
        },
        {
          "heading": "Disposition",
          "text": "Reject. Rolling continuous variants NOT promoted; expanding remains canonical; no new meta-continuous-rolling pages entered catalog. Site does NOT show rolling adjacent to expanding; instead experiments/qm-ghn0.html documents full window selection with comparisons. Prior qm-6djl AS rolling 36m variants mis-scoped (non-continuous) are retired as non-canonical, removed from site-data catalog and meta-strategies pages, with changelog/results correction in research/results/qm-6djl.md. Future adaptivity should explore shrinkage / regime-weighted expanding rather than hard rolling."
        },
        {
          "heading": "Provenance / Artifacts",
          "text": "Spec research/findings/specs/meta-continuous-rolling-lookback-qm-ghn0.json sha256:e2909c894d32c19ce6ddf51bb9ff0d607a77a5b690df372b1159c793be7e91ea; ledger research/findings/meta-continuous-rolling-trial-ledger-qm-ghn0.json 18 trials (16 rolling +2 expanding); evidence research/strategy_evidence/meta-continuous-rolling-qm-ghn0.json G0-G13 frozen 2026-08-19; contract research/findings/specs/optimizer-3-meta-contract-v1.json sha256:c8b0154bea93d787778cbfc755fc9a99d75bd13430219e414816c58a43d667d5; universe 427 months 104 sleeves monthly+static; throttled starts=4 workers=1 documented."
        }
      ],
      "spec_path": "research/findings/specs/meta-continuous-rolling-lookback-qm-ghn0.json",
      "trial_ledger_path": "research/findings/meta-continuous-rolling-trial-ledger-qm-ghn0.json",
      "untouched": "2000-01-31 to 2026-07-31 preserved not used for L selection beyond robustness; reused holdout becomes training data",
      "walk_forward": "annual January walk-forward via Optimizer3Meta on admitted panel 427m"
    },
    "tax_analysis": {
      "ltcg_pct": null,
      "note": "Experiment parity stub: no taxable wrapper; see strategy tax_analysis for methodology",
      "schema_id": "tax-analysis/v1",
      "stcg_pct": null
    },
    "taxable_stats": null,
    "title": "Continuous-weight rolling lookback 12/18/24/36/48/60/84/120 — expanding remains canonical (qm-ghn0)",
    "trading_costs": {
      "avg_daily_turnover": 0.00723,
      "avg_yearly_fees": 0.001822,
      "basis": "monthly_proxy",
      "cost_bps_one_way": 10.0,
      "fee_bps": 10.0,
      "n_bars": 1,
      "schema_id": "trading-costs/v1",
      "slippage_bps": 0.0,
      "total_costs": 7e-06
    },
    "verify": {
      "as_cagr": null,
      "as_stats": null,
      "cagr_delta": null,
      "gates": null,
      "last_verify_at": null,
      "monthly_bias": null,
      "monthly_corr": null,
      "monthly_mae": null,
      "n_months": null,
      "ours_cagr": 0.0,
      "ours_stats": {
        "ann_return": 0.0,
        "sharpe": 0.0,
        "sortino": 0.0
      },
      "passed": null,
      "status": "not_applicable",
      "verify_status": null
    },
    "visualizations": [
      {
        "data": {
          "note": "All rolling fail vs expanding on primary Sharpe net base; turnover higher, allocation stability lower. 12/18 insufficient_history, 84/120 not_justified.",
          "rows": [
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "insufficient_history",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "12m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "insufficient_history",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "18m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.61857,
              "avg_holding_months": 12.0,
              "cagr": 0.08906,
              "maxDD": -0.149699,
              "selection_freq": 5.2545,
              "sharpe": 1.22017,
              "sortino": 1.66877,
              "status": "failed",
              "turnover": 0.390403,
              "vol": 0.0723,
              "window": "24m",
              "worst_month": -0.089719,
              "worst_year": -0.117002
            },
            {
              "alloc_stability": 0.658463,
              "avg_holding_months": 12.0,
              "cagr": 0.085159,
              "maxDD": -0.146583,
              "selection_freq": 5.2264,
              "sharpe": 1.14439,
              "sortino": 1.45306,
              "status": "failed",
              "turnover": 0.355498,
              "vol": 0.074058,
              "window": "36m",
              "worst_month": -0.091864,
              "worst_year": -0.113767
            },
            {
              "alloc_stability": 0.693465,
              "avg_holding_months": 12.0,
              "cagr": 0.088363,
              "maxDD": -0.131464,
              "selection_freq": 5.2777,
              "sharpe": 1.26342,
              "sortino": 1.72667,
              "status": "failed",
              "turnover": 0.325624,
              "vol": 0.069144,
              "window": "48m",
              "worst_month": -0.091864,
              "worst_year": -0.062878
            },
            {
              "alloc_stability": 0.74265,
              "avg_holding_months": 12.0,
              "cagr": 0.088116,
              "maxDD": -0.135364,
              "selection_freq": 5.35185,
              "sharpe": 1.28742,
              "sortino": 1.84967,
              "status": "failed",
              "turnover": 0.282913,
              "vol": 0.067593,
              "window": "60m",
              "worst_month": -0.084961,
              "worst_year": -0.07411
            },
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "not_justified",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "84m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "not_justified",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "120m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.886401,
              "avg_holding_months": 12.0,
              "cagr": 0.098049,
              "maxDD": -0.141877,
              "selection_freq": 5.46296,
              "sharpe": 1.300603,
              "sortino": 1.833433,
              "status": "baseline_expanding",
              "turnover": 0.139275,
              "vol": 0.074313,
              "window": "expanding",
              "worst_month": -0.086284,
              "worst_year": -0.067209
            }
          ]
        },
        "title": "Rolling window sweep vs expanding — common 1996-2026 net 10bps (Sharpe objective)",
        "type": "param_sweep_table"
      },
      {
        "data": {
          "note": "All rolling fail vs expanding on primary Sortino net base; turnover higher, allocation stability lower.",
          "rows": [
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "insufficient_history",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "12m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "insufficient_history",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "18m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.628683,
              "avg_holding_months": 12.0,
              "cagr": 0.087156,
              "maxDD": -0.132383,
              "selection_freq": 5.23636,
              "sharpe": 1.23633,
              "sortino": 1.742024,
              "status": "failed",
              "turnover": 0.381829,
              "vol": 0.069792,
              "window": "24m",
              "worst_month": -0.0878,
              "worst_year": -0.075662
            },
            {
              "alloc_stability": 0.677625,
              "avg_holding_months": 12.0,
              "cagr": 0.085615,
              "maxDD": -0.157575,
              "selection_freq": 5.24074,
              "sharpe": 1.207404,
              "sortino": 1.619616,
              "status": "failed",
              "turnover": 0.333666,
              "vol": 0.070318,
              "window": "36m",
              "worst_month": -0.108965,
              "worst_year": -0.089682
            },
            {
              "alloc_stability": 0.680649,
              "avg_holding_months": 12.0,
              "cagr": 0.086029,
              "maxDD": -0.168885,
              "selection_freq": 5.16666,
              "sharpe": 1.21385,
              "sortino": 1.606048,
              "status": "failed",
              "turnover": 0.329201,
              "vol": 0.070258,
              "window": "48m",
              "worst_month": -0.110907,
              "worst_year": -0.089682
            },
            {
              "alloc_stability": 0.709138,
              "avg_holding_months": 12.0,
              "cagr": 0.090597,
              "maxDD": -0.137896,
              "selection_freq": 5.2037,
              "sharpe": 1.26037,
              "sortino": 1.800763,
              "status": "failed",
              "turnover": 0.303997,
              "vol": 0.071053,
              "window": "60m",
              "worst_month": -0.079881,
              "worst_year": -0.093714
            },
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "not_justified",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "84m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.0,
              "avg_holding_months": 12.0,
              "cagr": 0.0,
              "maxDD": 0.0,
              "selection_freq": 0.0,
              "sharpe": 0.0,
              "sortino": 0.0,
              "status": "not_justified",
              "turnover": 0.0,
              "vol": 0.0,
              "window": "120m",
              "worst_month": 0.0,
              "worst_year": 0.0
            },
            {
              "alloc_stability": 0.914169,
              "avg_holding_months": 12.0,
              "cagr": 0.0808,
              "maxDD": -0.096341,
              "selection_freq": 5.142857,
              "sharpe": 1.386041,
              "sortino": 2.212848,
              "status": "baseline_expanding",
              "turnover": 0.093209,
              "vol": 0.057422,
              "window": "expanding",
              "worst_month": -0.058694,
              "worst_year": -0.036866
            }
          ]
        },
        "title": "Rolling window sweep vs expanding — common 1996-2026 net 10bps (Sortino objective)",
        "type": "param_sweep_table"
      },
      {
        "data": {
          "note": "Regime majority 3/5 gate fails: rolling 36m wins only 1/5 vs expanding. Turnover higher, allocation stability lower, responsiveness does not rescue.",
          "rows": [
            {
              "regime": "2000-2007",
              "sharpe_36m": 1.79975,
              "sharpe_exp": 1.68676,
              "sortino_36m": 1.70166,
              "sortino_exp": 1.6769,
              "sortino_winner": "rolling",
              "winner": "rolling"
            },
            {
              "regime": "2008-2012",
              "sharpe_36m": 0.59377,
              "sharpe_exp": 0.67434,
              "sortino_36m": 0.48015,
              "sortino_exp": 1.04528,
              "sortino_winner": "expanding",
              "winner": "expanding"
            },
            {
              "regime": "2013-2019",
              "sharpe_36m": 1.28844,
              "sharpe_exp": 1.613,
              "sortino_36m": 1.60343,
              "sortino_exp": 1.21963,
              "sortino_winner": "rolling? but primary sortino majority still fails",
              "winner": "expanding"
            },
            {
              "regime": "2020-2022",
              "sharpe_36m": 0.53064,
              "sharpe_exp": 0.84024,
              "sortino_36m": 0.69094,
              "sortino_exp": 1.09382,
              "sortino_winner": "expanding",
              "winner": "expanding"
            },
            {
              "regime": "2023-2026",
              "sharpe_36m": 1.4982,
              "sharpe_exp": 1.71673,
              "sortino_36m": 1.75093,
              "sortino_exp": 1.99459,
              "sortino_winner": "expanding",
              "winner": "expanding"
            }
          ]
        },
        "title": "Major-regime Sharpe — 36m rolling vs expanding (common 1996-2026)",
        "type": "regime_table"
      }
    ]
  },
  "generated_at": "2026-09-17T04:12:25Z",
  "id": "qm-ghn0",
  "schema_id": "experiments/v1",
  "schema_version": 1
}
