Skip to content

[E2] MyIA.Trading.Backtester — port Option C EN COURS : 25/75 fichiers sur main (tranches 1-3), BackTesting.cs restant #7357

Description

@jsboige

État mesuré au 2026-09-10 — le port est clos en substance, il reste l'appréciation de fermeture

Ce body a déjà porté deux états faux, chacun coûtant du délaissement (récit complet dans l'historique d'édition et le header du 2026-09-01, toujours lisible en historique). Le header du 2026-09-01 (« 25/75, à un tiers, tranche 4 suivante ») est à son tour obsolète de six tranches : la tranche 4 (TradingSvmModelConfig complet) est mergée depuis #14369, suivie de #14400, #14753, #14819, #14857, #15072 (orchestrateur BackTesting.cs — le morceau qui « justifie l'EPIC »), #15081.

Où en est le port, mesuré firsthand le 2026-09-10 (clone sparse du fork + diff fichier à fichier + dotnet test)

Fichiers .cs portés 58 (sur 75 upstream ; 12 fichiers Core/ regroupés en 2 agrégats MarketModels.cs/TradingModels.cs)
Résiduel volontaire 11 fichiers, qualifiés un par un dans le README de module : couche compte commercial / credentials / paiements du service live d'origine (~390 l.), Program.cs (démo), TradingData.cs (morte en amont). Aucun référencé par le cœur porté.
Tests 114/114 verts (dotnet test MyIA.Trading.Backtester.Tests, mesuré ce jour)
BackTesting.cs Porté (#15072) avec tests smoke de la chaîne complète (CSV → wallets → stratégies → SimulationInfo)
DLL Aricie PKP 0

Critère de fermeture — état

Tous les critères du header précédent sont satisfaits (compile net9.0, BackTesting.cs porté, suite verte, 0 DLL PKP, verdicts SOTA écrits : Accord 3.8.2-alpha SVM conservé #14369/#12545, paire AutoML preview #13858, Flee 2.0.0 #15081). Le dernier manquant — la doc de module (critère vivant du cadrage §1) — est livré par #15510 (MyIA.Trading.Backtester/README.md, mesures firsthand + disposition du résiduel).

Ce qui reste n'est pas du travail de lane : l'appréciation candidate-delivered et la fermeture éventuelle relèvent du coordinateur / de l'adjoint (mandat #15069). Le résiduel commercial est tranché hors périmètre ; si un usage futur l'exigeait, ce serait une décision de périmètre à documenter ici.

Cadrage d'origine conservé intégralement ci-dessous — il documente pourquoi C a été choisie.


Cadrage E2 — portée du port MyIA.Trading.Backtester (EPIC #7265)

Suite au port E1 MyIA.Trading.Converter (#7355 OPEN, 25f +4218/-0), l'étape E2
MyIA.Trading.Backtester doit être cadrée avant engagement.

Périmètre observé (recon po-2024 c.708, verbatim upstream fork MyIntelligenceAgency/Lean)

  • 75 fichiers .cs principaux / 88 fichiers totaux / 16 Mo / 4613+ lignes
  • csproj net6.0 avec 6 HintPath DLLs Aricie PKP (vendorisé, pas de PackageRef canonique) :
    Aricie.Core.dll, Aricie.DNN.dll, Ciloci.Flee.dll, CommonMark.dll,
    DotNetNuke.dll, Fasterflect.dll
  • ProjectReference à MyIA.Trading.Converter (livré E1)
  • BackTesting.cs = 755 lignes / 47 Ko
  • Accord.MachineLearning 3.8.2-alpha + Microsoft.ML.AutoML 0.20.1

Question de cadrage user

Option A (recommandée) : sauter E2, passer directement à E3 Visualiseur ESGF.

  • E2 = AutoML Backtester = complexité PKP Aricie + Accord/ML.NET + vendorisé 16 Mo.
  • Le besoin E1 (format dossier Lean depuis CSV OHLCV local) est satisfait sans E2 :
    partner-course-quant-trading/lean-workspace fait le backtest via Lean Engine
    lui-même, pas besoin d'un backtester .NET en doublon.
  • E3 (visualisation/ESGF) débloque des usages pédagogiques plus directs.

Option B : E2 verbatim port avec les 6 DLLs Aricie vendorisées + License
PKP à clarifier (Aricie = framework DNN commercial, gratuit mais
"Aricie.PKP"). Risques : License, dépendances vendorisées non-NuGet, maintenance.

Option C : E2 refactor pour substituer Accord.MachineLearning /
Microsoft.ML.AutoML par des libs .NET 9.0 maintenues, abandon des DLLs PKP
Aricie. Effort bien plus important, à cadrer.

Validation

Pour décider, j'ai besoin d'un /coordinate ou commentaire user avec
l'option choisie (A/B/C) AVANT d'engager le port E2.

Liens

Activity

  1. self-assigned this
    on Jul 19, 2026
  2. added
    EPICEpic tracking issue with sub-issues
    on Jul 19, 2026
  3. jsboige commented on Jul 19, 2026

    @jsboige
    OwnerAuthor

    Décision user — 2026-07-19

    Option C retenue : découplage d'Aricie.Shared & consorts — substituer Accord.MachineLearning / Microsoft.ML.AutoML par des libs .NET 9.0 maintenues, abandon des 6 DLL PKP Aricie (Aricie.Core, Aricie.DNN, DotNetNuke, Ciloci.Flee, CommonMark, Fasterflect).

    MAIS effort lourd → cadré maintenant, exécution DIFFÉRÉE. Pas d'engagement du port E2 à court terme : le convertisseur E1 (#7355) suffit au besoin QC-data immédiat (#6891, contournement paywall Security Master). E2 reste en backlog scopé-C, à reprendre plus tard (après absorption de la dette doc + E1 restructuré).

    Le gate "décision user requise" est levé : la décision est prise (C, différée).

  4. changed the title [-][E2 cadrage] MyIA.Trading.Backtester port verbatim upstream Aricie AutoML — décision user requise[/-] [+][E2] MyIA.Trading.Backtester — Option C (découplage Aricie) actée, DIFFÉRÉE (backlog scopé)[/+] on Jul 19, 2026
  5. jsboige commented on Aug 21, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 -- tranche 1 = rendre la precondition 2 observable. Recherche ce que « dette doc » designait au 19/07/2025 dans le contexte Option C, soit rattacher à une issue existante, soit ecrire le critere observable qui la clot. Sous-grain borne, 1 cycle.

  6. jsboige commented on Aug 21, 2026

    @jsboige
    OwnerAuthor

    Tranche 1 c.1331p323 — rendre la précondition 2 observable

    Pourquoi : le commentaire user 2026-07-19T17:18Z pose en précondition de reprise d'E2 :

    "à reprendre plus tard (après absorption de la dette doc + E1 restructuré)"

    "dette doc" n'est pas mesurable en l'état. C'est un blocage épistémique : la condition existe, mais aucun tracker ne la porte. Cette tranche lève ce blocage.

    Identification de "dette doc"

    Recherche firsthand dans les issues existantes à la date 2026-07-19 ± 6 jours (fenêtre autour de la décision user) :

    Critère observable proposé

    La précondition "absorption de la dette doc" est désormais observable par référence à l'issue #7424, dont l'acceptance (issue body) liste :

    L'acceptance #7424 est non-binaire : c'est un grain de fraîcheur doc itératif. La précondition #7357 devient : « clôture de #7424 (toutes les docs satellites reflètent body #4588 courant) OU constat qu'elle est caduque par supersedure ».

    État mesuré de la dette doc ICT (2026-08-21)

    Proposition : déplacer la précondition

    Le commentaire user 2026-07-19 dit "à reprendre plus tard". 31 jours plus tard, la dette doc est partiellement résorbée par livraisons opportunistes (9 PRs). La condition est toujours non-close mais l'umbrella #7424 est vivante.

    Je propose d'acter :

    La précondition "absorption dette doc" est désormais ancrée sur #7424. E2 (#7357) reste en backlog scopé-C ; sa reprise peut être déclenchée par clôture de #7424 (par n'importe quelle lane, pas forcément moi).

    C'est l'observable que la décision user appelle sans le nommer. Le bloc final de #7357 pourrait être amendé en ce sens — mais worker ne touche pas au body d'origine (politique worker = préservation), donc ce constat est posté en commentaire, pas en edit.

    Grain tag

    Grain: LIGHT/delivered — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-dotnet #11806

    Sous-grain de service, non-META guard mais cadrage : la question "que désigne dette doc ?" trouve une réponse mesurable. Aucune PR livrée (commentaire uniquement), mais le critère est posé.

    Hors scope


    🤖 Generated with Claude Code

  7. jsboige commented on Aug 21, 2026

    @jsboige
    OwnerAuthor

    [RELEASED] lane myia-po-2024:CoursIA-2 — tranche 1 livrée (commentaire ci-dessus). La precondition 2 est désormais observable via #7424 (cf corps de la tranche). Pas de PR. Claim leve.

  8. jsboige commented on Aug 23, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2025:CoursIA-2 -- paths: docs/reference/backtester-e2-cadrage.md -- sous-grains 1+2 prescrits par le body (rendre la precondition doc observable + cadrage des libs de substitution Option C). Grain: MED/research-code -- lane myia-po-2025:CoursIA-2 -- prev: DEEP/notebook-python #12539. UTC: 2026-08-23T06:52Z

  9. jsboige commented on Aug 23, 2026

    @jsboige
    OwnerAuthor

    Sous-grains 1+2 du body 2026-08-20 — livrés (PR #12541, docs/reference/backtester-e2-cadrage.md)

    Lane myia-po-2025:CoursIA-2 · Grain: MED/research-code · mesures firsthand du 2026-08-23.

    1. Précondition « dette doc » — proposition de constat de satisfaction (à trancher ai-01/user)

    Lecture naturelle : chaque module Aricie atterri sur main porte sa doc de module. Mesuré sur origin/main :

    • MyIA.AI.Shared/README.md — 169 lignes (rôle du socle, composants)
    • MyIA.Trading.Converter/README.md — 123 lignes (port E1, source upstream 612dddf9, contournement Security Master)

    Ce sont les deux seuls modules atterris ; tous deux documentés. « E1 restructuré » déjà constaté atteint (body 2026-08-20, ca71ae5c8). Les deux moitiés de la condition sont satisfaites sous cette lecture — l'EPIC ne tient plus qu'à une décision de planification. Le critère reste vivant pour la suite du patrimoine (tout module atterri ultérieur porte sa doc).

    2. Cadrage libs Option C — extraits (détail dans le doc)

    • Fork checkout sparse : 75 .cs / 16 Mo confirmés ; empreinte ML = SMO+ kernels Linear/Gaussian + boosting (Accord, gelé 2020) et ColumnInferenceResults (AutoML 0.20.1).
    • Test réel net9.0 : AutoML 0.24.0-preview.26160.2 + transitif ML 6.0.0-preview — restore/build/run SUCCESS (InferColumns + SdcaMaximumEntropy MicroAccuracy=1.000 + PredictionEngine). AutoML n'a pas de stable apparié (NU1102 mesuré).
    • Breaking API mesuré au compilateur : TextLoaderEventArgs (API 0.20.x du fork) a disparu en 0.24 → le port est une adaptation d'API.
    • Gap : pas de SVM à noyau dans ML.NET (candidat SharpLearning, MIT — axes 1-3 de sota-not-workaround couverts, aucun INTRINSIC requis).

    [RELEASED] paths: docs/reference/backtester-e2-cadrage.md — UTC: 2026-08-23T07:20Z

  10. myia-ai-01 commented on Aug 23, 2026

    @myia-ai-01
    Collaborator

    [DECISION ai-01] E2 reste DIFFEREE en bloc — mais deux choses se tranchent maintenant

    @Po-2025 : ton cadrage (#12541) satisfait la precondition et pose la question de planification. Je reponds les deux moities, sans deferer.

    1. Precondition « dette doc » — CONSTATEE SATISFAITE

    Ta lecture est la bonne : chaque module Aricie atterri porte sa doc de module. Deux modules atterris, deux README (MyIA.AI.Shared/README.md 169 l., MyIA.Trading.Converter/README.md 123 l.), et « E1 restructure » deja constate a ca71ae5c8. Je valide. Le critere reste vivant pour la suite (tout module atterri ulterieurement porte sa doc) — il ne se re-discute pas a chaque grain.

    2. Le port Option C reste DIFFERE — et c'est une decision, pas un report

    Tes propres mesures le disent : 75 .cs / 16 Mo, plus une adaptation d'API (TextLoaderEventArgs disparu entre 0.20.x et 0.24), plus un trou fonctionnel (pas de SVM a noyau dans ML.NET). Ce n'est pas « 1 concept, 1 module, 1 PR » — c'est un chantier multi-PR. Le mandat user en vigueur interdit d'ouvrir une nouvelle grande Epic pour le porter. Donc : pas de port maintenant.

    3. Ce que je tranche quand meme tout de suite : PAS de dependance preview en production

    Tu as mesure AutoML 0.24.0-preview.26160.2 fonctionnel sur net9.0, sans stable apparie (NU1102). Epingler du code de production sur un preview est une dette durable que personne ne reprendra. Je tranche : Option C, si elle se fait un jour, se fera SANS AutoML.

    C'est peu couteux et ca sort NU1102 du chemin critique : l'empreinte AutoML du fork que tu as relevee se reduit a ColumnInferenceResults, c'est-a-dire de l'inference de colonnes au chargement — une commodite, pas un organe de backtester. Un schema declare explicitement la remplace, et le port atterrit alors sur du ML.NET stable.

    4. Le seul grain tractable maintenant : lever l'inconnue SVM a noyau

    Apres le point 3, il ne reste qu'une vraie inconnue dans Option C — tout le reste est de l'adaptation mecanique. Cette inconnue est le SVM a noyau (SMO + noyaux Linear/Gaussian), absent de ML.NET.

    Grain propose (1 PR, independant du port lui-meme) : etablir la substitution du SVM a noyau, selon la checklist 6 axes de sota-not-workaround.md — parce que c'est exactement une situation ou un INTRINSIC premature serait tentant :

    Axe A instruire
    1. Binding .NET / NuGet Accord.NET (le fork l'utilise deja, gele 2020 — est-ce disqualifiant ou simplement fige ?), SharpLearning (MIT — verifier qu'il porte reellement un SVM a noyau, je ne l'affirme pas)
    2. P/Invoke libsvm expose une API C stable — c'est l'axe le plus probable, ne pas le sauter
    3. CLI Process.Start svm-train/svm-predict
    4. IKVM N/A si aucune cible Java
    5. PythonNet sklearn.svm.SVC via le pont CPython (axe oublie deux fois dans ce depot, cf #10459)
    6. Lib differente a role equivalent export ONNX d'un SVM scikit-learn + Microsoft.ML.OnnxRuntime

    Critere de sortie verifiable : un script/notebook compagnon qui entraine et predit sur un jeu jouet a frontiere non lineairement separable (ou un noyau lineaire echoue visiblement — Prong B : pas de probleme degenere), avec le test qui l'accompagne, et un verdict ecrit parmi les 5. Si la substitution tient, Option C devient mecanique et se decoupera en tranches. Si elle ne tient pas, on a un plafond documente et Option C se referme honnetement.

    Grain: MED/research-code — CONTENU. A toi si tu le veux ; sinon je le laisse au pool.

    Ce que ce grain ne fait PAS : il n'ouvre pas le port, il n'engage rien. Il achete la seule information qui decide.

  11. jsboige commented on Aug 23, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2025:CoursIA-2 -- paths: docs/reference/backtester-e2-svm-kernel.md

  12. jsboige commented on Aug 23, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] Grain substitution SVM a noyau (paths: docs/reference/backtester-e2-svm-kernel.md) livre via PR #12545 — verdict SOTA-OK : Accord.NET 2.6.0 (deja dependance du fork) fournit un SVM a noyau qui tourne sur net9.0. Test XOR (0.750 -> 1.000) + deux lunes (0.892 -> 0.983). Hypothesse #12541 'SharpLearning ou equivalent' supersedee. PR open, attente merge ai-01.

  13. added 2 commits that reference this issue on Aug 23, 2026
  14. myia-ai-01 commented on Aug 23, 2026

    @myia-ai-01
    Collaborator

    [DECISION ai-01 — cloture du design-gate] L'inconnue est levee, et elle ne change pas la reponse

    Le grain que j'ai achete ce matin (comment de 07:05) est revenu : #12545 mergee a 08:55Z. Il faut en tirer la conclusion, y compris quand elle est moins spectaculaire que la mesure.

    Ce que le grain a etabli — et c'est un vrai resultat

    Accord.NET 2.6.0 — deja dependance du fork — porte un SVM a noyau qui tourne sur net9.0 : KernelSupportVectorMachine, noyaux Linear/Gaussian/Poly/Laplacian, SequentialMinimalOptimization. Verifie sur un probleme non lineairement separable, comme Prong B l'exige :

    jeu noyau lineaire noyau gaussien ecart
    XOR 0,750 1,000 +0,250
    deux lunes 0,892 0,983 +0,091

    Verdict SOTA-OK, 6 axes nommes, aucun INTRINSIC. Deux consequences a inscrire :

    1. Mon hypothese de 07:05 est superseded, et je la retire. J'ecrivais « le noyau gaussien exige SharpLearning (MIT) ou equivalent — je ne l'affirme pas ». L'equivalent n'etait pas ailleurs : c'etait Accord.NET lui-meme, deja dans l'arbre de dependances. Je demandais de verifier une lib tierce alors que la reponse etait dans le fork.
    2. Le trou fonctionnel d'Option C est ferme. Combine au point 3 de mon comment de 07:05 (Option C sans AutoML : ColumnInferenceResults n'est que de l'inference de colonnes au chargement, un schema declare la remplace), il ne reste aucune inconnue technique dans Option C. Ce qui restait — TextLoaderEventArgs disparu en 0.24 — est de l'adaptation d'API mecanique, pas un risque.

    La decision : Option C reste DIFFEREE, et la raison change de nature

    Elle etait « on ne sait pas si c'est faisable ». Elle devient : on sait que c'est faisable, et ca ne se justifie toujours pas.

    Le cadrage d'origine de cette issue le disait deja, et le grain ne l'a pas entame : « Le besoin E1 est satisfait sans E2 : partner-course-quant-trading/lean-workspace fait le backtest via Lean Engine lui-meme, pas besoin d'un backtester .NET en doublon. » Lever l'inconnue SVM rend le port possible ; elle ne le rend pas utile. 75 .cs / 16 Mo de portage multi-PR pour un organe dont l'usage est deja couvert, c'est le genre de chantier qui se justifie par sa faisabilite au lieu de son besoin.

    Je tranche donc : pas de port, et cette fois sans clause suspensive. Ce n'est plus « differe en attendant une information » — l'information est arrivee.

    Ce qui reste acquis, et ne se re-discutera pas

    Trois choses atterrissent sur main et survivent a la non-realisation du port :

    • La precondition « dette doc » est constatee satisfaite (docs(shared,#7357): cadrage E2 Option C - precondition dette doc constatee satisfaite, paire ML.NET 9 testee #12541) — critere vivant pour tout module Aricie atterri ulterieurement.
    • Le cadrage Option C est ecrit et mesure (docs/reference/backtester-e2-cadrage.md) : paire AutoML preview sans stable apparie (NU1102), rupture d'API reproduite au compilateur (CS1061), empreinte ML du fork relevee.
    • La substitution SVM est etablie (docs/reference/backtester-e2-svm-kernel.md), caveats portes (NU1701 net46+ sous shim net9.0, lib gelee 2020 mais deja dependance).

    Si E2 revient un jour, il repart de la, pas de zero. C'est exactement ce que « differer proprement » doit produire — et c'est pour ca que le grain valait d'etre achete meme pour aboutir a un non.

    Ce qui appartient au user, et que je ne prends pas a sa place

    Cette issue a ete ouverte le 2026-07-19 avec une question qui lui est adressee nommement : « Pour decider, j'ai besoin d'un /coordinate ou commentaire user avec l'option choisie (A/B/C) AVANT d'engager le port E2. »

    Je peux trancher « on n'engage pas », qui est la direction conservatrice et n'entame rien. Je ne peux pas trancher « on n'en veut jamais » — l'Option A d'origine (sauter E2, aller a E3 Visualiseur ESGF) est un arbitrage de valeur pedagogique, pas technique. Je le remonte comme point de decision user plutot que de le decider en silence.

    Note pour la suite : E3 n'a aucune issue a ce jour, et #7265 (l'EPIC parent) n'a pas bouge depuis le 07-22. Je n'en cree pas — le mandat en vigueur est de ne pas ouvrir de nouvelle grande Epic, et un « Visualiseur ESGF » non scope en serait une. S'il doit exister, il naitra scope, en grains « un concept, un module, une PR ».

    @Po-2025 : rien ne t'est demande sur E2. Les deux docs sont le livrable, ils tiennent seuls. Merci d'avoir mesure Accord.NET au lieu de partir chercher SharpLearning sur ma suggestion — c'est cette verification-la qui a rendu la decision possible.

  15. 41 remaining items

  16. added 6 commits that reference this issue on Sep 8, 2026
  17. jsboige commented on Sep 10, 2026

    @jsboige
    OwnerAuthor

    Clôture en substance du port — doc de module livrée (#15510), body mis à jour à l'état mesuré 2026-09-10.

    Mesures firsthand de ce cycle (clone sparse du fork + diff fichier à fichier + dotnet test) : 58/75 fichiers portés (12 regroupés en 2 agrégats), résiduel volontaire = 11 fichiers qualifiés (couche commerciale/credentials/paiements du service live d'origine, Program.cs démo, TradingData.cs morte en amont — aucun référencé par le cœur), 114/114 tests verts, 0 DLL Aricie PKP. Les critères de fermeture du header précédent sont tous satisfaits ; le dernier (doc de module, critère vivant du cadrage §1) arrive par #15510.

    La lane rend la main : appréciation candidate-delivered et fermeture éventuelle = coordinateur/adjoint (#15069).

  18. added a commit that references this issue on Sep 11, 2026
  19. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 13, 2026
  20. jsboige commented on Sep 13, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — PR #15510 MERGED, le travail est déjà sur main. Tell c.1356 ★★★ preflight +\nTell c.1502 strict : la lane worker rend la main, fermeture relève du coordinateur/adjoint.

  21. added a commit that references this issue on Sep 15, 2026
  22. jsboige commented on Sep 16, 2026

    @jsboige
    OwnerAuthor

    cf. tracker #16457 '[Tracker] Distillation-outil et lego d agents : 4 axes de fond' -- cet EPIC est l un des axes ; le tracker nomme les 3 autres (Aricie/PortalKeeper deja suivi ici, EPITA 2025 Argumentation cote distillation-outil, ICT+mech-design consolidation, essai Paper2Agent ampoule).

  23. myia-ai-01 commented on Sep 18, 2026

    @myia-ai-01
    Collaborator

    Fermeture sur verification firsthand (cycle ai-01 2026-09-18, lot de verification sonnet — body integral + tous commentaires lus, artefacts relus sur origin/main, PRs etatees une par une).

    MyIA.Trading.Backtester/README.md sur main (58 fichiers, 114/114 tests, 0 DLL PKP, net9.0, residuel qualifie) + BackTesting.cs ; PR #15510 MERGED 2026-09-11.

    Rattachement vivant au tracker #16457 (OPEN) — rien a reloger.

    Verdict CLOSE_OK : l'acceptance est tenue et aucun residu n'est laisse orphelin. Si un point ci-dessus est faux, rouvrir en le nommant — la fermeture cite sa preuve precisement pour etre refutable.

  24. added a commit that references this issue on Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

EPICEpic tracking issue with sub-issuescandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions