WP46 progress log
All times ET. "Done" means executed with the listed command and artefact; "planned" means not yet executed.
Phase 0 — Inventory and literature (done 2026-11-09)
- Repository reconnaissance:
Recherche-UQO/conventions (HARMONISATION.md), WP41 as the FinData template; folderfinance/wp46_garch_benchmark, repogitsrv:srv/git/wp46_uqo.gitcreated 2026-11-09. - FinData audit:
.venv/bin/python scripts/audit_findata.py→docs/findata_audit.md,results/manifests/findata_audit.json(live API, 42 candidates, 0 errors). Dedicated API keywp46_uqo_c(scopes read:market, query, export; two earlier keys revoked). - Literature:
scripts/build_references.py→paper/references.bib(205 entries: 200 Crossref/arXiv/OpenAlex-verified + 5 manual URL),docs/literature_matrix.md,results/metrics/references_verification.json(1 unverified: Chung 1999, excluded). - Gate 0: PASS (evidence-backed instrument list; no invented endpoints).
Phase 1 — Pre-registered protocol (done 2026-11-09, freeze tag prereg-frozen)
docs/preregistered_protocol.md,configs/{model_registry,forecast_protocol,study,instruments}.yaml,docs/methodology_decisions.md(D-01…D-15).- Disclosure: SPY 2024 forecast values (no losses) were inspected during driver smoke tests before the freeze (D-15); the pilot (Phase 2) used the validation period 2012–2015 only.
Phase 2 — Trusted data and pilot (done 2026-11-09)
- Ingestion on M3U96a:
scripts/ingest_bars.py --workers 3(1-min + daily bars, 42 instruments + VIX/SPX; manifestresults/manifests/ingest_manifest.jsonwith dataset versions and SHA-256) — cacheM3U96a:~/wp46-cache/bars(not in git). - Panels:
scripts/build_panels.py(3 runs: tz fix, per-instrument session length D-05, crypto cutoff D-06) →~/wp46-cache/panels/*.parqueton M3U96a, laptop and the 5 other compute nodes;results/manifests/panels_manifest.json. - Tests:
pytest tests/unit tests/integration(19 passed),pytest tests/simulation -m slow(5 passed after fixing the NAGARCH parameter index in the test),pytest tests/replication -m r(rugarch 1.5-6 cross-check PASS;results/metrics/rugarch_crosscheck.json). - Pilot:
scripts/run_pilot.py --symbols SPY,AAPLand--symbols CL,EURUSD(validation period) →results/metrics/pilot/; leakage check passed (future returns perturbed → forecasts unchanged). - Gate 2: PASS (see
docs/feasibility_report.md).
Phase 3–5 — Benchmark, realized/multivariate tiers, inference (in progress)
- Job list:
scripts/make_jobs.py --name main→ 3,276 jobs (42 instruments × 29 implemented models × distributions), OOS 2012-01-03 → 2026-10-30. - Dispatch:
scripts/dispatch_nodes.py launch --jobs results/manifests/jobs_main.json --name main(M3U96a/M3U96b/M2U64/M5M36/M4M64a/M4M64c).
Open issues
- FIGARCH: arch and rugarch differ by 1.47 log-likelihood units on the fixture (truncation/constraints) — caveat in the model card.
- Crypto realized measures unusable before 2022 (D-06): crypto Tier B / proxy-based evaluation covers 2022–2026 only.
Amendments after the freeze
- A-01 (2026-11-09, during the main run): the arch wrapper passed a seeded generator only for Gaussian innovations; simulation
forecasts (h > 1) of EGARCH/APARCH/TGARCH/AVGARCH with t/GED/skew-t innovations were drawn from an unseeded generator.
Fixed (
DISTS[dist](seed=seed)); the 504 affected jobs are re-run so that every forecast is bit-reproducible. No change to the protocol (Monte Carlo noise only; 2,000 paths). Found by the model-card audit (model_cards/_discrepancies.md). - A-02 (2026-11-09): registry bibkeys corrected to the verified keys (zumbach2009riskmetrics, gonzalezrivera1998smooth, hansen2016exponential). Documentation only.
- A-03 (2026-11-09): tests added for GARCH-M (nesting of GARCH(1,1) at delta = 0, recovery), QGARCH (recovery), and cross-checks extended to TGARCH (rugarch fGARCH/TGARCH), GAS-t (R package GAS, inverse-information scaling), GARCH-X return equation (rugarch external regressor) and MS-GARCH likelihood and 22-step forecasts (R package MSGARCH). Verification only.
- A-04 (2026-11-09): performance bug — custom models with skew-t innovations recomputed kappa = E[z^2 1{z<0}] (20,000 quantile evaluations) at every likelihood evaluation, making those jobs ~100x slower and stalling the nodes; kappa is now held at 0.5 inside the optimizer (it only enters the first-observation initialization of the GJR recursion) and computed exactly once after the fit. Runs restarted with the fix; completed jobs kept (results unaffected: the likelihood maximised is identical up to the first-observation term of the custom GJR, which is not a registry model).
- Note (2026-11-09): the first main run wrote one
_runs.jsonlper node under the same name, so the rsync merge kept a single node's manifest, andcpu_swas the cumulative CPU of the worker process. Compute accounting in the paper therefore uses the complete per-refit (time_s) and per-origin (time_fc_s) timings stored in every fits/forecast table (exact, 3,276 jobs);maxrssis reported as the per-worker peak (≈ 0.4 GB).run_benchmark.pynow records per-job CPU deltas in_runs_<host>.jsonl.