Skip to content

docs(qc,#18900): tranche 3 du livre face à nos reproductions (chapitre 06, ex. 14-19) - #19056

Merged
myia-ai-01 merged 1 commit into
mainfrom
docs/qc-book-vs-reproductions-ch06c
Oct 4, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
docs/qc-book-vs-reproductions-ch06c

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Grain: MED/qc — lane myia-po-2024:CoursIA-3 — prev: DEEP/research-code #19035

Part of #18900 (tranche 3 : chapitre 06, exemples 14 à 19)

Empilée sur #19019 (base docs/qc-book-vs-reproductions-ch06b), elle-même empilée sur #18985 : elle ajoute la tranche 3 à la section que #18985 crée dans BOOK_MAPPING.md. Après le merge des deux, retarget sur main.

Résumé

Troisième tranche de la comparaison entre les chiffres du livre Hands-On AI Trading et nos reproductions. Le livrable est un nouveau tableau dans la section « Résultats du livre face à nos reproductions » de MyIA.AI.Notebooks/QuantConnect/BOOK_MAPPING.md, avec les mêmes colonnes que les tranches 1 et 2.

Exemple Verdict Motif
06-14 REPRODUIT rejeu dans les conditions du livre : Sharpe 0,202, dans [−0,80 ; 0,45], à la borne haute de l'échelle du balayage (0,20)
06-15 REPRODUIT rejeu dans les conditions du livre : Sharpe 0,582, positif et dans l'échelle du balayage (0,42 à 1,02)
06-16 sans objet, pas de rejeu sans clé d'API en paramètre du projet, notre projet classe les articles par mots-clés, sans LLM, et l'actif est SPY. La ligne d'inventaire passe de COVERED à PARTIAL
06-17 ÉCART (borne à zéro) rejeu dans les conditions du livre : profit net de −0,062 %. Le modèle du livre manquait à notre Object Store : c'est le CNN de repli, entraîné sur des motifs synthétiques, qui a tourné (journal du backtest). Issue fille #19053
06-18/01, 06-19/01 NON COMPARABLE courbes de prévision et rendements mensuels, sans statistique de backtest dans le texte
06-18/02, 06-19/02 sans objet aucune reproduction dans le dépôt (GAP, #18962)

Règle de verdict, publiée avant les rejeux

Les règles des tranches 1 et 2 s'appliquent (base, complément chapitre 06, complément « borne à zéro »). Le complément de la tranche 3 a été posté à 02:51:41Z. Le premier backtest a été créé à 02:52:47Z.

Ce complément traite une source nouvelle. Pour 14 et 15, le texte ne donne pas de Sharpe, mais le balayage de paramètres de tearsheet2.png porte une échelle de couleur. Elle est lue comme l'intervalle des Sharpe du balayage : avec la normalisation par défaut de matplotlib, ses bornes sont le minimum et le maximum observés. La lecture est précise à 0,03 près, et un rejeu à moins de 0,05 d'une borne de tolérance serait dit fragile. Les tolérances qui en découlent :

  • 14 : échelle de −0,55 à 0,20, donc REPRODUIT si le Sharpe est dans [−0,80 ; 0,45] ;
  • 15 : échelle de 0,42 à 1,02, donc REPRODUIT si le Sharpe est dans [0,17 ; 1,27] et positif ;
  • 17 : le livre ne publie qu'un signe, donc borne à zéro sur le profit net (voir les écarts internes au livre).

Le complément fixe aussi l'ordre des rejeux (15, puis 17, puis 14) et exclut l'exemple 16 avant tout calcul (voir plus bas).

Rejeux (QC Cloud, projets séparés, un backtest à la fois)

Chaque rejeu est une copie de notre main.py. Y changent seulement la fenêtre et le capital (repris de set_start_date, set_end_date et set_cash dans le code du livre) et le retrait de la ligne set_brokerage_model. Les paramètres publiés par le livre sont déjà nos valeurs par défaut.

Exemple Projet Backtest Sharpe CAGR Pire baisse Profit net PSR Ordres
06-15 37323229 8df461e5fffd0f0df859d0bd41296130 0,582 18,69 % 41,8 % 146,0 % 10,1 % 1813
06-17 37323273 87648032844af2f195239271140bcb1f −24,1 −0,012 % 0,2 % −0,062 % 0 % 8
06-14 37323339 672faa80ccb73bdaa629b4137f388590 0,202 6,11 % 44,7 % 36,6 % 1,3 % 624

Deux projets du dépôt se rattachent à 14, et deux à 15. Le rejeu porte sur celui dont le code suit celui du livre, mesuré à l'arbre syntaxique (docstrings retirés) :

Exemple Projet rejoué Lignes de diff avec le code du livre Autre projet Lignes de diff
14 ML-Temporal-CNN 12 Temporal-CNN-Prediction (un MLPClassifier, sans convolution) 275
15 ML-Gaussian-Classifier 48 Gaussian-Direction-Classifier 259

Diff du rejeu 15 par rapport à projects/ML-Gaussian-Classifier/main.py (sha256 du fichier rejoué 0836d6897129deeacd97b026287d971e58b6f9b2393df79b66b13998a26e9a56) :

-        self.set_start_date(2015, 1, 1)
-        self.set_end_date(2026, 1, 1)
-        self.set_cash(100_000)
-        self.set_brokerage_model(...)
+        self.set_start_date(2019, 1, 1)
+        self.set_end_date(2024, 4, 1)
+        self.set_cash(1_000_000)

Diff du rejeu 17 par rapport à projects/ML-HeadShoulders-CNN/main.py (sha256 83c956a4ca3c57842aed5e2737c8e969d8a3d206068c4aa4e003a28c17503bf2) ; le capital était déjà celui du livre :

-        self.set_start_date(2015, 1, 1)
-        self.set_end_date(2024, 1, 1)
+        self.set_start_date(2019, 1, 1)
+        self.set_end_date(2024, 4, 1)
-        self.set_brokerage_model(...)

Diff du rejeu 14 par rapport à projects/ML-Temporal-CNN/main.py (sha256 3ad8305adaa3a25778aac3ec866630f0caf354159a5b65d8ee9c1d6f936c7093) ; le capital était déjà celui du livre, et temporalcnn.py est envoyé tel quel (sha256 34390ca45d939df6a1469d73995dba251cc5fad4b4334339d4d61491fdcd0d36, identique au fichier du dépôt) :

-        self.set_start_date(2015, 1, 1)
-        self.set_end_date(2024, 1, 1)
+        self.set_start_date(2018, 12, 31)
+        self.set_end_date(2024, 4, 1)
-        self.set_brokerage_model(...)

Les différences de notre code avec celui du livre sont gardées au rejeu, qui juge notre reproduction et non le code du livre. Pour 15 : des gardes, et une différence de comportement (quand aucune action n'est prédite en hausse, notre code liquide tout, celui du livre garde ses positions). Pour 17 : une garde (symbol not in data) et des conversions de type ; et le chemin de repli quand le modèle manque à l'Object Store, qui est celui qui a tourné au rejeu (voir les verdicts). Pour 14 : dans main.py, seules la fenêtre et la ligne de courtage diffèrent ; dans temporalcnn.py, des renommages, verbose=0 et des conversions de type, pour le même modèle.

Exemple 16 : pas de rejeu, et une ligne d'inventaire corrigée

Notre projet ML-LLM-Summarization ne joue pas la stratégie du livre par défaut :

  • sans paramètre de projet portant une clé d'API, il classe les articles par mots-clés, sans LLM ;
  • le mode LLM exige de déposer cette clé comme paramètre du projet QC, ce que nous ne faisons pas ;
  • l'actif est SPY, pas TSLA.

Le notebook QC-Py-26-LLM-Trading-Signals, l'autre ressource de la ligne, enseigne l'analyse de sentiment par LLM : ses sorties committées portent Source: simulated, et il ne résume pas d'articles. La ligne 16 du tableau d'inventaire passe donc de COVERED à PARTIAL, comme la ligne 10 dans la tranche 2.

Ce que ces verdicts disent, et ce qu'ils ne disent pas

L'échelle de couleur d'un balayage est une source plus faible qu'un chiffre du texte : elle borne la stratégie sur tout le balayage, pas le paramètre publié.

  • 15 : le rejeu tombe dans la fourchette ; sa PSR (10,1 %) rappelle qu'un Sharpe de 0,58 sur cinq ans n'est pas un avantage établi.
  • 14 : le rejeu tombe à la borne haute de l'échelle, avec un profit net positif (36,6 %), alors que le livre dit que la plupart des combinaisons ne sont pas profitables. L'univers publié (3) n'est pas dans le balayage : les deux ne se contredisent pas, et la PSR du rejeu (1,3 %) ne dit pas plus.
  • 17 : l'ÉCART porte sur le modèle. La première ligne du journal du backtest est Object Store model missing, training synthetic CNN : le rejeu a joué le CNN de repli, et non le modèle entraîné du livre, absent de notre Object Store. Il dit que le projet, tel qu'il tourne aujourd'hui sur QC Cloud, ne retrouve pas le signe annoncé ; il ne dit encore rien de la stratégie du livre. Le Sharpe (−24,1) tombe dans l'échelle du balayage du livre (de −135 à −20 environ), ce qui ne change pas le verdict, la règle portant sur le profit net. Suite : [QC][livre] Head & Shoulders CNN (06/17) : notre rejeu tourne sans le modèle entraîné du livre #19053 (exécuter le research.ipynb du projet sur QC Cloud pour déposer le modèle, puis rejouer).

Écarts internes au livre (texte contre code et figures de son dépôt)

  • 14 : l'univers publié (3) n'est pas dans le balayage, dont les valeurs sont 2, 4, …, 10. L'intervalle sert donc de fourchette pour la stratégie, pas de chiffre pour le paramètre publié.
  • 17 : le texte et footnotes.txt disent « toutes les combinaisons sont profitables », mais l'échelle du balayage va d'environ −135 à −20 en Sharpe. Le Sharpe de QuantConnect retranche le taux sans risque, et une stratégie presque toujours hors du marché a une volatilité proche de zéro : son Sharpe peut être très négatif avec de petits gains. D'où une borne sur le profit net.

Hors de cette PR

Tier et genre

MED/qc, comme les tranches 1 et 2 : la PR étend l'inventaire avec des rejeux QuantConnect vérifiés sous une règle pré-enregistrée, et corrige une ligne de l'inventaire (16, COVERED → PARTIAL). Si la revue juge que docs décrit mieux la PR, la re-qualification est bienvenue.

Vérifications (après le dernier commit)

Tête 49d5ebda1a, un seul fichier modifié.

  • python scripts/notebook_tools/check_prose_quantitative_claims.py --diff github/docs/qc-book-vs-reproductions-ch06b...HEAD : [OK] aucun compteur quantitatif en prose.
  • python scripts/check_docs_links.py --check --base github/main : OK: No new broken links. (0 pre-existing, 8129 total)
  • git diff --stat github/docs/qc-book-vs-reproductions-ch06b...HEAD : BOOK_MAPPING.md, 30 insertions, 2 suppressions.
  • Rejeux : chaque fichier relu sur QC après envoi, sha256 identique au fichier publié ci-dessus ; chaque backtest lu seulement à completed: true. Le chemin de modèle de 17 est lu dans le journal du backtest.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de docs/qc-book-vs-reproductions-ch06b. Aucune PR ouverte de docs/qc-book-vs-reproductions-ch06b vers main a cet instant -- si la base n'est jamais mergee, le livrable (docs(qc,#18900): tranche 3 du livre face à nos reproductions (chapitre 06, ex. 14-19)) devient un orphelin (personne ne le verra jamais, cf. #10918). Remede : ouvrir une PR de docs/qc-book-vs-reproductions-ch06b vers main, ou rebaser cette PR sur main.

Couverture CI perdue sur cette base (mesure, #16194)

6 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards.yml
  • mermaid-fill-color-advisory.yml
  • notebook-plan-loss-gate.yml
  • paragraph-length-advisory.yml
  • pr-gate.yml
  • secret-scan.yml

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19056 (docs(qc,#18900): tranche 3 du livre face à nos reproductions (chapitre 06, ex. 14-19)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

…e 06, ex. 14-19)

Trois rejeux QC Cloud dans les conditions du livre, sous la règle
pré-enregistrée (complément tranche 3, c.5975932871) : 15 et 14
REPRODUIT (échelle de couleur du balayage), 17 ÉCART (borne à zéro ;
le CNN de repli synthétique a tourné, modèle absent de l'Object
Store, #19053). 18/01 et 19/01 NON COMPARABLE ; ligne 16 de
l'inventaire passée de COVERED à PARTIAL.

Part of #18900

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the docs/qc-book-vs-reproductions-ch06c branch from 505c262 to d029eb8 Compare October 4, 2026 14:52
@jsboige
jsboige changed the base branch from docs/qc-book-vs-reproductions-ch06b to main October 4, 2026 14:52
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Rebasée sur main après le merge de #19019 (14:41:52Z), puis base retargetée sur main. Le patch est inchangé : git range-diff rend 505c26268a = d029eb8a18. Le diff contre main est maintenant le seul fichier BOOK_MAPPING.md, +30 −2. Le changement de tête périme tout dossier de prévalidation posé sur 505c26268a.

@github-actions github-actions Bot added variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) labels Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR : sa base a change apres son dernier run pull_request (issue #14477 cause 4). Le retarget emet l'action edited, que pr-gate.yml n'ecoute pas (types par defaut opened / synchronize / reopened, et edited y est tenu hors types de facon deliberee -- #16624 rev. ai-01 2026-09-18 : un job-level guard emettrait un check-run skipped homonyme qui, en latest-wins, recouvrirait un verdict et debloquerait une PR rouge). Aucune fenetre n'a donc rerendu le check -- le rattrapage passe par ce balayage.

Cause mesuree : base_ref_changed=2026-10-04T14:52:57Z, dernier run PR gate=aucun

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19056
head: d029eb8
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 82f4176f72288d7a92f2f4f9b60ed6e831d468442e057a789438cc29d79c13a8
diff-files: 1
diff-additions: 30
diff-deletions: 2
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

note: Dossier c428 sur PR #19056 (docs(qc,#18900): tranche 3 du livre face a nos reproductions, chapitre 06 ex 14-19). Tierce attestation depuis myia-po-2026:CoursIA-3 (PR porteuse myia-po-2024:CoursIA-3, distincte). MED/qc, 1 fichier (BOOK_MAPPING.md), +30/-2. Nouvelle tete d029eb8 apres rebase post-merge #19019 (14:41Z) puis retarget base main -- patch identique (range-diff 505c262 = d029eb8, rapport de la lane c.14:53Z). Checks latest-wins-green mesure ce cycle : 13 check-runs foldes par (started_at,id) tous success/skipped ; PR gate SUCCESS @17:59:37Z agrege par le sweep que j'ai declenche (workflow_dispatch run 37222399770 -- le dernier service datait de 14:44Z, avant la creation de cette tete). B.0 rc=0 mesure ce cycle (4 commentaires, 0 nit non leve -- le 4e est le commentaire collant PR gate du sweep). mss BLOCKED = exigence de review sur la nouvelle tete (l'approbation ai-01 est l'autre moitie du merge), PAS un defaut de contenu. scope: PASS (1 fichier sous MyIA.AI.Notebooks/QuantConnect/, PAS sous .claude/, .github/, ni CLAUDE.md). domain: PASS (substance MED/qc verifiee : regle de verdict pre-enregistree c.5975932871 a 02:51Z AVANT le premier rejeu ; verdicts honnetes 15 REPRODUIT (Sharpe 0,582) / 14 REPRODUIT (0,202) / 17 ECART documente par issue fille #19053 (modele Object Store absent, CNN synthetique a tourne) / 16 PARTIAL / 18-19 NON COMPARABLE ; rejeux QC reellement executes un a la fois dans projets separes 37323229/37323273/37323339). verdict READY.

@github-actions github-actions Bot removed the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Oct 4, 2026
@myia-ai-01 myia-ai-01 closed this Oct 4, 2026
@myia-ai-01 myia-ai-01 reopened this Oct 4, 2026
@github-actions github-actions Bot removed the markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. label Oct 4, 2026
@myia-ai-01
myia-ai-01 merged commit 6310c9f into main Oct 4, 2026
28 of 29 checks passed
@jsboige
jsboige deleted the docs/qc-book-vs-reproductions-ch06c branch October 7, 2026 07:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants