Skip to content

QC MeanReversion : le code de main plante le 2018-09-11 (IndexError, XLC trop jeune) et le README décrit la v4.0 #20346

Closed

Description

@jsboige

Grain: MED/qc — lane myia-po-2024:CoursIA-3 — prev: DEEP/qc #20330

Constat (mesuré)

MyIA.AI.Notebooks/QuantConnect/projects/MeanReversion/main.py, tel qu'il est sur main (sha256 7851ba9c19ad), plante sur QC Cloud le 2018-09-11 à 10:00. Projet 37661514 (nœuds ESGF), backtest 6bf412f10f48, fenêtre codée 2015-01-01 → 2024-12-31. Erreur :

Runtime Error: single positional indexer is out-of-bounds
  at _get_3m_return
    return float(hist["close"].iloc[-1] / hist["close"].iloc[-self.rs_lookback] - 1)
 in main.py: line 72
  at _daily_scan
    etf_ret_3m = self._get_3m_return(self.symbols[etf])
 in main.py: line 120

Cause (lecture du code) : _get_3m_return demande rs_lookback + 5 = 68 barres. Il ne rend 0.0 que sous 0,8 × 63 = 50,4 barres, puis lit iloc[-63]. Un ETF jeune a entre 51 et 62 barres : il passe la garde et sort de l'index. C'est le cas de XLC, introduit en juin 2018, le 2018-09-11 (RSI sous 40 ce jour-là). XLRE (octobre 2015) est exposé de la même façon dans ses premières semaines.

Ce n'est pas un effet des demi-séances (#20286) : _daily_scan tourne à 10:00 New York, et la mesure de c.6107023496 montre des historiques complets à cette heure, demi-séances comprises.

Ce que cela dit du README

  • Les métriques du README FR (sweep [EPIC] Consolidation QC/Trading — projets, checkpoints, research notebooks, papertrading + dégénériciser ESGF #1621, Sharpe −0,082) et celles du README EN (« 2015-2026 », Sharpe 0,294) ne peuvent pas venir de ce code sur sa fenêtre codée : il s'arrête en septembre 2018.
  • La description est celle de la v4.0 : sortie à RSI > 60, stop à −8 %, sortie totale en marché baissier. Le code est en v5.2 : sortie à RSI > 65, stop à −10 %, demi-poids (12,5 %) en marché baissier, filtre de force relative sur trois mois contre SPY moins 10 points.
  • config.json porte un cloud-id, le README dit « Aucun ». Non vérifié, hors de cette issue.

Pré-enregistrement (écrit avant le backtest du correctif)

Correctif : une seule ligne. La garde devient len(hist) < self.rs_lookback et rend 0.0, soit la convention que le code applique déjà à un historique court. Un appel à 63 barres ou plus ne change pas ; sous 50,4 barres non plus. Seuls les appels qui plantaient changent.

Exécution : nœuds QC ESGF, fenêtre codée, deux variantes :

  • fix : le correctif seul ;
  • fixdiag : le correctif, plus un compteur journalisé des appels qui tombent entre 51 et 62 barres (symbole, date, longueur).

Prédictions

  1. fix va au bout de la fenêtre (completed: true, sans erreur).
  2. Avant le 2018-09-11, les ordres de fix (date, symbole, quantité) sont identiques à ceux du run qui plante.
  3. Les appels entre 51 et 62 barres ne portent que sur XLC (été 2018) et XLRE (fin 2015, début 2016).
  4. fixdiag passe les mêmes ordres que fix.

Publié ensuite : Sharpe, CAGR, pire baisse, PSR, ordres et frais de fix, avec les identifiants de backtest, dans les deux README réalignés sur le code v5.2. Pas de verdict de stratégie : une seule fenêtre, des paramètres choisis sur cette même période (historique v4.2 → v5.4 du docstring). Cette issue corrige un plantage, elle ne mesure pas un avantage.

Activity

  1. jsboige commented on Oct 11, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-3 -- correctif de garde + réalignement des deux README sur v5.2, paths: MyIA.AI.Notebooks/QuantConnect/projects/MeanReversion/**

  2. jsboige commented on Oct 11, 2026

    @jsboige
    OwnerAuthor

    Résultat, lu à completed: true (lane myia-po-2024:CoursIA-3). Pré-enregistrement : body de cette issue, écrit avant tout backtest du correctif.

    Projets QC sur les nœuds ESGF : fix 37661669, backtest ad190cab96bc, main.py sha256 0b28658c42c7 ; fixdiag 37661671, backtest ee3c72c70fed, sha256 daa6c742530e. Le run qui plante, orig, est le backtest 6bf412f10f48 (projet 37661514, sha256 7851ba9c19ad).

    # Prédiction Mesure Tenue
    1 fix va au bout de la fenêtre completed: true, sans erreur, 2015-01-01 → 2024-12-31 oui
    2 ordres identiques avant le 2018-09-11 258 = 258, identiques (date, symbole, quantité) ; les 259 ordres de orig, jour du plantage compris, sont les 259 premiers de fix oui
    3 appels entre 51 et 62 barres : XLC et XLRE seulement un seul appel : XLC le 2018-09-11, 58 barres oui
    4 fixdiag passe les mêmes ordres que fix 704 = 704, identiques oui

    Le correctif ne change donc qu'un seul appel sur toute la fenêtre : celui qui plantait. Ce jour-là, orig avait soldé XLC (−7 parts) puis s'était arrêté en évaluant sa force relative. fix lui attribue 0.0 et le rachète (+805 parts).

    Métriques de fix, descriptives : Sharpe 0,675 (QC, avec taux sans risque) ; CAGR 10,42 % ; pire baisse 11,1 % ; PSR 8,7 % ; 704 ordres ; rendement net +169,6 %. Pas de verdict de stratégie, comme annoncé : une seule fenêtre, et des paramètres v5.x choisis sur cette même période. Le docstring donne pour la v5.2 un Sharpe de 0,810, que ce backtest ne reproduit pas.

    PR à suivre :

    • correctif de garde ;
    • deux README réalignés sur la v5.2 ;
    • ligne MeanReversion de docs/qc/qc-strategies-status.md requalifiée, avec une note de correction datée.

    Traces : G:/Mon Drive/MyIA/IA/QC-traces/20346-meanreversion/{fix,fixdiag} (results.json).

  3. added a commit that references this issue on Oct 12, 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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions