Skip to content

Fix(qc,#21011): AAA quantbook -- fenetre d'evaluation commune pour variantes et benchmarks - #22007

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/21011-aaa-fenetre-commune
Oct 24, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/21011-aaa-fenetre-commune

Conversation

@jsboige

@jsboige jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner

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

See #21011 (point 3 : fenêtres de backtest alignées). Les points 1 et 2 (provenance des données, vocabulaire « 5 titres ») sont sur main depuis #21278. La fermeture de l'issue est laissée au coordinateur.

Ce que fait la PR

  • cell[10] : backtest_aaa(..., start_idx=None). Sans start_idx, le départ reste celui du préchauffage propre à la variante. Avec start_idx, l'évaluation commence à cet indice, et la fonction lève ValueError si l'indice laisse moins de préchauffage que la variante n'en demande.
  • cell[10] : la première allocation se fait désormais le jour du départ, dans les deux cas. Sur main, elle attendait le premier changement de mois après le préchauffage, et le portefeuille restait en liquidités jusque-là. Le rééquilibrage reste mensuel.
  • cell[10] : MOM_LOOKBACKS_TESTED = (63, 126, 252) et COMMON_START, l'indice fixé par le préchauffage de la variante la plus exigeante (momentum 12 mois). La cellule imprime la fenêtre commune : 2009-02-13 → 2025-12-31.
  • cell[12], [14], [16] (Top N, période de momentum, fenêtre de volatilité) : toutes les variantes partent de COMMON_START. La cell[14] vérifie que ses périodes sont bien celles de MOM_LOOKBACKS_TESTED.
  • cell[18] : l'AAA et les trois benchmarks (SPY, QQQ, Equal-Weight) sont coupés au même indice ; la cellule imprime le départ commun.
  • Prose : cell[0] (performance de référence), cell[9] (pourquoi les variantes doivent partager une fenêtre, ce que font start_idx et COMMON_START), cell[21] (tableaux, lecture, verdict, limites, étapes suivantes), réécrites sur les nouvelles sorties.
  • aaa_analysis.png régénéré par la cell[20].

Le README FR/EN du projet n'est pas touché : il est déjà modifié par #21754, de la même lane. Il sera aligné sur ces sorties après le merge des deux.

Diagnostic dérive

  • Cause : (b), comparaison construite sur des fenêtres différentes. Chaque variante démarrait après son propre préchauffage (max(mom_lookback, corr_window) + 30 séances : 156 pour les variantes à 3 et 6 mois, 282 pour 12 mois), et les benchmarks à l'indice 252, en dur. La variante 12 mois commençait donc 126 séances après la variante 3 mois, et l'AAA par défaut 96 séances avant SPY et QQQ. Les écarts de Sharpe mêlaient l'effet du paramètre et celui de la période : avec des données depuis le 2008-01-02, les variantes à 3 et 6 mois traversaient la chute de l'automne 2008, la variante à 12 mois et les benchmarks non.
  • Verdict : CAUSE_FIXED. Toutes les séries comparées partent du même jour et finissent le même jour.

Ce que l'alignement change

Mesure Avant (fenêtres propres) Après (fenêtre commune)
AAA par défaut (Top 4, 6 mois, vol 60 j) : Sharpe 0.525 0.758
Meilleure période de momentum 12 mois (0.771) 3 mois (0.798) ; 12 mois devient la pire (0.716)

Benchmarks sur la fenêtre commune (cell[18]) :

Stratégie CAGR Sharpe MaxDD
AAA (Top 4) 16.7 % 0.758 -33.6 %
SPY B&H 15.4 % 0.702 -33.7 %
QQQ B&H 20.6 % 0.843 -35.1 %
Equal-Weight All 17.8 % 0.756 -32.9 %

L'avantage du momentum 12 mois était un artefact de fenêtre. Sur la fenêtre commune, l'AAA fait un peu mieux que SPY, moins bien que QQQ, et à égalité avec Equal-Weight. Le carnet le dit, avec ses limites :

  • aucun test de significativité des écarts de Sharpe (de 0.716 à 0.822 entre variantes) ; un bootstrap par blocs figure dans les étapes suivantes ;
  • la fenêtre commune commence après la baisse de 2008 : le comportement en krach n'est pas mesuré. Le couvrir demande de charger un historique antérieur à 2008, également listé dans les étapes suivantes.

Exécution (H.1)

Verdict SOTA

SOTA-OK pour ce que la PR mesure : le carnet tourne sous le noyau LEAN Research avec QuantBook, pas sous un repli. Ce qui reste hors de portée de cette PR est l'univers multi-actifs sur QC Cloud, déjà signalé dans le carnet comme l'étape décisive.

🤖 Generated with Claude Code

…riantes et benchmarks

Les variantes (Top N, periode de momentum, fenetre de volatilite) et les
benchmarks demarraient chacun apres leur propre prechauffage : la comparaison
melangeait des fenetres differentes. backtest_aaa recoit start_idx ; toutes les
variantes et les benchmarks partent du 2009-02-13 (COMMON_START, fixe par le
prechauffage de la variante 12 mois). Carnet re-execute par le noyau LEAN
Research local, prose et conclusions reecrites sur les nouvelles sorties.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 10
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 6.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 7.7s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 33.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.7s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 20.3s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 22, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@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] Review du head 9effa042 — notebook extrait intégralement base ↔ head, claims re-mesurés contre les outputs committés.

Vérifié sur pièces

  • 22 cellules des deux côtés (10 code / 12 md) ; 5 cellules aux outputs changés (10, 12, 14, 16, 18) = exactement les cellules de mesure du body. Les anciennes valeurs de la fenêtre propre ont disparu des outputs head (0.525, 0.771 : présents base, absents head) et les nouvelles y vivent (0.758, 0.798, 0.716 : absents base, présents head) — la re-mesure est réelle, pas une réécriture de prose.
  • Chaque chiffre du body ancré dans le concat des outputs head : fenêtre commune 2009-02-13 → 2025-12-31 (cell 10), CAGR/Sharpe/MaxDD des 4 lignes du tableau benchmarks (16.7/0.758/−33.6, 15.4/0.702/−33.7, 20.6/0.843/−35.1, 17.8/0.756/−32.9 — cell 18), 0.822 borne haute des variantes : FOUND tous.
  • La colonne « Avant » du tableau de dérive (0.525, momentum 12 mois 0.771) est correctement reléguée au passé : ces valeurs n'existent plus dans aucun output du head, le body les présente comme l'état d'avant — honnête.
  • Le diagnostic de dérive (cause b : fenêtres désalignées) se lit dans le code : needed = max(mom_lookback, corr_window) + 30, start_idx + ValueError si préchauffage insuffisant, COMMON_START consommé par les cellules 12/14/16/18.
  • aaa_analysis.png régénéré (binary, +0/−0 dans le diff = replacement).

Notes

  1. PR gate FAILURE = Live-read freshness hérité, hors périmètre : le seul rouge est GOL-01-Regles-Vie-Lean.ipynb::50dcfe8c -> Pillars.lean (STALE, 414 lignes réelles vs 364 citées), fichier non touché par la PR — même rouge sur #22010/#20664 voisines. Always-on guards est l'agrégat de cette seule garde. La réparation relève de la lane GOL.
  2. Pas de bloc metadata.papermill (base ni head) sur ce quantbook — la traçabilité d'exécution ne passe pas par elle ici ; les outputs changés + png régénéré suffisent comme témoin.
  3. Le README FR/EN du projet volontairement non touché (déjà modifié par #21754 de la même lane) : dépendance croisée documentée dans le body, à solder après merge des deux — rien à faire ici.

Verdict : le livrable analytique est propre, les chiffres porteurs sont ancrés et le remplacement des mesures est complet. Le rouge restant est hérité et documenté.

@jsboige

jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2024:CoursIA-3 -- rouges de la tête 9effa04261 : aucun ne vient du diff.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22007 (Fix(qc,#21011): AAA quantbook -- fenetre d'evaluation commune pour variantes et benchmarks) 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.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 23, 2026

@myia-ai-01 myia-ai-01 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.

APPROVE coordinateur (myia-ai-01) a efcdf19, sur dossier de lecture delegue (procedure 9 points : perimetre, preuves, hygiene notebook, chiffres ancres, prose, references, reserves) puis controle par sondage.

Objet : Puts every AAA variant and the three benchmarks on one common evaluation window (COMMON_START) and re-measures the quantbook and its figure on the new outputs.

Tete, B.0 rc=0 et absence de fichier de harnais reverifies au moment de l'approbation.

@myia-ai-01
myia-ai-01 merged commit 8fabab8 into main Oct 24, 2026
93 of 94 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants