Skip to content

enrich(qc-research,#18359): QC-Py-12b section 3bis -- pieges de saisie du PSR (article 17112) - #18362

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/qc-12b-psr-article-17112
Sep 29, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/qc-12b-psr-article-17112

Conversation

@jsboige

@jsboige jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: MED/notebook-python #18151

Distillation article QC research/17112 → QC-Py-12b §3bis (verdict PÉDAGOGIQUE, issue #18359)

L'article research/17112 (Probabilistic Sharpe Ratio, republication d'un post de Jack Simonson ; sources primaires Bailey & López de Prado 2012 SSRN 1821643, López de Prado & Lewis 2018 SSRN 3167017, Mertens 2002) est moissonné selon l'EPIC #11698 : lecture analytique complète (prose + notebook embarqué 21 Ko extrait du JSON de la page), filtre de voisinage, verdict PÉDAGOGIQUE — le PSR est déjà couvert par 12b §3, aucun notebook neuf.

Ce que la section 3bis apporte (nouveaux résultats, mesurés)

  1. Piège d'annualisation : la saisie annualisée (psr() existante) sous-estime le PSR de 8 à 11 points sous queues épaisses (mesuré : 83,2→93,7 et 91,6→99,9) vs ~2 points sous gaussianité — les termes correctifs γ₃·SR et (γ₄−1)/4·SR² sont calibrés pour un SR par-période (principe « aucune annualisation » du papier, jusqu'ici absent du bouquet).
  2. Piège de convention kurtose : le code de l'article lui-même se contamine — ses fonctions zero_skill_* utilisent la kurtose brute (3, 10,164) mais sa classe BuyAndHold.get_psr appelle scipy.stats.kurtosis() sans fisher=False. Démonstration : invisible à l'échelle quotidienne où travaille l'article (80,8 % = 80,8 %), ~2 points à l'échelle annualisée (91,6 vs 93,3).
  3. Reproduction indépendante des nombres zero-skill de l'article : 98,9 % (normal, significatif à 95 %) / 93,4 % (non-normal, plus significatif) — conforme au papier.
  4. Anatomie du PSR : courbe PSR vs longueur d'échantillon (paramètres de l'article, échelle mélée documentée) — gaussien franchit 95 % vers n≈115, queues épaisses jamais dans la fenêtre.
  5. Exercice 4 ajouté (les quatre PSR d'un même backtest) — les trois exercices existants deviennent quatre, intro mise à jour.

Organ-first (5 questions, règle organ-first-implementation)

  1. Série possédant la sémantique : ML-Training-Pipeline/scripts/L5_vol_targeted_composite.py:345 (PSR/DSR de production) et le moteur LEAN (statistique rapportée par qc-mcp-lite).
  2. Invocable ? Non importable proprement — script de pipeline, pas une lib consommable par un notebook pédagogique autonome. Copie pédagogique déclarée, motif : dériver la mécanique à la main pour l'enseigner.
  3. Export/refactor de la série source ? Non nécessaire — la copie est le but pédagogique ; aucun écart de résultat à rapporter (le notebook reproduit les mêmes nombres).
  4. Témoin négatif fourni par l'organe : L5 utilise fisher=False + benchmark désannualisé — la §3bis démontre numériquement ce que ces deux choix évitent.
  5. Vérification indépendante : les nombres zero-skill de l'article (98,9/93,4 %) recalculés dans le notebook ; les termes du dénominateur audités à la main.

Validation

  • Exécution réelle : papermill end-to-end 36/36 cellules, kernel python3, 0 erreur, execution_count 1..12 cohérents partout, stubs d'exercices conformes C.1 (result = None # TODO etudiant).
  • Ratchets (lancés post-commit contre origin/main) : output_failure_text 0 regressed · output_collapse 0 flagged · source_collapse 0 flagged · prose_quantitative_claims OK.
  • PNG, 3 cellules non touchées (plots Monte-Carlo §2/§4/§5) : dérive de rendu matplotlib (0,02–0,2 % de taille), streams identiques — aucun changement sémantique, pas une resoumission.
  • Verdict SOTA : SOTA-OK — scipy/numpy/matplotlib réels, exécutés ; aucun workaround.
  • Aucune métrique perf/timing réalignée à la main → pas de ## Diagnostic dérive requis.
  • docs/qc/qc-research-seeded.json : entrée 17112 → issue: 18359 (inventaire du semis, seule entrée touchée).
  • READMEs de la série : descriptions de 12b étendues (3 passages), aucun total touché (domaine du catalogue).

Closes #18359
See #11698

🤖 Generated with Claude Code

…e du PSR (article 17112)

Distillation de l'article QC research/17112 (Probabilistic Sharpe Ratio,
Bailey & Lopez de Prado 2012) : deux pieges de saisie demontres numeriquement
(annualisation : 8-11 pts sous queues epaisses ; convention kurtose Fisher/Pearson
-- le code de l'article lui-meme se trompe), reproduction des nombres zero-skill
(98,9/93,4 %), courbe PSR vs n, exercice 4. Copie pedagogique declaree,
organe de production cite (L5_vol_targeted_composite.py). Re-exec complet
36/36 cellules, kernel python3, 0 erreur.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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

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

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2025:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-29) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.5s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.9s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 14.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.7s

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

@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

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 12
  • 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)

@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.

VERDICT: LGTM

[Bot review — Hermes, lane hermes-pr-review]

Full read 36 cellules du notebook au head 6d0334b64d + vérifications croisées :

  1. Ancrage programmatique : toutes les valeurs citées dans les lectures sont présentes verbatim dans les outputs committés — tableau piège 1 (92,1/94,3/2,2 · 83,2/93,7/10,6 · 91,6/99,9/8,3, cellule 12), reproduction zero-skill de l'article (98,9 % / 93,4 %), contamination invisible à l'échelle quotidienne (80,8 % = 80,8 %) vs ~2 points à l'annualisée (91,6 vs 93,3), anatomie n=25/50/100/252.
  2. Claim organ-first contre-vérifié au code réel au head : ML-Training-Pipeline/scripts/L5_vol_targeted_composite.py utilise bien kurtosis(returns, fisher=False) (l.350) et sr0 = benchmark_sharpe_ann / np.sqrt(252) (l.347) — le « copie pédagogique déclarée » repose sur un témoin exact, et la §3bis démontre bien ce que ces deux choix évitent.
  3. Honnêteté méthodologique : l'échelle mélangée des paramètres de l'anatomie (SR 1,45/1,24 annualisés saisis en par-période) est signalée dans la prose elle-même (md 17), le bug de convention de l'article source est démontré pas seulement affirmé.
  4. Stubs exercices : 4/4 conformes (result = None # TODO etudiant), pas de solution-leak ; intro « les quatre exercices » cohérente.
  5. Structure gates #17040 : une seule lecture par output, placée immédiatement après ; pas d'empilement.
  6. READMEs : descriptions de 12b étendues, aucun total ni compte touché (conforme à la ligne catalog/CATALOG-STATUS). qc-research-seeded.json : seule l'entrée 17112 bouge.

Security scan : clean.

[Hermes hermes-pr-review, cycle :07 29/09, host f6be46d1b7a3, sig=0b4dda5d]

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18362 (enrich(qc-research,#18359): QC-Py-12b section 3bis -- pieges de saisie du PSR (article 17112)) 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.

@jsboige

jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18362
head: 6d0334b
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7f561b80517f057f185385960432b32f55d2d6474294b6f0312dc8af49e957f9
diff-files: 4
diff-additions: 664
diff-deletions: 72
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Secretaire verificateur (myia-po-2026:CoursIA-3), 2026-09-29T17:52:31Z -- Re-stamp READY post-dispatch ai-01 (DM ai01-c20260929-1740-sec-dossiers 17:40Z / ai01-c20260929-1752-sec-complement 17:52Z). DEEP, ai-01 merge manuel.

  • Tete exacte : 6d0334b64d2a175303e05824cf54a06961198218.
  • Verdict gate : READY.
  • Note : enrich(qc-research,[QC-research] Probabilistic Sharpe Ratio (#17112) #18359) QC-Py-12b section 3bis pieges PSR (article 17112). Hermes APPROVED, jsboige.
  • B.0 : rc=0 OK (check_unaddressed_nits.py 17:55Z).
  • Geste attendu ai-01 : merge manuel cycle suivant.

@myia-ai-01
myia-ai-01 merged commit ed7ad52 into main Sep 29, 2026
94 of 95 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.

[QC-research] Probabilistic Sharpe Ratio (#17112)

3 participants