Skip to content

docs(qc,#18900): chiffres du livre face à nos reproductions, chapitre 06 exemples 08 à 13 - #19019

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

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

Conversation

@jsboige

@jsboige jsboige commented Oct 3, 2026

Copy link
Copy Markdown
Owner

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

See #18900 (partiel : tranche 2, chapitre 06 exemples 08 à 13)

Empilée sur #18985 (base docs/qc-book-vs-reproductions-ch06a) : elle ajoute la tranche 2 à la section que #18985 crée dans BOOK_MAPPING.md. Après le merge de #18985, retarget sur main.

Résumé

Deuxiè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 la tranche 1.

Exemple Verdict
06-08/01, 06-08/03 sans objet : aucune reproduction dans le dépôt (GAP)
06-08/02 REPRODUIT (borne à zéro) : rejeu dans les conditions du livre, Sharpe 0,24 > 0
06-09 NON COMPARABLE : le livre publie un décompte de paires tiré d'un notebook de recherche, pas un backtest
06-10 sans objet, pas de rejeu : notre projet ne met pas en œuvre le modèle du livre. La ligne de l'inventaire passe de COVERED à PARTIAL
06-11 REPRODUIT (borne à zéro) : rejeu dans les conditions du livre, profit net de 23,7 % > 0
06-12 NON COMPARABLE : démonstration d'un modèle de coûts, sans statistique de backtest
06-13 REPRODUIT (borne à zéro) : rejeu dans les conditions du livre, profit net de 38,1 % > 0

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

La règle de la tranche 1 s'applique (base, complément chapitre 06). Le complément de la tranche 2 a été posté à 18:57:08Z. Le premier backtest a été créé à 18:58:14Z.

Ce complément traite un cas que la tranche 1 n'avait pas rencontré. Pour 08/02, 11 et 13, le livre ne publie qu'un signe sur tout son balayage : « tous les Sharpe sont positifs », ou « toutes les combinaisons sont profitables ». Une tolérance de 0,25 autour de zéro contredirait alors la condition « même signe ». Le test se réduit donc au signe :

  • REPRODUIT si le rejeu a un Sharpe > 0 (08/02) ou un Net Profit QuantConnect > 0 (11, 13) ;
  • ÉCART sinon.

C'est un test faible : il dit que notre reproduction ne contredit pas le livre, pas qu'elle en reproduit un chiffre. La règle de la borne à zéro est ajoutée à la liste de la section, avec le lien vers ce complément.

Le complément fixe aussi l'ordre des rejeux, 08/02, puis 13, puis 11, et exclut l'exemple 10 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 (reprise de set_start_date et set_end_date dans le code du livre), le retrait de la ligne set_brokerage_model et, pour deux exemples, un paramètre ramené à la valeur que publie le texte du livre.

Exemple Projet Backtest Sharpe CAGR Pire baisse Profit net PSR Ordres
06-08/02 37309010 3e0d8c17982c9acc9d544fccf9260a09 0,24 6,87 % 20,5 % 41,8 % 1,7 % 746
06-13 37309113 a0205f4b3e052a526d3fc25de8acdc70 0,211 6,34 % 34,7 % 38,1 % 1,4 % 1658
06-11 37309271 a30271d032a6f4e54c2f2ed3bbb90381 0,124 4,13 % 41,0 % 23,7 % 0,8 % 532

Diff du rejeu 08/02 par rapport à projects/Stoploss-Volatility-ML/main.py (sha256 du fichier rejoué e25e0f7a42a108b616e1fa90595a4787c73caff9318342265d9614e24d0547e5) :

-        self.set_start_date(2015, 1, 1)
-        self.set_end_date(2026, 3, 1)
+        self.set_start_date(2018, 12, 31)
+        self.set_end_date(2024, 4, 1)
-        self.set_brokerage_model(...)
-        period = 22 * int(self.get_parameter('indicator_lookback_months', 1))
+        period = 22 * int(self.get_parameter('indicator_lookback_months', 3))

Diff du rejeu 13 par rapport à projects/PCA-StatArbitrage/main.py (sha256 dc0fcd27072d856a2facfdb2eb012700a03bb1fe1f39b2ce35562d10ee6f77da) :

-        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(...)
-        self._lookback = self.get_parameter("lookback_days", 60)
+        self._lookback = self.get_parameter("lookback_days", 63)

Diff du rejeu 11 par rapport à projects/InverseVolatility-Rank/main.py (sha256 a151a0ef01ae50d2f0d102468d8004aad4ed71c9122d0378c3c47c9424fabb95) ; la date de fin et le capital étaient déjà ceux du livre :

-        self.set_start_date(2015, 1, 1)
+        self.set_start_date(2018, 12, 31)
-        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 : volatilité réalisée de SPY à la place du VIX (08/02, le VIX n'étant pas disponible sur QC Cloud) ; trois surcouches de risque propres à notre projet (11, même modèle Ridge) ; LinearRegression à la place de sm.OLS avec constante, qui donne les mêmes résidus, et des gardes ajoutées (13).

Exemple 11 : le rejeu redonne notre chiffre, et montre que le dépôt a dérivé

Le fichier rejoué pour 11 est identique, à l'octet près, au main.py du projet QC Cloud 29463533 que cite le README du projet (même sha256). Notre chiffre de la page de statut a été mesuré sur ce projet, sur 1629 jours de cotation comme le rejeu. Le rejeu redonne donc exactement Sharpe 0,124, CAGR 4,13 % et pire baisse 41,0 % ; seul le PSR change (1,9 % sur la page de statut, 0,8 % au rejeu).

Le main.py du dépôt commence, lui, au 2015-01-01 et fixe un modèle de courtage : les chiffres publiés ne décrivent pas le code publié. Ce constat, et la vérification des autres projets, sont suivis dans #19018 ; la section de BOOK_MAPPING.md le note.

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

Le docstring de projects/Clustering-Fundamentals-ML/main.py le dit : la version actuelle (v4) classe les actions par z-scores de 8 facteurs fondamentaux, sans PCA ni LGBMRanker. Elle a remplacé deux versions plus proches du livre, abandonnées pour leur lenteur et des NaN. Un rejeu mesurerait donc une autre stratégie que celle du livre, et sa borne (Sharpe ≥ 0) ne dirait rien de la reproduction.

Dans le dépôt, LGBMRanker et PCA n'apparaissent que dans ce docstring : aucun code ne les appelle. La ligne 10 du tableau d'inventaire passe donc de COVERED à PARTIAL, ce qui correspond à la définition du fichier (« la technique est présente, mais seulement pour une partie de l'exemple »). Le chiffre de la page de statut (Sharpe 0,142) vient de la version v3, et la section le précise.

Ce que REPRODUIT dit, et ce qu'il ne dit pas

Le livre ne publie, pour ces exemples, qu'un signe sur tout un balayage. Le rejeu confirme ce signe aux paramètres publiés. Il ne dit rien de la place du rejeu dans le balayage, ni de la qualité de la stratégie : les PSR des rejeux (1,7 % pour 08/02, 1,4 % pour 13, 0,8 % pour 11) rappellent qu'un Sharpe positif sur cinq ans n'est pas un avantage établi.

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

  • 08/01 : stop à 0,95 dans le texte et footnotes.txt ; 0,99 par défaut dans le code, dans la zone où le livre dit que le Sharpe s'effondre (≥ 0,985).
  • 08/02 : 3 mois d'historique dans le texte et footnotes.txt ; 1 mois par défaut dans le code. Le rejeu suit le texte.
  • 13 : 63 jours dans le texte et footnotes.txt ; 60 par défaut dans le code, une valeur hors du balayage (pas de 21 jours). Le rejeu suit le texte.

Une incohérence de notre côté est aussi notée dans la section : pour l'exemple 13, la page de statut date sa mesure de 2015-2026, alors que le code du projet s'arrête au 2024-01-01.

Hors de cette PR

Tier et genre

MED/qc, comme la tranche 1 : la PR étend l'inventaire avec trois rejeux QuantConnect vérifiés sous une règle pré-enregistrée, et elle corrige une ligne de l'inventaire (10, 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 3542a3f782, un seul fichier modifié.

  • python scripts/notebook_tools/check_prose_quantitative_claims.py --diff github/docs/qc-book-vs-reproductions-ch06a...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, 8124 total)
  • git diff --stat github/docs/qc-book-vs-reproductions-ch06a...HEAD : BOOK_MAPPING.md, 34 insertions, 2 suppressions.
  • Rejeux : chaque main.py relu sur QC après envoi, sha256 identique au fichier publié ci-dessus ; chaque backtest lu seulement à completed: true.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 3, 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-ch06a. 1 PR ouverte(s) de docs/qc-book-vs-reproductions-ch06a vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a 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.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] APPROVE — ancres factuelles vérifiées firsthand au head 3542a3f7.

  • Règle pré-enregistrée : le complément tranche 2 (c.5972434603) est horodaté 18:57:08Z, avant le premier backtest 18:58:14Z — la règle de la borne à zéro a bien été publiée avant les rejeux, comme la tranche 1.
  • Colonne « notre chiffre » exacte : les trois lignes (ex 10 : Sharpe 0,142/CAGR 3,37 %/MaxDD 65,3 % ; ex 11 : 0,124/4,13 %/41,0 %+PSR 1,9 % ; ex 13 : 0,165/5,34 %/35,9 %) matchent à la décimale qc-strategies-status.md (lignes 356/142/409 au ref du head).
  • Dates de code vérifiées au head : PCA-StatArbitrage/main.py = 2015-01-01 → 2024-01-01 (l'incohérence 2015-2026 de la page de statut est réelle et correctement signalée) ; Stoploss-Volatility-ML/main.py = 2015-01-01 → 2026-03-01, lookback défaut 1 mois — conformes aux colonnes « nos conditions ».
  • Application de la règle cohérente : les trois REPRODUIT (borne à zéro) suivent le test publié (0,24 > 0 ; 23,7 % > 0 ; 38,1 % > 0), et la section « ce que les verdicts ne disent pas » + les PSR gardent l'interprétation honnête.
  • Pas une PR de totaux (#17633 n/a) ; scan sécu clean ; stacking sur #18985 documenté avec retarget prévu.

Note de transparence : les chiffres de rejeu eux-mêmes (projets QC 37309010/37309113/37309271) reposent sur les IDs de backtest cités — vérifiables côté QuantConnect, pas depuis ce dépôt ; la règle et les sources internes, elles, sont vérifiées ci-dessus.

[Hermes hermes-pr-review, cycle :19 03/10, host f6be46d1b7a3, sig=a971e01c]

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19019 (docs(qc,#18900): chiffres du livre face à nos reproductions, chapitre 06 exemples 08 à 13) 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.

…es 08-13

Tranche 2 of the book-vs-reproduction comparison in BOOK_MAPPING.md:
three QC replays in the book's conditions (08/02, 13, 11) under the
zero-bound rule published before the first backtest; examples 08/01 and
08/03 have no reproduction, 09 and 12 publish no backtest figure, and
example 10 is not replayed because our project no longer implements the
book's model (inventory row COVERED -> PARTIAL).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the docs/qc-book-vs-reproductions-ch06b branch from 3542a3f to fc8f6c6 Compare October 4, 2026 06:57
@jsboige
jsboige changed the base branch from docs/qc-book-vs-reproductions-ch06a to main October 4, 2026 06:57
@github-actions github-actions Bot added the markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. label Oct 4, 2026
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Rebase après le merge par squash de #18985 : la branche repart de main (e5f523f), et la base de cette PR est maintenant main. Nouvelle tête : fc8f6c6.

#19041 a été mergée entre-temps et a fermé #18961. Comme annoncé dans le commentaire de coordination (c.5975869567), deux passages de la tranche 2 sont mis à jour sur cette branche :

Le conflit sur la ligne 09 du tableau des chapitres est résolu en gardant la version de main (COVERED, #18961). La ligne 10 garde la requalification de la tranche 2 (PARTIAL). Le diff reste limité à BOOK_MAPPING.md (+34/−3).

La tête a changé, donc le plancher DWELL est réarmé et l'attestation précédente est périmée. #19056 (tranche 3) est rebasée sur cette tête, sans conflit.

@github-actions github-actions Bot added variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) 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-04T06:57:32Z, dernier run PR gate=aucun

@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
@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 4, 2026
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA-2
pr: 19019
head: fc8f6c6
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3774ab30d59567818b6155eff06b435c3df9394362ec06d39db31e55df3ecd7b
diff-files: 1
diff-additions: 34
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Notes pour la lecture coordinator :

— dossier myia-po-2027:CoursIA-2, dispatch ai-01 c1006 (lot de 9).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. pr-overlap Advisory: another open PR touches the same files (organ #13615) 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.

3 participants