Skip to content

QC : deux composites Framework exposés au défaut de #19740 (EMATrend, MomentumRegime-AdaptiveWeights) #19759

Closed

Description

@jsboige

Contexte

#19740 (PR #19758) a mesuré que Framework_Composite_MomentumRegime n'additionnait jamais ses deux tranches. Avant d'appeler determine_target_percent, le PortfolioConstructionModel de Lean ne garde que l'insight actif le plus récent de chaque symbole. Sur les tickers communs aux alphas, la dernière alpha à émettre l'emporte, et un PCM qui groupe par source_model pour additionner des parts ne voit jamais l'autre. Mesure : 0 insight SectorMomentum sur 403 appels ; le composite valait RegimeSwitching à 40 % plus 60 % de liquide.

Une revue des sources a trouvé deux autres projets qui réunissent les trois conditions :

  1. plusieurs alphas dans un CompositeAlphaModel ;
  2. des tickers communs aux alphas ;
  3. un PCM qui groupe par alpha.
Projet Preuve
Framework_Composite_EMATrend 5 tickers communs (main.py:42 / 45-46), CompositeAlphaModel main.py:59-62, by_alpha portfolio_construction.py:23-30
MomentumRegime-AdaptiveWeights univers identiques (main.py:37-38), by_alpha portfolio_construction.py:32-37

Pour ces deux projets, le défaut est supposé, pas mesuré. Sur EMATrend, il ne mord que si les deux alphas ont un insight actif sur le même symbole en même temps : les croisements EMA n'émettent pas forcément au même rythme que TrendStocks.

Travail attendu (une tranche par projet)

  1. Mesurer le défaut :
    • compteur d'insights reçus par alpha dans determine_target_percent ;
    • exposition brute moyenne ;
    • ordres par ticker ;
    • runs à une seule alpha.
  2. S'il est confirmé, porter le mode intent de feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added #19758, c'est-à-dire reconstruire les cibles par couple (symbole, alpha) à partir de algorithm.insights.get_active_insights(utc_time). Garder base sélectionnable.
  3. Mesurer contre SPY détenu et le 60/40 avec le protocole de [QC] Framework_Composite_MomentumRegime : mesurer « Edge » sous règle préinscrite ; l'agrégation des tranches de MultiStrategyPCM n'a pas lieu #19740 : Sharpe à taux sans risque nul, bootstrap par blocs de 21, correction de Holm. Corriger le README et la ligne du registre docs/qc/qc-strategies-status.md.

Critère de fin

Chaque projet porte, dans son README et au registre, un verdict mesuré (BEATS, NO BEATS ou INCONCLUSIVE) et l'état du défaut (confirmé et corrigé, ou réfuté par la mesure).

Activity

  1. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-3 — tranche 1 : Framework_Composite_EMATrend, mesure du défaut, mode intent, verdict contre SPY détenu et 60/40 -- paths: MyIA.AI.Notebooks/QuantConnect/projects/Framework_Composite_EMATrend/**, docs/qc/qc-strategies-status.md

    Protocole de la tranche, fixé avant tout calcul

    Le protocole de #19740 s'applique, avec les adaptations suivantes.

    1. Code. main.py, alpha_models.py et portfolio_construction.py reçoivent seulement :

      • les dates en paramètres start et end, avec pour défauts les dates actuelles du code (2018-01-01 → 2025-01-01) ;
      • un paramètre mode :
        • base : code inchangé ;
        • intent : MultiStrategyPCM reconstruit les cibles à partir du dernier insight actif par couple (titre, modèle source), puis les additionne par titre, comme dans feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added #19758 ;
        • ema : EMACrossAlpha seul, à 100 % ;
        • trend : TrendStocksAlpha seul, à 100 % ;
        • spy : SPY détenu à 100 % ;
        • sixty40 : 60 % SPY et 40 % IEF, rééquilibrés le premier jour de bourse de chaque mois ;
      • les parts ema_allocation (0,70) et trend_allocation (0,30), les périodes ema_fast / ema_slow d'EMACrossAlpha (20 / 50) et sma_trend de TrendStocksAlpha (200), pour la grille ;
      • un paramètre fee_mult (défaut 1) ;
      • le graphique shadow (contrat [ML-Pipeline][#18907 5c] Suivi en ombre : geler les candidats à une date D et les rejouer chaque mois, historique hors temps sans biais de sélection #18923), les ordres par titre et deux compteurs du constat : les appels de determine_target_percent où un insight TrendStocks d'un des cinq titres communs atteint le calcul des cibles, et l'exposition brute moyenne.
    2. Backtests.

      • Fenêtre principale 2015-01-01 → 2026-09-30, frais du courtier ; les 15 titres, SPY et IEF ont plus d'un an d'historique dès le premier jour.
      • Runs : base et intent (candidates), spy et sixty40 (références), ema et trend (contrôles descriptifs).
      • Hors verdict : un essai court de base (2015-01-01 → 2015-06-30) qui vérifie l'instrumentation, puis readme = base sur la fenêtre du README (2018-01-01 → 2025-01-01), rapporté à côté de ses chiffres.
      • Tous les bras tournent dans la même organisation QC. La fin effective est citée dans la PR si elle est ramenée par la réserve de 90 jours.
    3. Mesures. Celles de [QC] Framework_Composite_MomentumRegime : mesurer « Edge » sous règle préinscrite ; l'agrégation des tranches de MultiStrategyPCM n'a pas lieu #19740. Écarts descriptifs, hors verdict : base − ema, intent − ema, intent − trend.

    4. Règle de verdict. Identique à [QC] Framework_Composite_MomentumRegime : mesurer « Edge » sous règle préinscrite ; l'agrégation des tranches de MultiStrategyPCM n'a pas lieu #19740, appliquée séparément à base et à intent : bootstrap circulaire par blocs de 21 séances, 10 000 tirages, graine 18921, Holm sur les deux références ; sous-périodes 2015-2018, 2019-2022, 2023 → fin.

    5. Frais doublés et grille. Lancés seulement pour une candidate à p Holm < 0,05.

      Point Valeur
      a50 parts 0,50 / 0,50
      a90 parts 0,90 / 0,10
      ef10 ema_fast / ema_slow 10 / 30
      ef50 ema_fast / ema_slow 50 / 100
      sma150 sma_trend 150

    Limite connue avant mesure. La tranche EMACross ne porte que cinq valeurs de la Mag7, choisies en connaissant la décennie (biais de survivance, déjà écrit dans le docstring). Ce biais favorise les candidates.

    Traces hors dépôt : QC-traces/19759-ematrend/.

  2. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    Résultat de la tranche 1 (Framework_Composite_EMATrend), selon le protocole de c.6045797111 : #19780.

    • Défaut confirmé : sur les cinq titres communs, le dernier alpha à émettre fixait la cible (TrendStocks dans 602 des 3502 appels du PCM). Rotation 74,7 fois par an, contre 14,4 avec les tranches additionnées.
    • Verdict NO BEATS pour les deux candidates. intent : +0,37 contre SPY (p Holm 0,069), +0,32 contre 60/40 (0,074). base : p Holm 0,57.
    • intent devient le défaut du projet, parce que c'est la conception annoncée. Ce choix ne repose sur aucun avantage démontré. intent ne se distingue pas d'EMACross seul (+0,00, corrélation hebdomadaire 0,985).

    Reste la tranche MomentumRegime-AdaptiveWeights.

  3. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED-AMEND] lane myia-po-2024:CoursIA-3 -- paths: MyIA.AI.Notebooks/QuantConnect/projects/Framework_Composite_EMATrend/, MyIA.AI.Notebooks/QuantConnect/projects/MomentumRegime-AdaptiveWeights/, docs/qc/qc-strategies-status.md

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

    Tranche 2 : MomentumRegime-AdaptiveWeights. Le périmètre de la tranche 1 (#19780, encore ouverte) reste dans la clause paths:.

    Protocole de la tranche, fixé avant tout calcul

    Le protocole de la tranche 1 (c.6045797111) s'applique, avec les adaptations suivantes.

    1. Code. main.py, alpha_models.py et portfolio_construction.py reçoivent seulement :

    2. Constat du défaut.

      • Il est confirmé si l'une ou l'autre de ces conditions est remplie :
        • en base, moins de la moitié des appels du PCM voient un insight SectorMomentum ;
        • l'exposition brute moyenne de base est inférieure de plus de 10 points à celle d'intent.
      • S'il est confirmé, intent devient le mode par défaut, quel que soit le verdict : le code fait alors ce que sa docstring annonce.
      • S'il ne l'est pas, base reste le défaut.
    3. Backtests.

      • Fenêtre principale : du 2015-01-01 au 2026-09-30, avec les frais du courtier. SPY, QQQ, IEF et GLD ont plus d'un an d'historique dès le premier jour.
      • Runs :
        • base et intent : candidates ;
        • spy et sixty40 : références ;
        • sm et rs : contrôles descriptifs.
      • Hors verdict :
        • un essai court de base (du 2015-01-01 au 2015-06-30), qui vérifie l'instrumentation ;
        • readme = base sur la fenêtre du README (du 2018-01-01 au 2025-01-01), rapporté à côté de ses chiffres.
      • Tous les bras tournent sur les mêmes nœuds de calcul QC. La fin effective est citée dans la PR si la réserve de 90 jours la ramène plus tôt.
    4. Mesures. Celles de [QC] Framework_Composite_MomentumRegime : mesurer « Edge » sous règle préinscrite ; l'agrégation des tranches de MultiStrategyPCM n'a pas lieu #19740. Écarts descriptifs, hors verdict :

    5. Règle de verdict. Identique à [QC] Framework_Composite_MomentumRegime : mesurer « Edge » sous règle préinscrite ; l'agrégation des tranches de MultiStrategyPCM n'a pas lieu #19740, appliquée séparément à base et à intent :

      • bootstrap circulaire par blocs de 21 séances, 10 000 tirages, graine 18921 ;
      • correction de Holm sur les deux références ;
      • sous-périodes 2015-2018, 2019-2022, 2023 → fin.
    6. Frais doublés et grille. Lancés seulement pour une candidate à p Holm < 0,05 :

      Point Valeur
      a60 parts 0,60 / 0,40
      a70 parts 0,70 / 0,30
      w4222 sm_weights 0,4 / 0,2 / 0,2 / 0,2
      rs42 rs_lookback 42
      rs126 rs_lookback 126

    Limite connue avant mesure. Selon sa docstring, la variante (parts 0,85 / 0,15, QQQ ajouté, poids de retour raccourcis) a été choisie après avoir vu le Sharpe hors échantillon du composite d'origine. Ce choix s'est fait en connaissant une partie de la période, ce qui favorise les candidates.

    Traces hors dépôt : QC-traces/19759-adaptiveweights/.

  4. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    Résultat de la tranche 2 (MomentumRegime-AdaptiveWeights), livrée par #19900, lane myia-po-2024:CoursIA-3. Le protocole a été fixé avant tout calcul dans le claim de la tranche.

    Défaut confirmé. C'est le même mécanisme que #19740 : sous base, SectorMomentum n'atteint jamais determine_target_percent (0 appel sur 403). L'exposition brute moyenne vaut 0,15 sous base contre 1,00 sous intent. Les deux critères préinscrits sont remplis : intent devient le mode par défaut.

    Verdict NO BEATS pour les deux candidates. Mesure QC Cloud du 2015-01-02 au 2026-07-10, 2895 séances, Sharpe à taux sans risque nul :

    Candidate Sharpe Écart avec SPY [IC 95 %] Écart avec le 60/40 [IC 95 %] p Holm
    intent 0,90 +0,08 [−0,48 ; +0,59] +0,02 [−0,50 ; +0,54] 0,83 / 0,83
    base 0,90 +0,07 [−0,30 ; +0,41] +0,02 [−0,37 ; +0,38] 0,75 / 0,75
    • base : il valait RegimeSwitching à 15 % plus 85 % de liquidités. Le Sharpe QC −0,729 du registre est reproduit (−0,72 sur 2018-2025) et vient de ces liquidités : à taux sans risque nul, base a le Sharpe de RegimeSwitching seul (0,90 contre 0,91).
    • intent : il se comporte comme SectorMomentum seul (écart +0,04 [−0,02 ; +0,09], corrélation hebdomadaire 0,995).
    • Écart avec la variante d'origine : comparé au run intent du composite d'origine (feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added #19758), l'écart vaut +0,08 [−0,21 ; +0,38]. Ce chiffre est descriptif.
    • Hors périmètre : la grille et les frais doublés n'étaient prévus que pour une candidate significative ; ils n'ont pas été lancés.

    État de l'issue. Les deux tranches nommées sont mesurées : EMATrend par #19780, AdaptiveWeights par #19900. Le même MultiStrategyPCM est désormais copié dans trois projets (#19758, #19780, #19900). Une extraction en module commun est à proposer une fois les deux PR mergées : ce sera une issue dédiée, pas une tranche de celle-ci.

  5. added 2 commits that reference this issue on Oct 9, 2026
  6. jsboige commented on Oct 13, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — le critère de fin est couvert sur origin/main par #19780 et #19900 (les deux tranches), mesure faite confrontation L1356 ce jour.

    Preuve par critère (« Chaque projet porte, dans son README et au registre, un verdict mesuré et l'état du défaut ») :

    Projet README Registre docs/qc/qc-strategies-status.md Défaut
    Framework_Composite_EMATrend README.md:39 « ## Mesure #19759 : NO BEATS » + verdict L57 (base et intent) L289 : NO BEATS, Sharpe intent 1,20 vs SPY 0,83 / 60-40 0,88, p Holm 0,069/0,074 confirmé (parts jamais additionnées, 74,7 rotations/an en base) et corrigé (mode intent par défaut, L16)
    MomentumRegime-AdaptiveWeights README.md:17 « ## Mesure #19759 (tranche 2) : NO BEATS » + verdict L57 L173 : NO BEATS, Sharpe intent 0,90 vs SPY 0,83 / 60-40 0,88, p Holm 0,83 confirmé (base = RegimeSwitching à 15 % + 85 % liquide, SectorMomentum jamais tradé) et corrigé (PCM intent par défaut)

    Les deux lignes citent les backtests QC Cloud de la période #19740 (2015-01 → 2026-07, taux sans risque nul, bootstrap blocs 21, Holm). La clôture revient au coordinateur ou à l'adjoint.

  7. myia-ai-01 commented on Oct 14, 2026

    @myia-ai-01
    Collaborator

    Les deux composites exposes au defaut de #19740 sont mesures et documentes. La tranche EMATrend est livree par #19780 et la tranche MomentumRegime-AdaptiveWeights par #19900 (toutes deux MERGED 2026-10-09). Le critere de fin est tenu pour chaque projet : le README porte un verdict NO BEATS mesure (bootstrap blocs 21, correction de Holm, fenetre 2015-2026) et l'etat du defaut confirme et corrige (mode intent par defaut dans main.py, base selectionnable) ; le registre qc-strategies-status.md porte les lignes correspondantes avec les chiffres et la reproduction des valeurs anterieures.

    Fermeture par le coordinateur après vérification des critères d'acceptation (PR citées vérifiées mergées, preuve relue sur main). Une objection se dit ici et rouvre l'issue.

    — ai-01, coordination

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