Skip to content

feat(qc,#19621): FamaFrench+AllWeather mesuré NO BEATS, tranche factorielle réparée - #19633

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/19621-ffaw-measure
Oct 8, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/19621-ffaw-measure

Conversation

@jsboige

@jsboige jsboige commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/qc — lane myia-po-2024:CoursIA-3 — prev: DEEP/qc #19599

Résumé

Mesure sur QC Cloud de Framework_Composite_FamaFrenchAllWeather, selon la règle de verdict inscrite sur #19621 avant le premier backtest. Le registre classait le projet « Alive — BEATS » sur la foi d'un « 87.5% OOS » qui était le PSR d'un échantillon de 835 séances, sans comparaison à une référence.

Le défaut annoncé dans l'issue se confirme. La tranche FamaFrench (20 %) n'émettait aucun ordre : son filtre de régime sur la SMA200 de SPY n'était créé que pour les tickers de l'univers factoriel, qui ne contient pas SPY. Le composite valait 80 % d'AllWeather et 20 % de liquide.

Verdict préinscrit sur base (code tel quel) : NO BEATS. Second verdict sur intent (la tranche sans filtre, comme l'annoncent le docstring et le README) : NO BEATS aussi. Le projet passe à intent par défaut pour être conforme à sa description, sans avantage mesuré.

Changements

portfolio_construction.py n'est pas modifié. catalog.json non plus : le catalogue appartient à sa régénération.

Mesures

QC Cloud, projet de mesure 37452619, 2015-01-01 → 2026-09-25, frais du courtier, 2949 séances de clôture. Sharpe à taux sans risque nul. Bootstrap circulaire par blocs de 21 séances, 10 000 tirages, graine 18921, correction de Holm sur les deux références.

Run Sharpe CAGR Pire baisse Rotation / an Ordres sur les ETF factoriels
intent (nouveau défaut) 1,02 9,6 % −17,6 % 0,79 232
base (code avant #19621) 1,03 7,0 % −13,2 % 0,33 0
sma (contrôle) 1,01 9,4 % −17,2 % 1,09 243
aw (AllWeather seul, contrôle) 1,03 8,8 % −16,2 % 0,43 0
SPY détenu 0,83 13,9 % −33,7 % 0,09 —
60 % SPY / 40 % IEF 0,87 8,8 % −21,1 % 0,28 —
Candidate contre SPY [IC 95 %] contre 60/40 [IC 95 %] p Holm Frais doublés Sous-périodes positives Grille positive Verdict
base +0,20 [−0,25 ; +0,59] +0,16 [−0,20 ; +0,49] 0,37 +0,19 / +0,15 3/3 et 2/3 5/5 et 5/5 NO BEATS
intent +0,19 [−0,13 ; +0,48] +0,15 [−0,10 ; +0,39] 0,22 +0,18 / +0,14 3/3 et 3/3 5/5 et 5/5 NO BEATS
  • base − aw : −0,002 [−0,005 ; +0,001], signature d'une tranche inerte.
  • intent − aw : −0,01 [−0,14 ; +0,14]. Active, la tranche factorielle relève rendement et pire baisse sans changer le Sharpe.
  • vol_window est inerte : le point de grille 126 reproduit intent à l'identique. Seul le signe du score sélectionne, et diviser par une volatilité positive ne le change pas. Le README le dit.
  • Run orig (base sur la fenêtre d'origine 2018-2025) : Sharpe QC 0,341, CAGR 6,57 %, pire baisse 13,1 %, 343 ordres tous AllWeather. Il reproduit la ligne « alignée » du README : ces chiffres mesuraient déjà la tranche inerte. Le PSR QC vaut 1,6 % contre 22,9 % dans le README ; écart non investigué.

Détail complet : c.6028384270 sur #19621.

Ce que le verdict ne dit pas

  • Pas hors échantillon : la fenêtre de mesure est incluse dans celle du balayage d'allocation (2010-2026). Ce défaut favorisait la candidate, ce qui renforce le NO BEATS.
  • Le balayage 2010-2026 du README (pire baisse 17,1 %) ressemble à une tranche active ; hypothèse non vérifiée : il a été produit par une version antérieure du code.

Validation

  • python -m py_compile sur main.py et alpha_models.py : OK.
  • Fichiers mesurés et fichiers livrés. Tous les runs du verdict ont tourné sur main.py 0f297a835d2e et alpha_models.py be2c8c1c08ff (sha256, préfixes), avec base par défaut et mode passé explicitement. Les fichiers de cette PR (568e36d8d43d, ff1bd167c967) ne changent que le défaut de mode (intent), les commentaires et le docstring. Le run check, lancé sur ces fichiers sans paramètre mode, redonne intent à l'identique : même série de clôture, mêmes statistiques, mêmes comptes d'ordres.
  • Traces (statistiques, graphiques, journal des ordres, plan de chaque run) hors dépôt : QC-traces/19621-famafrench-allweather/.
  • Pas de notebook touché.

Suivi

Pas de gel au registre du suivi en ombre : le verdict est NO BEATS.

Closes #19621

🤖 Generated with Claude Code

…ve fixed

The FamaFrench sleeve never emitted: its SPY SMA200 regime filter was only
created for tickers in the factor universe, which does not contain SPY, so
the composite ran as 80% AllWeather and 20% cash.

- main.py / alpha_models.py: mode parameter (intent default, base = code
  before #19621, sma = effective filter, spy and sixty40 held references),
  start/end, lookback, vol_window, fee_mult, shadow chart (#18923) and
  per-ETF order counts.
- README.md / README.en.md: measured verdict NO BEATS for base and intent
  (Holm p 0.37 and 0.22), corrected description (monthly signals, all
  positive factors, no drift threshold), vol_window shown inert.
- qc-strategies-status.md: Alive - BEATS (87.5% was a small-sample PSR)
  becomes NO BEATS.

Co-Authored-By: Claude Opus 5.5 (1M context) <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).

@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
@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19633 (feat(qc,#19621): FamaFrench+AllWeather mesuré NO BEATS, tranche factorielle réparée) 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.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA
pr: 19633
head: 4faea3f
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: eaef7bfd5dd3db3d9523cf4ce7d35efaf570123d1c4b8dbee36f222fd870775a
diff-files: 5
diff-additions: 288
diff-deletions: 100
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19633
head: 4faea3f
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c97685ffcae9048aa990010cdba534a030e9e8540aa754a26420e685ed5e4505
diff-files: 5
diff-additions: 288
diff-deletions: 100
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 19633
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

2 participants