Skip to content

feat(notebooks,#20211): QC-Py-43 -- diffusion sur series de rendements, controle negatif bootstrap et mesure d'augmentation - #20212

Open
jsboige wants to merge 4 commits into
mainfrom
feature/20211-diffusion-series
Open

jsboige wants to merge 4 commits into
mainfrom
feature/20211-diffusion-series

Conversation

@jsboige

@jsboige jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA-2 — prev: DEEP/guard #19851

Volet P3 de l'EPIC #19306 (données financières synthétiques par diffusion). Issue fille #20211.

Résumé

Un DDPM écrit de zéro (torch, pas diffusers) apprend la distribution de fenêtres de
rendements et en engendre de nouvelles. Le carnet ne juge pas le générateur sur sa perte
d'entraînement mais sur sa fidélité aux faits stylisés de la série réelle, et sur
l'utilité mesurée des données engendrées — avec le contrôle négatif qui sépare « apprendre la
distribution » de « recopier les marginales ».

Ce que le carnet mesure (sorties réelles, exécution locale)

Série : SPY 2015-2024, 2 515 rendements log quotidiens (yfinance).

Fait stylisé Réel Bootstrap i.i.d. Diffusion
kurtosis en excès +13,634 +17,561 +2,770
acf_r_1 (rendements) -0,116 +0,015 +0,037
acf_r2_1 (carrés) +0,460 -0,018 +0,206

Trois résultats, dans l'ordre où ils comptent :

  1. Le contrôle négatif fonctionne. Le bootstrap reproduit les marginales et détruit le
    vol clustering : acf_r2_1 s'effondre de +0,460 à -0,018.
  2. Le générateur bat ce contrôle : +0,206, tout en préservant les marginales. Il apprend
    donc une partie de la structure de dépendance, ce qu'un tirage sans remise ne fabrique pas.
  3. Il n'égale pas le réel (+0,206 contre +0,460) : la persistance est partiellement
    restituée, pas reproduite.

Verdict de la mesure d'augmentation — INCONCLUSIF

Protocole doctrine §C : prédiction de |r_{t+1}|, walk-forward 5 folds, graines 0/1/7/42,
Diebold-Mariano sur perte MSE, baseline majorité.

Critère Mesure Atteint
gain de RMSE +1,7 % à +9,9 % sur 4/4 graines oui
edge ≥ 2σ edge/σ = -0,44 non
DM p < 0,05 p médian 0,151 ; 1 fold sur 5 non
bat la majorité 3 graines sur 4 (graine 7 : -2,8 %) partiel
biais comparable +0,08 à +0,12 (augmenté) vs -0,01 à +0,06 (réel) non

Le signe est favorable, mais la conjonction edge/σ et Diebold-Mariano n'est pas
remplie, et le bras augmenté porte un biais positif systématiquement plus fort — une partie
du gain vient d'un décalage de niveau, pas d'une meilleure précision. Verdict INCONCLUSIF,
jamais « prometteur ».

Organes natifs — les 5 questions organ-first (#13564)

  1. Quelle série possède la sémantique ? GenAI/Image possède la diffusion (pipelines
    diffusers), mais pour des images ; QuantConnect/Python possède les séries de rendements,
    mais sans modèle génératif. Aucune ne possède « diffusion sur séries financières » —
    c'est l'angle mort mesuré par l'EPIC (FinDiff 0, FTS-Diffusion 0, DeepMarket 0,
    score-based 0 en prose sur origin/main).
  2. Peut-on invoquer son module réel ? Le substrat (torch 2.14.0) est réel et installé. Un
    UNet 2-D de diffusers ne s'applique pas à une série 1-D : l'appel direct n'est pas le bon
    geste, et ce carnet le dit au lieu de le contourner.
  3. Que faut-il exporter ou refactorer ? Rien de GenAI/Image : le pont est ce que cette
    issue livre. Vérifié qu'aucun helper de diffusion 1-D n'existait au moment du livrable.
  4. Quel témoin négatif l'organe natif fournit-il ? Le bootstrap i.i.d. — il reproduit
    exactement les marginales, donc il isole la seule chose qu'un générateur doit apporter : la
    dépendance. Le carnet l'implémente et le mesure.
  5. Quelle autre série vérifie indépendamment ? QuantConnect — doctrine §C appliquée telle
    quelle (folds, graines, DM, majorité, rapport de biais).

Validation

  • Exécution locale, kernel python3 : 15/15 cellules, 0 erreur, 3 figures PNG embarquées.
  • issue fille #20211 créée par cette lane, [CLAIMED] posé avant édition.
  • Aucun raise NotImplementedError / assert False / 1/0 : les stubs d'exercice utilisent
    print(...) + # TODO etudiant (C.1). Les 3 exercices sont non résolus par construction.
  • Sorties alignées sur la source committée : le carnet a été re-exécuté après la
    normalisation des listes source par le hook pre-commit.

Limites écrites (pas des oublis)

  • INCONCLUSIF n'est pas un échec du générateur : c'est le résultat honnête d'un budget de
    156 fenêtres d'entraînement. Le §5 établit ce que le générateur sait faire ; le §6 dit que
    ce savoir ne se transforme pas encore en gain mesurable.
  • Confondant de protocole : le bras augmenté voit plus d'exemples à nombre d'époques
    constant, donc plus de pas de gradient. Le carnet l'écrit plutôt que de le taire.
  • Pas de P&L, donc pas de coûts de transaction : aucune position n'est prise, la métrique
    est une erreur de prédiction. L'absence de mesure de P&L interdit de conclure quoi que ce
    soit d'exploitable — dit dans le carnet.
  • yfinance à l'exécution (réseau requis). Mesuré : deux exécutions successives dérivent au
    6ᵉ décimale (kurtosis_exces +13,634434 puis +13,634303). La prose du §1 qui affirmait une
    reproductibilité exacte a été corrigée, avec la mesure qui la réfute. Les verdicts sont
    stables.

Note sur le renvoi du body parent

Le body de #19306 cite « Pont direct avec #19267 ». Re-vérifié : #19267 porte désormais un
autre sujet
(digestion Heuristic Search). Le renvoi est périmé ; il n'est pas recopié.

See #20211 — Part of #19306.

🤖 Generated with Claude Code

…s, controle negatif bootstrap et mesure d'augmentation

EPIC #19306 volet P3 (donnees financieres synthetiques par diffusion).

Carnet QC-Py-43-Diffusion-Series-Synthetiques.ipynb, execute localement
(kernel python3, 15/15 cellules, 0 erreur) :

- faits stylises de reference sur SPY 2015-2024 (2 515 rendements log) :
  kurtosis en exces +13,63, acf_r2_1 +0,460 ;
- controle negatif bootstrap i.i.d. : marginales reproduites, acf_r2_1 effondre
  a -0,018 -- c'est le metre-etalon ;
- DDPM ecrit de zero en torch (fenetres de 32 rendements, T=200 pas) : la
  diffusion restitue acf_r2_1 = +0,206, donc bat le bootstrap sans egaler le reel ;
- mesure d'augmentation (5 folds, graines 0/1/7/42, Diebold-Mariano sur perte
  MSE, baseline majorite) : verdict INCONCLUSIF -- gain de RMSE positif sur 4/4
  graines mais edge/sigma = -0,44 et DM non significatif (p median 0,151), avec
  un biais plus fort sur le bras augmente.

Le carnet rend le verdict contre des statistiques de la serie engendree, jamais
contre la courbe de perte.

See #20211, Part of #19306.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…reproductibilite corrige

Le hook pre-commit normalise les listes `source` ; le carnet est re-execute apres
cette normalisation pour que les sorties committee correspondent exactement a la
source committee.

Mesure au passage : la serie vient de yfinance a l'execution, donc les statistiques
derivent au 6e decimale entre deux fetches (kurtosis_exces +13,634434 -> +13,634303).
La prose du §1 affirmait une reproductibilite exacte : corrige, avec la mesure qui
la refute. Les verdicts sont stables (acf_r2_1 diffusion +0,205855 -> +0,205854 ;
edge/sigma -0,437 ; DM p median 0,1515 ; verdict INCONCLUSIF inchange).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…t declare

Section markdown ajoutee en fin de carnet (markdown seul, re-execution non due).

Pourquoi : l'acceptance de l'EPIC #19306 exige que l'issue fille cite les PDF
archives au gisement biblio avec leur chemin. Le carnet ne citait aucune source,
donc le depot du PDF n'avait pas d'ancre.

Contenu : FinDiff (arXiv:2309.01472) situe -- objet tabulaire a modalites mixtes
et motivation de confidentialite, distinct de la serie 1-D jugee par faits
stylises de ce carnet. FTS-Diffusion et DeepMarket nommes comme non consultes.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

…ite fantome

Deux rouges de la PR #20212, tous deux markdown-only (aucune re-execution due) :

1. check-nav-chain : QC-Py-43 etait `orphan_entry` -- `nav_edges` ne lit que les
   cellules markdown des .ipynb, le README ne cree pas d'arete. Le carnet porte
   desormais son en-tete de nav conventionnel, et QC-Py-41 recoit un pied de nav
   vers lui. Le pied est une CELLULE NOUVELLE, jamais un edit de la ligne
   d'en-tete de QC-Py-41 : #20044 (OPEN) reecrit deja cette ligne-la.

2. enrich-quality (PHANTOM_IN_FENCE) : les trois clapets d'exercice affichaient
   `print("Exercice N a completer")`, dont `completer` est capture comme
   identifiant suivi de guillemet, alors qu'il n'existe dans aucune cellule de
   code. C'etait un stub hypothetique montre en prose, pas du code du carnet :
   la ligne est retiree, le `# TODO etudiant` reste.

Verifie localement : check_notebook_nav_chain.py --check = 0 NEW vs baseline
(rc=0) ; enrich_quality_ci.py = rc=0 sur QC-Py-43 (base NONE) et sur QC-Py-41
(base = origin/main).

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Deux rouges traités (tête 83c170f31a96), et un rouge de la famille runner écrit sans rejeu

1. check-nav-chain — orphan_entry sur QC-Py-43 : CORRIGÉ

Cause mesurée, pas devinée : nav_edges() (scripts/notebook_tools/check_notebook_nav_chain.py:204)
ne lit que les cellules markdown des .ipynb. Le README ne crée aucune arête — la ligne de
tableau que j'y avais ajoutée (déjà committée) ne pouvait donc pas ancrer le carnet, et QC-Py-43
restait une entrée sans lien entrant dans une série qui en compte plusieurs.

Deux gestes, tous deux markdown-only :

  • QC-Py-43 porte désormais son en-tête de nav conventionnel
    ([<< Sommaire QC](../README.md) | [Précédent : QC-Py-41-PaperTrading-IBKR <<](...)) ;
  • QC-Py-41 reçoit un pied de nav vers QC-Py-43. C'est une cellule nouvelle, jamais un édit
    de la ligne d'en-tête de QC-Py-41 : feat(qc,#20041): QC-Py-42 -- alpha mining par evolution (deap), verdict OOS honnete #20044 (OPEN) réécrit déjà cette ligne-là
    (| [Suivant : QC-Py-42-Alpha-Mining-Evolution >>](...)), et un édit du même endroit aurait été
    un conflit garanti entre deux PRs de la même lane.

Mesure : check_notebook_nav_chain.py --check --diff-files <diff> rend
OK: 0 NEW finding vs baseline (376 connus), rc=0.

2. Enrich-quality — PHANTOM_IN_FENCE completer : CORRIGÉ

Les trois clapets d'exercice affichaient print("Exercice N a completer"). Le scanner capture
completer comme identifiant (il est suivi d'un guillemet, scan_enrich_quality.py:505) puis exige
que tout identifiant vu dans ≥ 2 clapets existe dans le code ou les sorties du carnet — ce qui
n'était pas le cas. C'était un stub hypothétique montré en prose, pas du code du carnet : la
ligne est retirée, le # TODO etudiant reste, les trois exercices restent non résolus.

Mesure : enrich_quality_ci.py --base NONE --head QC-Py-43... → rc=0, et
--base <origin/main:QC-Py-41> --head QC-Py-41 → rc=0.

Rien de tout cela ne touche une cellule de code : aucune re-exécution n'est due (C.2, exception
markdown uniquement), et la prose chiffrée du carnet — les faits stylisés du §5, le verdict
INCONCLUSIF du §6 — ne dérive donc pas.

3. math-render — famille runner, consigné ici, sans rejeu

ModuleNotFoundError: No module named 'scripts.tests' au step Run unit tests : l'arbre du runner
est amputé de scripts/tests/, exactement la famille documentée sur #20174.

🤖 Generated with Claude Code

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 10, 2026
@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

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

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

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: 2
  • Code cells validated: 28
  • 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

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 17.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.8s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 10.1s

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

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Kernel drift guard — famille runner, classee a la source (tete 83c170f31a96)

Rouges de cette tete : Gitleaks secret scanner (meme famille, .pre-commit-config.yaml absent du runner — cf
le dossier detaille sur #20203) et Kernel drift guard (base vs PR).

Kernel drift echoue sur l'auto-test du garde test_ict_notebook_resolves_to_its_pinned_env
(scripts/notebook_tools/tests/test_check_kernel_drift_env_hint.py:43) :

E  AssertionError: l'env ICT est epingle dans IIT/ICT-Series/pyproject.toml
E  assert None is not None

La PR ne touche aucun fichier de la serie IIT/ICT-Series (elle modifie QC-Py-43, cote QuantConnect) : ce
n'est pas une derive de contenu. Trois mesures convergent :

Pas de rejeu (meme slot, meme echec). Consigne permanente ai-01 sur #20174.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20212 (feat(notebooks,#20211): QC-Py-43 -- diffusion sur series de rendements, controle negatif bootstrap et mesure d'augmentation) 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.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants