Repository navigation
QC EMA-Cross-Stocks : séparer le choix des titres et le signal EMA, mesure hors échantillon (ligue #19821) #20258
Description
Activity
- addedquantconnectQuantConnect strategy developmentQuantConnect strategy development
on Oct 10, 2026 [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.)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
origetnonreg, 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 dansfixed-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 dansfixed-hold. Le traceur modifie donc la stratégie qu'il mesure, et la référenceholdne 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.
- 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. - 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.
- Runs relancés :
fixed-ema,fixed-hold,pit-emaetpit-hold, avec le correctif. Ces quatre runs portent le verdict. - 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 :fixne passe aucun ordre à minuit. - 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 contrepit-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.
- added a commit that references this issue
on Oct 10, 2026 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 demain.py39dff013e7f5.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
origetnonreg.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-ema0.92 20.4 % −48.2 % 1.32 34.6 % −36.4 % fixed-hold0.86 20.1 % −62.3 % 1.32 34.8 % −39.0 % pit-ema0.33 4.0 % −36.4 % 0.85 17.7 % −42.7 % pit-hold0.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-ema3,40,fixed-hold5,00,pit-ema3,13,pit-hold4,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 pourfixed-ema, 0,76 → 0,86 pourfixed-hold) et abaisse celles au fil de l'eau (0,41 → 0,33 pourpit-ema, 0,48 → 0,45 pourpit-hold).Traces et outils d'analyse sont hors dépôt (
QC-traces/20258-ema-cross-stocks/,results.json). La PR suit.- added a commit that references this issue
on Oct 10, 2026
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é :
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
Candidate :
EMA-Cross-Stockssur l'univers au fil de l'eau (universe=pit). Chaque premier jour de bourse du mois, l'univers devient les5plus grosses capitalisations américaines. Le filtre est celui deTrendWeatherPointInTime([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.Paramètres ajoutés, sans effet par défaut :
start,end,universe(fixedpar défaut,pit),top_n(5),mode(emapar défaut ;hold= mêmes titres, mêmes parts, même bande, sans condition EMA),fee_mult(1),trace(0 ; 1 = graphiqueshadowau 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.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 :
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.
Références de la candidate, sur la même période hors échantillon :
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.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.
Sous-périodes hors échantillon : 2005-2009, 2010-2014, 2025-01-02 → 2026-06-30.
BEATS si, contre chacune des deux références, sur la période hors échantillon :
NO BEATS si la différence est négative ou non significative contre l'une des deux références.
Contrôles descriptifs, hors verdict :
fixed-emacontrefixed-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-holdcontrepit-hold: la prime du choix rétrospectif ;main.pyest relevée avant chaque compilation.Non-régression : le
main.pyactuel (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é.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.
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 contratshadowvient de la ligue (#19821).