Skip to content

[QC-research] CAPM Alpha Ranking Strategy On Dow 30 Companies (#15345) #19680

Closed

Description

@jsboige

Grain: MED/qc — lane myia-po-2023:CoursIA — prev: MED/qc #19678

Sous-grain de #11698 (Phase 2 — semis manuel : article du sitemap non couvert). Preflight anti-doublon par numéro d'article : gh search issues "15345" = 0 résultat ; greps de voisinage sur projects/STRATEGIES_DETAIL.md et docs/qc/qc-strategies-status.md : « alpha ranking » = 0 occurrence, « dow 30 » = 0, « capm » = 1 unique occurrence qui est l'instrument de vérification de LowBeta-Industries-QC (régression CAPM comme mesure, pas comme signal de trading). L'entrée du comptoir docs/qc/qc-research-seeded.json portait issue: null. Page article vérifiée chargée avant semis.

Article source

Lecture analytique

Ce que l'article annonce

Ranking mensuel par alpha CAPM sur l'univers Dow 30. Chaque premier jour de mois (Scheduled Event, month_start) : récupérer 21 jours de clôtures des 30 composantes Dow + SPY (self.history(...).close.unstack(level=0)), régresser le rendement de chaque action sur celui du benchmark (np.linalg.lstsq), ranger par intercept (alpha), liquider tout et acheter les 2 premiers à 100 % chacun — soit un livre concentré à levier 2× sans couverture ni stop-loss. Composantes Dow listées statiquement (dernier changement 19/03/2015 → date de départ la plus tôt 2015-03-19).

La thèse annoncée : « stocks which beat the market last month will continue to beat the market » — momentum 1 mois sur actions individuelles, que l'article lui-même qualifie d'échec en régime volatile.

Métriques rendues par l'article

Pas de table de résultats — mais une métrique en prose + un événement, tous deux confrontables :

  • Test 2015 : rendement −15,463 % (« performed quite poorly »), année volatile (−10 % du 18 au 25 août 2015) ;
  • Margin call en janvier — conséquence directe du levier 2× (deux positions à 100 %).

L'update STAFF (Derek Melchin) apporte une version retravaillée : PEP8, fin avril 2024 (donc une fenêtre longue mesurable existe côté STAFF), exposition cible réduite pour éviter les margin calls, security initializer ajouté.

Sources primaires citées

  1. Wikipédia — Dow Jones Industrial Average (référence de composition, pas une source académique) ;
  2. Sharpe, William — Nobel lecture 1990 (PDF nobelprize.org) — la théorie CAPM elle-même.

La chaîne d'attribution est générique : Sharpe (1990) fonde le modèle CAPM, mais aucune source ne teste le signal spécifique (ranking mensuel par alpha sur Dow 30). Le claim momentum-1-mois de l'article va contre le consensus académique (le momentum canonique est 12-1 mois ; l'horizon 1 mois penche reversal) — et l'article le mesure lui-même perdant. À la différence de 9031 (#19678, Gurrib 2020 nommément sur le signal), le premier maillon stratégique manque ici.

Défaut mesurable dans le code publié — régression inversée

La prose : « regressed the market excess return against the asset excess return… the slope and intercept will be beta and alpha » (asset = β·marché + α). Le code fait l'inverse :

result = np.linalg.lstsq(returns, benchmark)   # résout benchmark ≈ slope·action + intercept
alphas[symbol] = result[0][1]

Le design matrix est le vecteur des rendements de l'action, la cible est le benchmark : l'intercept mesuré est l'alpha du benchmark sur l'action, pas celui de l'action sur le benchmark (et l'estimateur de pente est β inversé). Sur 21 points quotidiens fortement bruités, les deux rankings divergent — le signal réellement tradeable par ce code n'est pas celui que la théorie décrit. À porter tel quel (discipline de port fidèle, précédent 15366 divergence a5) puis à documenter, avec en option un bras B « régression dans le bon sens » pour mesurer l'écart — la divergence EST le finding pédagogique.

Différenciation vs bouquet existant

  • Mécanisme ranking par alpha de régression : 0 occurrence au bouquet (le « CAPM » existant est un instrument de mesure LowBeta, pas un signal).
  • Univers Dow 30 : un seul occupant, PuppiesOfTheDow-QC — mécanisme value-income, pas momentum. Le momentum existant tourne sur ETF sectoriels (MomentumStrategy, AssetClassMomentum-QC) ou facteurs (FamaFrench), jamais sur actions individuelles par alpha.
  • Sœur fraîche : ShortTermReversalFutures-QC ([QC-research] Short Term Reversal With Futures (#15366) #18466) = reversal hebdo futures ; ici momentum mensuel actions — la face miroir en equity.

L'article est-il redondant ? NON — mécanisme absent, univers sans occupant momentum, une métrique et un événement (margin call) à confronter.

Verdict

  • CONSOLIDATION — aucun projet existant à rouvrir (aucun ranking alpha au bouquet).
  • PÉDAGOGIQUE — la régression CAPM comme outil de cours existe déjà via LowBeta ; le notebook de cours n'est pas la sortie naturelle de ce draft.
  • NOUVEAU — famille ranking-alpha vierge, coût de port faible (30 actions quotidiennes, rebalancement mensuel, lstsq numpy), une métrique en prose (−15,463 % en 2015) + un margin call + la fenêtre STAFF post-2015→2024 : trois cibles de confrontation. Les réserves : draft, pas de table de métriques, source primaire générique (Sharpe = théorie, pas le signal), auteur déjà porté ([QC-research] Short Term Reversal With Futures (#15366) #18466) — elles bornent le claim, elles n'invalident pas le semis : à coût faible et cibles mesurables, le port vaut le coup.
  • IGNORE — n/a : contrairement à 15366 (zéro métrique, 8 futures, coût défavorable), les axes coût et confrontabilité s'inversent.

Acceptance du port (pour la lane qui le prendra)

  1. Porter le code publié tel quel (régression inversée incluse, documentée en tête de fichier), frais IBKR marge, cash 1 M, fenêtre 2015-03-19 → 2026 (composantes statiques de l'article ; documenter la survivorship bias des composantes figées 2015).
  2. Bras A (code article) : confrontation directe — le rendement 2015 (fenêtre complète vs le −15,463 % de l'article), le margin call de janvier (présent/absent sous IBKR), et le comportement post-2015 inédit.
  3. Bras B (fix régression) : même harnais, régression dans le sens CAPM (action sur benchmark) — mesurer si le ranking et les résultats divergent (c'est le finding).
  4. Bras C (update STAFF) : exposition réduite par position (ex. 0.5/0.5 au lieu de 1/1) — reproduire la variante Derek Melchin.
  5. Benchmark SPY sur le même harnais ; verdict BEATS / NO BEATS / INCONCLUSIVE écrit par bras, multi-seed n/a (aucun entraînement stochastique — les LSTSQ sont déterministes, le point C de pr-review-discipline §C ne s'applique pas).
  6. Référence Sharpe (Nobel lecture 1990) citée dans le README ; absence de source primaire sur le signal écrite dans le README (chaîne d'attribution [EPIC] Verification des citations arXiv dans les notebooks — 83 notebooks, 107 IDs, partition par famille #11168 — le maillon stratégique manque).

Acceptance locale (semis)

  • Article lu en entier (corps + fil, statut, auteur, update STAFF, question Ebow sans réponse)
  • Voisinage re-vérifié (greps : famille absente, un seul occupant Dow value-income)
  • Sources primaires identifiées — génériques (Sharpe 1990 = théorie), maillon stratégique absent, dit tel quel
  • Défaut de code identifié à la lecture (régression inversée) avec extrait cité
  • Verdict coché avec justification (NOUVEAU — axes coût/confrontabilité inversés vs 15366)
  • Métriques de l'article recopiées ci-dessus pour confrontation future

Part of #11698

Activity

  1. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-3 -- port QC des trois bras (article, regression corrigee, exposition reduite STAFF) + benchmark SPY, regle de verdict preinscrite ici avant le premier backtest -- paths: MyIA.AI.Notebooks/QuantConnect/projects/CAPMAlphaRankingDow30-QC/**

  2. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    Règle préinscrite — lane myia-po-2024:CoursIA-3, avant le premier backtest

    Port : MyIA.AI.Notebooks/QuantConnect/projects/CAPMAlphaRankingDow30-QC/main.py. Code de l'article repris tel quel (régression inversée incluse), frais IBKR, compte sur marge, capital 1 M, lookback 21 séances, rééquilibrage au premier jour de bourse du mois. La liste des 30 titres n'est pas dans le texte de l'article (seulement dans son backtest joint) : j'utilise la composition du Dow au 2015-03-19, figée. Biais du survivant assumé et écrit dans le README.

    Passages

    Label Paramètres Fenêtre
    spy SPY détenu à 100 %, même harnais 2015-03-19 → 2026-09-30
    article (bras A) régression publiée, exposition 1,0 par ligne idem
    capm (bras B) action régressée sur le benchmark (sens CAPM), exposition 1,0 idem
    staff (bras C) régression publiée, exposition 0,5 par ligne idem
    y2015 bras A sur l'année civile 2015 2015-01-01 → 2015-12-31
    <bras>_fees2 frais ×2, seulement pour un bras significatif 2015-03-19 → 2026-09-30

    Verdict par bras (A, B, C), contre spy

    • Statistique : écart de Sharpe journalier (bras − SPY), séances communes, strategy_metrics.sharpe.
    • p unilatéral par bootstrap circulaire par blocs (voltarget_strategy_verdict.circular_block_diff, réglages par défaut). Correction de Holm sur les trois bras.
    • BEATS si les trois conditions tiennent :
      • p Holm < 0,05 ;
      • écart positif sous frais ×2 ;
      • écart positif sur au moins 2 des 3 sous-fenêtres (2015-03-19 → 2018-12-31, 2019 → 2022, 2023 → 2026-09-30).
    • NO BEATS si l'écart est ≤ 0, ou si p Holm ≥ 0,05.
    • INCONCLUSIVE sinon : significatif, mais frais ×2 ou sous-fenêtres en échec.
    • Bras significatif dont le passage frais ×2 n'est pas lu : PENDING, jamais BEATS.

    Confrontations à l'article (descriptives, hors verdict)

    1. Rendement 2015 :

      • passage y2015 comparé au −15,463 % publié ;
      • rendement du bras A du 2015-03-19 au 2015-12-31.

      REPRODUIT si l'écart est ≤ 3 points de rendement, ÉCART sinon.

    2. Appel de marge : présent ou absent en janvier (2015 dans y2015, 2016 dans article). Lu par le compteur on_margin_call et ses dates dans les statistiques de fin.

    3. Bras B contre bras A (le constat de la régression inversée) :

      • part des mois où la paire choisie diffère, lue dans le journal (SEL ...) ;
      • écart de Sharpe B − A avec son intervalle bootstrap, descriptif.

    Résultats lus seulement à completed: true ; traces hors dépôt (QC-traces/19680-capm-alpha-ranking).

  3. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    Ajout à la règle préinscrite — lane myia-po-2024:CoursIA-3. Posté après lecture des passages A/B/C, avant tout passage du bras ajouté.

    Ce que les journaux ont montré

    Les trois bras préinscrits sont terminés et lus à completed: true. Leur verdict suit la règle sans changement, et il sera publié avec la PR. Les journaux des bras à levier 2 (article, capm) portent en revanche des refus d'ordres pour pouvoir d'achat insuffisant. Le bras staff (0,5 par ligne) n'en porte aucun.

    Passage Rééquilibrages avec 2 achats refusés avec 1 achat refusé
    article 138 57 41
    capm 138 57 38

    Mécanisme. En résolution journalière, l'ordre de vente part à la clôture. Au moment des achats, les anciennes lignes occupent donc encore la marge, et à levier 2 l'achat d'un nouveau titre est refusé. Le bras article passe ainsi 57 mois sur 138 entièrement en liquidités. Les bras A et B mesurent donc le code tel qu'il tourne aujourd'hui sur Lean, pas la règle à levier 2 que l'article décrit. Le bras C, sans refus, est la seule mesure propre de la règle, à levier 1.

    Bras ajoutés

    Paramètre timing=intent : ventes inchangées le jour du rééquilibrage, achats à la séance suivante, une fois les ventes exécutées. Le signal et les poids sont ceux des bras A et B.

    Label Paramètres Fenêtre
    intent_article régression publiée, exposition 1,0, timing=intent 2015-03-19 → 2026-09-30
    intent_capm sens CAPM, exposition 1,0, timing=intent idem

    Lecture : descriptive, hors verdict et hors Holm.

    • L'écart de Sharpe contre SPY est rapporté avec son IC bootstrap et son p brut, avec le même outil et les mêmes séances.
    • Les refus d'ordres et les appels de marge sont comptés, ce qui permet de confronter l'appel de marge de janvier publié dans l'article.
    • Si un écart positif avec p brut < 0,05 apparaît, il ne vaut pas BEATS : il appelle une évaluation préinscrite séparée (frais ×2, sous-fenêtres).

    Le verdict A/B/C préinscrit reste celui qui fait foi pour cette issue.

  4. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    Résultats — lane myia-po-2024:CoursIA-3. PR : #19690.

    Verdict préinscrit (c.6033649014), appliqué sans changement

    Bras Écart de Sharpe 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

    Fenêtre 2015-03-19 → 2026-09-30, 2 900 séances communes. Aucun bras n'est significatif, donc aucun passage à frais doublés n'a été lancé.

    Bras ajoutés timing=intent (descriptifs, hors Holm, inscrits en 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

    Attendre que les ventes soient exécutées ne suffit pas. Le modèle IBKR de Lean refuse encore une ligne entière un mois sur deux : deux lignes à 1,0 dépassent d'un rien le pouvoir d'achat. Mieux investie, la règle fait moins bien. Aucun appel de marge non plus dans ces bras. Le bras staff, sans aucun refus, reste la mesure la plus propre de la règle, et il ne bat pas SPY.

    Correction du commentaire d'ajout

    Le commentaire c.6034039690 écrivait « 57 mois sur 138 entièrement en liquidités » pour le bras article. Le compte mesuré est 56. Le tableau des refus reste juste (57 mois à deux ordres refusés), mais dans l'un de ces mois les deux refus ne portent qu'une ligne au total (écart de 1,04 ligne à la cible) : le portefeuille y garde une ligne presque pleine. Le README de la PR porte le bon chiffre.

    Confrontations à l'article

    • 2015 : −27,9 % en année civile (y2015), soit −12,5 points contre le −15,463 % publié, donc ÉCART. Le bras A sur 2015-03-19 → 2015-12-31 fait −17,7 %, soit −2,3 points, dans le seuil.
    • Appel de marge de janvier : absent dans tous les passages. ÉCART. Sous ce modèle de courtier, le levier 2 bute sur des refus d'ordre à l'envoi, pas sur un appel de marge.
    • Régression inversée : les paires article et capm diffèrent 137 mois sur 138. L'écart de Sharpe capm − article vaut +0,11, IC [−0,73 ; 0,91], p 0,39.

    Traces hors dépôt : G:\Mon Drive\MyIA\IA\QC-traces\19680-capm-alpha-ranking.

  5. added a commit that references this issue on Oct 7, 2026
  6. added 2 commits that reference this issue on Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions