Skip to content

QC EMA-Cross-Stocks : séparer le choix des titres et le signal EMA, mesure hors échantillon (ligue #19821) #20258

Description

@jsboige

Fille de #19821 (ligue de stratégies, protocole commun). Grain de la file « stratégies dégénérées du dépôt » : univers choisi avec le recul.

Constat

projects/EMA-Cross-Stocks/ détient chaque jour, à parts égales, ceux de AAPL, MSFT, GOOGL, AMZN et NVDA dont l'EMA 20 est au-dessus de l'EMA 50. Son README publie, sur 2015-2024, un Sharpe QC de 0,991 et un CAGR de 29,2 %. Il affirme aussi, dans sa « Lecture honnête », que ce rendement vient surtout du choix des cinq titres et qu'une simple détention des mêmes titres ferait aussi bien ou mieux. Cette affirmation n'a jamais été mesurée.

Deux effets se mélangent dans le chiffre publié :

  • le choix des titres, fait avec la connaissance de leur parcours jusqu'en 2024 ;
  • le signal EMA, qui décide quand détenir chaque titre.

La mesure ci-dessous les sépare. L'univers fixe garde ses cinq titres. L'univers « au fil de l'eau » prend, chaque mois, les cinq plus grosses capitalisations américaines connues à cette date.

La règle tient compte de l'arbitrage c.6092954192 (PR #19599) : un BEATS exige une période hors échantillon distincte. Ici, aucun paramètre n'est choisi sur les données : EMA 20/50, cinq titres, bande de 5 % et allocation de 95 % sont ceux du code existant. La période où la stratégie a été présentée, 2015-2024, est traitée comme l'échantillon. Le verdict porte sur les périodes qu'elle n'a pas vues.

Règle inscrite avant le premier backtest

  1. Candidate : EMA-Cross-Stocks sur l'univers au fil de l'eau (universe=pit). Chaque premier jour de bourse du mois, l'univers devient les 5 plus grosses capitalisations américaines. Le filtre est celui de TrendWeatherPointInTime ([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) : action principale, pas de certificat de dépôt, prix > 5, capitalisation > 0. La règle de détention est inchangée : EMA 20 > EMA 50, 95 % répartis à parts égales sur les titres retenus, ordre seulement si l'écart à la cible dépasse 5 %. Un titre qui sort de l'univers est liquidé. Frais : le modèle de courtier natif de Lean déjà utilisé par le projet. Les EMA d'un titre entrant sont préchauffées sur l'historique.

  2. Paramètres ajoutés, sans effet par défaut : start, end, universe (fixed par défaut, pit), top_n (5), mode (ema par défaut ; hold = mêmes titres, mêmes parts, même bande, sans condition EMA), fee_mult (1), trace (0 ; 1 = graphique shadow au format de la ligue, une valeur par séance de SPY, séries entrelacées). Avec les valeurs par défaut, le code doit reproduire le backtest d'origine.

  3. Fenêtre et découpage : chaque configuration tourne une fois, du 2005-01-01 au 2026-06-30. Ses rendements journaliers sont ensuite découpés :

    • échantillon : du 2015-01-01 au 2024-12-31, la fenêtre où la stratégie a été présentée ;
    • hors échantillon : du 2005-01-03 au 2014-12-31, puis du 2025-01-02 au 2026-06-30, mis bout à bout. C'est la seule période qui porte le verdict.

    La période d'avant 2015 n'a servi à aucun choix. Pour l'univers fixe, le choix des titres reste rétrospectif sur toute la fenêtre. C'est pourquoi la candidate est l'univers au fil de l'eau.

  4. Références de la candidate, sur la même période hors échantillon :

    • (a) SPY détenu, sans frais, calculé sur les clôtures que l'algorithme reçoit ;
    • (b) pit-hold : le même univers au fil de l'eau, détenu à parts égales sans condition EMA, avec frais. Cette référence isole le signal EMA.
  5. Statistique : différence de Sharpe, à taux sans risque nul, annualisée sur 252 séances. Bootstrap circulaire par blocs de 21 séances, 10 000 tirages, graine 18921. Correction de Holm sur les deux références.

  6. Sous-périodes hors échantillon : 2005-2009, 2010-2014, 2025-01-02 → 2026-06-30.

  7. BEATS si, contre chacune des deux références, sur la période hors échantillon :

    • p de Holm < 0,05 avec une différence positive ;
    • différence encore positive à frais doublés (un run de plus, lancé seulement si p < 0,05 contre les deux) ;
    • au moins 2 sous-périodes sur 3 positives.

    NO BEATS si la différence est négative ou non significative contre l'une des deux références.

  8. Contrôles descriptifs, hors verdict :

    • fixed-ema contre fixed-hold, sur l'échantillon puis hors échantillon. C'est la mesure directe de la phrase du README : à univers égal, le signal EMA ajoute-t-il quelque chose à la détention ?
    • fixed-hold contre pit-hold : la prime du choix rétrospectif ;
    • les mêmes différences sur l'échantillon 2015-2024 ;
    • l'empreinte de main.py est relevée avant chaque compilation.
  9. Non-régression : le main.py actuel (orig) et le nouveau aux valeurs par défaut (nonreg) tournent sur 2015-01-01 → 2024-12-31. Statistiques QC et ordres doivent être identiques, un par un. Sinon la mesure s'arrête et l'écart est publié.

  10. Compteurs : revues mensuelles, titres distincts passés dans l'univers, nombre moyen de lignes détenues, séances entièrement en liquidités, ordres, frais cumulés, points de trace.

  11. Les résultats ne sont lus qu'à completed: true.

La PR répondra aux cinq questions de la règle organ-first. Le filtre de capitalisation et le modèle de frais mis à l'échelle viennent de TrendWeatherPointInTime, en copie déclarée, car un projet QC ne peut pas importer un autre projet. Le contrat shadow vient de la ligue (#19821).

Activity

  1. jsboige commented on Oct 10, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-3 -- mesure EMA-Cross-Stocks, univers fixe et au fil de l'eau, regle inscrite dans le body -- paths: MyIA.AI.Notebooks/QuantConnect/projects/EMA-Cross-Stocks/**, docs/qc/qc-strategies-status.md

    (check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with [RELEASED] when your PR lands.)

  2. jsboige commented on Oct 10, 2026

    @jsboige
    OwnerAuthor

    Amendement de la règle, posté avant tout nouveau run (2026-10-10, 12:21Z).

    Premier passage. Les six runs de la règle sont faits. La non-régression est exacte : entre orig et nonreg, les 27 statistiques QC et les 1423 ordres sont identiques. Le compteur « séances entièrement en liquidités » a pourtant signalé un défaut : 592 séances sur 5406 dans fixed-hold, un mode qui détient les cinq titres sans condition.

    Défaut mesuré dans le code publié. Lean livre les avis de dividende et de split dans une tranche de minuit, qui ne porte aucune barre de cours.

    • Cette tranche est la première de la journée : c'est elle qui déclenche le rééquilibrage quotidien.
    • Aucun titre n'y a de barre, donc tous sont liquidés (« EMA Exit »).
    • La séance qui porte les vraies barres ne rééquilibre plus. Les lignes ne sont rachetées que le lendemain.

    Mesures :

    • orig (code actuel, 2015-2024) : 442 ordres sur 1423 sont des sorties passées à minuit, réparties sur 111 jours. 94 de ces jours liquident au moins trois lignes. Aucun achat n'est passé à minuit. Les premières dates correspondent aux détachements de dividende d'AAPL (2015-02-05, 2015-05-07) et de MSFT (2015-02-17, 2015-05-19).
    • Avec trace=1, SPY entre dans les données et ses propres dividendes ajoutent des liquidations : 288 jours dans fixed-hold. Le traceur modifie donc la stratégie qu'il mesure, et la référence hold ne détient pas en continu.

    Le premier passage ne mesure donc pas la règle décrite par le projet (long quand l'EMA 20 est au-dessus de l'EMA 50, à plat sinon). Ses résultats restent publiés dans la PR, mais ils ne portent pas le verdict.

    Amendement.

    1. Correctif : une tranche sans barre pour les titres de l'univers ne déclenche plus le rééquilibrage du jour. C'est une garde dans on_data, dans un commit séparé de celui des paramètres.
    2. Le reste de la règle ne change pas : candidate, références, fenêtre, découpage, statistique, seuils, sous-périodes et contrôles descriptifs.
    3. Runs relancés : fixed-ema, fixed-hold, pit-ema et pit-hold, avec le correctif. Ces quatre runs portent le verdict.
    4. Non-régression : elle reste établie pour le commit des paramètres, au premier passage. Un run de plus, fix, mesure l'effet du correctif sur le résultat publié : valeurs par défaut, 2015-2024, comparé à orig (sorties de minuit, ordres, statistiques QC). Prédiction falsifiable : fix ne passe aucun ordre à minuit.
    5. Déclaration : les résultats du premier passage ont été lus avant cet amendement. Verdict du premier passage : NO BEATS. Écart de Sharpe hors échantillon de pit-ema : −0,13 contre SPY détenu, −0,07 contre pit-hold, p de Holm 1,00 dans les deux cas. L'amendement ne change aucun seuil et ne choisit aucun paramètre au vu de ces résultats.
  3. added a commit that references this issue on Oct 10, 2026
  4. jsboige commented on Oct 10, 2026

    @jsboige
    OwnerAuthor

    Résultat : NO BEATS (passe amendée, code corrigé)

    Mesure faite selon la règle du body, amendée par c.6097429792 avant les reruns (correctif de la tranche de minuit). Tous les runs ont été lus à completed: true, projet QC 37623163, empreinte de main.py 39dff013e7f5.

    Effet du correctif sur le backtest d'origine (2015-2024, valeurs par défaut)

    code d'origine (78998fb5…) code corrigé (8b783209…)
    Sharpe QC 0.986 1.124
    CAGR 29.07 % 34.66 %
    Max DD 36.5 % 36.4 %
    PSR 33.16 % 48.53 %
    Ordres 1423 615
    dont ordres à minuit 442 (111 jours) 0 (prédiction vérifiée)

    La non-régression du commit 1 reste acquise : 1423 ordres identiques un par un entre orig et nonreg.

    Verdict sur la candidate pit-ema, hors échantillon (2005-2014 + 2025-01-02 → 2026-06-30)

    Contre Écart de Sharpe IC 95 % p unilatéral p de Holm 2005-2009 2010-2014 2025-2026 S1
    SPY détenu −0.21 [−0.70 ; 0.24] 0.82 1.00 −0.11 −0.26 −0.95
    pit-hold −0.12 [−0.42 ; 0.17] 0.80 1.00 −0.01 −0.17 −0.65

    Écart négatif contre les deux références et sur les trois sous-périodes : NO BEATS. Le run à frais doublés (fee_mult=2), prévu seulement si p < 0,05 contre les deux, n'est pas lancé.

    Les quatre configurations

    Configuration Sharpe HE CAGR HE Max DD HE Sharpe éch. CAGR éch. Max DD éch.
    fixed-ema 0.92 20.4 % −48.2 % 1.32 34.6 % −36.4 %
    fixed-hold 0.86 20.1 % −62.3 % 1.32 34.8 % −39.0 %
    pit-ema 0.33 4.0 % −36.4 % 0.85 17.7 % −42.7 %
    pit-hold 0.45 6.5 % −38.9 % 0.94 21.1 % −37.3 %
    SPY détenu 0.54 9.1 % −55.2 % 0.78 13.0 % −33.7 %

    Sharpe à taux nul, 252 séances. HE = hors échantillon ; éch. = 2015-2024.

    Contrôles descriptifs (hors verdict)

    Écart de Sharpe HE (p) Échantillon (p) 2005-2009 2010-2014 2025-2026 S1
    fixed-ema − fixed-hold +0.06 (0.40) −0.00 (0.50) +0.19 +0.07 −0.70
    fixed-hold − pit-hold +0.41 (0.019) +0.37 (0.001) +0.85 −0.01 +0.05
    fixed-ema − SPY +0.38 (0.087) +0.53 (0.013) +0.94 −0.02 −0.95
    pit-ema − SPY −0.21 (0.82) +0.07 (0.40) −0.11 −0.26 −0.95
    • La phrase du README se vérifie : à univers fixe, le signal EMA n'ajoute rien à la détention des cinq titres. Il réduit la pire baisse hors échantillon (−48 % contre −62 %), au prix de 1364 ordres contre 75.
    • Le rendement publié vient du choix rétrospectif des titres : +0,41 hors échantillon, porté par 2005-2009.

    Compteurs

    • pit : 261 revues mensuelles, 18 titres distincts. L'univers au fil de l'eau est exactement les cinq titres fixes sur 38 revues, toutes entre 2023-04 et 2026-06.
    • Lignes détenues en moyenne : fixed-ema 3,40, fixed-hold 5,00, pit-ema 3,13, pit-hold 4,66.
    • Séances entièrement en liquidités : 459, 1, 412, 1.
    • Ordres QC : 1364, 75, 1462, 164.
    • Points de trace : 5406 par run.

    Première passe (avant correctif)

    Elle reste publiée dans ce fil et donnait le même verdict : pit-ema − SPY −0,13 et − pit-hold −0,07, p de Holm 1,00, sous-périodes toutes négatives. Hors échantillon, le correctif relève les deux configurations à univers fixe (Sharpe 0,83 → 0,92 pour fixed-ema, 0,76 → 0,86 pour fixed-hold) et abaisse celles au fil de l'eau (0,41 → 0,33 pour pit-ema, 0,48 → 0,45 pour pit-hold).

    Traces et outils d'analyse sont hors dépôt (QC-traces/20258-ema-cross-stocks/, results.json). La PR suit.

  5. added a commit that references this issue on Oct 10, 2026
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

    quantconnectQuantConnect strategy development

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions