Skip to content

feat(qc,#19680): port CAPM alpha ranking Dow 30 — NO BEATS ×3, levier 2 non tenu sous Lean - #19690

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/19680-capm-alpha-ranking-dow30
Oct 8, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/19680-capm-alpha-ranking-dow30

Conversation

@jsboige

@jsboige jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner

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

Closes #19680

Résumé

Cette PR porte sur QuantConnect l'article 15345, CAPM Alpha Ranking Strategy On Dow 30 Companies. Trois bras ont été mesurés contre SPY, sur le même harnais, du 2015-03-19 au 2026-09-30. La règle de verdict avait été inscrite sur l'issue avant le premier backtest (c.6033649014).

Verdict : NO BEATS pour les trois bras. Le code publié régresse le benchmark sur l'action, au lieu de l'inverse annoncé dans le texte. Avec ce code, la paire choisie diffère de la paire « sens CAPM » 137 mois sur 138. Le résultat, lui, ne change pas de façon mesurable.

Contenu

Fichiers ajoutés sous MyIA.AI.Notebooks/QuantConnect/projects/CAPMAlphaRankingDow30-QC/ :

  • main.py : le code de l'article, porté tel quel, régression inversée incluse.
    • Deux noms d'API Python de Lean ne passent plus en snake_case et ont été renommés : self.benchmark devient self._benchmark, portfolio.values devient portfolio.values().
    • Le reste vient de la mise à jour de l'équipe QuantConnect, ou sert à la mesure : l'initialiseur de titres, les paramètres regression / exposure / mode / fee_mult / start / end, le graphique shadow, le journal SEL et les compteurs de marge.
    • Le paramètre timing a été ajouté après la mesure des bras préinscrits. Par défaut (article), le comportement est celui du code publié. Avec intent, les achats attendent la séance qui suit les ventes (voir « Exposition effective »).
  • config.json : l'id cloud 37467233.
  • README.md : description, extrait de la régression inversée, ce que le port change, univers figé, sources et mesure.

Mesure

Fenêtre principale : 2 900 séances communes. La statistique est l'écart de Sharpe journalier contre SPY, sans taux sans risque. Le p vient d'un bootstrap circulaire par blocs, avec correction de Holm sur les 3 bras.

Passage Sharpe (sans taux) Sharpe QC CAGR Drawdown max Ordres
article (régression publiée, 1,0 par ligne) 0,53 0,35 11,4 % −51,0 % 386
capm (sens CAPM, 1,0 par ligne) 0,64 0,47 16,6 % −53,5 % 391
staff (régression publiée, 0,5 par ligne) 0,50 0,32 10,0 % −47,8 % 527
spy 0,82 0,54 13,7 % −33,8 % 1
Bras Écart contre SPY IC 95 % p Holm Sous-fenêtres 2015-18 / 19-22 / 23-26 Verdict
article −0,29 [−0,94 ; 0,33] 1,00 −0,61 / −0,20 / −0,28 NO BEATS
capm −0,18 [−0,91 ; 0,45] 1,00 −0,42 / −0,16 / −0,32 NO BEATS
staff −0,32 [−0,76 ; 0,08] 1,00 +0,03 / −0,45 / −0,50 NO BEATS

Aucun bras n'étant significatif, la règle préinscrite ne demande pas de passage à frais doublés. Aucun n'a été lancé.

Exposition effective : le levier 2 n'est pas tenu

Les journaux des bras à levier 2 portent des refus d'ordres pour pouvoir d'achat insuffisant. En résolution journalière, la vente part à la clôture : le jour du rééquilibrage, les anciennes lignes occupent encore la marge quand partent les achats.

Passage Rééquilibrages 2 ordres refusés 1 ordre refusé sans refus
article 138 57 41 40
capm 138 57 38 43
staff 138 0 0 138

Le bras article passe 56 mois sur 138 entièrement en liquidités. Les bras A et B mesurent donc le code tel qu'il tourne sur Lean aujourd'hui, pas la règle à levier 2. Le bras C, sans refus, mesure la règle telle qu'elle est écrite, à levier 1, et ne bat pas SPY non plus.

Bras ajoutés (timing=intent), descriptifs, hors verdict et hors Holm. Ils ont été inscrits sur l'issue avant d'être lancés (c.6034039690).

Passage Sharpe (sans taux) CAGR Drawdown max Écart contre SPY IC 95 % p brut Mois avec un achat refusé
intent_article 0,29 2,5 % −74,6 % −0,53 [−1,04 ; −0,08] 0,99 69 sur 138
intent_capm 0,50 12,7 % −62,2 % −0,32 [−0,97 ; 0,28] 0,84 71 sur 138

Même une fois les ventes exécutées, le modèle IBKR de Lean refuse une ligne entière un mois sur deux. Mieux investie, la règle fait moins bien. Aucun des cinq passages de stratégie ne bat SPY.

Confrontations à l'article

Ces lectures sont descriptives, hors verdict.

  • Rendement 2015. L'article publie −15,463 %. Les deux comparaisons nommées par la règle ne concluent pas pareil :
    • année civile (y2015) : −27,9 %, soit −12,5 points, donc ÉCART ;
    • bras A du 2015-03-19 au 2015-12-31 : −17,7 %, soit −2,3 points, dans le seuil de 3 points.
  • Appel de marge en janvier. Absent : 0 appel de marge dans tous les passages, en 2015 comme en 2016. C'est un ÉCART. Sous le modèle de marge IBKR de Lean, l'ordre qui dépasserait la marge est refusé à l'envoi : y2015 compte 15 refus sur 10 des 12 rééquilibrages de l'année, et les bras intent ne reçoivent pas d'appel de marge non plus.
  • Régression inversée. Sur 138 rééquilibrages, les paires choisies par article et capm diffèrent 137 fois et sont disjointes 129 fois. L'écart de Sharpe capm − article vaut +0,11, IC 95 % [−0,73 ; 0,91], p 0,39.

Vérifications

  • Backtests QC Cloud : projet 37467233, 7 passages lus à completed: true. Pour chaque passage, l'empreinte du main.py envoyé (sha256, fins de ligne LF) a été vérifiée contre le fichier exécuté. Les 5 passages préinscrits ont tourné sur aac9ea8b90e8…, archivé dans les traces. Les 2 passages intent ont tourné sur 24fb0c1dd53d…, le fichier de cette PR, qui n'ajoute que le paramètre timing ; son défaut garde le chemin mesuré. Identifiants : article 8b8449ad…, capm 367c5d79…, staff d16777a5…, spy 90282d13…, y2015 5ac164eb…, intent_article a69831f6…, intent_capm 1ef39405… Deux backtests ont échoué à l'initialisation, sur les deux noms d'API ; ils sont conservés dans les traces.
  • Traces hors dépôt : G:\Mon Drive\MyIA\IA\QC-traces\19680-capm-alpha-ranking. Elles contiennent les plans, les graphiques, les journaux, results.json et les scripts d'analyse.
  • Pas d'entraînement ni de réglage. Les paramètres sont ceux de l'article, la régression est déterministe, et il n'y a pas de multi-seed à faire (point 5 de l'acceptance). La fenêtre 2016-2026 est postérieure au test publié par l'article.
  • Outil réel (SOTA-OK) : moteur Lean sur QuantConnect Cloud, frais IBKR sur compte marge.
  • Bibliographie : la Nobel Lecture de Sharpe (1990) est archivée dans G:\Mon Drive\MyIA\IA\Bibliographie IA\Trading\.
  • Périmètre : nouveau projet, aucun fichier existant touché. Le catalogue n'a pas été régénéré à la main.

🤖 Generated with Claude Code

… 2 non tenu sous Lean

Port de l'article QuantConnect Research 15345 (regression inversee du code
publie conservee, bras A ; sens CAPM, bras B ; variante 0,5 par ligne, bras C).
Mesure preinscrite sur l'issue : NO BEATS pour les trois bras contre SPY
(p Holm 1,00). Les journaux montrent des achats refuses a levier 2 en
resolution journaliere ; le parametre timing=intent, ajoute apres coup et
mesure hors verdict, ne recupere pas l'exposition et fait moins bien.

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

github-actions Bot commented Oct 7, 2026

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

…ois (faux positif prose-counts)

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

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[INFO] ripe-signal coord -- lane myia-po-2026:CoursIA-2 -- 2026-10-07 c.1407 -- DriveFS HS (incident c.1406), fallback commentaire PR

#19690 feat(qc,#19680): port CAPM alpha ranking Dow 30 — NO BEATS ×3, levier 2 non tenu sous Lean

  • Lane : myia-po-2024:CoursIA-3 (pas ma lane — ripe-surfond depuis c.1407)
  • Grain : DEEP/qc (Body confirme : NO BEATS x3, multi-seed, p bootstrap circulaire, Holm)
  • Gates : PR gate SUCCESS 2026-10-07T14:30:33Z (run 112845521257), CodeQL 4× SUCCESS, fast-lane ombre SUCCESS
  • B.0 : 1 comment (jsboige) -- a verifier
  • Verdict : RIPE — merge candidate

#19661 fix(prevalidation,#19630): nommer le gel de campagne sur une PR sans dossier READY

  • Lane : myia-po-2026:CoursIA-2 (ma lane -- ripe-surfond depuis c.1407)
  • Grain : MED/guard (fix gate check_adjoint_prevalidation.py, 150/150 tests, gate frozen_umbrella_exclusion toujours evalue)
  • Gates : PR gate SUCCESS 2026-10-07T07:55:58Z (run 112677666871), ADJOINT PREFLIGHT cmt 12:58:37Z (jsboige, lane=myia-po-2026:CoursIA), tous checks SUCCESS
  • Verdict : RIPE — merge candidate

#19691 non-rripe : PR gate FAILURE 2026-10-07T13:39:59Z (run 112801323538), ripe-signal c.1406 annule.

— myia-po-2026:CoursIA-2, c.1407

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA
pr: 19690
head: 3ea8a1f
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: f276b6bfa7c854ba6d9b1c9322549dc29e0098cf1e9f036721dd897e549995d8
diff-files: 3
diff-additions: 353
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19690
head: 3ea8a1f
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: edd9955d812f2821937d9a1ee543ca37e77033a1b9eec4ec6a2e0cd92e19dca9
diff-files: 3
diff-additions: 353
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19690
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 4f88551 into main Oct 8, 2026
36 of 37 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] CAPM Alpha Ranking Strategy On Dow 30 Companies (#15345)

2 participants