Skip to content

feat(qc,#19457): convertisseur generalise dataset -> module QuantConnect - #19618

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/qc-19457-open-datasets
Oct 7, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/qc-19457-open-datasets

Conversation

@jsboige

@jsboige jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2023:CoursIA — prev: MED/docs #19549

Part of #19457 (critère 2 — convertisseur généralisé). Le critère 3 est déjà mesuré (variante EDGAR libre livrée par #15584, trois runs Cloud OOS 2022-2024 dans le README du projet, verdict NO BEATS) ; le critère 1 (tableau d'inventaire des datasets ouverts) est posté sur l'issue, comme son acceptance le prescrit (« Sortie = un tableau sur cette issue, pas un fichier dans le dépôt »).

Le problème

Un projet QuantConnect Cloud refuse les fichiers .csv : seul du .py est accepté. Le convertisseur existant — write_cloud_module (edgar_signal.py:642, unique dans le dépôt — grep -rln write_cloud_module = 0 occurrence hors projet) — émet le bon type d'artefact, mais il est lié à une source (SEC EDGAR) et à un schéma (paires 10-K adjacentes). Brancher une source ouverte nouvelle exigeait donc d'en réécrire un.

Ce que la PR livre

scripts/datasets/build_qc_custom_data.py — convertisseur généralisé :

  • Entrée : csv, tsv, json (liste d'objets), jsonl/ndjson. Le format jsonl n'était lu par aucun script de scripts/datasets/ avant ce commit (seuls CSV et Parquet* y étaient gérés) — c'est le format nouveau que la généralisation rend consommable.
  • Sortie : module .py portant la constante de données, plus — sur --class-name — une classe PythonData dérivée qui les relit (patron du dépôt, cf partner-course-quant-trading/examples/Sector-Momentum/FredRate.py).
  • Valeurs conservées en chaînes (même choix que le convertisseur EDGAR : le consommateur type ses colonnes, et None reste distinct de "None").
  • Rendu déterministe : deux conversions du même fichier sont byte-identiques.
  • Fail-closed : --class-name sans --date-column/--value-column est une erreur d'appel, jamais un module à moitié fonctionnel ; format inconnu = erreur, jamais un devinage.

Le convertisseur du projet EDGAR reste en place et inchangé : la généralisation ne le remplace pas, elle évite d'en réécrire un par source. Le README du projet porte le renvoi croisé (« Brancher une autre source »).

Preuve d'exécution

python -m pytest scripts/datasets/tests/test_build_qc_custom_data.py -q
25 passed in 0.19s

python -m pytest scripts/datasets/tests/ -q
77 passed in 2.83s

Les 25 tests sont hermétiques (0 réseau, tmp_path). Le plus important n'est pas un test de forme : test_emitted_custom_data_class_executes exécute réellement la classe PythonData émise contre un faux AlgorithmImports (injecté dans sys.modules) et vérifie que GetSource rend un SubscriptionDataSource en transport LocalFile, que Reader rend un objet typé (Time, Value, Symbol) et qu'une ligne incomplète est ignorée sans faire tomber le moteur. L'artefact est consommé, pas seulement écrit.

Garde prose-counts : check_prose_quantitative_claims.py --diff origin/main...HEAD → [OK] aucun compteur quantitatif en prose.

Portée du non-verifié

  • Les tests tournent hors LEAN (faux AlgorithmImports) : ils prouvent la forme du module et la mécanique du Reader, pas un backtest Cloud consommant ce module. Le seul backtest Cloud de cette famille reste celui du critère 3 (EDGAR, déjà mesuré).
  • Aucun fichier de données réel n'est committé : le convertisseur est l'outil, pas la donnée.
  • Le tableau d'inventaire (critère 1) est posté sur l'issue et ses licences portent leurs citations ; ce qu'il n'a pas pu vérifier y est marqué À VÉRIFIER.

Fichiers

  • scripts/datasets/build_qc_custom_data.py (nouveau)
  • scripts/datasets/tests/test_build_qc_custom_data.py (nouveau, 25 tests)
  • scripts/datasets/README.md · README.en.md (ligne de catalogue + section d'usage, parité FR/EN)
  • MyIA.AI.Notebooks/QuantConnect/projects/Filing-Language-Stability/README.md (renvoi croisé)

🤖 Generated with Claude Code

Generalise le geste du convertisseur EDGAR (`edgar_signal.write_cloud_module`,
unique dans le depot) : un projet QuantConnect Cloud refuse les `.csv` et
n'accepte que du `.py`, il fallait jusqu'ici reecrire un convertisseur par
source. `scripts/datasets/build_qc_custom_data.py` lit desormais `csv`/`tsv`/
`json`/`jsonl` et emet le meme type d'artefact : constante de donnees, plus une
classe `PythonData` derivee si on la demande.

Le format `jsonl` (alias `ndjson`) n'etait lu par aucun script de
`scripts/datasets/` avant ce commit — c'est le format nouveau rendu consommable.
Le convertisseur du projet EDGAR reste en place et inchange pour son usage.

25 tests hermetiques (0 reseau), dont un qui **execute** la classe `PythonData`
emise contre un faux `AlgorithmImports` (GetSource + Reader) : l'artefact est
consomme, pas seulement ecrit. 77/77 sur le dossier `scripts/datasets/tests/`.

Part of #19457 (criteres 1-2 ; le critere 3 est deja mesure : variante EDGAR
libre, trois runs Cloud OOS 2022-2024, verdict NO BEATS).

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: 19618
head: 6c226b4
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 818d6eaf67acfcd0e590a23e3a5958b34ddd3c7574bdf21fa1e72910bd08ff62
diff-files: 5
diff-additions: 716
diff-deletions: 0
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 19618
organ-rc: 0
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19618
head: 6c226b4
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 10dc20f374dedaf9d4622f8e6525ab5870a014f220bb95d8a568df0b43f6c999
diff-files: 5
diff-additions: 716
diff-deletions: 0
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 19618
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants