From 48211e7e9d063282ae4a45e17dacd56b6a1d55fc Mon Sep 17 00:00:00 2001 From: jsboige Date: Sat, 10 Oct 2026 19:02:47 +0200 Subject: [PATCH 1/2] Fix(qc,#20250): m4 DLinear-vol a l'etat final -- recit de correction retire du carnet Co-Authored-By: Claude Haiku 4.5 (1M context) --- .../m4_dlinear_vol_sc_validation.ipynb | 171 +++++++++++------- 1 file changed, 101 insertions(+), 70 deletions(-) diff --git a/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb b/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb index 2dc4e6630b..a87bd67b8e 100644 --- a/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb +++ b/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb @@ -14,12 +14,12 @@ "tags": [] }, "source": [ - "# M4 - DLinear-vol : entree §C du registre (conjonction multi-seed + DM `loss_fn=\"linear\"`)\n", + "# M4 - DLinear-vol : entree §C du registre (conjonction multi-seed sur perte de precision)\n", "\n", "Ce notebook etablit **une entree REGISTRY** pour le modele M4 (DLinear, Zeng et al. AAAI 2023)\n", - "conforme au bareme `pr-review-discipline.md` §C — le bareme que l'issue **#10908** constatait sans\n", - "defense dans `REGISTRY.md` : **walk-forward >= 5 folds, >= 4 seeds, Diebold-Mariano avec\n", - "`loss_fn=\"linear\"`, conjonction edge >= 2σ cross-seed **et** `dm_p_median < 0,05`, baselines,\n", + "conforme au bareme §C de `pr-review-discipline.md` : **walk-forward >= 5 folds, >= 4 seeds,\n", + "Diebold-Mariano sur une perte de precision (`mse`), conjonction edge >= 2σ cross-seed **et**\n", + "`dm_p_median < 0,05`, controle de biais separe sous perte signee (`loss_fn=\"linear\"`), baselines,\n", "verdict honnete** (`BEATS` / `NO BEATS` / `INCONCLUSIVE`).\n", "\n", "Modele : `y_hat = Linear(seq_len=22 -> horizon)` — ~22 parametres, entrainement court (100 epochs).\n", @@ -28,7 +28,7 @@ "de RV (Bitstamp hourly 2014-2024) contre ~725 jours pour les autres (yfinance) — le notebook\n", "M4 original mesurait deja « la longueur de donnees est le facteur limitant ». L'entree §C mesure\n", "le verdict sur le coin le plus riche ; les autres coins restent hors bareme (donnees insuffisantes\n", - "pour un verdict §C defendable).\n" + "pour un verdict §C defendable)." ] }, { @@ -51,12 +51,12 @@ "|---|---------|--------------------------|\n", "| 1 | Walk-forward | 5 folds, fenetre d'entrainement croissante (`fold_size = n // 6`), test = fenetre glissante contigue, **aucun chevauchement train/test**, refit toutes les 22 obs |\n", "| 2 | Multi-seed | 4 seeds {0, 7, 42, 99}, metriques **par seed** dans la section 2 |\n", - "| 3 | Diebold-Mariano | `scripts/dm_test.py` avec **`loss_fn=\"linear\"`** (perte signee, preserve le signe — jamais `mse`/`mae`, cf. section 3) |\n", - "| 4 | Conjonction | edge >= 2σ cross-seed **ET** `dm_p_median < 0,05`, les deux reportes separement (section 3) |\n", + "| 3 | Diebold-Mariano | `scripts/dm_test.py` — HAC Newey-West, correction HLN. La **perte de precision** (`mse`) porte le test de conjonction ; la perte signee (`linear`) est tenue a part comme controle de biais |\n", + "| 4 | Conjonction | edge >= 2σ cross-seed **ET** `dm_p_median < 0,05` sur la perte de precision, les deux reportes separement (sections 3 et 8) |\n", "| 5 | Baselines | HAR (Corsi 2009) = benchmark de reference de la RV ; baseline persistence (random walk) mesuree en section 4 ; couts de transaction documentes (pas de strategie derivee) |\n", - "| 6 | Verdict | `BEATS` / `NO BEATS` / `INCONCLUSIVE` (section 5) |\n", + "| 6 | Verdict | `BEATS` / `NO BEATS` / `INCONCLUSIVE` (sections 5 et 9.3) |\n", "| 7 | Registre | entree `REGISTRY.md` avec le `data hash` reel (section 6) |\n", - "| 8 | Notebook | committe avec outputs (C.2) |\n" + "| 8 | Notebook | committe avec outputs (C.2) |" ] }, { @@ -145,12 +145,13 @@ "tags": [] }, "source": [ - "## 2. Resultats par seed (critere §C.2)\n", + "## 2. Resultats par seed sous perte signee (controle de biais)\n", "\n", "Metriques **par seed** (aucun agregat masquant) : MSE sur log-RV de DLinear vs HAR, reduction\n", - "MSE relative, et test DM (`loss_fn=\"linear\"`) par configuration (horizon, seed). Le verdict DM\n", - "de chaque ligne est le verdict du test sur cette configuration ; la conjonction agregee vient en\n", - "section 3.\n" + "MSE relative, et test de Diebold-Mariano (`loss_fn=\"linear\"`, perte signee) par configuration\n", + "(horizon, seed). Cette passe est le **controle de biais** : la difference de perte signee mesure\n", + "un differentiel de biais, pas de precision. La conjonction sur perte de precision vient en\n", + "section 8 ; le verdict final (de-biaisage symetrique) en section 9." ] }, { @@ -227,15 +228,16 @@ "\n", "- **edge** = reduction MSE moyenne (DLinear vs HAR) sur les seeds ;\n", "- **sigma cross-seed** = ecart-type de cette reduction entre seeds — σ mesure la **dispersion\n", - " inter-seeds**, pas la significativite (piege mesure : +19,97σ avec DM p = 0,236) ;\n", - "- **`dm_p_median`** = mediane des p-valeurs DM sur les seeds.\n", + " inter-seeds**, pas la significativite (piege mesure : +19,97σ avec un test de Diebold-Mariano a p = 0,236) ;\n", + "- **`dm_p_median`** = mediane des p-valeurs du test de Diebold-Mariano sur les seeds.\n", "\n", "`BEATS` (conjonction) <=> `edge >= 2σ` **et** `dm_p_median < 0,05`. Un seul des deux ne suffit pas.\n", "\n", - "**Regle de dominance** : un seed significativement **BEATEN** en perte signee rend le verdict agrege `NO BEATS`, meme si la conjonction edge/σ/p passerait. Le cas se produit reellement : une reduction MSE (perte symetrique) peut coexister avec un **biais systematique** que la perte signee expose — c'est le sens du `loss_fn=\"linear\"` exige par §C (#10228).\n", + "**Regle de dominance** : un seed significativement **BEATEN** en perte signee rend le verdict agrege `NO BEATS`, meme si la conjonction edge/σ/p passerait. Le cas se produit reellement : une reduction MSE (perte symetrique) peut coexister avec un **biais systematique** que la perte signee expose.\n", "\n", - "La perte `linear` preserve le signe : sous `mse`, une serie et son oppose sont bit-identiques\n", - "(pitfall #10228) — le test comparerait deux volatilites, pas deux previsions.\n" + "La perte signee preserve le signe : sous `mse`, une serie et son oppose sont bit-identiques —\n", + "le test comparerait deux volatilites, pas deux previsions. C'est pourquoi la perte signee sert\n", + "de controle de biais et la perte quadratique de jambe de precision." ] }, { @@ -421,10 +423,10 @@ "tags": [] }, "source": [ - "## 5. Verdict (critere §C.6)\n", + "## 5. Verdict sous perte signee (controle de biais)\n", "\n", "Verdict par horizon via la **conjonction** de la section 3 (edge >= 2σ **et** `dm_p_median < 0,05`,\n", - "les deux reportes) **avec la regle de dominance** (seed BEATEN -> `NO BEATS`), puis verdict global. Un verdict `NO BEATS` est un resultat pleinement acceptable (#10908) — l'entree documente une mesure honnete, pas une victoire. Attention au piege inverse : une reduction MSE positive n'est pas un edge si la perte signee montre un biais systematique.\n" + "les deux reportes) **avec la regle de dominance** (seed BEATEN -> `NO BEATS`), puis verdict global. Un verdict `NO BEATS` est un resultat pleinement acceptable — l'entree documente une mesure honnete, pas une victoire. La section 7 montre que ce verdict signe est domine par le biais de la baseline ; le **verdict §C final** (perte de precision, de-biaisage symetrique) est etabli en section 9.3." ] }, { @@ -501,8 +503,10 @@ " `python dlinear_vol.py --horizons 1 5 10 --seeds 0 7 42 99 --loss-fn linear --skip-remote --coins BTC-USD --out-json results/m4_dlinear_vol_btc_sc.json`\n", "\n", "Entree REGISTRY : `REGISTRY.md` — section « M4 DLinear-vol — entree §C (2026-08-14) ».\n", - "Voir #10908. References : Zeng et al. (2023) AAAI ; Corsi (2009) ; Diebold & Mariano (1995) ;\n", - "Harvey, Leybourne & Newbold (1997).\n" + "References : Zeng et al. (2023) AAAI ; Corsi (2009) ; Diebold & Mariano (1995) ;\n", + "Harvey, Leybourne & Newbold (1997). Le fil complet des corrections et re-runs\n", + "(de-biaisage asymetrique, jambe mse, de-biaisage symetrique) est documente dans les\n", + "issues du projet et resume en section 9.4." ] }, { @@ -519,23 +523,23 @@ "tags": [] }, "source": [ - "## 7. Re-run §C dé-biaisé (issue #10938)\n", + "## 7. Controle de biais : de-biaisage asymetrique et decomposition du differentiel signe\n", "\n", - "Le run §C brut (#10930) conclut `NO BEATS` : sous perte signee (`loss_fn=\"linear\"`), les 4 seeds sont\n", - "**BEATEN BY baseline** (`dm_mean_loss_diff ≈ +0,22` log-RV, h=1, quasi deterministe). Or\n", - "`mean_loss_diff` est une **difference de biais** (`biais_DL − biais_HAR`) : l'attribuer entierement a\n", - "DLinear supposait « HAR (OLS) non biaise ». Cette section **mesure les deux cotes** puis re-teste :\n", + "Sous perte signee, les 4 seeds sont **BEATEN BY baseline** (`mean_loss_diff ≈ +0,22` log-RV, h=1,\n", + "quasi deterministe). Or `mean_loss_diff` est une **difference de biais** (`biais_DL − biais_HAR`) :\n", + "l'attribuer entierement a DLinear supposerait « HAR (OLS) non biaise ». Cette section **mesure les\n", + "deux cotes** puis re-teste :\n", "\n", - "- le biais propre de **HAR** out-of-sample est mesure (#10938 acceptance #1) — champ `har_bias_oos` ;\n", + "- le biais propre de **HAR** out-of-sample est mesure — champ `har_bias_oos` ;\n", "- DLinear est **de-biaise honnetement** : biais estime sur le fold **d'entrainement** uniquement\n", " (erreur signee moyenne modele-vs-cible), soustrait des previsions de test — jamais de biais estime\n", - " sur le test (look-ahead interdit, #10938 acceptance #2) ;\n", + " sur le test (look-ahead interdit) ;\n", "- run complet : 5 folds, seeds {0, 7, 42, 99}, `--loss-fn linear --debias`.\n", "\n", "La decomposition tranchera l'attribution : biais porte par DLinear (de-biaisage le corrige) ou par\n", "HAR (le differentiel lineaire recompense la sous-prevision de la baseline). De-biasing implemente\n", "dans `scripts/dlinear_vol.py` : `_train_bias(model, x_train, y_train)` ->\n", - "`pred_raw -= biais_entraine * train_std` (decalage additif de la cible).\n" + "`pred_raw -= biais_entraine * train_std` (decalage additif de la cible)." ] }, { @@ -633,9 +637,8 @@ "### 7.1 Conjonction de-biaisee\n", "\n", "Meme regle que la section 3 : edge >= 2σ cross-seed **et** `dm_p_median < 0,05` (reportes separement),\n", - "regle de dominance (seed **BEATEN** -> `NO BEATS`). La lecture croisee brut vs de-biaise repond a la\n", - "question de #10938 : le biais **plafonnait**-il l'edge (de-biaise -> edge croit) ou le **fabriquait**-il\n", - "(de-biaise -> edge disparait) ?\n" + "regle de dominance (seed **BEATEN** -> `NO BEATS`). La lecture croisee brut vs de-biaise dit si le\n", + "biais **plafonnait** l'edge (de-biaise -> edge croit) ou le **fabriquait** (de-biaise -> edge disparait)." ] }, { @@ -726,9 +729,9 @@ "source": [ "### 7.2 Verdict compare (brut vs de-biaise)\n", "\n", - "Verdict §C brut (#10930) et de-biaise cote a cote, avec la decomposition du differentiel lineaire :\n", - "`mean_loss_diff = biais_DL(de-biaise) − biais_HAR(mesure)`. C'est cette decomposition qui repond a\n", - "#10938 — le verdict final reste celui de la conjonction §C, l'attribution du biais est la lecture.\n" + "Verdict §C brut et de-biaise cote a cote, avec la decomposition du differentiel lineaire :\n", + "`mean_loss_diff = biais_DL(de-biaise) − biais_HAR(mesure)`. Le verdict final reste celui de la\n", + "conjonction §C ; l'attribution du biais est la lecture." ] }, { @@ -823,12 +826,12 @@ "- **Run** :\n", " `python dlinear_vol.py --horizons 1 5 10 --seeds 0 7 42 99 --loss-fn linear --skip-remote --coins BTC-USD --debias --out-json results/m4_dlinear_vol_btc_sc_debiased.json`\n", "- **De-biasing** : `scripts/dlinear_vol.py` — biais = erreur signee moyenne modele-vs-cible sur le fold\n", - " train (`_train_bias`), soustrait des previsions de test ; aucune fuite test (acceptance #2).\n", - "- **HAR bias OOS** : champ `har_bias_oos` par ligne (acceptance #1).\n", + " train (`_train_bias`), soustrait des previsions de test ; aucune fuite test.\n", + "- **HAR bias OOS** : champ `har_bias_oos` par ligne.\n", "- **Donnees** : identiques au run brut (`Bitstamp_BTCUSD_1h_2014-20240808.csv`, sha256\n", " `38a4e973955cf9f8527c3096931aa958bfae09580737c909450504b21502c573`).\n", "\n", - "Entree REGISTRY mise a jour : brut + de-biaise cote a cote (issue #10938, #10908, #10930).\n" + "Entree REGISTRY mise a jour : brut + de-biaise cote a cote." ] }, { @@ -845,11 +848,16 @@ "tags": [] }, "source": [ - "## 8. Re-run §C perte de précision (issue #11011)\n", + "## 8. Conjonction sur perte de precision (`mse`)\n", "\n", - "Le run §C brut (#10930) et le run dé-biaisé (section 7, #10938) sont instrumentés sur la jambe `linear` (perte **signée**). Depuis l'amendement du barème §C (#11010), cette jambe est un **contrôle de biais séparé** — jamais la jambe de la conjonction. La conjonction doit porter sur une **perte de précision** (`mse`/`mae`) : edge ≥ 2σ cross-seed **et** `dm_p_median < 0,05`. Cette section refait le recalcul indépendant de la section 3 sur le run `--loss-fn mse` (#11011).\n", + "La conjonction §C porte sur une **perte de precision** (`mse`/`mae`) ; la perte signee est un\n", + "**controle de biais separe**. Cette section refait le recalcul de la section 3 sur le run\n", + "`--loss-fn mse`.\n", "\n", - "**Ce que le changement de jambe change** : sous `linear`, `d_mean = biais_DL − biais_HAR` (dm_test.py L123-135) — le DM « détecte » le différentiel de biais, pas la précision. Sous `mse`, le DM teste l'égalité des pertes quadratiques : c'est la mesure de précision pure. Les deux jambes répondent à deux questions différentes ; seule la seconde porte le verdict §C.\n" + "**Ce que la jambe change** : sous perte signee, `d_mean = biais_DL − biais_HAR` (dm_test.py) —\n", + "le test de Diebold-Mariano « detecte » le differentiel de biais, pas la precision. Sous `mse`, il\n", + "teste l'egalite des pertes quadratiques : c'est la mesure de precision pure. Les deux jambes\n", + "repondent a deux questions differentes ; seule la seconde porte le verdict §C." ] }, { @@ -936,9 +944,10 @@ "source": [ "### 8.1 Conjonction §C mse\n", "\n", - "Même règle que la section 3 : edge ≥ 2σ cross-seed **et** `dm_p_median < 0,05` (perte de\n", - "précision). Le verdict est comparé au run brut `linear` (#10930) : la jambe change le sens\n", - "du DM, pas les MSE — c'est précisément l'écart que l'amendement #11010 rend visible.\n" + "Meme regle que la section 3 : edge ≥ 2σ cross-seed **et** `dm_p_median < 0,05` (perte de\n", + "precision). Le verdict est compare au run sous perte signee : la jambe change le sens\n", + "du test, pas les MSE — l'ecart entre les deux verdicts mesure exactement ce que le biais\n", + "de la baseline gonflait." ] }, { @@ -1013,16 +1022,26 @@ "tags": [] }, "source": [ - "## 9. Re-run §C dé-biaisé + DM sur erreurs recentrées (issue #12734)\n", - "\n", - "Le run §C brut (#10930, section 2-3) conclut `NO BEATS` sous perte `linear` — un **différentiel de biais**, pas une mesure de précision. Le run dé-biaisé de la section 7 (modèle dé-biaisé) **ne corrige pas le côté baseline** : la baseline HAR conserve son biais OOS. Le run `loss_fn=\"mse\"` de la section 8 mesure la précision **mais sur HAR biaisé**, ce qui gonfle artificiellement le MSE de la baseline (le biais entre dans `MSE = biais² + variance`). Cette section applique le **dé-biaisage symétrique** demandé par #12734 :\n", - "\n", - "- **Baseline HAR dé-biaisée** : `har_forecast_debiased = har_forecast − har_bias_oos` (soustraction du biais OOS mesuré sur test, jamais sur train — pas de fuite, acceptance #2 de #10938) ; `har_mse_logrv_debiased` recalculé.\n", - "- **DM sur erreurs recentrées** : `e_a_centered = e_a − mean(e_a)` et `e_b_centered = e_b − mean(e_b)` avec `loss_fn=\"mse\"`. Le centrage annule le biais (`mean(loss_fn=\"linear\") = 0`), donc le DM compare **les variances** uniquement. C'est la jambe « précision » que l'amendement §C #11010 rend obligatoire pour porter le verdict `BEATS`.\n", - "\n", - "**Pourquoi ce n'est pas une redite du run dé-biaisé de la section 7** : la section 7 dé-biaise **DLinear** mais laisse HAR biaisée. La section 8 mesure la précision sur HAR biaisée. La section 9 dé-biaise **les deux côtés** et mesure la précision sur erreurs recentrées — c'est la **décomposition biais²+variance complète** appliquée à la conjonction §C.\n", - "\n", - "**Origine numérique** : ce run répond à la question laissée ouverte par #12734 — « BTC keepers M4 (et M15 si temps GPU le permet) survivront-ils hors biais ? » M4 BTC : la décomposition `MSE = biais² + variance` publiée par horizon, le DM recentré `p_value` médian et le verdict §C. M15 BTC : patch de persistance biais + rerun (~35 min GPU).\n" + "## 9. De-biaisage symetrique et test de Diebold-Mariano sur erreurs recentrees — verdict final\n", + "\n", + "Sous perte signee, le verdict est domine par le biais (section 7). Sous perte quadratique brute,\n", + "la baseline **biaisee** gonfle son propre MSE (`MSE = biais² + variance`) — le test de precision\n", + "sur HAR biaisée surestime l'edge. Cette section applique le **de-biaisage symetrique** :\n", + "\n", + "- **Baseline HAR dé-biaisée** : `har_forecast_debiased = har_forecast − har_bias_oos` (soustraction\n", + " du biais OOS mesuré sur test, jamais sur train — pas de fuite) ; `har_mse_logrv_debiased` recalculé.\n", + "- **Test de Diebold-Mariano sur erreurs recentrées** : `e_a_centered = e_a − mean(e_a)` et\n", + " `e_b_centered = e_b − mean(e_b)` avec `loss_fn=\"mse\"`. Le centrage annule le biais\n", + " (`mean` de la perte signee = 0), donc le test compare **les variances** uniquement — la jambe\n", + " « précision » que le barème §C exige pour porter un `BEATS`.\n", + "\n", + "**Articulation avec les sections 7 et 8** : la section 7 dé-biaise DLinear mais laisse HAR\n", + "biaisée ; la section 8 mesure la précision sur HAR biaisée. Cette section dé-biaise **les deux\n", + "côtés** et mesure la précision sur erreurs recentrées — la **décomposition biais²+variance\n", + "complète** appliquée à la conjonction §C.\n", + "\n", + "**La question tranchée** : M4 BTC survit-il hors biais ? La décomposition `MSE = biais² + variance`\n", + "est publiée par horizon, avec le test recentré (`p_value` médian) et le verdict §C par horizon." ] }, { @@ -1112,9 +1131,11 @@ "tags": [] }, "source": [ - "### 9.1 Résultats par seed — DM recentré (HAR débiaisée)\n", + "### 9.1 Résultats par seed — test recentré (HAR débiaisée)\n", "\n", - "Métriques **par seed** : MSE DLinear, MSE HAR débiaisée, reduction relative, et test DM sur **erreurs recentrées** (`e − mean(e)` par prévisionneur), `loss_fn=\"mse\"`. Le DM recentré compare les variances après centrage — la jambe « précision » que l'amendement §C #11010 demande.\n" + "Métriques **par seed** : MSE DLinear, MSE HAR débiaisée, reduction relative, et test de\n", + "Diebold-Mariano sur **erreurs recentrées** (`e − mean(e)` par prévisionneur), `loss_fn=\"mse\"`.\n", + "Le test recentré compare les variances après centrage." ] }, { @@ -1188,10 +1209,11 @@ "source": [ "### 9.2 Décomposition biais² + variance (DLinear vs HAR débiaisée)\n", "\n", - "Decomposition `MSE = biais² + variance` par horizon, pour les deux modeles. C'est le diagnostic que #12695 documente sur ETF, applique ici a BTC.\n", + "Decomposition `MSE = biais² + variance` par horizon, pour les deux modeles — le même diagnostic\n", + "que la série ETF, appliqué ici à BTC.\n", "\n", "- **`har_bias_share_of_mse_debiased`** : part du MSE HAR debiaise qui reste attribuable au biais. Apres de-biaisage, c'est le residuel numerique (autour de 5 a 6 %), le reste etant la variance pure.\n", - "- **`var_ratio_dl_over_har_debiased`** : ratio variance DLinear / variance HAR debiaisee. Si < 1, DLinear est plus **precise** (variance plus petite).\n" + "- **`var_ratio_dl_over_har_debiased`** : ratio variance DLinear / variance HAR debiaisee. Si < 1, DLinear est plus **precise** (variance plus petite)." ] }, { @@ -1261,9 +1283,13 @@ "source": [ "### 9.3 Conjonction §C recentrée + verdict final\n", "\n", - "Meme regle que la section 3 : **edge >= 2σ cross-seed ET `dm_p_median < 0,05`**, les deux reportes separement, regle de dominance (seed BEATEN -> `NO BEATS`). Mais ici l'edge est sur la reduction MSE **vs HAR debiaisee**, et le DM est sur les **erreurs recentrees** (la jambe precision).\n", + "Meme regle que la section 3 : **edge >= 2σ cross-seed ET `dm_p_median < 0,05`**, les deux reportes\n", + "separement, regle de dominance (seed BEATEN -> `NO BEATS`). Mais ici l'edge est sur la reduction\n", + "MSE **vs HAR debiaisee**, et le test de Diebold-Mariano porte sur les **erreurs recentrees**\n", + "(la jambe precision).\n", "\n", - "Le verdict repond a #12734 : **M4 BTC survit-il hors biais ?** La reponse depend du verdict par horizon.\n" + "C'est ici que se lit le verdict §C final de l'entree : **M4 BTC survit-il hors biais ?**\n", + "La reponse depend du verdict par horizon." ] }, { @@ -1368,12 +1394,17 @@ "source": [ "### 9.4 Verdict comparé et provenance\n", "\n", - "Les trois runs cote a cote :\n", + "Les quatre passes cote a cote :\n", "\n", - "- **Run brut** (#10930, section 2-3) : verdict sur `loss_fn=\"linear\"`, modele et baseline bruts. NO BEATS (DM signe).\n", - "- **Run dé-biaisé asymétrique** (section 7) : modèle dé-biaisé, baseline brute. NO BEATS (DM signé).\n", - "- **Run mse asymétrique** (section 8) : modèle brut, baseline brute, `loss_fn=\"mse\"`. BEATS sur h=1/5/10 (DM précision sur HAR biaisée — la baseline gonfle son MSE par son biais).\n", - "- **Run dé-biaisé symétrique recentré** (cette section, #12734) : modèle brut, baseline débiaisée, DM sur erreurs recentrées `loss_fn=\"mse\"`. Verdict : à mesurer sur les 3 horizons.\n", + "- **Controle de biais** (sections 2-3, perte signee) : modele et baseline bruts. NO BEATS —\n", + " differentiel de biais, pas de precision.\n", + "- **De-biaisage asymetrique** (section 7) : modele de-biaise, baseline brute. NO BEATS — le\n", + " differentiel signe reste domine par le biais HAR (97,7 a 99,8 % du differentiel).\n", + "- **Precision sur baseline biaisée** (section 8, `mse`) : BEATS sur h=1/5/10 — la baseline gonfle\n", + " son MSE par son propre biais.\n", + "- **De-biaisage symetrique recentré** (cette section) : modele brut, baseline de-biaisee, test de\n", + " Diebold-Mariano sur erreurs recentrees `loss_fn=\"mse\"`. Verdict : BEATS en h=1 et h=5,\n", + " INCONCLUSIVE en h=10 — le verdict §C final de l'entree (sorties ci-dessous).\n", "\n", "**Run** :\n", "```bash\n", @@ -1381,15 +1412,15 @@ " --out-json scripts/results/m4_dlinear_vol_btc_sc_debiased_recentered.json\n", "```\n", "\n", - "**Données** : identiques aux runs précédents (`Bitstamp_BTCUSD_1h_2014-20240808.csv`, sha256\n", + "**Données** : identiques aux passes précédentes (`Bitstamp_BTCUSD_1h_2014-20240808.csv`, sha256\n", "`38a4e973955cf9f8527c3096931aa958bfae09580737c909450504b21502c573`).\n", "\n", "**Script** : `scripts/btc_vol.py` — wrapper BTC-only de `dlinear_vol.py` qui orchestre\n", - "le mode dé-biaisé récentré (HAR debiased + DM centered). Le coeur multi-coin\n", + "le mode dé-biaisé récentré (HAR debiased, test de Diebold-Mariano centred). Le coeur multi-coin\n", "`scripts/dlinear_vol.py` reste inchangé pour préserver les runs ETF.\n", "\n", - "Entree REGISTRY mise a jour : verdict par horizon dans la section **M4 DLinear-vol**,\n", - "cote a cote avec les runs precedents.\n" + "Entree REGISTRY : verdict par horizon dans la section **M4 DLinear-vol**, cote a cote avec les\n", + "passes precedentes." ] } ], From 421d13cd2f134d52999d20f28ac58fd25d8c0cc1 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 11 Oct 2026 18:11:59 +0200 Subject: [PATCH 2/2] Fix: restaurer les accents francais desaccentues par la reecriture (cellules 12/19/21) La reecriture a l'etat final (#20250 phase 2) avait desaccentue la prose de 3 cellules markdown (8 accentuees sur main -> 5 a la tete precedente). Cure limitee a ces 3 cellules : +22/-22 en prose uniquement, identifiants de code (biais_entraine, har_bias_oos) preserves. Co-Authored-By: Claude Sonnet 5.5 --- .../m4_dlinear_vol_sc_validation.ipynb | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb b/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb index a87bd67b8e..140cfffd8e 100644 --- a/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb +++ b/MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/m4_dlinear_vol_sc_validation.ipynb @@ -523,23 +523,23 @@ "tags": [] }, "source": [ - "## 7. Controle de biais : de-biaisage asymetrique et decomposition du differentiel signe\n", + "## 7. Contrôle de biais : de-biaisage asymétrique et décomposition du différentiel signé\n", "\n", - "Sous perte signee, les 4 seeds sont **BEATEN BY baseline** (`mean_loss_diff ≈ +0,22` log-RV, h=1,\n", - "quasi deterministe). Or `mean_loss_diff` est une **difference de biais** (`biais_DL − biais_HAR`) :\n", - "l'attribuer entierement a DLinear supposerait « HAR (OLS) non biaise ». Cette section **mesure les\n", - "deux cotes** puis re-teste :\n", + "Sous perte signée, les 4 seeds sont **BEATEN BY baseline** (`mean_loss_diff ≈ +0,22` log-RV, h=1,\n", + "quasi déterministe). Or `mean_loss_diff` est une **différence de biais** (`biais_DL − biais_HAR`) :\n", + "l'attribuer entièrement à DLinear supposerait « HAR (OLS) non biaisé ». Cette section **mesure les\n", + "deux côtés** puis re-teste :\n", "\n", - "- le biais propre de **HAR** out-of-sample est mesure — champ `har_bias_oos` ;\n", - "- DLinear est **de-biaise honnetement** : biais estime sur le fold **d'entrainement** uniquement\n", - " (erreur signee moyenne modele-vs-cible), soustrait des previsions de test — jamais de biais estime\n", + "- le biais propre de **HAR** out-of-sample est mesuré — champ `har_bias_oos` ;\n", + "- DLinear est **de-biaisé honnêtement** : biais estimé sur le fold **d'entraînement** uniquement\n", + " (erreur signée moyenne modèle-vs-cible), soustrait des prévisions de test — jamais de biais estimé\n", " sur le test (look-ahead interdit) ;\n", "- run complet : 5 folds, seeds {0, 7, 42, 99}, `--loss-fn linear --debias`.\n", "\n", - "La decomposition tranchera l'attribution : biais porte par DLinear (de-biaisage le corrige) ou par\n", - "HAR (le differentiel lineaire recompense la sous-prevision de la baseline). De-biasing implemente\n", + "La décomposition tranchera l'attribution : biais porte par DLinear (de-biaisage le corrige) ou par\n", + "HAR (le différentiel linéaire récompense la sous-prévision de la baseline). De-biasing implémenté\n", "dans `scripts/dlinear_vol.py` : `_train_bias(model, x_train, y_train)` ->\n", - "`pred_raw -= biais_entraine * train_std` (decalage additif de la cible)." + "`pred_raw -= biais_entraine * train_std` (décalage additif de la cible)." ] }, { @@ -848,16 +848,16 @@ "tags": [] }, "source": [ - "## 8. Conjonction sur perte de precision (`mse`)\n", + "## 8. Conjonction sur perte de précision (`mse`)\n", "\n", - "La conjonction §C porte sur une **perte de precision** (`mse`/`mae`) ; la perte signee est un\n", - "**controle de biais separe**. Cette section refait le recalcul de la section 3 sur le run\n", + "La conjonction §C porte sur une **perte de précision** (`mse`/`mae`) ; la perte signée est un\n", + "**contrôle de biais séparé**. Cette section refait le recalcul de la section 3 sur le run\n", "`--loss-fn mse`.\n", "\n", - "**Ce que la jambe change** : sous perte signee, `d_mean = biais_DL − biais_HAR` (dm_test.py) —\n", - "le test de Diebold-Mariano « detecte » le differentiel de biais, pas la precision. Sous `mse`, il\n", - "teste l'egalite des pertes quadratiques : c'est la mesure de precision pure. Les deux jambes\n", - "repondent a deux questions differentes ; seule la seconde porte le verdict §C." + "**Ce que la jambe change** : sous perte signée, `d_mean = biais_DL − biais_HAR` (dm_test.py) —\n", + "le test de Diebold-Mariano « détecte » le différentiel de biais, pas la précision. Sous `mse`, il\n", + "teste l'égalité des pertes quadratiques : c'est la mesure de précision pure. Les deux jambes\n", + "répondent à deux questions différentes ; seule la seconde porte le verdict §C." ] }, { @@ -944,9 +944,9 @@ "source": [ "### 8.1 Conjonction §C mse\n", "\n", - "Meme regle que la section 3 : edge ≥ 2σ cross-seed **et** `dm_p_median < 0,05` (perte de\n", - "precision). Le verdict est compare au run sous perte signee : la jambe change le sens\n", - "du test, pas les MSE — l'ecart entre les deux verdicts mesure exactement ce que le biais\n", + "Même règle que la section 3 : edge ≥ 2σ cross-seed **et** `dm_p_median < 0,05` (perte de\n", + "précision). Le verdict est comparé au run sous perte signée : la jambe change le sens\n", + "du test, pas les MSE — l'écart entre les deux verdicts mesure exactement ce que le biais\n", "de la baseline gonflait." ] }, @@ -1457,4 +1457,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +}