You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
QC : deux composites Framework exposés au défaut de #19740 (EMATrend, MomentumRegime-AdaptiveWeights) #19759
#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 :
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)
Mesurer le défaut :
compteur d'insights reçus par alpha dans determine_target_percent ;
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).
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 ;
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.
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.
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).
sixty40 : 60 % SPY et 40 % IEF, rééquilibrés le premier jour de bourse de chaque mois ;
pour la grille, les parts sm_allocation (0,85) et rs_allocation (0,15), ainsi que les poids de retour sm_weights (0,5 / 0,2 / 0,2 / 0,1) et rs_lookback (63) ;
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.
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.
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).
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.
[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)
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.
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.
Activity
jsboige commentedon Oct 7, 2026
[CLAIMED] lane myia-po-2024:CoursIA-3 — tranche 1 :
Framework_Composite_EMATrend, mesure du défaut, modeintent, verdict contre SPY détenu et 60/40 -- paths: MyIA.AI.Notebooks/QuantConnect/projects/Framework_Composite_EMATrend/**, docs/qc/qc-strategies-status.mdProtocole de la tranche, fixé avant tout calcul
Le protocole de #19740 s'applique, avec les adaptations suivantes.
Code.
main.py,alpha_models.pyetportfolio_construction.pyreçoivent seulement :startetend, avec pour défauts les dates actuelles du code (2018-01-01 → 2025-01-01) ;mode:base: code inchangé ;intent:MultiStrategyPCMreconstruit 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:EMACrossAlphaseul, à 100 % ;trend:TrendStocksAlphaseul, à 100 % ;spy: SPY détenu à 100 % ;sixty40: 60 % SPY et 40 % IEF, rééquilibrés le premier jour de bourse de chaque mois ;ema_allocation(0,70) ettrend_allocation(0,30), les périodesema_fast/ema_slowd'EMACrossAlpha(20 / 50) etsma_trenddeTrendStocksAlpha(200), pour la grille ;fee_mult(défaut 1) ;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 dedetermine_target_percentoù un insightTrendStocksd'un des cinq titres communs atteint le calcul des cibles, et l'exposition brute moyenne.Backtests.
baseetintent(candidates),spyetsixty40(références),emaettrend(contrôles descriptifs).base(2015-01-01 → 2015-06-30) qui vérifie l'instrumentation, puisreadme=basesur la fenêtre du README (2018-01-01 → 2025-01-01), rapporté à côté de ses chiffres.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.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 à
baseet à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.Frais doublés et grille. Lancés seulement pour une candidate à p Holm < 0,05.
a50a90ef10ema_fast/ema_slow10 / 30ef50ema_fast/ema_slow50 / 100sma150sma_trend150Limite connue avant mesure. La tranche
EMACrossne 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/.jsboige commentedon Oct 7, 2026
Résultat de la tranche 1 (
Framework_Composite_EMATrend), selon le protocole de c.6045797111 : #19780.NO BEATSpour les deux candidates.intent: +0,37 contre SPY (p Holm 0,069), +0,32 contre 60/40 (0,074).base: p Holm 0,57.intentdevient le défaut du projet, parce que c'est la conception annoncée. Ce choix ne repose sur aucun avantage démontré.intentne se distingue pas d'EMACross seul (+0,00, corrélation hebdomadaire 0,985).Reste la tranche
MomentumRegime-AdaptiveWeights.Merge remote-tracking branch 'origin/main' into feature/19759-ematren…
jsboige commentedon Oct 8, 2026
[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 clausepaths:.Protocole de la tranche, fixé avant tout calcul
Le protocole de la tranche 1 (c.6045797111) s'applique, avec les adaptations suivantes.
Code.
main.py,alpha_models.pyetportfolio_construction.pyreçoivent seulement :startetend, avec pour défauts les dates actuelles du code (2018-01-01 → 2025-01-01) ;mode:base: code inchangé ;intent: leMultiStrategyPCMde feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added #19758, repris tel quel deFramework_Composite_MomentumRegime; il reconstruit les cibles à partir du dernier insight actif par couple (titre, modèle source), puis les additionne par titre ;sm:SectorMomentumAlphaseul, à 100 % ;rs:RegimeSwitchingAlphaseul, à 100 % ;spy: SPY détenu à 100 % ;sixty40: 60 % SPY et 40 % IEF, rééquilibrés le premier jour de bourse de chaque mois ;sm_allocation(0,85) etrs_allocation(0,15), ainsi que les poids de retoursm_weights(0,5 / 0,2 / 0,2 / 0,1) etrs_lookback(63) ;fee_mult(défaut 1) ;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 les compteurs de feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added #19758 :SectorMomentumatteint le calcul des cibles ;SectorMomentumUP reçus ;Constat du défaut.
base, moins de la moitié des appels du PCM voient un insightSectorMomentum;baseest inférieure de plus de 10 points à celle d'intent.intentdevient le mode par défaut, quel que soit le verdict : le code fait alors ce que sa docstring annonce.basereste le défaut.Backtests.
baseetintent: candidates ;spyetsixty40: références ;smetrs: contrôles descriptifs.base(du 2015-01-01 au 2015-06-30), qui vérifie l'instrumentation ;readme=basesur la fenêtre du README (du 2018-01-01 au 2025-01-01), rapporté à côté de ses chiffres.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−sm,intent−smetintent−rs;intent− le runintentde feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added #19758 (Framework_Composite_MomentumRegime, parts 0,60 / 0,40), relu depuis ses traces, sur les séances communes. Cet écart dit ce que la variante « T85/RS15 » change par rapport au composite dont elle dérive.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 à
baseet àintent:Frais doublés et grille. Lancés seulement pour une candidate à p Holm < 0,05 :
a60a70w4222sm_weights0,4 / 0,2 / 0,2 / 0,2rs42rs_lookback42rs126rs_lookback126Limite 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/.jsboige commentedon Oct 8, 2026
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 jamaisdetermine_target_percent(0 appel sur 403). L'exposition brute moyenne vaut 0,15 sousbasecontre 1,00 sousintent. Les deux critères préinscrits sont remplis :intentdevient le mode par défaut.Verdict
NO BEATSpour les deux candidates. Mesure QC Cloud du 2015-01-02 au 2026-07-10, 2895 séances, Sharpe à taux sans risque nul :intentbasebase: 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,basea 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).intentdu 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.État de l'issue. Les deux tranches nommées sont mesurées : EMATrend par #19780, AdaptiveWeights par #19900. Le même
MultiStrategyPCMest 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.docs(qc): distinguish pre-rebuild counters and unrounded differences
feat(qc,#19759): EMATrend -- tranches additionnees (intent), NO BEATS…
feat(qc,#19759): MomentumRegime-AdaptiveWeights -- PCM intent par def…
jsboige commentedon Oct 13, 2026
[INFO] candidate-delivered — le critère de fin est couvert sur
origin/mainpar #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 ») :
docs/qc/qc-strategies-status.mdFramework_Composite_EMATrendREADME.md:39« ## Mesure #19759 :NO BEATS» + verdict L57 (base et intent)intentpar défaut, L16)MomentumRegime-AdaptiveWeightsREADME.md:17« ## Mesure #19759 (tranche 2) :NO BEATS» + verdict L57Les 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.
myia-ai-01 commentedon Oct 14, 2026
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