Repository navigation
docs(qc,#18900): chiffres du livre face à nos reproductions, chapitre 06 exemples 08 à 13 - #19019
Conversation
Base != main (advisory, #10918)Cette PR ne livre pas sur Couverture CI perdue sur cette base (mesure, #16194)6 workflow(s) se declencheraient si cette PR visait
Un check absent n'est pas un check vert. |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[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]
Path-collision (organ #13359/#13615)Cette PR #19019 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
…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>
3542a3f to
fc8f6c6
Compare
|
Rebase après le merge par squash de #18985 : la branche repart de #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 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. |
PR gate absent du rollup (advisory, #10928)
Cause mesuree : base_ref_changed=2026-10-04T06:57:32Z, dernier run PR gate=aucun |
|
[ADJOINT PREFLIGHT] Notes pour la lecture coordinator :
— dossier myia-po-2027:CoursIA-2, dispatch ai-01 c1006 (lot de 9). |
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 dansBOOK_MAPPING.md. Après le merge de #18985, retarget surmain.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.GAP)REPRODUIT(borne à zéro) : rejeu dans les conditions du livre, Sharpe 0,24 > 0NON COMPARABLE: le livre publie un décompte de paires tiré d'un notebook de recherche, pas un backtestCOVEREDàPARTIALREPRODUIT(borne à zéro) : rejeu dans les conditions du livre, profit net de 23,7 % > 0NON COMPARABLE: démonstration d'un modèle de coûts, sans statistique de backtestREPRODUIT(borne à zéro) : rejeu dans les conditions du livre, profit net de 38,1 % > 0Rè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 :
REPRODUITsi le rejeu a un Sharpe > 0 (08/02) ou unNet ProfitQuantConnect > 0 (11, 13) ;ÉCARTsinon.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 deset_start_dateetset_end_datedans le code du livre), le retrait de la ligneset_brokerage_modelet, pour deux exemples, un paramètre ramené à la valeur que publie le texte du livre.3e0d8c17982c9acc9d544fccf9260a09a0205f4b3e052a526d3fc25de8acdc70a30271d032a6f4e54c2f2ed3bbb90381Diff du rejeu 08/02 par rapport à
projects/Stoploss-Volatility-ML/main.py(sha256 du fichier rejouée25e0f7a42a108b616e1fa90595a4787c73caff9318342265d9614e24d0547e5) :Diff du rejeu 13 par rapport à
projects/PCA-StatArbitrage/main.py(sha256dc0fcd27072d856a2facfdb2eb012700a03bb1fe1f39b2ce35562d10ee6f77da) :Diff du rejeu 11 par rapport à
projects/InverseVolatility-Rank/main.py(sha256a151a0ef01ae50d2f0d102468d8004aad4ed71c9122d0378c3c47c9424fabb95) ; la date de fin et le capital étaient déjà ceux du livre :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 desm.OLSavec 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.pydu 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.pydu 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 deBOOK_MAPPING.mdle note.Exemple 10 : pas de rejeu, et une ligne d'inventaire corrigée
Le docstring de
projects/Clustering-Fundamentals-ML/main.pyle dit : la version actuelle (v4) classe les actions par z-scores de 8 facteurs fondamentaux, sans PCA niLGBMRanker. Elle a remplacé deux versions plus proches du livre, abandonnées pour leur lenteur et desNaN. 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,
LGBMRankeretPCAn'apparaissent que dans ce docstring : aucun code ne les appelle. La ligne 10 du tableau d'inventaire passe donc deCOVEREDà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
REPRODUITdit, et ce qu'il ne dit pasLe 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)
footnotes.txt; 0,99 par défaut dans le code, dans la zone où le livre dit que le Sharpe s'effondre (≥ 0,985).footnotes.txt; 1 mois par défaut dans le code. Le rejeu suit le texte.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
LGBMRanker) relèverait d'une issue de portage, à ouvrir si la revue juge utile de le suivre.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 quedocsdé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.main.pyrelu sur QC après envoi, sha256 identique au fichier publié ci-dessus ; chaque backtest lu seulement àcompleted: true.🤖 Generated with Claude Code