Skip to content

Mesure A/B : la copie gelee du PCM par poches contre le canonique (TrendWeatherPointInTime) #24628

Open

Description

@jsboige

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 .py du projet n'est touché — ni la copie gelée, ni main.py, ni alpha_models.py : le contrat du registre du suivi en ombre est intact, et la candidate tw-pit reste 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

  1. jsboige commented on Nov 4, 2026

    @jsboige
    OwnerAuthor

    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 gele 793d624e par les trois empreintes sha256 du README du projet) et le canonique projects/SharedPCM/pouches_pcm.py (variant B, additive=True, algorithm=self), sur la fenetre principale 2018-01-01 -> 2026-09-25 en universe=pit.

    Un seul fichier du depot est modifie : le README du projet. Aucun .py du projet n'est touche, donc le contrat du registre du suivi en ombre reste intact et la candidate tw-pit reste 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.

  2. jsboige commented on Nov 4, 2026

    @jsboige
    OwnerAuthor

    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 .py n'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.

    Variante Projet QC Backtest Sharpe net CAGR Pire baisse Ordres
    A — copie gelée 37601754 262237620eaa15151c5faa5ab0c132a1 0,92 19,9 % 36,6 % 1 744
    B — canonique 38896479 2db6d814a11d6669456eefcd10797017 0,92 19,9 % 36,6 % 1 744

    É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 additive n'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 fixed du 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 mensuelle pit. Le test préinscrit de significativité n'a pas été rejoué sur ce chemin : le verdict NO BEATS n'est pas reformulé.

    Preuves : PR #24631, tête 5145514df6, branche feature/qc-pcm-ab-measurement, commit 5145514df6 (1 fichier, 27 lignes ajoutées). Garde de périmètre check_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 pour pouches_pcm.py (5d0618bc480c), alpha_models.py (de37af8068da) et main.py (77e9ff7e9156).

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions