Repository navigation
Description
Part of #20188
Mesure A/B de la copie gelée du PCM par poches contre le canonique
Ce qui est mesuré
La copie déclarée projects/TrendWeatherPointInTime/portfolio_construction.py est la seule survivante de la famille du PCM par poches qui ne soit pas un kit pédagogique autonome. Elle est antérieure au correctif additive : pas de paramètre additive, pas de reconstruction des cibles depuis les insights actifs, lecture directe de active_insights.
Cette copie est gelée : elle porte la candidate tw-pit du registre du suivi en ombre (#18923), dont le code est rejoué au SHA gelé. Elle ne peut donc pas être migrée vers le canonique — la question n'est pas « faut-il la migrer », mais « le gel coûte-t-il un comportement différent, et de combien ? ». Tant que la question n'a pas de réponse mesurée, la copie reste une copie dont personne ne connaît l'écart réel.
Hypothèse préinscrite
Le composite TrendWeatherPointInTime comporte deux poches dont les univers sont disjoints :
- poche tendance : actions de grandes capitalisations (
TrendStocks), les ETFs All Weather sont explicitement exclus (exclude=AW_TICKERS) ; - poche All Weather : SPY, IEF, GLD, XLP.
Le mode additive du canonique ne diffère du mode de base que lorsqu'un même symbole reçoit des insights de plusieurs sources (il additionne alors les poids par symbole, là où le mode de base n'en garde qu'un). Deux poches disjointes ne partagent aucun symbole : l'addition n'a donc jamais rien à sommer.
Hypothèse : sur ce projet, la copie gelée et le canonique produisent des cibles identiques, donc des résultats identiques.
Si l'hypothèse est fausse, le gel est dégradé : c'est le résultat le plus valuable de la mesure, et il sera publié tel quel.
Protocole préinscrit
| Variante A | Variante B | |
|---|---|---|
| Code | copie gelée MultiStrategyPCM (repo HEAD = SHA gelé 793d624e) |
canonique MultiStrategyPouchesPCM (projects/SharedPCM/pouches_pcm.py, verbatim) |
| Projet QC | 37601754 (shadow-tw-pit), code déjà poussé au gel |
projet dédié, mêmes fichiers sauf le module PCM et l'import de main.py |
| Fenêtre | 2018-01-01 → 2026-09-25 (fenêtre principale du README du projet) | idem |
| Paramètres | universe=pit, top_n=15, weighting=momentum, fee_mult=1, trend_alloc=0.75 |
idem |
Le mode additive=True est activé explicitement avec algorithm=self, comme l'exige le canonique.
Mesures : Sharpe, CAGR et pire baisse calculés sur les séries du rejeu en ombre (graphique shadow, séries e0..e4 fusionnées), par l'instrument du dépôt (shadow_replay.py), pas sur les statistiques du rapport QuantConnect — comme le prescrit le README du projet. Les statistiques QC (Sharpe avec taux sans risque, nombre d'ordres) servent de témoin négatif : si elles divergent, l'une des deux variantes a divergé de la fenêtre principale déjà publiée.
Règle de verdict (fixée avant le premier backtest)
- Divergence nulle (Sharpe, CAGR, pire baisse et nombre d'ordres identiques) ⇒ le gel est documenté comme sans coût de comportement sur ce projet ; la copie déclarée reste gelée, et son entrée de manifeste porte la mesure au lieu d'une assertion.
- Divergence mesurée ⇒ le gel est dégradé ; l'écart est publié avec sa valeur, sa source et sa borne, et la migration du projet vers le canonique est rouverte.
Dans les deux cas, le verdict est écrit dans le README du projet avec les identifiants de backtest et les valeurs mesurées.
Périmètre
- Un seul fichier du dépôt est modifié :
projects/TrendWeatherPointInTime/README.md. - Aucun fichier
.pydu projet n'est touché — ni la copie gelée, nimain.py, nialpha_models.py: le contrat du registre du suivi en ombre est intact, et la candidatetw-pitreste rejouable. - Règle G : les deux backtests sont exécutés sur QC Cloud, et Sharpe / CAGR / pire baisse figurent dans le corps de la PR.
Preuve que la variante A est bien le code gelé
Les empreintes sha256 des trois fichiers du projet au HEAD du dépôt sont main.py 9618cea1d839, alpha_models.py de37af8068da, portfolio_construction.py 6c325cd73df0 — identiques aux empreintes que le README du projet déclare pour les fichiers extraits au commit gelé 793d624e. Le projet QC 37601754 porte des fichiers de tailles identiques (6680, 7063, 2742 octets) et leur contenu a été relu.
Activity
jsboige commentedon Nov 4, 2026
Grain: DEEP/qc -- lane myia-po-2024:CoursIA-2 -- prev: MED/guard #24627
[CLAIMED] lane myia-po-2024:CoursIA-2 -- paths: MyIA.AI.Notebooks/QuantConnect/projects/TrendWeatherPointInTime/README.md
Mesure A/B preinscrite entre la copie gelee
portfolio_construction.py(variant A, projet QC 37601754, code verifie identique au SHA gele793d624epar les trois empreintessha256du README du projet) et le canoniqueprojects/SharedPCM/pouches_pcm.py(variant B,additive=True,algorithm=self), sur la fenetre principale 2018-01-01 -> 2026-09-25 enuniverse=pit.Un seul fichier du depot est modifie : le README du projet. Aucun
.pydu projet n'est touche, donc le contrat du registre du suivi en ombre reste intact et la candidatetw-pitreste rejouable.Les deux backtests sont lances sur QC Cloud ; Sharpe, CAGR et pire baisse sont calcules sur les series du rejeu en ombre par l'instrument du depot (
shadow_replay.py), comme le prescrit le README du projet. Le verdict et les valeurs mesures sont ecrits dans le README et dans le corps de la PR.jsboige commentedon Nov 4, 2026
Grain: DEEP/qc — lane myia-po-2024:CoursIA-2 — prev: MED/guard #24627
[DELIVERED] lane myia-po-2024:CoursIA-2 -- paths: MyIA.AI.Notebooks/QuantConnect/projects/TrendWeatherPointInTime/README.md -- PR #24631
Mesure A/B livrée, dans le périmètre annoncé (le seul fichier touché est le README du projet ; aucun
.pyn'est modifié, le contrat du registre du suivi en ombre reste intact).Protocole exécuté, tel qu'inscrit dans le corps de l'issue : fenêtre principale 2018-01-01 → 2026-09-25,
universe=pit, autres paramètres par défaut.262237620eaa15151c5faa5ab0c132a12db6d814a11d6669456eefcd10797017Écart entre les deux séries d'équité : 0,000000 dollar au maximum sur 2 194 rendements, capital final identique (486 462 dollars) — séries identiques bit pour bit. Mesures par l'instrument du dépôt (
shadow_replay.py), frais 2,12 %, rotation 7,3 par an.Verdict : la copie gelée et le canonique sont équivalents en comportement. L'égalité est structurelle : les deux poches n'ont aucun symbole en commun (la poche tendance exclut SPY, IEF, GLD et XLP), donc la reconstruction additive du canonique n'a rien à additionner. Le gel n'introduit aucune divergence et le correctif
additiven'a pas d'effet observable sur ce projet. La décision de dégel reste au coordinateur (#20188) ; la mesure fournit l'élément qui manquait au manifeste de source unique.Point de reproductibilité constaté au passage, consigné dans le README : le rejeu du 2026-11-04 ne reproduit pas la ligne « univers ex ante » du 2026-10-06 (0,92 contre 1,05 de Sharpe net ; 36,6 % contre 24,3 % de pire baisse ; 1 744 ordres contre 1 727). Un contrôle
fixeddu même jour, même projet, même code, reproduit exactement la ligne publiée (Sharpe net 1,2222 ; CAGR 23,01 % ; pire baisse 27,59 % ; frais 0,25 % par an ; rotation 7,0 par an ; 1 679 ordres), ce qui écarte le code, les paramètres, l'instrument, l'environnement et le modèle de frais. L'écart porte donc sur les données fondamentales qui nourrissent la sélection mensuellepit. Le test préinscrit de significativité n'a pas été rejoué sur ce chemin : le verdictNO BEATSn'est pas reformulé.Preuves : PR #24631, tête
5145514df6, branchefeature/qc-pcm-ab-measurement, commit5145514df6(1 fichier, 27 lignes ajoutées). Garde de périmètrecheck_pr_perimeter.py 24631 --scan-thread→VERDICT: OK. Les fichiers de la variante B ont été poussés dans QC depuis le disque du dépôt et relus depuis QC : sha256 identique à la source pourpouches_pcm.py(5d0618bc480c),alpha_models.py(de37af8068da) etmain.py(77e9ff7e9156).