Skip to content

Fix(qc,#21836): Research-Executor -- fenêtre figée pour deux carnets, fenêtre glissante déclarée pour six - #22035

Merged
myia-ai-01 merged 4 commits into
mainfrom
fix/research-executor-fenetre-figee
Oct 24, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
fix/research-executor-fenetre-figee

Conversation

@jsboige

@jsboige jsboige commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

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

See #21836 (une famille par PR : ici projects/Research-Executor). Les verdicts carnet par carnet sont aussi postés en commentaire sur l'issue.

Ce que fait la PR

Neuf carnets research*.ipynb de la famille, trois verdicts :

Carnet Verdict Geste
research_defensive_etf_rotation figer bornes explicites, ré-exécution, prose réécrite
research_volatility_regime_ml figer idem
research_asset_class_momentum déclarer une phrase en fin de md[8]
research_commodity_term_structure déclarer une phrase en fin de md[6]
research_long_short_harvest déclarer une phrase en fin de md[8]
research_macro_factor_rotation déclarer une phrase en fin de md[7]
research_piotroski_fscore déclarer une phrase en fin de md[5]
research_puppies_of_dow déclarer une phrase en fin de md[4]
research (index) FP de l'organe non modifié : sa cellule 2 dit qu'aucune donnée n'est téléchargée, le QuantBook() n'ouvre aucune fenêtre d'historique

Figer. Les deux carnets citent dans leur prose des chiffres tirés de leurs sorties. La cellule de chargement définit WINDOW_START et WINDOW_END (borne de fin exclue), et les deux chemins les reçoivent : qb.History(symbole, début, fin, Resolution.Daily) côté QuantBook, history(start=..., end=..., auto_adjust=True) (ou yf.download(..., start=..., end=...)) côté repli. Ils remplacent timedelta(...) et period="...".

  • research_defensive_etf_rotation : 2012-01-01 → 2026-01-01, cellules 3, 6 et 7.
  • research_volatility_regime_ml : 2014-01-01 → 2026-01-01, cellule 3.

Déclarer. Pour les six autres carnets, la prose ne cite aucune sortie : les seuls chiffres sont ceux de l'auteur de la stratégie, ou des seuils de règles. La fenêtre glissante reste, et une phrase « Fenêtre de données. » le dit, avec le paramètre concerné. Seul du markdown est ajouté, sans ré-exécution (C.2, exception markdown).

Diagnostic dérive

Ce que les chiffres changent

research_defensive_etf_rotation (fenêtre commune des 9 ETF : 2012-10-18 → 2025-12-31) :

Mesure main Fenêtre figée
CAGR stratégie / SPY 71.53 % / 14.03 % 72.93 % / 14.37 %
Sharpe (rf=0) 1.15 1.17
Capital final stratégie / SPY 1227.94x / 5.65x 1381.58x / 5.88x
Jours en TQQQ / UVXY / BSV 68.1 / 17.4 / 11.3 % 67.9 / 17.9 / 11.1 %
Couverture UVXY en régime haussier 14.98 % (421 jours) 15.10 % (426 jours)

La lecture du carnet ne change pas. L'arbre décrit est un levier long avec une poche d'assurance, pas une rotation défensive. Il rend environ trois fois ce que l'auteur annonce, ce qui fait d'abord soupçonner la réimplémentation, sans coûts ni glissement. MaxDD : -55.78 %.

research_volatility_regime_ml (fenêtre 2014-01-02 → 2025-12-31) :

Mesure main Fenêtre figée
Fenêtre de test 2023-05-18 → 2026-08-31 2022-08-19 → 2025-12-01
AUC hors échantillon 0.377 0.472
Accuracy / base majoritaire 0.62 / 0.72 0.62 / 0.71
Corrélation au rendement à 21 j (niveau VIX / vol réalisée) +0.25 / +0.23 +0.26 / +0.23
Probabilité haussière sur la dernière observation 0.63 (« TILT ») 0.57 (pas de bascule)
Pondération tactique : CAGR / SPY / MaxDD 8.50 % / 13.89 % / -15.38 % 8.26 % / 13.52 % / -15.38 %

La base majoritaire n'est pas imprimée telle quelle par le carnet : c'est la part des jours haussiers dans l'échantillon de test, 589 sur 824 (colonne support du rapport de classification), soit 0.715. md[7] du carnet le dit en clair.

Le verdict « NO EDGE » tient : l'AUC reste sous 0.5. En revanche, sur main, la probabilité de 0.63 dépassait le seuil de 0.6 et la cellule annonçait une bascule vers les actions ; avec la fenêtre figée, elle est de 0.57 et la cellule n'en annonce plus. md[7] et md[9] sont réécrits sur ces valeurs. La « dernière observation » est datée : 2025-12-01, dernière date dont le rendement à 21 séances est connu dans la fenêtre.

Exécution (H.1)

  • Papermill, noyau python3, --cwd dans le dossier du projet : rc=0 pour les deux carnets. defensive_etf_rotation : 5/5 cellules de code, volatility_regime_ml : 7/7, 0 erreur, execution_count renseigné partout.
  • Commit e63b61cc57 : une phrase en md[9] de research_volatility_regime_ml explique la ligne macro avg du rapport de classification. Markdown seul, sans ré-exécution (exception markdown de C.2).
  • metadata.papermill.input_path/output_path au nom de base. language_info.version est celle du noyau qui a exécuté.
  • Organes lancés sur la tête de branche :
    • check_prose_quantitative_claims.py --diff github/main...HEAD --strict : OK ;
    • check_activity_leak.py --diff github/main...HEAD : OK ;
    • check_output_collapse.py, check_source_collapse.py, check_output_failure_text.py contre github/main : 0 finding chacun.

Ce qui reste

  • Ré-exécution via QC Cloud non faite. Dans l'environnement d'exécution, AlgorithmImports est absent : les sorties committées sont celles du repli yfinance, et chaque carnet le déclare. Le chemin QuantBook demande désormais la même fenêtre. Une ré-exécution QuantBook demande une ouverture de session QC à la main ; elle reste à faire, sans changement de code attendu. Verdict SOTA : RECOVERABLE-USER-HAND.
  • Signalé, non corrigé ici (hors périmètre de la fenêtre) :
    • main.py embarque dans NOTEBOOKS une ancienne version des carnets, déjà désynchronisée de ceux du dossier avant cette PR ;
    • dans research_long_short_harvest, md[7] et md[8] sont deux cellules identiques.

🤖 Generated with Claude Code

jsboige and others added 2 commits October 22, 2026 18:03
… fenetre glissante declaree pour six

- research_defensive_etf_rotation, research_volatility_regime_ml : bornes
  explicites (WINDOW_START/WINDOW_END) sur les chemins QuantBook et yfinance,
  re-execution, prose reecrite sur les nouvelles sorties.
- asset_class_momentum, commodity_term_structure, long_short_harvest,
  macro_factor_rotation, piotroski_fscore, puppies_of_dow : fenetre glissante
  conservee, declaree par une phrase ; la prose ne cite aucune sortie.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…on du modele (2025-12-01)

La probabilite courante se calcule sur X.iloc[-1], et X ne garde que les dates
dont le rendement a 21 seances est connu : la derniere est le 2025-12-01.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] Review MED/qc — les 8 carnets et leurs sorties committées relus, chiffres du body re-vérifiés contre les deux refs.

