CHANGELOG — révision scientifique complète (editorial board, 2026-10-17)
WP 12 — Forecasting Realized Volatility Across Asset Classes — version 0.1 (août 2026, brouillon ; pipeline jamais exécuté
jusqu'au bout) → version 0.2 (octobre 2026). État figé avant révision : tag git pre-revision-20261017,
docs/main_pre-revision-20261017.pdf (9 p.). Rapport scientifique : docs/REVIEW-REPORT.md.
1. Corrections majeures du code (preuves dans le dépôt)
| # | Où | Avant | Après | Pourquoi / preuve |
|---|---|---|---|---|
| C1 | src/wp12/models_econ.py::rolling_garch_forecasts |
La prévision était tirée de l'objet res ajusté à la date de ré-estimation : entre deux ré-estimations (22 j) la prévision GARCH/GJR/EGARCH restait figée, et même à la date de ré-estimation elle conditionnait sur les rendements jusqu'à t−1 (décalage d'un jour). |
Paramètres ré-estimés tous les 22 j sur la fenêtre se terminant à l'origine t ; récursion de variance refiltrée chaque jour sur les données jusqu'à t (arch_model(...).fix(params).forecast(...)), prévision = E[σ²_{t+1..t+h} | F_t]. |
Vérifié empiriquement sur econ_SPY.parquet (v0.1) : seuls 3,3 % des jours consécutifs avaient une prévision GARCH différente (= 1/22). Les 25 fichiers econ_*.parquet ont été ré-exécutés (6 min 18 s, 16 workers) ; anciens fichiers conservés dans data/processed/forecasts_pre-revision-20261017/ (non commités). |
| C2 | src/wp12/models_econ.py::rolling_realgarch_forecasts |
Fenêtre d'estimation et filtre de l'état log h arrêtés à t−1 : première prévision = E[x_t] au lieu de E[x_{t+1}]. |
Fenêtre et filtre jusqu'à t inclus ; mu = ω + β log h_t + γ log x_t. |
Lecture du code ; ré-exécuté avec C1. |
| C3 | src/wp12/evaluation.py::model_confidence_set |
La statistique t_{i·} = d_{i·}/sqrt(var_i) était studentisée par la variance bootstrap de la perte moyenne du modèle i (var(L̄_i*)) et non par celle de l'écart à la moyenne de l'ensemble var(d̄_{i·}*) — incohérent avec Hansen-Lunde-Nason (2011, éq. T_max). |
var_i = var(boot_d) avec boot_d = L̄_i* − moyenne de l'ensemble. |
Définition HLN 2011 §3.1 ; test unitaire tests/test_evaluation.py toujours vert (18/18). |
| C4 | scripts/04_evaluate.py::attach_actuals |
Pertes moyennes, DM et MCS calculés sur les dates propres à chaque modèle (LSTM/Transformer commencent 22 j plus tard ; le pooled plus tôt car il compte le calendrier-union). | Échantillon commun par (actif, horizon) : seules les dates où tous les modèles ont une prévision sont conservées (journalisé dans la sortie de 04). | Comparabilité des pertes moyennes ; standard de la littérature. |
| C5 | src/wp12/models_ml.py::rolling_pooled_lgbm, scripts/03_run_models.py::run_pooled, scripts/05_robustness.py::part_loo |
LightGBM n_jobs=-1 (18 threads) : 9 s par ré-estimation par sursouscription ; horizons et exclusions en série (≈ 77 min pour le pooled seul). |
n_jobs=2 (2,4 s/ré-estimation) ; un processus par horizon (pooled) et par (actif exclu, horizon) (LOO) ; --part loo-forecast séparé de la comparaison. |
Chronométrage du 2026-10-17 (n_jobs=2 : 2,42 s ; 4 : 2,55 s ; 8 : 4,08 s ; 18 : 8,95 s). Fréquence de ré-estimation mensuelle inchangée. |
| C6 | scripts/05_robustness.py::part_outliers (nouveau) |
— | Sensibilité des résultats crypto aux jours de RV implausible (> 500 % annualisé) ; sortie results/reproduced/outlier_sensitivity.csv, table results/tables/outliers.tex. |
Diagnostic données : BTC 2013-04-10 (2 530 % ann.), XRP/ETH/ADA 2017 et fév. 2021 (> 1 000 %) ; cf. REVIEW-REPORT §Données. |
| C7 | scripts/08_make_tables.py::table_sensitivity |
Table fréquence × fenêtre ; plantait sans window_sensitivity.csv. |
Bloc fenêtre imprimé seulement si le fichier existe ; ratio à HAR ajouté par mesure ; table_outliers ajoutée. |
— |
| C8 | scripts/90_verify_bib.py (nouveau) |
— | Vérification Crossref de chaque entrée du .bib → docs/bib-verification.csv. |
Protocole §Références. |
| C10 | src/wp12/models_econ.py (GARCH, GJR, EGARCH, Realized GARCH) |
Aucun filtre d'insanité sur la famille GARCH alors que le texte l'annonçait pour « tous les modèles » : les prévisions EGARCH simulées explosaient (max 7,6·10²⁴⁸ sur TLT/EURUSD/ZN…), contaminant Comb-Mean/Comb-InvMSE et le MSE (overflow). | Filtre d'insanité (étendue de la cible réalisée sur la fenêtre, comme HAR) appliqué aux quatre modèles ; prévisions non finies ignorées. | Constaté sur merged_forecasts.parquet du premier passage de 04 (22:36) ; econ ré-exécuté (2 min 23 s). |
| C11 | models_econ.py, models_ml.py (tous les filtres d'insanité) |
Borne inférieure = min de la cible sur la fenêtre, y compris deux jours ADA à RV = 0 (4 et 9 janv. 2020, flux mort) → prévisions HARQ négatives tronquées à 10⁻¹² → QLIKE ≈ 10⁹ sur 19 jours ADA (QLIKE moyen HARQ h=1 : 494 075). | Borne inférieure = min des cibles strictement positives. | losses_by_ticker.csv avant/après ; HARQ h=1 overall 494 075 → 0,516 (ratio 2,01). Le pooled, les ML et deep n'ont pas été ré-exécutés avec cette borne (elle n'était contraignante que sur ADA pour HARQ ; prévisions minimales des autres modèles ≥ 3·10⁻⁷). |
| C12 | scripts/04_evaluate.py::load_forecasts |
pooled_loo.parquet (4 actifs) était chargé comme un 26ᵉ modèle → l'échantillon commun s'effondrait à 766 k lignes. |
Fichier LOO exclu de 04 (comparé dans 05). | Journal 04 : 4 517 493 → 766 402 lignes (bug) vs 4 483 121 → 4 432 500 (corrigé). |
| C13 | scripts/09_build_paper.py::check_headers |
Signalait titlepage.tex (page titre canonique sans en-tête projet). |
Fichiers titlepage*.tex exemptés. |
HARMONISATION §3. |
| C9 | config.yaml |
min_intraday_bars: 30 (non lu par le code). |
Commentaire corrigé : seuils effectifs 250 (equity RTH) / 700 (autres), realized_vol.MIN_BARS. |
Incohérence config/texte. |
2. Texte — avant / après
| # | Section | Avant (v0.1) | Après (v0.2) | Raison |
|---|---|---|---|---|
| T1 | introduction.tex |
Vide (en-tête seulement, bien que le README annonce la section « written »). | Introduction complète (motivation, désaccord de la littérature, design, aperçu des résultats généré à partir de results/reproduced/, contributions, plan). |
Section manquante. |
| T2 | literature.tex |
44 références ; « five HAR variants » ; pas de résultats contradictoires ; pas de littérature crypto-données. | 16 références vérifiées ajoutées (voir §4) ; « six HAR specifications » ; évidence contradictoire (Branco-Rubesam-Zevallos 2024 vs Christensen et al. 2023 / Zhang et al. 2024) ; justification GW 2006 vs West 1996 pour le DM en fenêtre roulante ; qualité des données crypto (Alexander-Dakos 2020). | Master prompt §5-6. |
| T3 | data.tex |
« day = calendar day in UTC » pour la crypto ; « AC(1) averages 0.70–0.82 » ; univers en liste à puces ; « roughly 94 million bars » ; README « five classes ». | Jour crypto = jour calendaire US Eastern (le client API ne convertit aucun fuseau : api_client.py ; n_bars max = 1 440) ; AC(1) par classe 0,70 / 0,74 / 0,77 / 0,86 (recalculé sur panel.parquet) ; jours de sauts par classe 3,7 / 8,2 / 10,2 / 14,8 % ; univers en prose ; 93,8 millions de barres (compte pyarrow) ; quatre classes partout ; paragraphe sur les jours de RV implausible. |
Affirmations non vérifiées ou fausses. |
| T4 | methodology.tex |
Description verbale de GARCH/GJR/EGARCH, DM, MCS, combinaisons, GR, utilité, VaR ; « fourteen additional predictors » ; facteur de conversion GARCH non formalisé ; pas d'échantillon commun ; Realized GARCH multi-pas sans formule. | Équations ajoutées : cible (eq:target), RV sous-échantillonné (eq:rvss), TQ explicité, GARCH/EGARCH (eq:garch, eq:egarch), facteur ĉ_t et mapping (eq:garch_map), forme réduite du Realized GARCH, DM avec Bartlett (eq:dm), MCS t_{i·}/T_max (eq:mcs), MZ (eq:mz), encompassing (eq:enc), poids inverse-MSE (eq:comb), statistique de fluctuation (eq:gr), poids de timing (eq:timing), gain d'utilité (eq:utility), LR de Kupiec (eq:kupiec) ; quinze prédicteurs supplémentaires (compte dans ml_features) ; sous-section « Forecast target and rolling protocol » avec l'échantillon commun ; note de bas de page sur la correction C1. |
Master prompt §4. |
| T5 | results.tex, robustness.tex, economic_value.tex, conclusion.tex |
Vides. | Rédigées à partir des sorties de results/reproduced/ (voir §3) ; chaque chiffre renvoie à un CSV/table générée. |
— |
| T6 | appendix.tex |
Vide. | Table par actif, grilles d'hyperparamètres, reproductibilité et temps d'exécution. | — |
| T7 | main.tex |
\WPabstract = texte provisoire « TO BE WRITTEN… » ; \WPdate August 2026 ; \WPversion 0.1. |
Résumé rédigé à partir des résultats ; October 2026 ; 0.2 ; mots-clés en minuscules (sauf sigles). | Protocole. |
3. Réanalyses exécutées (2026-10-17, Mac Studio M5 Max 18 c / 48 Go, Python 3.14)
| Étape | Commande | Durée | Sortie |
|---|---|---|---|
| Famille économétrique (HAR ×6, GARCH ×3, Realized GARCH) × 25 actifs — 3 passages (après C1-C2 ; après C10 ; après C11) | python3 scripts/03_run_models.py --family econ --workers 16 |
6 min 18 s + 2 min 23 s + 2 min 30 s | data/processed/forecasts/econ_*.parquet (non commités) |
| Pooled LightGBM (mensuel, 3 horizons en parallèle) | python3 scripts/03_run_models.py --family pooled |
23 min 54 s (en concurrence avec le LOO ; ≈ 8 min seul d'après le chronométrage unitaire) | forecasts/pooled.parquet (203 911 prévisions) |
| Pooled leave-one-out (NVDA, GBPUSD, ETH, GC × 3 horizons, 12 processus) | python3 scripts/05_robustness.py --part loo-forecast |
23 min 59 s (simultané au pooled) | forecasts/pooled_loo.parquet (34 484 prévisions) |
| Évaluation (échantillon commun, combinaisons, pertes, DM, MCS 5 000 bootstraps, MZ, encompassing) | python3 scripts/04_evaluate.py |
35 s | results/reproduced/{losses_*,dm_*,mcs_*,mz_*,encompassing_*}.csv |
| Robustesse : sous-périodes, LOO (comparaison), GR, outliers | `python3 scripts/05_robustness.py --part subperiods | loo | gr |
| Interprétation (SHAP + permutation, pooled h=1) | python3 scripts/03_run_models.py --family interpret |
11 s | shap_h1.csv, permutation_h1.csv |
| Valeur économique (timing, utilité, VaR) | python3 scripts/06_economic_value.py |
4 s | timing_*.csv, utility_*.csv, var_*.csv |
Budget : le protocole autorisait < 30 min ; l'estimation préalable (econ 4 min, pooled 8 min, LOO 10 min, reste 5 min) tenait dans
le budget, mais la contention CPU entre le pooled et le LOO lancés ensemble (30 threads sur 18 cœurs) a porté ces deux étapes à 24 min,
et les deux corrections C10-C11 découvertes à l'évaluation ont imposé deux ré-exécutions de la famille économétrique. Temps machine total
≈ 45 min. Toutes les sorties sont réelles et reproductibles par les commandes ci-dessus.
| Figures et tables | python3 scripts/07_make_figures.py && python3 scripts/08_make_tables.py | < 1 min | figures/*.png, results/tables/*.tex |
Prévisions réutilisées de l'exécution de l'auteur du 2026-08-10 (code inchangé depuis pour ces familles, vérifié par git log sur
models_ml.py : dernier commit 0ca469f du 2026-08-10 20:56, fichiers écrits 21:12–22:33) : ml_*.parquet (12 modèles tabulaires × 25 actifs,
≈ 2 h de calcul), deep_*.parquet (LSTM, Transformer), et results/reproduced/frequency_sensitivity.csv (05 --part freq, écrit 22:51).
4. Références (57 → 73, toutes vérifiées sur Crossref — docs/bib-verification.csv)
- DOI de revue ajouté sur 53 entrées existantes (Crossref renvoyait souvent la version SSRN/NBER : remplacée par le DOI de l'article publié, résolu
et contrôlé titre/revue/volume/pages via
api.crossref.org/works/<doi>). Sans DOI (inexistant) : Mincer-Zarnowitz 1969 (chapitre NBER, URL ajoutée), Vaswani et al. 2017, Lundberg-Lee 2017, Ke et al. 2017 (NeurIPS). - Corrigées :
RahimikiaPoon2020(était un@articleavec « journal = SSRN Working Paper » →@techreport, DOI 10.2139/ssrn.3707796) ;MincerZarnowitz1969(éditeur, lieu, URL). - Ajoutées (16) : Bollerslev-Hood-Huss-Pedersen 2018 RFS (10.1093/rfs/hhy041) ; Zhang-Zhang-Cucuringu-Qian 2024 JFEC (10.1093/jjfinec/nbad005) ; Branco-Rubesam-Zevallos 2024 JEF (10.1016/j.jempfin.2024.101524) ; Andersen-Bollerslev-Meddahi 2005 Econometrica (10.1111/j.1468-0262.2005.00572.x) ; Hansen-Lunde 2006b J. Econometrics (10.1016/j.jeconom.2005.01.005) ; Diebold 2015 JBES (10.1080/07350015.2014.983236) ; Clements-Preve 2021 JBF (10.1016/j.jbankfin.2021.106285) ; Hansen-Huang 2016 JBES (10.1080/07350015.2015.1038543) ; Patton-Sheppard 2009 Handbook (10.1007/978-3-540-71297-8_36) ; Buccheri-Corsi 2021 JFEC (10.1093/jjfinec/nbz025) ; West 1996 Econometrica (10.2307/2171956) ; Brownlees-Gallo 2006 CSDA (10.1016/j.csda.2006.09.030) ; Patton 2020 JBES (10.1080/07350015.2019.1585256) ; Catania-Grassi-Ravazzolo 2019 IJF (10.1016/j.ijforecast.2018.09.005) ; Alexander-Dakos 2020 QF (10.1080/14697688.2019.1641347) ; Aït-Sahalia-Mykland-Zhang 2005 RFS (10.1093/rfs/hhi016).
- Retirées : aucune (toutes les références v0.1 existent et sont correctement citées).
5. Non modifié faute de temps de calcul (< 30 min imposés) — voir REVIEW-REPORT « analyses recommandées non exécutées »
- Sensibilité à la fenêtre d'estimation (500 / 1 000 / 2 000 j) :
05 --part window(~20 min sur 16 cœurs) — table du papier imprimée sans ce bloc. - Ré-exécution des 12 apprenants tabulaires et des 2 apprenants profonds (≈ 2 h 20) : prévisions de l'auteur réutilisées (code inchangé).
- Nettoyage des barres crypto (Brownlees-Gallo 2006) et test de sauts par seuil (Corsi-Pirino-Renò 2010) : non implémentés.