QuantConnect Python Notebooks
Supports de cours pour l’apprentissage du trading algorithmique avec QuantConnect LEAN.
Note : Ces notebooks sont des supports de cours à lire sur GitHub ou en local. Pour exécuter les backtests, copiez le code dans un projet QuantConnect Cloud.
4-Type Classification
| Type | Count | Description |
|---|---|---|
| (a) quantbook QC Cloud | 18 | QuantBook research or cloud-deploy descriptors (inclut Cloud-06-PCA-StatArb, Cloud-07-TemporalCNN ajoutés 2026-05, Cloud-08-ValueFactor-ZScore, Cloud-09-OptionWheel ajoutés 2026-06) |
| (b) research companion | 2 | QuantBook research paired with a course notebook |
| (c) standalone research | 6 | Local yfinance/sklearn training |
| (d) pedagogical placeholder | 33 | Course material with embedded QCAlgorithm strings |
Récapitulatif : 18+2+6+33 = 59 entrées de classification. Le nombre total de fichiers .ipynb dans le dossier est 55 : la différence reflète les notebooks classés dans plusieurs catégories (ex. course material exécuté localement = (c)+(d)). Voir docs/qc/qc-strategies-status.md pour la classification détaillée.
Note — écarts de classification 4-types (hub vs feuille) : la classification ci-dessus (a/b/c/d) classe les notebooks Python du dossier par modalité d’exécution (quantbook QC Cloud, research companion, standalone local, placeholder pédagogique). Le dossier
projects/— catalogué dansprojects/README.mdet référencé depuis le hubQuantConnect/README.md— utilise un 4-types distinct par robustesse (Robuste / Historique / Exploratoire / ML-DL-RL). Les deux classifications ont des périmètres disjoints : ce dossier = supports de cours (notebooks pédagogiques),projects/= stratégies déployables (code backtest). Toute lecture transversale doit garder cette distinction à l’esprit : un notebook (c) « standalone research » n’est pas pour autant une stratégie de production, et inversement un projet « Robuste » n’a pas forcément de notebook pédagogique ici. Alignement non forcé volontairement (cf. note tracker#5661).
Full classification: docs/qc/qc-strategies-status.md
État réel d’exécution (audit 2026-05-05, mise à jour 2026-07-02)
Suite à l’audit du 5 mai 2026, voici l’état honnête de chaque notebook. Aucun output theatrical (cellules qui printent des métadonnées en se faisant passer pour une exécution) ne subsiste après nettoyage de la PR chore/qc-strip-fake-outputs. Mise à jour 2026-05-28 : ajout des 5 notebooks créés depuis l’audit initial (RL avancé + 2 Cloud). Les comptes de cellules par notebook ne sont plus tenus dans cette prose : ils dérivaient à chaque ré-exécution (le « tapis roulant » des re-synchronisations, cf #9377). Le statut d’exécution ci-dessous reste la donnée pédagogique utile ; les décomptes précis relèvent du catalogue généré (COURSE_CATALOG.generated.*).
Légende : - EXÉCUTÉ : cellules avec outputs réels issus d’une vraie exécution kernel - NON EXÉCUTÉ : code source réel mais jamais exécuté (commit attendu après run kernel — préférable au théâtre) - doc cloud : notebook markdown-only documentant un backtest QC Cloud (résultats sur la plateforme, pas dans le notebook)
| Notebook | Statut | Détail |
|---|---|---|
| QC-Py-01-Setup | NON EXÉCUTÉ | |
| QC-Py-02-Platform-Fundamentals | NON EXÉCUTÉ | |
| QC-Py-03-Data-Management | NON EXÉCUTÉ | |
| QC-Py-04-Research-Workflow | NON EXÉCUTÉ | |
| QC-Py-05-Universe-Selection | NON EXÉCUTÉ | |
| QC-Py-05b-FScore-Piotroski | EXÉCUTÉ | CPU local (yfinance/numpy/scipy), cellules code exécutées, données réelles 14 titres |
| QC-Py-06-Options-Trading | NON EXÉCUTÉ | |
| QC-Py-06b-Derivatives-Valuation-From-Scratch | EXÉCUTÉ | CPU local (numpy/scipy), 13/13 cellules code, 3 figures |
| QC-Py-07-Futures-Forex | NON EXÉCUTÉ | |
| QC-Py-08-Multi-Asset-Strategies | NON EXÉCUTÉ | |
| QC-Py-09-Order-Types | NON EXÉCUTÉ | |
| QC-Py-10-Risk-Portfolio-Management | NON EXÉCUTÉ | |
| QC-Py-11-Technical-Indicators | NON EXÉCUTÉ | |
| QC-Py-12-Backtesting-Analysis | NON EXÉCUTÉ | |
| QC-Py-12b-Backtest-Validity | EXÉCUTÉ | |
| QC-Py-13-Alpha-Models | NON EXÉCUTÉ | |
| QC-Py-14-Portfolio-Construction-Execution | NON EXÉCUTÉ | |
| QC-Py-14b-Liquidity-Execution-Costs | EXÉCUTÉ | CPU local (yfinance/pandas/numpy), cellules exécutées, figures committées |
| QC-Py-15-Parameter-Optimization | NON EXÉCUTÉ | |
| QC-Py-16-Alternative-Data | NON EXÉCUTÉ | |
| QC-Py-17-Sentiment-Analysis | NON EXÉCUTÉ | |
| QC-Py-18-ML-Features-Engineering | EXÉCUTÉ | |
| QC-Py-19-ML-Supervised-Classification | NON EXÉCUTÉ | |
| QC-Py-20-ML-Regression-Prediction | NON EXÉCUTÉ | |
| QC-Py-21-Portfolio-Optimization-ML | NON EXÉCUTÉ | |
| QC-Py-22-Deep-Learning-LSTM | NON EXÉCUTÉ | |
| QC-Py-23-State-Space-Models | EXÉCUTÉ | |
| QC-Py-23b-PatchTST-iTransformer | EXÉCUTÉ | |
| QC-Py-23c-TimesFM-Foundation-Models | EXÉCUTÉ | |
| QC-Py-24-Autoencoders-Anomaly | EXÉCUTÉ | |
| QC-Py-25-Reinforcement-Learning | EXÉCUTÉ | |
| QC-Py-26-LLM-Trading-Signals | NON EXÉCUTÉ | |
| QC-Py-27-Production-Deployment | NON EXÉCUTÉ | |
| QC-Py-28-Market-Regime-Detection | NON EXÉCUTÉ | |
| QC-Py-28b-Macro-Cycle-Regimes | EXÉCUTÉ | cellules locales exécutées + run QC Cloud 2016-2026 (diagnostic → allocation) |
| QC-Py-28c-Factor-Preprocessing-Regime | EXÉCUTÉ | cellules locales exécutées sur série synthétique à régimes (port du livre 06/02, issue #18958) |
| QC-Py-29-Derivatives-Valuation | EXÉCUTÉ | cellules locales exécutées (BS / arbre CRR / Monte-Carlo : convergence, grecques, scénario liquidité) |
| QC-Py-30-LSTM-Training | EXÉCUTÉ | |
| QC-Py-31-Transformer-Training | EXÉCUTÉ | |
| QC-Py-32-RL-DQN-Trading | EXÉCUTÉ | |
| QC-Py-40-PaperTrading-Binance | EXÉCUTÉ | |
| QC-Py-41-PaperTrading-IBKR | EXÉCUTÉ | |
| QC-Py-Cloud-01-FinBERT-Sentiment | EXÉCUTÉ | |
| QC-Py-Cloud-02-ML-Classification | EXÉCUTÉ | |
| QC-Py-Cloud-12-SectorRotation-Momentum | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-14-DualMomentum | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-03-Risk-Parity | EXÉCUTÉ | |
| QC-Py-Cloud-03b-RiskParity-Composite | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-04-MeanReversion | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-05-MLP-Forecasting | EXÉCUTÉ | |
| QC-Py-Cloud-11-RegimeSwitching | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-13-VolTargeting | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-06-PCA-StatArb | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-07-TemporalCNN | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-08-ValueFactor-ZScore | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-09-OptionWheel | doc cloud | markdown-only — backtest sur QC Cloud |
| QC-Py-Cloud-10-RL-DQN-Trading | EXÉCUTÉ | |
| QC-Py-33-RL-PPO-Trading | EXÉCUTÉ | |
| QC-Py-34-RL-SAC-A2C-Trading | EXÉCUTÉ | |
| QC-Py-35-RL-Portfolio-Construction | EXÉCUTÉ | |
| QC-Py-Dataset-Workflow | NON EXÉCUTÉ |
Récapitulatif : la majorité des notebooks sont NON EXÉCUTÉS (code réel, exécution kernel ou QC Cloud à faire) ; une part croissante est EXÉCUTÉE et 10 sont des doc cloud (markdown-only). Le décompte précis relève du catalogue généré.
Politique : un notebook NON EXÉCUTÉ avec du code réel est préférable à un notebook avec des outputs théâtraux (print de métadonnées prétendant être une exécution). Les patterns théâtraux suivants sont désormais détectés comme erreur par scripts/validate_qc_notebooks.py : - print("Algorithme charge : {len(qc_code)} caracteres") — métadonnée d’une string, pas une exécution - print("Workflow de deploiement...") — workflow MCP imprimé comme texte - print("Placeholder pour les resultats") — résultats hardcodés - print("Resultats sync depuis QC Cloud projet XXXX") — sans fetch réel
Les notebooks NON EXÉCUTÉS doivent être exécutés (kernel local pour les indépendants, QC Cloud pour ceux qui requièrent QuantBook) avant de pouvoir être marqués EXÉCUTÉ. Aucun raccourci toléré.
Aperçu — le trading quantitatif en images
Chaque notebook de la série rend visible un geste quantitatif distinct, dans une figure extraite des sorties réelles des notebooks. Plutôt qu’une galerie séparée du propos, ces figures sont replacées ci-dessous dans leur progression pédagogique — du premier backtest QuantBook aux agents de renforcement profond — au plus près du concept qu’elles illustrent. La provenance détaillée (cellule, poids, alt-text) est documentée dans assets/readme/MANIFEST.md.
04 — Le workflow de recherche QuantBook. Le QuantBook autorise l’exploration interactive avant l’algorithmation : on y confronte une stratégie simple (croisement de moyennes mobiles) au buy-and-hold de référence sur SPY. La courbe de capital révèle quand la stratégie bat le marché passivement et quand elle le suit — le premier geste de la recherche quantitative.
08 — Corrélations glissantes, ou la faillite du modèle statique. La corrélation moyenne entre deux actifs cache sa vérité : elle évolue dans le temps et s’effondre précisément lors des périodes de stress où la diversification était censée protéger le portefeuille. La corrélation glissante rend ce risque visible — pourquoi l’allocation statique est un leurre.
10 — Le coût d’un stop-loss. Protéger une position a un prix. Les stops fixes coupent net, les stops trailing suivent la hausse mais se déclenchent sur le bruit, les stops volatilité s’adaptent au régime de marché. Sur un même prix simulé, les trois types laissent des traces différentes — choisir un stop, c’est choisir quel risque on accepte. La partie 4 se clôt sur le Hierarchical Risk Parity : pondérer un portefeuille multi-actifs sans jamais inverser la matrice de covariance, en trois étapes (clustering, quasi-diagonalisation, bisection récursive) — avec la leçon mesurée d’un univers crypto dominé par un seul actif, où la meilleure allocation hiérarchique reste sous le benchmark.
12 — Le profil risque-rendement d’un backtest. La richesse d’un backtest ne tient pas dans un seul Sharpe : le scatter des rendements quotidiens de la stratégie contre son benchmark expose la dispersion, les queues et la fréquence des bons et mauvais jours. C’est la signature statistique complète du comportement de la stratégie.
12b — Un Sharpe de 0,2 prouve-t-il quoi que ce soit ? Non, si le backtest couvre moins de dix ans : l’erreur-type asymptotique du Sharpe annualisé vaut environ 1/sqrt(N_années) (Lo, 2002) — sur 7 ans, ±0,38. Un Sharpe mesuré à 0,2 est statistiquement indistinguable d’une stratégie sans aucun bord. Le notebook construit la lecture honnête d’un backtest : intervalle de confiance du Sharpe, PSR et ses deux pièges de saisie (annualisation, convention de kurtose — démontrés sur l’article QC research/17112), multiplication des tests et faux positifs, et ce qu’il faut pour qu’une performance soit significative.
19 — La validation walk-forward, ou l’honnêteté temporelle. Un modèle entraîné une fois puis testé sur tout l’échantillon triche avec le temps. La validation walk-forward décale une fenêtre d’entraînement puis re-teste, fold après fold, en mimant le retrain périodique qu’exige un trading réel. L’accuracy par fold révèle la robustesse — ou l’effondrement — hors échantillon.
32 — L’agent qui apprend à trader. Le deep reinforcement learning entraîne un agent par essais et erreurs : chaque épisode ajuste sa politique pour maximiser la récompense cumulée. La courbe des récompenses par épisode montre la transition de l’exploration vers l’exploitation — le moment où l’agent cesse de tâtonner et commence à exploiter ce qu’il a appris.
Phase 1 : Fondations LEAN (QC-Py-01 à 04)
| Notebook | Contenu |
|---|---|
| QC-Py-01-Setup | Compte QC, premier backtest, architecture LEAN |
| QC-Py-02-Platform-Fundamentals | QCAlgorithm lifecycle, Initialize/OnData |
| QC-Py-03-Data-Management | History API, consolidators, multi-timeframe |
| QC-Py-04-Research-Workflow | QuantBook, pandas, notebook vers algorithme |
Phase 2 : Classes d’actifs (QC-Py-05 à 10)
| Notebook | Contenu |
|---|---|
| QC-Py-05-Universe-Selection | Univers dynamiques, filtres fondamentaux |
| QC-Py-05b-FScore-Piotroski | F-Score de Piotroski : les 9 sous-scores sur données réelles, convention de datation article vs papier 2000, critique de liquidité, variance small-univers mesurée (#17770) |
| QC-Py-06-Options-Trading | Chaînes d’options, greeks, stratégies couvertes |
| QC-Py-06b-Derivatives-Valuation-From-Scratch | Complément from-scratch de QC-Py-29 : les trois moteurs reconstruits à la main, put américain, asiatique arithmétique, variables de contrôle (#16239) |
| QC-Py-07-Futures-Forex | Contrats à terme, devises, hedging |
| QC-Py-08-Multi-Asset-Strategies | Portefeuilles multi-classes d’actifs |
| QC-Py-09-Order-Types | Market, limit, stop, trailing, combo orders |
| QC-Py-10-Risk-Portfolio-Management | Risk management, position sizing, drawdown, hierarchical risk parity |
Phase 3 : Analyse et Stratégie (QC-Py-11 à 17)
| Notebook | Contenu |
|---|---|
| QC-Py-11-Technical-Indicators | Indicateurs techniques, indicateurs custom |
| QC-Py-12-Backtesting-Analysis | Mesures de performance, Sharpe, drawdown |
| QC-Py-12b-Backtest-Validity | Erreur-type du Sharpe (Lo 2002), PSR (Bailey & López de Prado 2012) et ses pièges de saisie, signification statistique du backtest |
| QC-Py-13-Alpha-Models | Framework Alpha, signaux, combinaison |
| QC-Py-14-Portfolio-Construction-Execution | Construction portefeuille, exécution |
| QC-Py-14b-Liquidity-Execution-Costs | Liquidité et coûts d’exécution : proxys (ADV, Amihud, Corwin-Schultz), loi racine, capacité, stress COVID réel (#16239) |
| QC-Py-15-Parameter-Optimization | Optimization, grid search, walk-forward |
| QC-Py-16-Alternative-Data | données alternatives, sentiment, fundamentals |
| QC-Py-17-Sentiment-Analysis | NLP, analyse sentiment, signaux textuels |
Phase 4 : Machine Learning (QC-Py-18 à 29)
| Notebook | Contenu |
|---|---|
| QC-Py-18-ML-Features-Engineering | Feature engineering pour trading |
| QC-Py-19-ML-Supervised-Classification | Classification, signaux d’achat/vente |
| QC-Py-20-ML-Regression-Prediction | Régression, prédiction de prix |
| QC-Py-21-Portfolio-Optimization-ML | Optimisation ML de portefeuille |
| QC-Py-22-Deep-Learning-LSTM | Réseaux LSTM pour séries temporelles |
| QC-Py-23-State-Space-Models | State Space Models (S4/Mamba) pour séries temporelles |
| QC-Py-23b-PatchTST-iTransformer | PatchTST, iTransformer — transformers spécialisés séries temporelles |
| QC-Py-23c-TimesFM-Foundation-Models | Modèle de fondation zéro-shot (TimesFM 2.5), univarié / multivarié / covariables, quantiles |
| QC-Py-24-Autoencoders-Anomaly | Détection d’anomalies, autoencodeurs |
| QC-Py-25-Reinforcement-Learning | RL, DQN, environnement trading |
| QC-Py-26-LLM-Trading-Signals | LLM pour signaux de trading |
| QC-Py-27-Production-Deployment | Déploiement live, monitoring |
| QC-Py-28-Market-Regime-Detection | Détection de régimes de marché |
| QC-Py-28b-Macro-Cycle-Regimes | Macro et régimes : diagnostic composite borné, indicateurs → budget de risque |
| QC-Py-28c-Factor-Preprocessing-Regime | Prétraitement de facteurs (FFD, standardisation, ACP) pour la détection de régime — port du livre 06/02, comparaison à la classe majoritaire |
| QC-Py-29-Derivatives-Valuation | Valorisation d’un dérivé : Black-Scholes, arbre binomial et Monte-Carlo sur le même contrat — précision, convergence, flexibilité, coût, liquidité |
Entraînement ML (QC-Py-30 à 32)
Notebooks d’entraînement de modèles avec checkpoints GPU.
| Notebook | Modèle | Sortie |
|---|---|---|
| QC-Py-30-LSTM-Training | LSTM | Checkpoint PyTorch |
| QC-Py-31-Transformer-Training | Transformer | Checkpoint PyTorch |
| QC-Py-32-RL-DQN-Trading | DQN | Checkpoint PyTorch |
Reinforcement Learning Avancé (QC-Py-33 à 35)
Approfondissement RL au-delà du DQN de la Phase 8 : PPO, SAC/A2C, application portfolio.
| Notebook | Algorithme | Contenu |
|---|---|---|
| QC-Py-33-RL-PPO-Trading | PPO | Proximal Policy Optimization, clipped surrogate, Stable-Baselines3 |
| QC-Py-34-RL-SAC-A2C-Trading | SAC + A2C | Soft Actor-Critic + A2C, comparatif algorithmes RL |
| QC-Py-35-RL-Portfolio-Construction | RL multi-asset | RL pour allocation multi-asset, contraintes de risque |
Paper Trading (QC-Py-40 à 41)
| Notebook | Courtier |
|---|---|
| QC-Py-40-PaperTrading-Binance | Binance |
| QC-Py-41-PaperTrading-IBKR | Interactive Brokers |
Stratégies Cloud (QC-Py-Cloud-*)
Notebooks de recherche et stratégies exécutées sur QuantConnect Cloud.
| Notebook | Stratégie |
|---|---|
| QC-Py-Cloud-01-FinBERT-Sentiment | NLP FinBERT sentiment |
| QC-Py-Cloud-02-ML-Classification | ML classification |
| QC-Py-Cloud-14-DualMomentum | Dual Momentum |
| QC-Py-Cloud-03-Risk-Parity | Risk Parité |
| QC-Py-Cloud-03b-RiskParity-Composite | Risk Parité composite |
| QC-Py-Cloud-04-MeanReversion | Mean Reversion |
| QC-Py-Cloud-05-MLP-Forecasting | MLP Forecasting |
| QC-Py-Cloud-11-RegimeSwitching | Régime Switching |
| QC-Py-Cloud-13-VolTargeting | Volatility Targeting |
| QC-Py-Cloud-06-PCA-StatArb | PCA Statistical Arbitrage |
| QC-Py-Cloud-07-TemporalCNN | Temporal CNN |
| QC-Py-Cloud-08-ValueFactor-ZScore | Value Factor Z-Score |
| QC-Py-Cloud-09-OptionWheel | Option Wheel (risk education) |
| QC-Py-Cloud-10-RL-DQN-Trading | RL DQN (advanced) |
| QC-Py-Cloud-12-SectorRotation-Momentum | Sector Rotation & Multi-Asset Momentum |
Utilitaires
| Notebook | Usage |
|---|---|
| QC-Py-Dataset-Workflow | Workflow de gestion des datasets QC |
Conclusion / Prochaines étapes
Ce que vous avez appris
Cette sous-série Python couvre l’éventail complet du trading algorithmique sur QuantConnect, des fondations LEAN aux frontières de l’IA, organisé en 5 arcs pédagogiques :
- Fondations & Asset Classes (Phases 1-2) : le
QCAlgorithmlifecycle, l’universe selection, et les classes d’actifs (equities, options, futures, forex). On apprend à structurer un algo propre via l’Algorithm Framework modulaire. - Analyse & Stratégie (Phase 3) : indicateurs techniques, risk/portfolio management (Kelly, Risk Parity), backtesting rigoureux (Sharpe, Sortino, drawdown). On apprend que la métrique seule ne fait pas la stratégie — le walk-forward et l’out-of-sample sont obligatoires.
- Machine Learning (Phase 4) : feature engineering, classification/régression directionnelle (Random Forest, XGBoost), portfolio optimization ML-enhanced. On apprend que le ML classique est solide en regime stable mais fragile aux coûts de transaction réels.
- Deep Learning & RL (QC-Py-30 à 35) : LSTM, Transformers, puis Reinforcement Learning (DQN, PPO, SAC/A2C). On apprend que les modèles de profondeur exigent une validation multi-seed et walk-forward — un Sharpe spectaculaire en backtest court est presque toujours un artefact d’overfitting.
- Production (Paper Trading + Cloud) : déploiement paper/live (IBKR, Binance), stratégies cloud-native (FinBERT sentiment, ML classification, Temporal CNN, Option Wheel). On apprend que la stratégie ne se juge que sur le Sharpe net après frais, slippage et impact de marché.
Le fil rouge : la rigueur méthodologique — l’audit d’exécution honnête (section ci-dessus) et les 36 baselines vérifiées du catalogue enseignent que la plupart des edges apparents ne survivent pas à un backtest aligné.
Prochaines étapes
- Suivre l’ordre des phases : les notebooks sont conçus pour être lus séquentiellement (chacun suppose la maîtrise du précédent). Commencer par QC-Py-01 si vous débutez.
- Exécuter sur QC Cloud : les notebooks marqués
[QC CLOUD]nécessitent QuantConnect Cloud (gratuit) — copier le code dans un projet QC Lab. - Consulter les projets associés : chaque notebook pédagogique a un
main.pycorrespondant dans../projects/pour exécution backtest réelle. - Approfondir le RL : si le trading RL vous intéresse, enchaîner QC-Py-25 (intro RL) → 32 (DQN) → 33 (PPO) → 34 (SAC/A2C) dans l’ordre.
- Lire le livre : Hands-On AI Trading (Jared Broad, 2025), dont les exemples sont rattachés à ces notebooks dans BOOK_MAPPING.md.
- Retour au README principal : pour la vue d’ensemble de la série QuantConnect complète (incluant les 50+ projets de stratégies backtestées) et les cross-series bridges.
Rappel honnête : le trading algorithmique est un domaine où l’overfitting est la règle. La discipline du walk-forward, du multi-seed et du out-of-sample strict — enseignée tout au long de cette sous-série — est ce qui sépare une stratégie robuste d’une illusion statistique.
Navigation : README principal | Livre de référence



![Analyse de backtest : deux sous-graphiques côte-à-côte sur 2 ans (2022-01 → 2024-01). Gauche — scatter Strategy Returns (%) vs Benchmark Returns (%) avec droite de régression rouge en pointillés β = 0.44 (la stratégie amplifie modérément le benchmark), ~250 points bleus dispersés dans le quadrant [-3 %, +3 %]², axes croisés à (0, 0). Droite — equity curves comparées : Strategie (bleu marine) finit à 1.42, Benchmark (gris tirets) finit à 1.47, baseline noire horizontale à 1.00. La Strategie reste sous le Benchmark toute l'année 2022 (sous-performance), puis dépasse en 2023-07 → 2023-10 (pic ~1.50). Démontre la mesure du β (sensibilité au benchmark) et le profil risque/rendement : β=0.44 < 1 = stratégie défensive (moins volatile que le marché).](assets/readme/quantpy12-backtest-scatter.png)

