The live-forward pipeline keeps research artifacts and the public website separate:
Yahoo Finance and cached inputs
|
v
Daily live-forward pipeline
- refresh official closes for archived cohorts
- extend frozen Ridge and XGBoost portfolios
- replay 1-60-session replacement policies
- calculate returns, costs, and turnover
|
+--> reports/live_forward/ private, ignored research evidence
|
+--> public sanitizer and validator
|
v
site/ committed static bundle
|
v
GitHub Actions / Pages
reports/live_forward/ remains the full local evidence store. The publisher uses
separate explicit field allowlists for model snapshots and frozen-cohort policy
paths when it creates site/data/dashboard.json; it does not copy local paths,
cached input names, raw price/feature rows, model files, credentials, or
candidate-trial details. The public bundle is then validated for required files,
snapshot and cohort schemas, duplicate identifiers or holdings, forbidden
private strings, and a SHA-256 digest.
The standard daily command now refreshes both the local dashboard and the public bundle:
python -m src.cli run-live-forward-daily --as-of YYYY-MM-DDThis command is monitoring-only by default and reports
"new_model_lists": 0. It rebuilds:
reports/live_forward/cohort_monitor.json;reports/live_forward/dashboard.html; and- the tracked
site/deployment bundle.
The historical one-session retraining path requires the explicit --retrain
flag. It should not be used during the frozen-cohort policy experiment.
To rebuild the public bundle without retraining:
python -m src.cli publish-live-dashboard \
--live-root reports/live_forward \
--output-dir siteValidate exactly what will be published:
python -m src.cli validate-live-dashboard-site --site-dir siteCommit site/ after reviewing the generated changes. A pull request that
changes the public bundle runs the validation and packaging job without
deploying. After merge, the resulting push to main runs the same validation,
uploads the Pages artifact, and deploys it to the github-pages environment.
The deploy job is explicitly restricted to refs/heads/main.
The scheduled public refresh runs at 22:30 UTC on weekdays, after the regular
US market close. It reconstructs the frozen-cohort monitor from the sanitized
portfolio selections already committed in site/data/dashboard.json, downloads
only their adjusted closes and SPY, validates the bundle, commits changed public
JSON, and deploys that exact version. It does not access the ignored reports/
directory, model files, news data, API credentials, or local caches. On market
holidays, the refresh detects that the latest official close is already
published and leaves the site unchanged.
The scheduled workflow is
refresh-dashboard.yml. It can
also be launched manually from GitHub Actions when a scheduled run needs to be
repeated.
In the GitHub repository, open Settings > Pages and set Source to GitHub Actions. After the workflow succeeds, the expected project URL is:
https://hansun103.github.io/AI-Driven-Portfolio-Optimization-Backtesting-System/
Deployment intentionally runs from main, so work on the live-forward branch must be reviewed and
merged before it becomes public. The browser fetches only static JSON, CSS, and JavaScript; no API
server, token, database, or LLM service is required.
The workflow does not deploy when the sanitizer output is absent, malformed, contains a blocked private marker, contains duplicate selected tickers, or does not match its deployment-manifest hash. A failed deployment leaves the previously successful Pages version online.