@@ -155,14 +155,38 @@ flowchart LR
155155
156156See [ Qlib and ML winner-selection research notes] ( docs/research/2026-07-17-qlib-winner-selection-research.md ) .
157157
158+ The controlled U.S. replication is now implemented with the exact 158-feature contract, a
159+ Qlib-style LightGBM regressor, raw and sector-neutral residual targets, identical temporal folds,
160+ and a fixed 40-stock portfolio. Build the cached feature panel and run all four arms with:
161+
162+ ``` bash
163+ pip install -e " .[tuning]"
164+ python -m src.cli build-qlib-alpha158-dataset
165+ python -m src.cli run-qlib-alpha158-comparison
166+ python -m src.cli run-alpha158-feature-ablation
167+ python -m src.cli run-double-ensemble-v10 \
168+ --output reports/experiments/double_ensemble_v10_consensus
169+ ```
170+
171+ The Ridge-controlled feature ablation found no verified incremental Alpha158 benefit: adding
172+ Alpha158 raised mean Rank IC from 0.0102 to 0.0114, but the paired confidence interval included
173+ zero and top-40 excess return fell from 0.1006% to 0.0646% per week. See the
174+ [ Alpha158 U.S. experiment record] ( docs/experiments/2026-07-20-qlib-alpha158-us.md ) .
175+
176+ The model-specific v10 study gave Ridge, LightGBM, and XGBoost independent Optuna searches and
177+ fold-safe shuffle-ablation selection. XGBoost achieved the strongest top-40 point estimate
178+ (0.2121% weekly excess) but its paired confidence interval included zero. LightGBM and the
179+ validation-weighted ensemble failed out of sample, so the ensemble remains disabled. See the
180+ [ v10 experiment record] ( docs/experiments/2026-07-20-double-ensemble-v10.md ) .
181+
158182## Key Modules
159183
160184| Module | Role |
161185| ---| ---|
162186| ` src/data ` | Market data, macro data, point-in-time universe, price repair, and caching |
163- | ` src/features ` | Technical, cross-sectional, macro, and NLP feature generation |
187+ | ` src/features ` | Technical, Alpha158, cross-sectional, macro, and NLP feature generation |
164188| ` src/targets ` | Weekly residual-return ranking targets |
165- | ` src/models ` | Ridge and XGBoost ranking models |
189+ | ` src/models ` | Ridge, XGBoost ranking, and LightGBM cross-sectional models |
166190| ` src/portfolio ` | Sparse ranking, active tilts, risk models, and costs |
167191| ` src/backtest ` | Walk-forward execution, accounting, and metrics |
168192| ` src/nlp ` | FinBERT, topic, event, and text-source pipelines |
@@ -220,6 +244,26 @@ the latest close, and a frozen paper portfolio plus `model_selection.csv` are sa
220244next-session returns; otherwise the forward test stops being clean. This daily proxy is designed to
221245collect evidence faster than waiting ten calendar weeks for ten weekly rebalance observations.
222246
247+ For the recurrent after-close experiment, use the one-call daily pipeline instead of running the
248+ monitor, two model families, and dashboard separately:
249+
250+ ``` bash
251+ python -m src.cli run-live-forward-daily --as-of 2026-07-22
252+ ```
253+
254+ The [ live-forward operating guide] ( docs/LIVE_FORWARD_MONITOR.md ) documents the close-data guard,
255+ frozen-snapshot contract, dashboard timestamps, model-overlap metrics, and generated artifacts.
256+
257+ The daily command first refreshes the latest prior Ridge and XGBoost portfolios against the
258+ completed session. Yahoo's final hourly bar begins at 15:30, so the command requires that bar and
259+ retries five times at 60-second intervals if it is not available yet. It then requires an official
260+ daily price row for the decision date, independently tunes and refits Ridge and XGBoost, saves both
261+ new top-40 portfolios, writes ` selection_stability_YYYY-MM-DD.json ` , and rebuilds the shared
262+ dashboard. The stability report tracks same-day model overlap, day-over-day retention, top-10
263+ persistence, rank correlation, entrants/exits, implied replacement, and multi-day consensus names.
264+ This ordering prevents a successful model retrain from leaving the performance chart stuck at an
265+ earlier intraday bar.
266+
223267The July 20, 2026 production-style run requested 25 Optuna trials with a 600-second timeout. Ten
224268trials completed, using three 42-session validation folds separated from training by a one-session
225269purge. The selected model was Ridge with ` alpha=6156.9973 ` , aggregate validation Rank IC of
@@ -261,9 +305,10 @@ Build the static monitoring dashboard:
261305python -m src.cli build-live-dashboard
262306```
263307
264- The dashboard reads every saved snapshot under ` reports/live_forward/ ` , supports changing the
265- snapshot and evaluation horizon, and shows portfolio return, benchmark return, active return,
266- stock-level winners/losers versus SPY, model-selection evidence, and experiment history.
308+ The dashboard reads every saved snapshot under ` reports/live_forward/ ` , overlays Ridge, XGBoost,
309+ and SPY on one multi-session chart, provides date-range controls, identifies the next frozen
310+ portfolios whose returns are pending, and shows human-readable model and stock-level evidence. It
311+ is refreshed by the daily pipeline, snapshot, intraday-report, and evaluation commands.
267312
268313Build the earlier conservative final-reference package:
269314
0 commit comments