@@ -30,9 +30,12 @@ The command performs these steps in order:
3030 decision date.
31317 . Tunes Ridge and XGBoost independently on temporal validation data, refits the selected
3232 configurations, and freezes both top-40 lists for the next evaluation session.
33- 8 . Writes model-agreement, day-over-day selection-stability diagnostics, and candidate split
33+ 8 . Freezes a separate shadow portfolio by blending the two full-universe percentile rankings
34+ with the historically selected 25% Ridge / 75% XGBoost weight and applying the same top-40
35+ sector cap.
36+ 9 . Writes model-agreement, day-over-day selection-stability diagnostics, and candidate split
3437 features that are not yet eligible for model fitting.
35- 9 . Rebuilds both dashboard outputs again so they include the newly frozen pending portfolios.
38+ 10 . Rebuilds both dashboard outputs again so they include the newly frozen pending portfolios.
3639
3740If final market data is unavailable, the command retries and then fails closed. It must not create a
3841snapshot from a partial trading day.
@@ -84,8 +87,10 @@ decision date or its future return.
8487 into an earlier feature row.
8588- Split features use only completed split events on or before the feature date. Upcoming splits
8689 require a separate timestamped announcement source and are not inferred from future event dates.
87- - Ridge and XGBoost are displayed together; neither is chosen retrospectively using realized live
88- returns.
90+ - Ridge, XGBoost, and the shadow ensemble are displayed together; none is chosen retrospectively
91+ using realized live returns.
92+ - The ensemble uses 25% Ridge / 75% XGBoost, selected by expanding historical OOS folds. Each fold's
93+ reported weight used only earlier completed folds; no live realized return selected the weight.
8994- The July 20 session is a setup/test observation. The official comparison baseline begins at the
9095 July 20 SPY close, and portfolio performance begins on July 21.
9196
@@ -131,6 +136,9 @@ Generated outputs remain under the ignored `reports/live_forward/` directory:
131136
132137- dated Ridge and XGBoost snapshot directories with manifests, tuning results, predictions, and
133138 selected holdings;
139+ - dated ` ridge_xgb_ensemble/ ` shadow snapshots with normalized component ranks, selected holdings,
140+ and SHA-256 hashes of both source score files;
141+ - a model-aware ` live_forward_results.csv ` rebuilt from the canonical per-snapshot summaries;
134142- intraday and close-to-close evaluation files for each frozen portfolio;
135143- holding-level returns, benchmark-relative returns, and beat-SPY indicators for completed sessions;
136144- ` selection_stability_YYYY-MM-DD.json ` ;
@@ -144,9 +152,16 @@ one-time repository setting.
144152Keep source code, configurations, tests, and documentation in Git. Do not commit cached prices,
145153trained artifacts, generated reports, credentials, or temporary pytest directories.
146154
155+ The consolidated result key is ` (model, decision_date, evaluation date, horizon, benchmark) ` .
156+ Including ` model ` prevents one same-session XGBoost observation from overwriting Ridge. If the
157+ table is missing or suspected to be stale, ` rebuild_live_forward_results() ` reconstructs it from
158+ the intact canonical snapshot JSON files; archived experimental variants are not mixed into the
159+ official live history.
160+
147161## Interpretation boundary
148162
149- The live sample is currently too short for a performance claim. Compare Ridge, XGBoost, and SPY over
150- many independent sessions, then report active return, Rank IC, turnover, drawdown, and uncertainty.
151- Model overlap is diagnostically useful, but high consensus is neither necessary nor sufficient for
152- outperformance.
163+ The live sample is currently too short for a performance claim. Compare Ridge, XGBoost, the
164+ predeclared ensemble, and SPY over many independent sessions, then report active return, turnover,
165+ drawdown, and uncertainty. Rank IC remains a component-model diagnostic; it is not available for
166+ the ensemble until paired historical out-of-sample scores are persisted. Model overlap is
167+ diagnostically useful, but high consensus is neither necessary nor sufficient for outperformance.
0 commit comments