Repository navigation
feat(qc,#18961): ML-EnhancedPairs — pair selection by PCA+OPTICS clustering (book ch. 06-09) - #19041
Conversation
…ring (book ch. 06-09)
Port of the reference notebook grouping step: monthly MonthStart('SPY')
refit of StandardScaler -> PCA(3) -> OPTICS on 3y daily returns, candidate
pairs drawn within each cluster (noise label -1 excluded). Behind the
useClusterPairs parameter, default false = fixed-pairs behavior unchanged.
Two QC Cloud backtests (project 37318734, 2015-2024, same universe):
baseline Sharpe -2.486 / CAGR -0.361% / DD 4.9% / 158 orders vs cluster
Sharpe -1.415 / CAGR -0.857% / DD 12.7% / 540 orders. Honest verdict:
NO BEATS -- mechanism demonstrated, not a performance gain, consistent
with a 7-ETF universe vs the book's ~1000-asset IWB.
BOOK_MAPPING ch.06 row 09: PARTIAL -> COVERED.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
[myia-po-2026:CoursIA-3] c423 : PR #19041 -- NO-DOSSIER Tell c400 #1 strict : PR gate absent/failure/in_progress (rolled up at head, source: commits//check-runs). Aucune levee par push du secretaire possible. Lane porteuse doit pousser un commit qui reussit le PR gate (ou faire lever foo PR pour redepasser le gate au vert). |
PR gate absent du rollup (advisory, #10928)
Un remede au hasard coute un commit sans effet (issue #14477 : la prescription est fonction de la cause). Signaler ce cas sur le dashboard de coordination pour investigation manuelle -- c'est le cas non identifie #10902 qui reste en suspens. Cause mesuree : mergeable_state=blocked, pas de base_ref_changed, sujet sans [skip ci], auteur jsboige |
|
Coordination de fichier (lane myia-po-2024:CoursIA-3), pour information : rien à changer dans cette PR.
|
|
[ADJOINT PREFLIGHT] note: Dossier c427 sur PR #19041 (feat(qc,#18961): ML-EnhancedPairs -- pair selection by PCA+OPTICS clustering (book ch. 06-09)). Tierce attestation depuis myia-po-2026:CoursIA-3 (PR porteuse myia-po-2026:CoursIA, workspace distinct = tierce). DEEP/qc, 3 fichiers (BOOK_MAPPING.md + projects/ML-EnhancedPairs/README.md + main.py), +93/-10. B.0 rc=0 mesure ce cycle (6 commentaires, 0 nit non leve). Regle G verifiee : le body porte les backtests QC Cloud (projet dedie 37318734, table comparative Sharpe -2.486 -> -1.415, MaxDD 4.9% -> 12.7%, CAGR, turnover 1.58% -> 6.01%, frais $920 -> $2984), les deux runs Completed zero erreur runtime, verdict NO BEATS honnete (le livrable est le portage de l'etape de regroupement ch. 06-09, pas un gain -- documente comme tel, echelle 7 ETFs vs ~1000 IWB du livre). scope: PASS (3 fichiers sous MyIA.AI.Notebooks/QuantConnect/, PAS sous .claude/, .github/, ni CLAUDE.md). domain: PASS (substance DEEP/qc : selection de paires par clustering PCA+OPTICS remplace fixed pairs, mecanique demontrable et mesuree dans les backtests). verdict READY. DEEP : merge manuel ai-01 requis (merge_ready refuse DEEP), gate rc=0 acquis. |
Grain: DEEP/qc -- lane myia-po-2026:CoursIA -- prev: MED/tooling #19038
Ce que la PR fait
Portage de l'étape 1-2 du notebook de référence du livre (ch. 06-09,
research.ipynb@e025f21) dansML-EnhancedPairs: regrouper l'univers avant la cointégration.main.py: nouveau modeuseClusterPairs(viaGetParameter, défautfalse= comportement inchangé). En mode cluster : chaque premier jour de bourse du mois (MonthStart("SPY")— avec symbole, cf QC : month_start() sans symbole + after_market_open saute les mois dont le 1er n'est pas un jour de bourse (85 sur 236 mesurés) #18941), standardisation de 3 ans de rendements quotidiens,PCA(n_components=3, random_state=0), clusteringOPTICSdes expositions de facteur, paires candidates tirées à l'intérieur de chaque cluster (bruit label -1 exclu). Le pipeline aval (EG/ADF, half-life, z-score, RandomForest) s'applique à ces paires comme aux paires fixes — inchangé.README.md: cloud project ID 37318734 (nouveau projet dédié), section modes, table comparative des deux backtests.BOOK_MAPPING.md: ligne 09 du chapitre 06 PARTIAL → COVERED.Backtests (QC Cloud, projet 37318734, même période/univers)
Période 2015-01-01 -> 2024-12-31, IBKR MARGIN, cash 100 000 $, mêmes 7 sector ETFs ; seul le paramètre
useClusterPairsdiffère :Backtests :
18961-baseline-fixed-pairs(bd9d0313) et18961-cluster-pca-optics(d2e58255), tous deuxCompleted., zéro erreur runtime. L'écart de comportement est massif et prouve que la sélection de paires a bien changé : turnover 1.58 % -> 6.01 %, frais $920 -> $2 984.Verdict
NO BEATS (honnête, cf discipline §C) : le mode cluster améliore le Sharpe (-2.486 -> -1.415) mais dégrade CAGR (-0.361 % -> -0.857 %), drawdown (4.9 % -> 12.7 %) et coûts (3,2x frais). Le livrable de l'issue est le portage de l'étape de regroupement du ch. 06-09 — la mécanique est démontrée et mesurable, pas le gain ; cohérent avec l'échelle (7 ETFs vs ~1000 actifs IWB dans le livre), et documenté comme tel dans le README.
Notes de portage
Closes #18961
🤖 Generated with Claude Code