HighBookToMarketFScore-QC
Classe d’actifs : Actions US (value stocks) ID projet Cloud : QC Project ID: 29687591 (cloned 2026-04-05, non déployé en QC Cloud)
🇬🇧 English version : voir
README.en.md(golden set préservé, original avant bascule FR).
Description
Clone de la QC Strategy Library #343 (High Book-to-Market High F-Score Quality Value par Louis Szeto). Stratégie value+quality systématique sélectionnant les actions avec book-to-market élevé filtrées par Piotroski F-Score ≥ 8, equally-weighted, rebalance mensuel.
Mesures vérifiées (multi-source)
Note honnête (#1621, drainage #9434) : le dossier HighBookToMarketFScore-QC souffrait d’une misattribution library-claim : le README présentait « Sharpe 2.09, CAGR 18.44%, MaxDD 24.20% » comme « Backtest Metrics » alors que ces chiffres sont la revendication de la QC Strategy Library #343 (cf.
main.py:5-10:# OOS 1Y Sharpe 2.09, 5Y CAGR 18.44%, 5Y Drawdown 24.20%, 62% Win Rate+ URLhttps://www.quantconnect.com/strategies/343auteur Louis Szeto) — PAS une sortie de backtest local. Le dossier ne contient pas deresearch.ipynbcontrairement à d’autres clones (#9530 DualMomentum, #9537 EMA-Cross-Crypto, #9542 DynamicVIXSpyRegime-QC) — la reproduction locale n’a pas eu lieu. Le README legacy disait aussi « Cloud project ID: None (local only) » alors quemain.py:10mentionne QC Project ID 29687591 (cloned 2026-04-05) — contradiction corrigée. Les tableaux ci-dessous citent la library claim avec sa traçabilité explicite + un drapeau SUSPECT overfit structurel (Sharpe 2.09 sur value+quality screen = exposé à look-ahead bias + small-universe variance).
| Source | Sharpe | CAGR | MaxDD | Période | Univers |
|---|---|---|---|---|---|
QC Strategy Library #343 (revendication originale, main.py:5-10) |
2.09 | 18.44% | 24.20% | OOS 1Y (5Y CAGR — fenêtre non précisée) | Top 20% book-to-market stocks filtrés F-Score ≥ 8, equal-weighted |
main.py:5-10 docstring |
n/a | n/a | n/a | self.set_start_date(self.end_date - timedelta(12*365)), set_end_date(2025, 1, 1) |
idem |
| Repro locale | NON REPRODUITE | n/a | n/a | n/a | n/a |
Lecture honnête — SUSPECT OVERFIT STRUCTUREL (c.1283-L1 ★★) : un Sharpe de 2.09 sur value+quality screen (Piotroski F-Score ≥ 8) sur OOS 1Y library est exposé à 3 sources structurelles de surestimation :
Look-ahead bias fondamental : le F-Score de Piotroski (2000) utilise des ratios financiers publiés en différé (60-90 jours post-quarter-close pour la plupart des fondamentaux US via SEC 10-Q/10-K filings). En backtest QuantConnect classique, ces données sont chargées au moment de la décision mensuelle — mais à moins d’utiliser
SetDataNormalizationMode(PointInTimeFundamentals), le backtest peut inclure des données qui n’étaient pas disponibles au moment de la décision (snapshot bias).Data mining sur fenêtre 12y rolling : la library #343 utilise
set_start_date(self.end_date - timedelta(12*365))+set_end_date(2025, 1, 1)= 12 ans rolling. Une stratégie filtrant top 20% B/M + F-Score ≥ 8 sur une fenêtre choisie a posteriori est exposée à la multiplicité des tests (backtest sur N périodes start possibles → résultats favorables cherry-picked).Small-universe variance : top 20% B/M + F-Score ≥ 8 = univers très restreint (probablement 30-50 stocks vs 500+ du SP500). Monthly rebalance sur 12 ans × ~30 trades = ~360 trades = variance du Sharpe mécanique élevée (intervalle de confiance à 95% du Sharpe ≈ ±0.5 pour N=360, ce qui rendrait un Sharpe vrai de 1.6 indistinguable d’un 2.6).
Cumul des 3 effets : un Sharpe library de 2.09 pourrait masquer un Sharpe réel de 1.2-1.6 sur la même stratégie avec PointInTimeFundamentals, fenêtre OOS fixée a priori, et univers élargi. C’est PAS un signal de déploiement live sans vérification empirique indépendante.
Cf. c.1282-L2 ★★ (LeveragedETFMomentum) : un Sharpe > 2× la base sur lev. ETFs bull-only backtest = SUSPECT overfit structurel. Ici la même mécanique s’applique : la stratégie est rentable sur le backtest mais vulnérable aux pathologies méthodologiques (look-ahead + data mining + small-universe). JAMAIS la déployer live sans backtest QC Cloud avec PointInTimeFundamentals + walk-forward OOS.
Vérification de la library claim : la QC Strategy Library #343 (Louis Szeto, https://www.quantconnect.com/strategies/343) est une stratégie publique à visée pédagogique sur la mécanique de value+quality systematic screen — PAS un signal de déploiement live. Le QC Project ID 29687591 (cloned 2026-04-05) n’a jamais été déployé en QC Cloud (README legacy confirmait « Not yet deployed »).
Reproductibilité : la library claim est reproductible localement via Lean CLI (lean backtest "MyIA.AI.Notebooks/QuantConnect/projects/HighBookToMarketFScore-QC") — l’univers Piotroski F-Score est construit depuis fundamentals data via universe.py et piotroski_score.py. Cette PR n’exécute pas la repro locale (hors scope, future action séparée) ; la note « Metrics from original library, not locally reproduced » du README legacy reste vraie.
Fichiers
main.py- Stratégie (clone QC Strategy Library #343, Piotroski F-Score value screen monthly rebalance)piotroski_score.py- Calcul F-Score (Profitabilité + Leverage/Liquidity + Operating Efficiency, 9 signaux binaires)piotroski_factors.py- Facteurs fondamentaux individuels (ROA, CFO, ΔROA, ACCRUAL, ΔLEVER, ΔLIQUID, EQ_OFFER, ΔMARGIN, ΔTURN)universe.py- PiotroskiScoreUniverseSelectionModel (sélection universe + filtre F-Score ≥ 8)symbol_data.py- Helpers pour charger fundamentals data
Références
- QuantConnect Strategy Library #343 — High Book-to-Market High F-Score Quality Value par Louis Szeto :
https://www.quantconnect.com/strategies/343 main.py:5-10docstring : source library + URL + QC Project ID 29687591 + auteur Louis Szeto- Piotroski (2000), « Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers », Journal of Accounting Research 38(suppl.) — papier fondateur du F-Score
- c.1282-L2 ★★ (LeveragedETFMomentum-QC) — SUSPECT overfit structurel pattern sur lev. ETFs bull-only backtest ; même mécanique applicable ici pour value+quality sur OOS 1Y window
- c.1281-L3 ★★ (DynamicVIXSpyRegime-QC) — library claim misattribution pattern, arche reproductible pour drainer les autres README QC library clones
Comment exécuter
Lean CLI :
lean backtest "MyIA.AI.Notebooks/QuantConnect/projects/HighBookToMarketFScore-QC"QC Cloud : QC Project ID29687591cloné 2026-04-05, non déployé en Cloud. Copiermain.py+piotroski_score.py+piotroski_factors.py+universe.py+symbol_data.pydans un nouveau projet QC Cloud pour exécuter. Note : la repro locale Docker Lean devrait reproduire la library claim (avec dividendes/frais) — variations attendues ~10-20% sur MaxDD, ~5-15% sur CAGR (frais Interactive Brokers + dividendes). Pour un backtest plus rigoureux (anti-SUSPECT), ajouterself.set_data_normalization_mode(DataNormalizationMode.POINT_IN_TIME_FUNDAMENTALS)avantset_start_date()dansmain.py:18-19et comparer les mesures.