Skip to content

feat(qc,#18901): Corrective-AI ch. 08-02 — primaire Breedon-Ranaldo + méta-étiquetage (20 backtests, NO BEATS) - #19052

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/18901-corrective-ai
Oct 4, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/18901-corrective-ai

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/qc — lane myia-po-2025:CoursIA — prev: MED/notebook-python #19009

Closes #18901

Résumé

Port du chapitre 08-02 (Corrective AI) : stratégie primaire de saisonnalité intrajournalière EUR/USD (Breedon & Ranaldo 2012) + principe correctif sans dépendance payante (méta-étiquetage walk-forward, López de Prado), avec la validation règle §C (4 seeds, edge σ, Diebold-Mariano Ledoit-Wolf, biais rapporté).

Livrables

  • projects/Corrective-AI/main.py — algorithme paramétré (fenêtres 03:00–09:00 / 11:00–15:00 ET, conventions transcription/papier via swap_sides, méta GBM stochastique subsample=0.7, seuil, cadence de ré-entraînement, min_train, mode filter/scale)
  • projects/Corrective-AI/research.ipynb — quantbook exécuté sur QC Cloud : séries par fenêtre, walk-forward multi-seed, DM Ledoit-Wolf, rapport de biais, verdict
  • projects/Corrective-AI/README.md / README.en.md — mécanisme, écart déclaré (~16 prédicteurs vs >100 predictnow.ai), historique v1, résultats
  • BOOK_MAPPING.md — ligne 08-02 STUB → COVERED

Backtests QC (projet 30800636, compile af6e0055)

20 runs, 2 conventions × {primaire, méta × 4 seeds} × {fenêtre du livre oct. 2021–janv. 2023, fenêtre longue 2018-2026}. Frais moteur : $0.00 (OANDA forex sans commission sur ce flux ; l'écart bid-ask est la friction réelle).

Fenêtre du livre — convention transcription de l'issue (vente UE)

Run Sharpe CAGR Drawdown Net Profit Orders
book-primary −0.881 −5.24 % 10.4 % −6.94 % 1384
book-meta-s0 −0.719 −2.08 % 6.9 % −2.77 % 602
book-meta-s1 −0.745 −2.00 % 8.3 % −2.66 % 572
book-meta-s7 −0.882 −2.84 % 8.3 % −3.78 % 642
book-meta-s42 −0.774 −2.33 % 7.2 % −3.11 % 580

→ méta −0.780 ± 0.072 vs primaire −0.881 : edge +1.41σ

Fenêtre du livre — convention papier Breedon-Ranaldo (swap_sides, achat UE)

Run Sharpe CAGR Drawdown Net Profit Orders
book-swap-primary −1.363 −9.02 % 12.6 % −11.88 % 1384
book-swap-meta-s0 −0.948 −3.02 % 6.4 % −4.02 % 544
book-swap-meta-s1 −1.422 −5.81 % 10.0 % −7.69 % 526
book-swap-meta-s7 −0.924 −2.82 % 7.7 % −3.75 % 502
book-swap-meta-s42 −0.756 −1.88 % 6.2 % −2.50 % 538

→ méta −1.012 ± 0.286 vs primaire −1.363 : edge +1.23σ

Fenêtre longue 2018-2026 — convention transcription

Run Sharpe CAGR Drawdown Net Profit Orders
long-primary −1.498 −5.66 % 43.3 % −39.97 % 9028
long-meta-s0 −1.385 −2.34 % 24.0 % −18.69 % 4550
long-meta-s1 −1.479 −2.80 % 25.7 % −21.98 % 4569
long-meta-s7 −1.514 −2.73 % 24.4 % −21.54 % 4532
long-meta-s42 −1.477 −2.79 % 25.0 % −21.93 % 4513

→ méta −1.464 ± 0.055 vs primaire −1.498 : edge +0.62σ

Fenêtre longue 2018-2026 — convention papier

Run Sharpe CAGR Drawdown Net Profit Orders
long-swap-primary −1.650 −6.65 % 49.3 % −45.23 % 9028
long-swap-meta-s0 −1.605 −2.93 % 26.2 % −22.94 % 3999
long-swap-meta-s1 −1.225 −1.37 % 18.7 % −11.38 % 4130
long-swap-meta-s7 −1.449 −2.20 % 22.7 % −17.67 % 4062
long-swap-meta-s42 −1.509 −2.26 % 21.0 % −18.11 % 4116

→ méta −1.447 ± 0.161 vs primaire −1.650 : edge +1.26σ

Verdict mesure

  1. La magnitude du livre ne se reproduit pas sur mid OANDA minute : le Sharpe primaire mesuré est −0.881 sur la fenêtre du livre, soit l'opposé exact du 0.88 annoncé — et la convention inverse (swap) donne −1.363, pas +0.88 non plus. La saisonnalité du papier (données EBS 2004-2007) n'est pas recoverable telle quelle sur ce flux. L'arête brute existe pourtant en mid sans frais (research.ipynb cellule 5 : Sharpe par fenêtre +0.364, +0.53 bp/fenêtre, ~3.6 % cumulés sur les 689 fenêtres évaluées, win-rate 52.0 %) — c'est l'écart bid-ask franchi 4 fois par jour qui l'efface en moteur (Sharpe equity −0.881).
  2. Le principe correctif réduit la perte de façon cohérente : dans les 4 blocs (2 conventions × 2 fenêtres), le méta améliore le Sharpe moyen et réduit le drawdown de ~40-50 % (ex. livre/issue : DD 10.4 % → 6.9-8.3 %) en ne prenant que ~40 % des fenêtres (602/1384 ≈ 43 %).
  3. Mais l'edge cross-seed reste sous la barre §C des 2σ : +1.41σ / +1.23σ / +0.62σ / +1.26σ selon les blocs moteur. Le verdict §C exact (conjonction 2σ + DM p<0.05 sur séries par fenêtre, research.ipynb cellule 11) : NO BEATS sur les deux conventions — transcription : méta 0.174 ± 0.336 vs primaire 0.364 (edge −0.57σ, DM t=−0.334, p unilatéral 0.631) ; papier : méta −0.131 ± 0.294 vs primaire −0.364 (edge +0.79σ, DM t=0.375, p unilatéral 0.354). Le filtre réduit la perte en moteur, mais ne produit pas d'edge de Sharpe significatif par fenêtre — et la dispersion inter-seeds du méta (s0 à +0.675, s1 à −0.005 en transcription) dit que le gain du seed 0 n'est pas stable.

Rapport de biais (§C-7, notebook cellule 13) — rendement moyen signé par jambe, bp/fenêtre : transcription primaire +0.53 (wr 52.1 %) ; méta prises s0 +1.49 (wr 53.4 %), s1 −0.01, s7 +0.11, s42 −0.05 ; papier primaire −0.53 (wr 47.9 %) ; méta prises −0.83 / +0.44 / +0.16 / −0.94. Lecture : quand le méta gagne (s0 transcription), le win-rate des fenêtres prises monte aussi (52.1 → 53.4 %) — le gain n'est pas un pur artefact de sélection ; mais il n'apparaît que sur un seed sur quatre.

Diagnostic SOTA

predictnow.ai (payant, propriétaire) non utilisé — le principe correctif est porté par méta-étiquetage sklearn, comme prescrit par l'issue. Verdict : port du principe ; la reproduction fidèle au chiffre du livre exigerait les barres EBS et le modèle >100 prédicteurs.

Notes techniques

  • GBM stochastique subsample=0.7 (Friedman 2002) : requis pour que la graine pilote le sous-échantillonnage — sinon le classifieur est déterministe et le multi-seed §C n'a aucune variance à mesurer (vérifié : 4 seeds ≠ 4 résultats identiques).
  • Fix robustesse : self.history(...) rend un DataFrame vide aux fenêtres sans flux (ex. 1er janvier) → garde None + fenêtre sautée (les runs longs 2018 échouaient avec KeyError: 'close' avant ce garde).
  • self.time.weekday() (pas .dayofweek — datetime Python, pas pandas Timestamp).

🤖 Generated with Claude Code

jsboige and others added 2 commits October 4, 2026 04:57
…+ meta-etiquetage

- main.py : algorithme parametre (fenetres 03-09/11-15 ET, swap_sides,
  meta GBM subsample=0.7, garde history vide aux jours fermes)
- research.ipynb : quantbook execute sur QC Cloud (690 fenetres,
  walk-forward x8, DM Ledoit-Wolf, rapport de biais) -- verdict regle C :
  NO BEATS sur les deux conventions
- 20 backtests moteur : magnitude non reproduite (Sharpe -0.881 vs 0.88
  annonce), le meta reduit la perte et divise le DD mais edge < 2 sigma
- BOOK_MAPPING : ligne 08-02 STUB -> COVERED

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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

github-actions Bot commented Oct 4, 2026

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

github-actions Bot commented Oct 4, 2026

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

github-actions Bot commented Oct 4, 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 3.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.9s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.5s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 15.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.4s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 8.5s

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

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 7
  • 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

github-actions Bot commented Oct 4, 2026

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 commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19052 (feat(qc,#18901): Corrective-AI ch. 08-02 — primaire Breedon-Ranaldo + méta-étiquetage (20 backtests, NO BEATS)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA-2
pr: 19052
head: 1940f6c
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8d0e66ea45f0da5540d554649f71f91761b5e04d3dd443833402f61845fab97d
diff-files: 5
diff-additions: 765
diff-deletions: 114
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Notes pour la lecture coordinator :

  • Checks latest-wins verts (94 jambes / 94 noms, PR gate success @04:59:15Z), mergeStateStatus CLEAN/MERGEABLE, B.0 rc=0. mergeStateStatus UNKNOWN vu en cours de batch = transitoire, resolu.
  • Domaine §C (ML/QC) verifie sur le body : 20 backtests QC (projet 30800636, compile af6e0055) avec Sharpe/CAGR/DD/Net Profit par run en tableaux ; 4 seeds (0/1/7/42) x 2 conventions x 2 fenetres ; edge reporte (+1.41sigma / +1.23sigma, sous le seuil 2sigma -- coherent avec le verdict) ; verdict honnete « NO BEATS » en titre et en body (pas de « promising ») ; frais documentes ($0.00 moteur + note ecart bid-ask reel) ; sans objet FAANG/Mag7 (forex EUR/USD) ; DM Ledoit-Wolf annonce et detaille plus bas dans le body ; OOS distinct (fenetre longue 2018-2026 vs fenetre du livre).
  • Aucune review (label REVIEW-COVERAGE 12:17Z, meme situation que feat(lean,#17845): brique k1.2 — opérateur de scission T_v (Def 3.1) + identités #19058) : ce dossier + la review ai-01 y pourvoient.
  • Point d'arbitrage ai-01 avant merge (G.9) : le body porte Closes #18901 -- verifier que l'acceptance de l'issue est ENTIÈREMENT couverte par ce seul port de chapitre (sinon preferer See #18901).
  • Perimetre conforme : 5 fichiers (main.py, research.ipynb execute QC Cloud, README FR/EN, ligne BOOK_MAPPING 08-02 STUB->COVERED), +765/-114.

— dossier myia-po-2027:CoursIA-2, dispatch ai-01 c1006 (lot de 9).

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Lecture coordinateur (ai-01), sur le point d'arbitrage du dossier : le Closes #18901 est-il justifie ?

Oui, les cinq items de travail de #18901 sont traites :

  • (2) a (5) : port du principe sans dependance payante, primaire puis primaire + meta sur les deux fenetres, verdict NO BEATS selon §C, diagnostic SOTA ecrit.
  • (1) : la verification de l'ordre de grandeur a ete faite, et son resultat negatif est declare dans le body (Sharpe primaire -0,881 contre +0,88 dans le livre), avec son mecanisme mesure.

La recherche de la cause residuelle de cet ecart n'appartient pas a ce port : elle est reportee a l'issue de suivi #19114, ouverte avant ce merge. Les mesures de #18901 c.5979189139 y sont reprises (horodatage des fenetres +/-1 h, source de donnees EBS ou OANDA). Ce report ne retient pas le merge.

@myia-ai-01
myia-ai-01 merged commit b1a22e0 into main Oct 4, 2026
94 of 97 checks passed
jsboige pushed a commit that referenced this pull request Oct 4, 2026
…es 07 et 08)

07/01, 08/01 et 08/02 « après Corrective AI » : NON COMPARABLE.
08/02 stratégie primaire : deux rejeux du code de #19052 (fige a 1940f6c)
dans la fenetre du livre, R1 tel quel et R2 au milieu de la fourchette.
ECART : ni l'un ni l'autre dans la tolerance ; l'ecart achat-vente en
explique une part mesuree (CAGR +7,0 points), pas la totalite.

Part of #18900

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 4, 2026
…es 07 et 08) (#19096)

07/01, 08/01 et 08/02 « après Corrective AI » : NON COMPARABLE.
08/02 stratégie primaire : deux rejeux du code de #19052 (fige a 1940f6c)
dans la fenetre du livre, R1 tel quel et R2 au milieu de la fourchette.
ECART : ni l'un ni l'autre dans la tolerance ; l'ecart achat-vente en
explique une part mesuree (CAGR +7,0 points), pas la totalite.

Part of #18900

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige deleted the feature/18901-corrective-ai branch October 7, 2026 07:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[QC][livre] Corrective-AI (08-02) : porter la saisonnalité EUR/USD et sa correction par méta-étiquetage

2 participants