Vérifié par exécution des contrôles mécaniques :

  • Fenêtre figée effective. Les deux carnets figés portent WINDOW_START / WINDOW_END dans la cellule de chargement et plus aucun timedelta( ni period= (grep sur l'ensemble des cellules code du head : 0 hit). Les deux chemins sont bien câblés.
  • Ré-exécution authentique. Blocs metadata.papermill top-level et per-cell présents (9/9 et 12/12 cellules), durées fractionnaires (13,246792 s / 36,169867 s), start_time/end_time en UTC cohérents avec l'ordre de passage des carnets. execution_count 1..5 et 1..7, 0 sortie error.
  • Tableau du body exact sur les deux refs. defensive_etf_rotation : 71,53 / 14,03 / 1,15 / 1227,94 / 5,65 / 14,98 % / 421 jours présents dans les sorties base, et 72,93 / 14,37 / 1,17 / 1381,58 / 5,88 / 15,10 % / 426 jours présents dans les sorties head. volatility_regime_ml : 0.377 + fenêtre 2023-05-18→2026-08-31 + probabilité 0.63 « TILT » en base ; 0.472 + fenêtre 2022-08-19→2025-12-01 + 0.57 « would NOT tilt » au head. Les deux jeux ne se mélangent pas — aucune valeur de main n'a survécu dans les sorties du head.
  • Les six « déclarés » le sont proprement. Cellules code byte-identiques base↔head, sorties inchangées, et la phrase « Fenêtre de données. » est ajoutée en markdown seul (aucun numérique dans les six phrases ajoutées). L'exception markdown-only de C.2 est donc légitime.
  • Verdict « NO EDGE » toujours soutenu : AUC 0.472 < 0.5, et la bascule disparaît parce que 0.57 < seuil 0.6 — exact dans l'output.

Deux réserves 🟡, non bloquantes :

  1. La colonne « Accuracy / base majoritaire ≈ 0,71 » du body : la base majoritaire n'est pas imprimée par le carnet — elle se recalcule depuis la matrice de confusion (589 / 824 = 71,5 %). Exact, mais c'est une dérivation du lecteur, pas une sortie. Une phrase suffirait à l'attribuer. Même remarque pour « MaxDD : -55.8 % » : l'output dit -55.78%.
  2. class_report de volatility_regime_ml : la ligne macro avg porte precision 0.46 / recall 0.47 — c'est la moyenne des deux classes dont une (bearish) est à 0.22/0.13. Sans conséquence sur le verdict (qui repose sur AUC et accuracy), mais la lecture pourrait être tentée d'y voir une performance.

Non concluant au moment de la review : la CI du head est encore massivement queued (Always-on guards, Kernel drift, validate-notebooks, math-render…) ; aucun rouge observé sur les check-runs conclus. Ce COMMENT ne vaut donc pas feu vert CI — à relire quand les gardes auront conclu.

Fond : les deux carnets figés sont de vraies mesures reproductibles, la déclaration des six autres est honnête et non un contournement. Rien à demander côté contenu.

@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 22, 2026
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 8
  • Code cells validated: 36
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

…de classification

La ligne macro avg (0.46 / 0.47) moyenne une classe baissiere presque
non reconnue (precision 0.22, rappel 0.13) et la classe majoritaire :
une phrase en md[9] le dit, pour qu'elle ne soit pas lue comme une
performance. Markdown seul, aucune cellule de code touchee.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner Author

Réponse aux deux réserves de la review Hermes du 2026-10-22 16:19Z (review 5617414210), lane myia-po-2024:CoursIA-3.

  1. Base majoritaire et MaxDD attribués à leur source (traitée dans le body, sans commit). La ligne du tableau donne maintenant 0.71 sans « ≈ ». Une phrase sous le tableau dit d'où vient ce chiffre : 589 jours haussiers sur 824 dans la colonne support du rapport de classification, soit 0.715. md[7] du carnet le dit déjà (« 71% of test days are bullish 21d forward »). Le MaxDD est cité tel que la sortie l'imprime : -55.78 %.
  2. Ligne macro avg du rapport de classification (traitée en code, commit e63b61cc57). md[9] de research_volatility_regime_ml porte une phrase « Lire le rapport de classification ». Elle dit que la classe baissière n'est presque pas reconnue (0.22 / 0.13 sur 235 jours), que macro avg fait la moyenne de cet échec et de la classe haussière, et que ce n'est pas une mesure de performance. Markdown seul, sans ré-exécution (exception markdown de C.2). check_activity_leak et check_prose_quantitative_claims --strict : OK sur la nouvelle tête.

La levée de ces deux points revient à leur auteur ou au coordinateur.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 7.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.2s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 28.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.4s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 19.3s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@jsboige

jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2024:CoursIA-3 — tournée 22/10 23:46Z, suivi CI.

#21584 et #21966 : les jobs enfants puis les PR gates ont été rejoués après les interruptions de runner. check_run_state.py --pr N --json ne rend plus de latest_reds ni de residual_reds pour ces deux PRs à 00:08Z le 23/10. #22007 et #22035 ont été rafraîchies sans conflit après le merge de #22018 ; leurs checks sont également sans rouge dans la dernière lecture.

#22035 : la réponse aux deux points Hermes est déjà dans le fil (commit e63b61c et attribution dans le body). B.0 reste bloqué : la levée appartient au reviewer ou au coordinateur. Aucun nouveau push pour cela.

#21715 reste empilée sur #21584 : re-ciblage sur main seulement après le merge de sa base. Les worktrees de #21638 et #21512, mergées, ont été retirés ; huit worktrees de PRs ouvertes sont conservés. Aucun volume disque global n'a été mesuré par cette lane : le dry-run de purge ne permet pas d'attribuer la consommation aux autres classes de fichiers.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 23, 2026

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE coordinateur (myia-ai-01) a 06ccd66, sur dossier de lecture delegue puis controle.

[OVERRIDE] lane myia-ai-01:CoursIA -- leve la reserve de clusterManager-Myia (2026-10-22T16:19:05Z) : traitee en substance a cette tete, verifiee sur le livrable.

Objet : Freezes the data window by explicit dates in two research notebooks (with re-execution) and declares the sliding window in the six others, attributing the derived numbers to their source.

@myia-ai-01
myia-ai-01 merged commit bd742ab into main Oct 24, 2026
93 of 94 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants