Repository navigation
feat(qc,#19740): MomentumRegime composite measured NO BEATS, sleeves now added - #19758
Conversation
…now added Lean's PortfolioConstructionModel keeps one active insight per symbol before determine_target_percent runs, so RegimeSwitching overwrote SectorMomentum on SPY, IEF and GLD: the composite was RegimeSwitching at 40 % plus 60 % cash. Mode intent (new default) rebuilds the targets per (symbol, alpha) and adds them, as MultiStrategyPCM's docstring announces; base keeps the old code. QC Cloud 2015-01-02 to 2026-07-09: base and intent are both NO BEATS against SPY and 60/40 (p Holm 0.72 and 1.00). Registry status Edge corrected. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Path-collision (organ #13359/#13615)Cette PR #19758 (
|
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] |
…d-composite Un conflit, resolu en lisant les deux cotes : docs/qc/qc-strategies-status.md, table des strategies composites. Chaque cote portait une annotation differente sur une ligne differente -- ma branche « (NO BEATS, #19759) » sur Framework_Composite_EMATrend, main « (NO BEATS, #19740) » sur Framework_Composite_MomentumRegime (apportee par 8207c65, #19758). Resolution = union des deux annotations, aucune information perdue. Les catalogues generes sont restes byte-identiques a main (regle catalog-pr-hygiene). See #19759 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…et_insights override (#19859) Le defaut documente dans #19740 (mesure) et #19822 (cas pedagogique QC-Py-14) : la methode de base PortfolioConstructionModel.get_target_insights ne preserve que le DERNIER insight actif par symbole. Quand deux Alpha Models emettent sur le meme symbole (EMA-Cross SPY=UP et TrendStocks SPY=UP au meme rebalancement), le dernier emis efface l'autre avant determine_target_percent, ce qui rend l'exemple "SPY: 13.33% (EMA) + 30% (Trend) = 43.33%" inatteignable (cf. mesures #19758, #19780). Le fix ajoute un override get_target_insights dans MultiStrategyPCM qui preserve TOUS les insights actifs groupes par symbole, ce qui permet ensuite a determine_target_percent (override existant) de les regrouper par source_model et d'additionner les tranches de capital allouees a chaque Alpha. La cellule d'interpretation (cell-235dfc3b) gagne une section "Subtilite : addition inter-strategy != get_target_insights par defaut" qui pose le diagnostic, documente la correction, et signale que la validation necessite une execution QC Cloud (create_compile + create_backtest via MCP qc-mcp ou Playwright ; cf. regle F). See #19822, Part of #19740 (umbrella composites). Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…aut, mesure NO BEATS (#19900) * feat(qc,#19759): MomentumRegime-AdaptiveWeights -- PCM intent par defaut, mesure NO BEATS Tranche 2 de #19759. Lean garde un seul insight actif par symbole avant determine_target_percent : sous le code d'origine, SectorMomentum n'atteignait jamais les cibles (0 appel sur 403) et le portefeuille valait RegimeSwitching a 15 % plus 85 % de liquidites (exposition brute 0,15). - mode `intent` (PCM de #19758, parts additionnees par titre), devenu le defaut selon les deux criteres preinscrits ; - modes `base`, `sm`, `rs`, `spy`, `sixty40`, parametres start/end, parts, poids de retour, rs_lookback, fee_mult, graphique shadow et compteurs ; - README FR/EN : mesure 2015-01 -> 2026-07, verdict NO BEATS pour `intent` (p Holm 0,83) et `base` (p Holm 0,75), ancienne analyse corrigee ; - registre docs/qc/qc-strategies-status.md mis a jour. See #19759 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * docs(qc): distinguish pre-rebuild counters and unrounded differences See #19759. Address Hermes R1/R2 without changing strategy code or measured series. Co-Authored-By: Claude-Code <noreply@anthropic.com> --------- Co-authored-by: Your <your.email@example.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Grain: DEEP/qc — lane myia-po-2024:CoursIA-3 — prev: MED/docs #19710
Closes #19740
Résumé
Framework_Composite_MomentumRegimeétait classé Edge au registre des stratégies. Mesuré selon le protocole préinscrit de #19740, il estNO BEATScontre SPY détenu et contre le 60/40, dans sa version d'origine comme dans sa version corrigée.La mesure révèle aussi un défaut de construction. Le composite annonçait l'addition de deux tranches (SectorMomentum 60 %, RegimeSwitching 40 %), mais SectorMomentum n'a jamais tradé.
PortfolioConstructionModelde Lean ne garde qu'un insight actif par symbole avant d'appelerdetermine_target_percent. RegimeSwitching, ajouté en second, écrase SectorMomentum sur SPY, IEF et GLD, et l'univers de SectorMomentum est entièrement inclus dans le sien.rs1,00 ;rs+0,001 [−0,012 ; +0,016].Ce que change la PR
portfolio_construction.pyadditive: reconstruit les cibles à partir de l'insight actif le plus récent par couple (symbole, alpha), puis les somme par symbole ; compteurs de diagnostic ; caveat dans le docstringmain.pymode(intentpar défaut,base= code d'origine,sm/rs= une alpha seule,spy/sixty40= références détenues) ;start/end,sm_weights,rs_lookback, allocations,fee_mult; graphiqueshadow(#18923) ; statistiques d'exécutionalpha_models.pylookback_weightsetmomentum_lookbackpassés en paramètres, valeurs par défaut inchangéesREADME.md,README.en.mddocs/qc/qc-strategies-status.mdMesure
QC Cloud, 2015-01-02 → 2026-07-09 (2894 séances), frais Interactive Brokers. Sharpe à taux sans risque nul, sur la valeur du portefeuille à chaque clôture.
intent(défaut)base(code d'origine)smseulrsseulVerdict (bootstrap circulaire par blocs de 21 séances, 10 000 tirages, graine 18921, Holm sur deux références) :
intentbaseNO BEATSpour les deux. La grille et les frais doublés n'étaient prévus que pour une candidate à p Holm < 0,05 : non lancés.Apport des tranches sous
intent(descriptif, hors Holm) :intent − sm: +0,20 [−0,03 ; +0,43] ;intent − rs: −0,08 [−0,46 ; +0,29].Choix du défaut.
intentrend le projet conforme à sa description (docstring deMultiStrategyPCM). Il ne crée aucun avantage mesuré : son Sharpe (0,83) est inférieur à celui debase(0,90).basereste sélectionnable pour reproduire les chiffres antérieurs.Écart au protocole : fin effective 2026-07-09
Les runs demandaient une fin au 2026-09-30. Ils ont tourné dans une organisation QC éducative sponsorisée, qui retient les 90 derniers jours (
outOfSampleDays: 90) : la fin a été ramenée au 2026-07-09, sans erreur.session_gap0/0 partout).Chiffres antérieurs
readme(base, 2015-01-01 → 2025-12-31) reproduit le tableau du README : Sharpe QC 0,21 contre 0,185, CAGR 4,72 % contre 4,728 %, pire baisse 11,5 %, 522 ordres contre 520. Ce tableau mesurait donc RegimeSwitching à 40 % plus du liquide. La piste « T80/RS20 » n'avait pas d'objet : sousbase, les parts ne changent que la part de liquide.oos(base, 2023-01-01 → 2026-05-01, 834 séances) donne Sharpe QC 0,133, PSR 2,5 %, 136 ordres. Hypothèse non vérifiée : autre version du code.Limites
alpha_models.py). Ce biais favorise la candidate, ce qui renforce leNO BEATS.PCM calls with SM. Sousintent, il reste à 0 par construction : il compte les insights reçus pardetermine_target_percent, après l'écrasement. L'addition se lit dans l'exposition brute (1,00) et dans les ordres GLD (203 contre 111).Composites voisins exposés au même mécanisme (non corrigés ici)
Revue des sources par un sous-agent, puis vérification par la lane. Le motif tient à trois conditions :
CompositeAlphaModel;source_modelpour additionner des parts.Aucun projet ne surcharge
get_target_insights(grep -rn target_insights: 0 résultat).Framework_Composite_EMATrendmain.py:42/45-46),CompositeAlphaModelmain.py:59-62,by_alphaportfolio_construction.py:23-30MomentumRegime-AdaptiveWeightsmain.py:37-38),by_alphaportfolio_construction.py:32-37Framework_Composite_TrendWeathermain.py:32-39)Framework_Composite_FamaFrenchAllWeathermain.py:37,40)composite-c1-multiassetRiskParityPCMne groupe pas par alpha (portfolio_construction.py:17-36)composite-c2-equityfactorMeanVariancePCMne groupe pas par alpha (portfolio_construction.py:18-55)Portfolio-IBKR-Coinbase-Hybridmain.py:411-447)Les deux projets exposés sont suivis par #19759 (une mesure chacun) ; ils ne sont pas touchés ici.
Preuves
alpha_models.py896d0843fcdd,main.py83125b57687c,portfolio_construction.py9658c87fcc4b. Les deux premiers fichiers committés sont identiques aux versions mesurées. Lemain.pycommitté (b25f2790cdae) n'en diffère que par la valeur par défaut demodeet des commentaires ; chaque run passaitmodeexplicitement.base207329fa ;intent1612f3f3 ;sm85558791 ;rs92272158 ;spy952a6554 ;sixty40ae609e39 ;readme5529dab9 ;oos5135a4bd ;trial0b67e4ca ettrial_intented9c5d98.G:\Mon Drive\MyIA\IA\QC-traces\19740-momentumregime\(plan.json,backtest.json,chart.json,backtest_raw.jsonpar run ;results_base.json,results_intent.json).check_prose_quantitative_claims.py --diff→[OK]. Aucun notebook touché (quantbook.ipynbinchangé).Verdict SOTA
SOTA-OK : backtests Lean sur QC Cloud, moteur et données natives, aucune sortie substituée.
🤖 Generated with Claude Code