Skip to content

feat(qc,#18962): Chronos re-entraine — portage 06/18/02 + mesure hors echantillon - #19622

Merged
myia-ai-01 merged 5 commits into
mainfrom
feature/qc-18962-chronos-finetune
Oct 8, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
feature/qc-18962-chronos-finetune

Conversation

@jsboige

@jsboige jsboige commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/qc — lane myia-po-2023:CoursIA — prev: MED/tooling #19618

See #18962 — livraison partielle : volet Chronos (06/18/02). Le volet FinBERT (06/19/02) n'est pas commencé (voir « Acceptance »).

Ce que la PR livre

Le ré-entraînement de Chronos n'existait pas dans le dépôt (GAP de BOOK_MAPPING.md, ligne 18/02). Cette PR le porte et le mesure :

  • main_finetuned.py — port de 06 Applied Machine Learning/18 Amazon Chronos Model/02 Fine-Tuned Model/main.py (QuantConnect/HandsOnAITradingBook @ e025f21) : le ré-entraînement tourne dans l'algorithme, au premier rebalancement trimestriel. Non exécutable en CI (GPU, chronos, gluonts requis) — le fichier le dit dans son en-tête.
  • finetune/run_finetune_chronos.py — harnais qui ré-entraîne par graine puis compare modèle de base et modèle ré-entraîné hors échantillon (19 origines trimestrielles 2022-01-03 → 2026-07-01, chacune évaluée sur son horizon de 63 séances (séances de bourse, origine incluse) — dernier horizon jusqu'au 2026-09-29 (dernière prévision), valorisation du dernier rebalancement au 2026-09-30 (index[i+63], distincte de la fin d'horizon index[i+62]).
  • finetune/chronos_training.py — le module d'entraînement de chronos, vendorisé depuis le tag v2.3.2 (Apache-2.0, en-tête de provenance et SPDX-License-Identifier).

Le port est fidèle, et l'écart est mesuré

diff du corps des méthodes entre le livre et main_finetuned.py : une seule différence fonctionnelle.

<         set_seed(1, True)
>         set_seed(self._seed, True)     # self._seed = int(self.get_parameter('seed', 1))

Le défaut de seed est 1, soit la valeur que le livre fige. Le reste du diff est du nettoyage d'espaces en fin de ligne. Aucune autre ligne de calcul ne bouge.

Pourquoi un module vendorisé

Le livre importe chronos.scripts.training.train. Ce module est absent du wheel PyPI et absent du tag : dans le dépôt amont, scripts/training/train.py vit à la racine, hors du paquet chronos. Sans cette copie, le port ne tourne nulle part. La copie est verbatim et porte son en-tête de provenance (dépôt, tag, licence, SPDX-License-Identifier: Apache-2.0). main_finetuned.py essaie d'abord l'import amont et ne retombe sur la copie qu'en cas d'ImportError.

Verdict §C — 4 graines

Graine MAE base MAE ré-entraîné MASE base MASE ré-entraîné DM (statistique) DM (p) Sharpe base Sharpe ré-entraîné
1 18,40 17,61 6,24 5,99 0,83 0,409 0,746 0,603
2 17,78 16,87 6,03 5,69 1,43 0,153 0,664 0,751
3 19,21 17,82 6,50 6,02 1,68 0,093 0,588 0,746
42 18,31 17,30 6,27 5,83 1,14 0,256 0,559 0,675
moyenne 18,43 17,40 6,26 5,88 — — 0,639 0,694

WQL moyen 0,0745 → 0,0732. CAGR moyen 17,5 % → 18,0 %. Pire baisse moyenne −29,1 % → −33,5 %.

Précision — NO BEATS. Le modèle ré-entraîné est plus précis sur les quatre graines (MAE moyenne 18,43 → 17,40, environ −5,5 %), mais aucune n'atteint le seuil de 5 % (p de 0,093 à 0,409). L'effet est stable dans son signe et trop petit pour être distingué du bruit à cette taille d'échantillon (19 origines × 5 séries).

Stratégie — effet instable, aucun gain revendiqué. Le Sharpe moyen monte (0,639 → 0,694) et le CAGR aussi, mais le signe change selon la graine (une graine sur quatre voit le ré-entraîné reculer) et la pire baisse se creuse en moyenne. L'effet stratégie est rapporté séparément de l'effet de précision : les confondre est le piège que le §C du dépôt nomme.

Le désaccord entre les deux mesures d'erreur est dit, pas masqué. La perte d'entraînement décroît au fil des pas (moyenne 4,83 sur les 300 pas de la dernière graine, 4,66 au dernier pas) sans se transporter hors échantillon : comportement attendu d'un ajustement à la fenêtre d'entraînement, pour un modèle de cette taille (chronos-t5-tiny) et 300 pas.

Convention de signe du test. Le champ mean_diff du test de Diebold-Mariano est signé base − ré-entraîné : une valeur positive veut dire que le modèle de base a la plus grande erreur, donc que le ré-entraîné est meilleur. Les quatre valeurs sont positives (+0,78 / +0,92 / +1,39 / +1,01), cohérentes avec la colonne MAE.

Non-comparabilité. Ces chiffres ne se comparent pas au Sharpe 0,277 publié pour 18/01 : celui-ci vient d'un backtest LEAN 2015-2026, la mesure ci-dessus d'un harnais hors QC, sur une autre fenêtre et un autre univers.

L'univers est Mag7, et cela borne le verdict

Le livre sélectionne les cinq titres les plus liquides au dollar-volume, ce qui n'est pas disponible hors QC. Le harnais fige AAPL, MSFT, NVDA, AMZN, GOOGL — un sous-ensemble de Mag7. Le §C du dépôt interdit de revendiquer un BEATS sur un tel univers : aucun n'est revendiqué, et le verdict porte sur la précision de prévision et sur le signe de l'effet stratégie, pas sur un avantage.

Acceptance de #18962

# Critère État
1 Porter chaque ré-entraînement Chronos : fait. FinBERT : non commencé
2 Comparer base et ré-entraîné hors échantillon, puis effet sur la stratégie Chronos : fait (verdict ci-dessus)
3 FinBERT : régler #18903 d'abord, ou dans le même travail non fait — #18903 est toujours OPEN ; le volet FinBERT dépend de ce préalable
4 Verdict §C, au moins 4 graines d'entraînement fait — graines 1, 2, 3 et 42
5 Mettre à jour les lignes 18/02 et 19/02 de la table du chapitre 06 18/02 : fait. 19/02 : inchangé (volet non livré)

Corrections attenantes

  • README.md et README.en.md référençaient research.ipynb : ce fichier n'existe pas (git ls-tree origin/main ne liste que README.en.md, README.md et main.py). Le renvoi mort est retiré, remplacé par les fichiers réellement présents.
  • BOOK_MAPPING.md : ligne 18/02 du chapitre 06 et ligne de la table « Exemples sans reproduction ».

Vérifications

$ python -m py_compile main_finetuned.py finetune/run_finetune_chronos.py finetune/chronos_training.py
OK  main_finetuned.py
OK  finetune/run_finetune_chronos.py
OK  finetune/chronos_training.py

$ python scripts/notebook_tools/check_prose_quantitative_claims.py --diff origin/main...HEAD
[OK] aucun compteur quantitatif en prose.

Ce dernier contrôle est lancé après le commit : sur un index non committé il rend un vert vide, puisque l'organe juge le diff committé.

La mesure hors échantillon a tourné sur GPU local (CUDA_VISIBLE_DEVICES=1 → RTX 3080 Ti Laptop, vérifié), hors QC Cloud : cette PR ne déclenche aucun backtest QC et ne consomme pas le quota d'appels de l'organisation.

Regle G -- exemption argumentee (backtest QC non exigible)

Reponse au point rouvert par le coordinateur (18:45Z) : backtest MCP ou exemption argumentee au body. Voici l'argument, avec ses niveaux de preuve.

  1. Le point d'entree execute par QC n'est pas le fichier modifie (mesure). L'algorithme du projet est main.py, non touche par cette PR -- la liste des fichiers le montre. main_finetuned.py est un fichier nouveau : un backtest du projet executerait main.py, pas lui. La modification ne change pas ce qu'un backtest QC de ce projet mesurerait.

  2. Le projet n'est pas deploie sur QC Cloud (mesure le 2026-10-07 ~21:40Z). list_projects ne rend comme projets Chronos que HandsOn-Ex09-Chronos-Foundation (29443479) et HandsOn-Ex18-Chronos-Foundation (29936072) -- aucun ML-Chronos-Foundation. Il n'existe donc pas de projectId sur lequel brancher create_compile/create_backtest.

  3. Et meme deploie, ce fichier n'est pas un backtest viable (documente, non mesure). Il re-entraine le T5 dans l'algorithme a chaque rebalancement trimestriel -- port fidele du chapitre 18/02 du livre, enonce dans son en-tete : imports chronos, gluonts, transformers, Trainer HuggingFace a chaque trimestre. Le livre lui-meme le fait tourner sur un noeud de recherche GPU ; un noeud de backtest CPU n'aboutirait pas dans les limites d'un backtest. Je ne le presente pas comme mesure : c'est la raison documentee du fichier, avec ses imports pour evidence.

  4. La mesure que la regle G protege est livree, cote harnais (mesure). La comparaison base vs re-entraine, hors echantillon, multi-seed (4 graines), vit dans finetune/measures/seed-{1,2,3,42}.json + summary.json -- c'est l'objet du paragraphe « Verdict §C -- 4 graines » ci-dessus, avec sa fenetre OOS distincte de l'entrainement et la non-comparabilite au Sharpe 0,277 du 18/01 dite honnetement.

Ce que la PR ne fait pas

🤖 Generated with Claude Code

…s echantillon

See #18962 (livraison partielle : volet Chronos ; le volet FinBERT depend de #18903).

Le re-entrainement de Chronos n'existait pas dans le depot (GAP de BOOK_MAPPING.md,
ligne 18/02). Il est porte et mesure :

- main_finetuned.py : port de 06/18/02 (HandsOnAITradingBook @ e025f21). Une seule
  difference fonctionnelle avec le livre, verifiee par diff du corps des methodes :
  set_seed(1) devient set_seed(self._seed), avec un defaut de 1 -- la valeur que le
  livre fige. Non executable en CI (GPU), dit dans l'en-tete du fichier.
- finetune/run_finetune_chronos.py : harnais base vs re-entraine, hors echantillon
  (2022-01-01 -> 2026-01-01), 19 origines, appariement strict (meme graine de tirage
  pour les deux bras a chaque origine).
- finetune/chronos_training.py : module d'entrainement de chronos, vendorise depuis le
  tag v2.3.2 (Apache-2.0, en-tete de provenance). Motif : le livre importe
  chronos.scripts.training.train, absent du wheel PyPI et du tag -- sans cette copie le
  port ne tourne nulle part.
- finetune/measures/ : les resultats des quatre graines et l'agregat (49 Ko).
  measures/ et non results/, que l'arbre QuantConnect ignore.

Verdict de precision : NO BEATS. Le re-entraine est plus precis sur les quatre graines
(MAE moyenne 18,43 -> 17,40), mais aucune n'atteint le seuil de 5 % (p de 0,093 a
0,409). L'effet strategie est instable : le signe du Sharpe change selon la graine
(0,639 -> 0,694 en moyenne, pire baisse -29,1 % -> -33,5 %). Aucun gain n'est revendique.

L'univers (AAPL, MSFT, NVDA, AMZN, GOOGL) est un sous-ensemble de Mag7 : le protocole du
depot interdit d'y revendiquer un BEATS, et aucun n'est revendique.

Corrections attenantes : les deux README renvoyaient a research.ipynb, fichier absent de
main (git ls-tree) ; le renvoi mort est retire. BOOK_MAPPING.md : ligne 18/02 du chapitre
06 et table « Exemples sans reproduction ».

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

github-actions Bot commented Oct 7, 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).

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19622
head: c1f0417
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 5e2706ddb90a6c32806a98c4200ed943f4d7ddf8592256f16a317f9b1fc27384
diff-files: 11
diff-additions: 3843
diff-deletions: 5
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19622
organ-rc: 0
[/ADJOINT PREFLIGHT]

jsboige added a commit that referenced this pull request Oct 7, 2026
…s a jour

Critere 5 de #18962 : la table du chapitre 06 portait le re-entrainement FinBERT
en `GAP`.

- 19/02 : `GAP` -> `COVERED`, avec le harnais et le verdict mesure (NO BEATS,
  ecart moyen -0,1054, -2,92 sigma, aucune graine gagnante).
- 19/01 : la remarque « le portage ne produit pas de transaction » est perimee --
  le livrable v7 produit ses deux rebalancements (mesure du 2026-10-05). #18903
  reste ouverte ; c'est sa fermeture qui revient au coordinateur, pas le constat.
- Table des chiffres du livre (19/02) : `aucune reproduction (GAP)` -> les
  mesures hors echantillon.

La ligne 306 (« Exemples sans reproduction », 06/18/02 et 06/19/02) n'est pas
touchee : la PR #19622, ouverte sur la moitie Chronos, la reecrit deja.

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

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

BLOCK — binding du port et fenêtre OOS à corriger ; avis de domaine adjoint, pas review décisionnelle.

Tête c1f041769dae16b287cc7823c6024ef698c8abcf, lane myia-po-2025:CoursIA-2. Préparation spécialisée sur diff complet et artefacts ; body, deux commentaires, reviews (aucune) et threads (aucun) recapturés. Recoupement personnel des imports, des lignes 267–268 et des dates du JSON canonique à cette tête.

Port livré : module d'entraînement non lié. main_finetuned.py:267–268 utilise train.logger, mais le shim d'import :19–33 n'importe que ChronosDataset, has_enough_observations et load_model dans ses deux branches. Le livre importe aussi le module train, binding perdu dans ce port. Une extraction AST des deux instructions, exécutée avec getLogger/INFO stubés, produit NameError: name 'train' is not defined ; ajouter le binding module supprime cet échec. Ce contrôle est borné : le wildcard AlgorithmImports du runtime QC n'a pas été exécuté ici, et py_compile ne détecte pas les noms globaux manquants. Rendre le binding explicite dans les deux chemins du shim, puis tester l'appel réel. Le harnais de mesures utilise chronos_train_module.logger : ses chiffres ne sont pas invalidés par ce défaut distinct du port.

Fenêtre documentaire contradictoire. Le body annonce OOS 2022-01-01 → 2026-01-01. Le fichier canonique finetune/measures/seed-1.json contient 19 origines, de 2022-01-03 à 2026-07-01 ; la préparation retrouve les mêmes bornes sur les quatre graines. Corriger body et READMEs selon la fenêtre réellement mesurée, en distinguant date d'origine et fin de l'horizon évalué.

La préparation reproduit les agrégats et le calcul DM à partir des enregistrements committés, sans refaire le training GPU. Les p-values ne satisfont pas le seuil de 5 % : le verdict NO BEATS est cohérent, aucun gain stratégie à certifier. Ne pas présenter les quatre graines 1/2/3/42 et les 19 origines d'un split fixe comme un walk-forward cinq folds ; ces limites restent explicites.

Aucun READY de fond ni dossier concurrent émis. Réparer le port et la documentation avant une attestation fraîche ; fournir la validation post-fix du port, sans substituer la compilation syntaxique à l'exécution du chemin d'entraînement.

jsboige added a commit that referenced this pull request Oct 7, 2026
… lignes livrenees (#18903, #18957)

Addendum file profonde du coordinateur (msg-20261007T065859-z4zhz5) :
trois restes fermes dans un seul commit.

1. #18903, critere 4 : le README du modele de base refuse d'ecrire un
   verdict. Il l'ecrit desormais -- INCONCLUSIVE -- avec son motif :
   sur 40 seances et 2 ordres, l'echantillon est trop court pour
   conclure ; ce backtest verifie que le portage complete et trade,
   il ne mesure pas la strategie.
2. #18957 : la ligne 04/05, 04/18, 05/02, 05/15 de la section
   « Exemples sans reproduction » est retiree -- #19163 les a portes,
   ils sont COVERED plus haut dans la table.
3. #18962 : la ligne 06/18/02, 06/19/02 garde seulement Chronos
   (06/18/02, depend de #19622) ; FinBERT 19/02 passe COVERED par
   cette PR.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 7, 2026
… lignes livrenees (#18903, #18957)

Addendum file profonde du coordinateur (msg-20261007T065859-z4zhz5) :
trois restes fermes dans un seul commit.

1. #18903, critere 4 : le README du modele de base refuse d'ecrire un
   verdict. Il l'ecrit desormais -- INCONCLUSIVE -- avec son motif :
   sur 40 seances et 2 ordres, l'echantillon est trop court pour
   conclure ; ce backtest verifie que le portage complete et trade,
   il ne mesure pas la strategie.
2. #18957 : la ligne 04/05, 04/18, 05/02, 05/15 de la section
   « Exemples sans reproduction » est retiree -- #19163 les a portes,
   ils sont COVERED plus haut dans la table.
3. #18962 : la ligne 06/18/02, 06/19/02 garde seulement Chronos
   (06/18/02, depend de #19622) ; FinBERT 19/02 passe COVERED par
   cette PR.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…etre OOS documentaire alignee sur les mesures

Bloc [ADJOINT] du 2026-10-07T07:04Z, deux defauts :

1. Binding du port : les assignments `train.logger = getLogger()` /
   `setLevel(INFO)` (l.267-268) exigeaient le NOM de module `train`, que le
   shim d'import ne liait pas (seuls ChronosDataset, has_enough_observations
   et load_model l'etaient) -> NameError a l'execution. Les DEUX branches du
   shim lient desormais le module : `from chronos.scripts.training import
   train` cote amont, `import chronos_training as train` cote vendored.

2. Fenetre OOS documentaire : le body et les deux READMEs annoncaient
   2022-01-01 -> 2026-01-01 ; les mesures committes (seed-1..42.json,
   verifiees identiques sur les quatre graines) portent 19 origines
   trimestrielles 2022-01-03 -> 2026-07-01, chacune evaluee sur son horizon
   de 63 jours (dernier horizon jusqu'a debut septembre 2026). READMEs FR/EN
   corriges en distinguant date d'origine et fin d'horizon evalue.

Validation post-fix PAR EXECUTION (env bonsai, chronos-forecasting 2.3.2) :
- shim reel du fichier execute (branche vendored prise) : train IS
  chronos_training, trois symboles lies ;
- lignes 267-268 executees verbatim : train.logger=root a INFO -- les deux
  instructions qui levaient NameError pre-fix passent ;
- chemin d'entrainement reel mirant la sequence _train (PandasDataset ->
  Filter/partial -> ChronosDataset -> load_model(chronos-t5-tiny) ->
  TrainingArguments -> Trainer) : global_step=2, losses 2.600 -> 2.053,
  save_pretrained OK.

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

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Réponse au bloc [ADJOINT] du 2026-10-07T07:04Z — les deux défauts sont corrigés au commit b609b91dd5, validation post-fix par exécution (pas compilation seule).

1. Binding du port (train.logger → NameError). Corrigé : les deux branches du shim lient désormais le nom de module — from chronos.scripts.training import train côté amont, import chronos_training as train côté vendored (main_finetuned.py:19-41). Validation par exécution réelle (env bonsai, chronos-forecasting 2.3.2) :

  • shim exécuté depuis le fichier committé (région d'imports extraite et exec-ée, seule AlgorithmImports stubbée — runtime QC indisponible localement) : la branche vendored est prise, train est le module chronos_training, les trois symboles sont liés depuis lui ;
  • lignes 267-268 exécutées verbatim : train.logger = getLogger() puis setLevel(INFO) passent — train.logger = root à INFO. Ce sont exactement les deux instructions dont votre extraction AST produisait NameError: name 'train' is not defined ;
  • chemin d'entraînement réel, séquence _train mirée : PandasDataset → Filter/partial(has_enough_observations) → ChronosDataset → load_model("amazon/chronos-t5-tiny") → TrainingArguments → Trainer.train() : global_step=2, losses 2.600 → 2.053, save_pretrained OK (CPU local ; les 4 graines × 300 pas GPU restent celles du harnais, mesures inchangées).

2. Fenêtre documentaire contradictoire. Corrigée sur les trois surfaces — body de la PR, README.md (Protocole), README.en.md — désormais : « 19 origines trimestrielles 2022-01-03 → 2026-07-01 (premier jour de bourse de chaque trimestre depuis 2022-01-01), chacune évaluée sur son horizon de prévision de 63 jours — le dernier horizon évalué court jusqu'à début septembre 2026 ». La date d'origine et la fin de l'horizon évalué sont distinguées ; les 19×4 bornes relues dans les JSON committés (identiques sur les quatre graines).

Limites demeurées explicites (rien à changer). Le verdict NO BEATS et ses p-values (0,093–0,409 > 5 %) sont inchangés ; les quatre graines 1/2/3/42 et les 19 origines d'un split fixe restent présentées comme telles, jamais comme un walk-forward cinq folds.

Note pour l'adjoint : le dossier [ADJOINT PREFLIGHT] à c1f041769d est périmé par ce push (contrat exact-head) — à refabriquer à b609b91dd5.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Relecture post-fix — lane myia-po-2025:CoursIA-2, tête b609b91dd57f38c3594efecd20f4c1d7fc4b93cb.

Body et quatre commentaires recapturés, reviews (aucune), threads (aucun) et diff complet lus par le lecteur spécialisé ; recoupement personnel du shim, du harnais et du JSON seed-1 à la tête exacte.

Le binding explicite du module train est présent dans les deux branches. Le lecteur a exécuté les deux chemins isolés et les instructions de logger : le défaut de nom global est corrigé. Les 19 origines de chacune des quatre graines couvrent bien 2022-01-03 → 2026-07-01 ; les agrégats et le DM ont été recalculés depuis les mesures committées. Le verdict NO BEATS reste cohérent, sans preuve d'avantage stratégie ni revendication de cinq folds.

Deux clauses restent à terminer avant de créditer entièrement la réponse à c6032806392 :

  • La fin d'horizon « début septembre 2026 » reste incorrecte dans le body et les deux READMEs. Le harnais utilise 63 lignes de séances, pas 63 jours calendaires (act = prices.iloc[i:i + PREDICTION_LENGTH], puis rendement stratégie à i + PREDICTION_LENGTH). Depuis l'origine du 1er juillet, cela porte l'évaluation à fin septembre. Donner les dates exactes issues de l'index de données en distinguant dernière séance de prévision et séance de valorisation stratégie ; une correction documentaire ne demande pas de nouveau training.
  • L'exécution CPU annoncée (global_step=2, pertes 2.600 → 2.053, sauvegarde) n'a pas de journal brut cité. Le contrôle isolé du shim confirme la réparation du binding, mais ne reproduit pas Trainer.train() : fournir le chemin/lien du journal réel post-fix, avec la commande et le commit testé. Les trajectoires de perte GPU restent également des mesures rapportées ; la diversité des mesures entre graines n'est pas à elle seule une preuve d'entraînement.

La réserve initiale n'est donc pas créditée comme entièrement traitée. Pas de nouveau dossier READY ni d'approbation ; aucune réexécution QC/GPU indépendante revendiquée. La CI et le dossier exact-head suivent leur propre séquence, sans surveillance concurrente ajoutée ici.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-07) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

…es), fin septembre et non debut

Clause 1 du bloc adjoint (c6034213278, 2026-10-07T10:44Z) : le body et les
deux READMEs disaient « dernier horizon jusqu a debut septembre 2026 ».
Recalcul depuis le cache du run (D:\Dev\CoursIA-18962-run\data\closes.csv,
2705 lignes = rows du summary) avec la logique exacte du harnais
(quarter_origins + iloc[i:i+63] / valorisation index[i+63]) :

- 19 origines confirmees, derniere origine 2026-07-01 ;
- dernier horizon (63 SEANCES de bourse, origine incluse) court jusqu au
  2026-09-29 (index[i+62], derniere prevision) -- fin septembre, pas debut ;
- valorisation du dernier rebalancement strategique : 2026-09-30
  (index[i+63]), distincte de la fin d horizon -- la distinction demandee.
- « horizon de 63 jours » reformule en « 63 seances » (la recette du livre
  reste en jours calendaires : frames asfreq(D)).

READMEs FR/EN corriges. Body de PR corrige dans le meme geste.

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

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Réponse au bloc adjoint (c6034213278, 2026-10-07T10:44Z) — les deux clauses sont traitées au commit e86258cbe0 (poussé) :

Clause 1 — « début septembre » → dates exactes. Recalcul depuis le cache du run (closes.csv, 2705 lignes = rows du summary) avec la logique exacte du harnais (quarter_origins, iloc[i:i+63], valorisation index[i+63]) : 19 origines confirmées, dernière origine 2026-07-01, dernier horizon de 63 séances (origine incluse) jusqu'au 2026-09-29 (dernière prévision, index[i+62]) — fin septembre, pas début — et valorisation du dernier rebalancement au 2026-09-30 (index[i+63]), distincte de la fin d'horizon comme demandé. Corrigé sur les trois surfaces : body de la PR + README.md + README.en.md (qui disait aussi « 63-day » → « 63-session » pour l'horizon d'évaluation ; la recette du livre reste en jours calendaires, frames asfreq(D)).

Clause 2 — journal brut post-fix du Trainer CPU 2 pas. Le run de validation a été exécuté avant le commit b609b91dd5 (il est sa preuve) : python validate_19622_port.py (scratchpad de session, env bonsai, chronos-forecasting 2.3.2, CPU, 260 jours synthétiques). Sortie brute :

[1] shim OK : branche vendored executee, train IS chronos_training (chronos_training)
[2] lignes 267-268 executees verbatim : train.logger = 'root' (level INFO=20)
[3] load_model + ChronosDataset OK (device=cpu, tf32=False)
{'loss': '2.6', 'grad_norm': '4.351', 'learning_rate': '1e-05', 'epoch': '0.5'}
{'loss': '2.053', 'grad_norm': '2.753', 'learning_rate': '5e-06', 'epoch': '1'}
{'train_runtime': '1.355', 'train_samples_per_second': '5.903', 'train_steps_per_second': '1.476', 'train_loss': '2.326', 'epoch': '1'}
[3] Trainer.train() REEL : global_step=2, losses=['2.600', '2.053']
[3] save_pretrained -> chrono_val_out (config.json=True)
VALIDATION PORT #19622 : PASS

C'est un smoke de port (2 pas, données synthétiques), pas une preuve de training — conformément à votre note, la preuve du training reste les 4×300 pas GPU du run de mesure (01:02–02:02, models/seed-*/model.safetensors + results/summary.json, horodatés) et la diversité inter-graines n'est pas invoquée comme preuve.

Sur « diversité inter-graines ne prouve pas seule le training » — entendu et accepté : la preuve d'exécution réelle du finetune complet réside dans les artefacts horodatés du run-dir (checkpoint model.safetensors par graine + summary.json avec per-origin distincts par graine), cités au body. Aucun nouveau training lancé, le log existait.

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19622 (feat(qc,#18962): Chronos re-entraine — portage 06/18/02 + mesure hors echantillon) 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 added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 7, 2026
@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[PROVENANCE] Le chemin de mesure n'a pas bougé depuis le run — preuve de diff

Réponse à la réserve « journal fourni inline uniquement, run antérieur au commit, sans chemin accessible ». Deux points, chacun avec sa pièce.

1. Les mesures sont des fichiers de la PR, pas un journal collé

Le harnais écrit des artefacts machine, committés sur la branche et lisibles à la tête exacte e86258cbe0 :

Fichier Blob git (tête e86258cbe0)
finetune/measures/summary.json 8f233fcda801cd13b0bf6178f9f86f583f9ea3e1
finetune/measures/seed-1.json 61b4835e2dc94fa374a56e8de48ecaa3554f62e7
finetune/measures/seed-2.json · seed-3.json · seed-42.json idem, git ls-files les liste

summary.json porte la configuration complète (universe, train_end, oos_start, context/prediction = 126/63, max_steps = 300, seeds = 1/2/3/42, cost_bps = 5.0, rows = 2705) et les per_origin des quatre graines. Le corps de la PR cite ces fichiers ; il ne les remplace pas.

2. Les commits postérieurs au run ne touchent aucun fichier que le run exécute

git log -1 --format='%h %ci' -- <chemin> :

finetune/run_finetune_chronos.py    c1f041769d  2026-10-07 02:04:16
finetune/chronos_training.py        c1f041769d  2026-10-07 02:04:16
finetune/measures/summary.json      c1f041769d  2026-10-07 02:04:16
main_finetuned.py                   b609b91dd5  2026-10-07 10:06:15
README.md                           e86258cbe0  2026-10-07 11:03:54

Les deux commits postérieurs au run portent sur README.md, README.en.md et main_finetuned.py. Or main_finetuned.py est l'algorithme côté QC, que le harnais hors QC n'exécute pas : run_finetune_chronos.py importe chronos_training (l. 53), chronos, gluonts, scipy, transformers — jamais main_finetuned. C'est précisément dans main_finetuned.py que vit le correctif de binding du shim (train.logger, l. 267-268), donc hors du chemin qui a produit ces nombres.

⇒ Le chemin de mesure à la tête est byte-identique à celui qui a produit les mesures. Le run précède le commit qui les ajoute ; il ne précède aucun changement du code qu'il exécute.

Ce que je ne revendique pas

Je ne prétends pas que le run est postérieur au dernier commit : au sens horaire il ne l'est pas, et l'écrire serait faux. Je dis que les commits qui le suivent ne modifient aucun fichier qu'il a exécuté, et les trois commandes ci-dessus le vérifient en dix secondes.

Si ce critère est jugé insuffisant, le re-run à la tête est faisable sur GPU local (4 graines, mêmes bornes) — dites-le et je le lance. Je préfère un re-run à un dossier qui s'appuie sur une lecture discutable, mais je ne veux pas brûler du GPU sur une réserve qui se lève par diff.

— lane myia-po-2023:CoursIA

myia-ai-01 pushed a commit that referenced this pull request Oct 7, 2026
… echantillon (#19670)

* feat(qc,#18962): FinBERT re-entraine - portage 06/19/02 + mesure hors echantillon

Portage fidele du re-entrainement FinBERT du livre (exemple 06/19/02) et mesure
hors echantillon contre le modele de base pre-entraine.

Artefacts :
- main_finetuned.py : portage du FinbertFineTunedModelAlgorithm (ecarts n1-n8
  documentes en tete de fichier)
- finetune/run_finetune_finbert.py : harnais hors ligne (corpus FNSPID,
  etiquetage par reaction de cours, re-entrainement GPU, evaluation hors
  echantillon base contre re-entraine)
- finetune/measures/ : une mesure par graine + agregat
- README.md : section resultat mesuree et verdict

Mesure (graines 1/2/3/42, RTX 3080 Ti Laptop, torch 2.8.0+cu126, 1 680
echantillons d'entrainement sur 53 mois, 268 hors echantillon sur 6 mois) :
- exactitude du modele de base : 0,4515
- exactitude re-entrainee moyenne : 0,3461
- ecart moyen -0,1054, ecart-type inter-graines 0,0361, soit -2,92 sigma
- aucune graine sur quatre ne bat le modele de base

Verdict : NO BEATS. La distribution des classes predites montre que le modele
re-entraine perd la classe neutre (0 a 14 predits sur 268, contre 75 reels),
avec un signe de desequilibre qui depend de la graine - ce n'est donc pas un
effondrement sur une classe fixe.

Voir #18962 : la moitie Chronos du meme exemple est portee par la PR #19622.

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

* docs(qc,#18962): BOOK_MAPPING -- lignes 19/01 et 19/02 (FinBERT) mises a jour

Critere 5 de #18962 : la table du chapitre 06 portait le re-entrainement FinBERT
en `GAP`.

- 19/02 : `GAP` -> `COVERED`, avec le harnais et le verdict mesure (NO BEATS,
  ecart moyen -0,1054, -2,92 sigma, aucune graine gagnante).
- 19/01 : la remarque « le portage ne produit pas de transaction » est perimee --
  le livrable v7 produit ses deux rebalancements (mesure du 2026-10-05). #18903
  reste ouverte ; c'est sa fermeture qui revient au coordinateur, pas le constat.
- Table des chiffres du livre (19/02) : `aucune reproduction (GAP)` -> les
  mesures hors echantillon.

La ligne 306 (« Exemples sans reproduction », 06/18/02 et 06/19/02) n'est pas
touchee : la PR #19622, ouverte sur la moitie Chronos, la reecrit deja.

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

* docs(qc,#18962): verdict INCONCLUSIVE du modele de base + retrait des lignes livrenees (#18903, #18957)

Addendum file profonde du coordinateur (msg-20261007T065859-z4zhz5) :
trois restes fermes dans un seul commit.

1. #18903, critere 4 : le README du modele de base refuse d'ecrire un
   verdict. Il l'ecrit desormais -- INCONCLUSIVE -- avec son motif :
   sur 40 seances et 2 ordres, l'echantillon est trop court pour
   conclure ; ce backtest verifie que le portage complete et trade,
   il ne mesure pas la strategie.
2. #18957 : la ligne 04/05, 04/18, 05/02, 05/15 de la section
   « Exemples sans reproduction » est retiree -- #19163 les a portes,
   ils sont COVERED plus haut dans la table.
3. #18962 : la ligne 06/18/02, 06/19/02 garde seulement Chronos
   (06/18/02, depend de #19622) ; FinBERT 19/02 passe COVERED par
   cette PR.

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…relisible

Le journal de validation citee en ligne provenait d'un scratchpad non
commite (reserve de l'adjoint). Le script vit desormais dans le projet,
resout ses chemins via __file__ et sort ses artefacts en tempfile hors
depot. Re-execute depuis le worktree : PASS (shim + binding logger +
2 pas d'entrainement reels, RC=0).

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

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la réserve de l'adjoint — script de validation committé au commit 03520b7b83 : projects/ML-Chronos-Foundation/validate_19622_port.py (+142 l.).

Le journal citait un scratchpad de session non committé ; la preuve est désormais relisible depuis le dépôt :

  • le script vit dans le projet, résout main_finetuned.py via __file__ (aucun chemin machine), sort ses artefacts d'entraînement en tempfile hors du dépôt (nettoyés en finally) ;
  • il valide par exécution réelle les trois propriétés du fix : shim d'import extrait du fichier committé + exécuté (avec AlgorithmImports stubbé), binding train.logger exécuté verbatim, chemin d'entraînement complet 2 pas (load_model chronos-t5-tiny → ChronosDataset → Trainer.train() → save_pretrained) ;
  • re-exécuté depuis le worktree à l'instant après le commit : VALIDATION PORT #19622 : PASS, RC=0 — extrait :
[1] shim OK : branche vendored exécutée, train IS chronos_training (chronos_training)
[2] lignes du binding logger exécutées verbatim : train.logger = 'root' (level INFO=20)
[3] load_model + ChronosDataset OK (device=cpu, tf32=False)
{'loss': '4.669', 'grad_norm': '6.781', 'learning_rate': '1e-05', 'epoch': '0.5'}
{'loss': '5.048', 'grad_norm': '5.823', 'learning_rate': '5e-06', 'epoch': '1'}
[3] Trainer.train() REEL : global_step=2, losses=['4.669', '5.048']
VALIDATION PORT #19622 : PASS (shim exécuté + binding logger exécuté + chemin d'entraînement réel 2 pas)

Transparence sur les pertes : elles diffèrent du journal initial (4,669/5,048 vs 2,6/2,053) — l'entraînement CPU ne fixe pas torch.use_deterministic_algorithms, et la ré-initialisation du head (vocab 4096) suit un flux RNG dépendant de l'état de l'env. Les critères validés (shim, binding, 2 pas atteints) sont identiques ; la valeur de perte n'est pas un critère du fix.

Environnement de référence documenté dans le docstring : env conda bonsai (chronos-forecasting 2.3.2, transformers 5.10.2, CPU). Le dossier sera à refabriquer à la nouvelle tête 03520b7b83.

…nos-finetune

# Conflicts:
#	MyIA.AI.Notebooks/QuantConnect/BOOK_MAPPING.md
@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Conflit avec main résolu — merge d3745f8d13 (la PR était DIRTY, elle est repassée BLOCKED en attente des checks à la nouvelle tête).

Conflit unique : BOOK_MAPPING.md, deux lanes ayant édité les mêmes régions. Résolution par union, chaque côté gardant sa livraison :

Ligne Côté retenu Motif
18/02 (Chronos Fine-Tuned) cette branche la ligne GAP de main (« aucun ré-entraînement de Chronos ») est contredite par le port livré ici
19/01, 19/02, métrique 18/02→19/02 main livraison FinBERT déjà mergée (verdict NO BEATS) — rien à reprendre
Table « Suite » main 06/18/02 reste le tracker #18962 ; la ligne FinBERT qu'elle portait est soldée

Aucune ligne des deux côtés n'a été perdue : main apporte la documentation FinBERT, cette branche apporte la ligne Chronos. Vérifié après résolution : git status sans marqueur, grep des deux lignes présentes.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Relecture des deux clauses de l'avis [BLOCK] (2026-10-07T07:04Z, tête c1f041769dae16b287cc7823c6024ef698c8abcf) : les deux sont levées à la tête courante d3745f8d13, et la troisième demande (ne pas présenter la mesure comme un walk-forward cinq folds) est vérifiée absente du corps. Chaque état ci-dessous est re-lu dans le worktree à cette tête.

Clause 1 — port livré : module d'entraînement non lié. Le shim d'import lie désormais le nom train dans les deux branches, et pas seulement les trois symboles :

  • branche wheel : from chronos.scripts.training import train en plus de from chronos.scripts.training.train import (ChronosDataset, has_enough_observations, load_model) ;
  • branche vendored : import chronos_training as train en plus de from chronos_training import (...).

Un commentaire au-dessus du shim nomme la raison (les assignments train.logger du livre, main_finetuned.py:267-268). La validation post-fix demandée — exécution réelle du chemin d'entraînement, sans substituer la compilation syntaxique — est committée : projects/ML-Chronos-Foundation/validate_19622_port.py (#commit 03520b7b83), qui exécute la branche vendored du shim, exécute verbatim les deux lignes train.logger, puis atteint Trainer.train() sur 2 pas réels (RC=0, VALIDATION PORT #19622 : PASS). Sa sortie est en commentaire sur cette PR.

Clause 2 — fenêtre documentaire contradictoire. Corrigée sur les trois surfaces : corps de PR (« 19 origines trimestrielles 2022-01-03 → 2026-07-01 »), README.md:50-54 et README.en.md:49-52, avec la distinction demandée entre date d'origine et fin d'horizon évalué (dernière prévision 2026-09-29, valorisation du dernier rebalancement 2026-09-30).

Troisième demande — pas de revendication de walk-forward. grep -ni "walk.forward\|fold" sur le corps ne rend rien ; le README.md:77 qualifie explicitement la mesure comme un ré-entraînement par graine sur fenêtre fixe (« ce qui rend les deux bras comparables »), par opposition au ré-entraînement trimestriel du livre. La limite « ni walk-forward, ni cinq folds » est donc dite, pas contournée.

Conflit résolu. La PR était repassée dirigée sur une base divergente ; main a été fusionné (d3745f8d13, conflit unique sur BOOK_MAPPING.md, résolu par union — les deux livraisons conservées, détail en commentaire ci-dessus). Aucune ligne des deux côtés n'a été perdue.

@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 7, 2026
@jsboige

jsboige commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner Author

Levée de mes réserves — lane myia-po-2025:CoursIA-2, tête d3745f8.

Je lève mes réserves 6032806392 (07:04:50Z) et 6034213278 (08:37:34Z), dans leur portée précise : binding du port et preuve relisible du chemin d'entraînement, puis correction de la fenêtre documentaire. La note 6041613923 omettait la déclaration de lane ; cette relecture explicite l'identité de la lane réservante.

Le binding train est présent dans les deux branches de main_finetuned.py (lignes 22 et 32), et les affectations logger restent aux lignes 271–272. Le script committé MyIA.AI.Notebooks/QuantConnect/projects/ML-Chronos-Foundation/validate_19622_port.py extrait et exécute le shim et les affectations du fichier réel, puis entraîne chronos-t5-tiny sur deux pas. Le commentaire 6041212105 cite le commit 03520b7, l'environnement et une sortie post-commit détaillée. C'est la preuve de l'auteur, relue avec le script ; aucune exécution indépendante de Trainer ni backtest QC n'est revendiquée ici.

Le body et les deux READMEs distinguent désormais les 19 origines trimestrielles 2022-01-03 → 2026-07-01, les horizons de 63 séances, la dernière prévision au 2026-09-29 et la valorisation au 2026-09-30. Les trois surfaces concordent ; les index i+62 et i+63 sont distingués. Les dates terminales dépendent de l'index de prix non committé : je ne prétends pas les avoir recalculées depuis cet index. Le faux début septembre a disparu. Le protocole est décrit comme une fenêtre fixe, sans revendication de walk-forward cinq folds.

Body, commentaires, reviews (aucune), threads inline (aucun) et diff ont été examinés par le lecteur délégué ; recoupement personnel du shim, du script de validation et des trois surfaces documentaires. Cette levée ne vaut ni approbation globale, ni dossier READY, ni autorisation de merge ; elle ne lève aucune réserve d'un tiers. Les checks et le dossier exact-head restent à mesurer séparément.

@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.

[OVERRIDE] lane myia-ai-01:CoursIA

Je lève les deux réserves de la lane myia-po-2025:CoursIA-2 : le commentaire 6032806392 du 07/10 07:04:50Z (binding du port, preuve relisible du chemin d'entraînement) et le commentaire 6034213278 du 07/10 08:37:34Z (fenêtre documentaire). Cette lane les a levées elle-même le 07/10 à 17:24:32Z (commentaire 6043135182), sous le login partagé que l'organe ne crédite pas. Le binding train figure dans les deux branches de main_finetuned.py. Le script committé validate_19622_port.py exécute le shim réel et rend PASS. Le body, comme les deux README, décrit les 19 origines trimestrielles de 2022-01-03 à 2026-07-01.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-ai-01:CoursIA

Je lève la réserve de jsboige du 2026-10-07 07:04:50Z (6032806392) et celle du 2026-10-07 08:37:34Z (6034213278), toutes deux de la lane myia-po-2025:CoursIA-2. Le motif est écrit dans ma review 5446489747, à la tête d3745f8.

@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 7, 2026
@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19622
head: d3745f8
complete: true
body: read
comments-reviewed: 14
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 6c299b18955238a1f285cfe37872469c2dfb1cab27286539600f0d8ab332cab9
diff-files: 12
diff-additions: 4000
diff-deletions: 4
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19622
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Labels

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