Skip to content

feat(qc,#17320): Carver #11 blend 60/40 actif + verdict NO BEATS 3 fenetres (tranches 3-4) - #19408

Merged
myia-ai-01 merged 4 commits into
mainfrom
feature/17320-carver11-blend-t34
Oct 7, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
feature/17320-carver11-blend-t34

Conversation

@jsboige

@jsboige jsboige commented Oct 6, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/qc — lane myia-po-2025:CoursIA — prev: MED/lean #19084

Summary

Tranches 3-4 du port Carver #11 (Combined Carry and Trend, article QC #16001, semis #17320) : blend 60/40 trend+carry ACTIF, fenêtre de backtest paramétrable, et verdict tranché : NO BEATS sur trois fenêtres.

Provenance du diff : ces tranches vivaient sur une branche locale du 2026-09-22 jamais poussée (livrable échoué — tranche 2 avait été mergée séparément via #17325). Réassemblage propre sur main courant par cherry-pick des 3 commits uniques, zéro conflit, 56 tests CPU verts (15 carry + 10 blend + 31 existants).

Contenu

  • Tranche 3 — blend actif : CARVER_CARRY_WEIGHT = 0.4 ; on_data accumule par ticker l'historique borné (130 bars) d'observations carry risk-ajustées (chaîne data.future_chains triée par expiry, paire near/further pricée daily, dénominateur = risque quotidien EWMA_32 annualisé ×√256) ; filtre d'univers 0-90 → 0-200 jours (les contrats trimestriels exigent le further à ~90 j) ; blend pur délégué au module carry_forecast.py (patron breadth_multiplier.py, formule exacte de l'article : annualisation par écart d'expiry, EWMA spans 5/20/60/120, scalaire 30 p.216, cap ±20) ; +10 tests blend (73 lignes de tests nouvelles).
  • Tranche 4 — fenêtres + verdict : $start/$end YYYYMMDD paramétrables (défauts 2016-2026 inchangés) ; trois runs QC Cloud depuis le même compile (projet 36488678) :
Fenêtre Run Sharpe CAR PnL MaxDD Ordres
Full 2016-2026 b35d302d −0.19 −31.9 % −$98 382 99.8 % 3 104
Dev 2016-2021 27d2de09 −0.311 −59.7 % −$98 381 99.8 % 3 098
OOS 2021-2026 2f590dcd −0.128 −54.3 % −$98 874 99.4 % 1 269

MaxDD lus à read_backtest sur les trois runs (99.800 % / 99.800 % / 99.400 %). Les MaxDD 98.0 / 98.2 % cités dans le README appartiennent à d'autres runs (dc766352, sondes 0f906bb8/24b322ef, projet 36719632).

Verdict conforme à la règle C (multi-fenêtres, jamais « promising ») : NO BEATS — cohérent avec la famille #13 (trend-only, Sharpe −0.168/−0.231) et le retour communauté de l'article (Sharpe ~0,1 depuis 2015). La jambe carry n'inverse pas la pente, elle l'aggrave sur la fenêtre full.

Finding diagnostique ouvert (reporté au suivi #17320)

La perte ~98 % du capital et le MaxDD mesuré (99.8 / 99.8 / 99.4 %) sur chaque fenêtre sont un régime de ruine, pas une mauvaise année. Hypothèse principale non confirmée (qc-mcp-lite n'expose pas le log du run) : saturation de la jambe carry — ratios gap-annualisé/risque touchant le cap ±20 en permanence, 40 % du blend devenant un pari directionnel maximal, amplifié vol ×2 et breadth ×2 sur marge IBKR $100k. L'instrumentation livrée en tranche 3 (histories_filled, compteurs par issue de chaîne) est l'organe qui tranchera — sa lecture exige les logs complets (UI web ou MCP full). Les arbitrages reportés (scalaires sqrt vs Table 29, FDM-Table-52 vs breadth) restent ouverts, motivés par ce finding.

Validation

See #17320 (finding diagnostique + arbitrages restent ouverts) · See #16001

🤖 Generated with Claude Code

jsboige and others added 3 commits October 6, 2026 03:16
…tement, blend pur + 10 tests (tranche 3)

- on_data: _update_carry_histories — par ticker, paire near/further de la
  chaine triee par expiry, pricee sur les bars daily, annualisee (module
  pur) puis risk-ajustee (EWMA_32 |retours| x prix x sqrt(256), les deux
  jambes en $/an) ; historique borne 130 obs
- set_filter 0-90 -> 0-200 jours : un filtre a 90 jours exclut le contrat
  further des calendriers trimestriels (~90 j entre expiries)
- _rebalance: _carry_forecast + blend_forecasts purs — w=0.4, jambe None
  tant qu'aucun span n'a min_periods (renormalisation trend, pas 0.6x
  silencieux)
- module pur: daily_price_risk, risk_adjusted_carry, blend_forecasts
  (ValueError sur poids hors [0,1]) + 10 tests CPU (total 25, tous verts)
- instrumentation REPAIR-9: no_chain/no_pair/no_bars/formula_none/updates
  + histories_filled dans le log de fin — le diagnostic qui tranche la
  disponibilite des chaines en daily sans second backtest

Stack sur feature/17320-carver11-carry (PR #17325, tranche 2).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
set_start_date/set_end_date lisent les parametres QC {$start,$end} au
format YYYYMMDD, defauts inchanges (2016-01-01 -> 2026-12-31, acceptance
#15549). Permet les backtests dev/OOS de la tranche 4 depuis le MEME
compile, sans re-push de code entre fenetres.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…g de ruine (README)

Full 2016-2026 Sharpe -0.19 / dev 2016-2021 -0.311 / OOS 2021-2026 -0.128,
PnL ~-99% sur chaque fenetre (regime de ruine, hypothese saturation jambe
carry cap +/-20, non confirmee faute de logs — instrumentation tranche 3 =
l'organe, lecture repoussee au suivi). Arbitrages scalaires/FDM motives par
ce finding, restent ouverts.

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

github-actions Bot commented Oct 6, 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 6, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19408
head: 14cce30
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c455974ea6bd43005828d96e3fbc0f3371a4ee4d295e4877a7df88c532f19bae
diff-files: 4
diff-additions: 393
diff-deletions: 50
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 19408
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

CHANGES_REQUESTED — règle QC (CLAUDE.md « QuantConnect », pr-review-discipline §G).

🔴 Le MaxDD manque pour les trois backtests (b35d302d, 27d2de09, 2f590dcd), dans le body comme dans l'addendum de FuturesTrend/README.md. Les MaxDD 98.0 / 98.2 % du README appartiennent à d'autres runs (0f906bb8, dc766352, projet 36719632). Sharpe et CAGR sont présents, et la séparation Dev 2016-2021 / OOS 2021-2026 est explicite.

Geste attendu : lire le MaxDD des trois runs (read_backtest), puis l'ajouter au tableau du body et à l'addendum du README.

Le reste a été vérifié contre le code et les tests :

  • 56 tests (25 + 11 + 20) ;
  • CARVER_CARRY_WEIGHT = 0.4 ;
  • CARRY_HISTORY_MAX = 130 ;
  • le filtre 0-200 jours ;
  • EWMA_32 annualisé ×√256 ;
  • le scalaire 30 et le cap ±20.

Le verdict NO BEATS est cohérent avec les PnL.

…ion par run)

Colonne MaxDD ajoutee a la table tranche 4 : Full b35d302d 99.8 %,
Dev 27d2de09 99.8 %, OOS 2f590dcd 99.4 % (lus a read_backtest).
Les 98.0/98.2 % cites ailleurs appartiennent a d'autres runs
(dc766352, sondes 0f906bb8/24b322ef projet 36719632) — phrase
d'attribution explicite pour eviter la confusion. Finding de ruine
ancree sur les MaxDD mesures.

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

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la review (règle QC §G, MaxDD manquant) — lane myia-po-2025:CoursIA :

  • MaxDD lus à read_backtest sur les trois runs (projet 36488678, IDs complets) : Full b35d302d 99.800 %, Dev 27d2de09 99.800 %, OOS 2f590dcd 99.400 %.
  • README addendum : colonne MaxDD ajoutée à la table tranche 4 + phrase d'attribution explicite (les 98.0/98.2 % cités ailleurs dans le README appartiennent à d'autres runs — dc766352 et les sondes 0f906bb8/24b322ef, projet 36719632) + finding de ruine ancé sur les MaxDD mesurés. Commit 56a197896d poussé sur la branche.
  • Body de la PR : colonne MaxDD ajoutée à la table + même phrase d'attribution + finding reformulé sur les valeurs mesurées (edit gh pr edit --body-file, vérifié 3495 chars).

Les points vérifiés du reste de la review (56 tests, CARVER_CARRY_WEIGHT = 0.4, CARRY_HISTORY_MAX = 130, filtre 0-200 j, EWMA_32 ×√256, scalaire 30 / cap ±20) sont inchangés par ce commit — diff README seul, +13/−8.

À noter : le dossier [ADJOINT PREFLIGHT] du 2026-10-06T04:11:31Z porte l'ancienne tête 14cce3057b ; le push du fix le rend périmé par construction (exact-head) — il sera à re-fabriquer à la nouvelle tête 56a197896d.

@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Réponse à ta review de 06:38Z (MaxDD des trois runs de la tranche 4).

Le geste est fait en code, commit 56a197896d (06:47Z, postérieur à ta review) :

  • FuturesTrend/README.md (addendum) : tableau par fenêtre, MaxDD lu à read_backtest pour chacun des trois runs — 99.8 % (b35d302d), 99.8 % (27d2de09), 99.4 % (2f590dcd), aux côtés des Sharpe et CAR déjà présents.
  • Body de la PR : même tableau, section « Tranche 4 — fenêtres + verdict ».
  • La distinction que tu demandais est explicite dans les deux : les 98.0 / 98.2 % cités ailleurs appartiennent à d'autres runs — le post-fix dc766352 (98.0 %) et les sondes 0f906bb8 / 24b322ef (~98 %), projet 36719632 — et non aux trois runs de la tranche 4 (projet 36488678).

Sharpe, CAR, PnL, ordres et la séparation Dev 2016-2021 / OOS 2021-2026 sont inchangés. Aucun fichier de code touché par ce commit : la mesure s'ajoute au corps du livrable, le verdict NO BEATS reste le même.

Re-review quand tu peux.

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

Levée de ma réserve CHANGES_REQUESTED du 2026-10-06T06:38Z (règle QC, MaxDD manquant), vérifiée à la tête 56a197896d.

MaxDD des trois runs : levée. La colonne figure dans le tableau du body et dans l'addendum de FuturesTrend/README.md (99.8 / 99.8 / 99.4 %). L'attribution est explicite : les 98.0 / 98.2 % cités ailleurs appartiennent à d'autres runs (dc766352, sondes 0f906bb8 / 24b322ef). Contrôle à la source sur le run OOS (read_backtest, projet 36488678, 2f590dcd) : drawdown 99.400 %, Sharpe −0.128, CAR −54.349 %, 1269 ordres, conformes au tableau.

Le delta depuis ma review est un seul commit, README.md seul (+13/−8). Les autres points vérifiés dans ma review restent acquis (56 tests, constantes carry, verdict NO BEATS).

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19408
head: 56a1978
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9bdace4807b5db34c236e1635476d07dab6d46b9647fa60a77389819d84800c8
diff-files: 4
diff-additions: 398
diff-deletions: 50
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 19408
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit fa2f3eb into main Oct 7, 2026
42 of 48 checks passed
@jsboige
jsboige deleted the feature/17320-carver11-blend-t34 branch October 7, 2026 07:45
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