# Exercice 2 : Definition des labels de direction
# TODO etudiant : implementer direction_label(future_return, threshold)
# Indice : DOWN=0, STATIONARY=1, UP=2 selon le seuil
def direction_label(future_return, threshold=0.0001):
# TODO etudiant : classifier le rendement
return None # TODO etudiant : retourner 0, 1 ou 2
test_returns = [0.005, -0.003, 0.00005, -0.00005, 0.02, -0.01]
result_labels = None # TODO etudiant : calculer les labels
print("Exercice a completer : labels de direction")<< Sommaire QC | Précédent : QC-Py-Cloud-06-PCA-StatArb <<
QC-Py-Cloud-07 — Temporal CNN Direction Prediction
Module : Hands-On AI Trading, Ch.6 — Applied Machine Learning, Example 14
Objectif : Utiliser un reseau de neurones convolutif temporel (Temporal CNN) pour predire la direction future des prix (hausse/baisse/stationnaire) sur les actions de l’univers QQQ.
Approche cloud-native : L’algorithme est execute sur QuantConnect Cloud. Les résultats sont presentes ci-dessous.
Note de conception : Ce notebook est un descriptif pedagogique. Le code executable se trouve dans le projet QuantConnect Cloud correspondant (voir le lien dans le notebook). L’absence d’outputs est intentionnelle.
1. Concept : Temporal CNN pour la prediction de direction
Le Temporal CNN utilise des couches de convolution 1D (Conv1D) pour extraire des caractéristiques temporelles a partir de données OHLCV historiques. Contrairement aux modèles de series temporelles classiques (ARIMA, HMM), le CNN apprend automatiquement les motifs pertinents.
Architecture du modèle
Input: (15 timesteps, 5 features) [OHLCV]
|
Conv1D(30 filters, kernel=4, relu) -- extraction de caractéristiques
|
Split en 3 regions temporelles : | court terme | moyen terme | long terme |
| | | |
Conv1D(1 filter, kernel=1, relu) | Conv1D(...) | Conv1D(...) |
| |
Concatenate + Flatten |
|
Dense(3, softmax) --> [P(hausse), P(baisse), P(stationnaire)]
Decisions de conception
Split temporel : La sortie du Conv1D est divisee en 3 regions (court/moyen/long terme), chacune traitee par un Conv1D(1,1). Cela force le modèle a apprendre des motifs a différentes echelles temporelles.
Classification 3 classes : Au lieu de predire un prix continu, le modèle classe la direction (UP/DOWN/STATIONARY). C’est plus robuste que la regression car il n’a pas besoin de predire l’amplitude exacte.
Entrainement hebdomadaire : Le modèle est reentraine chaque semaine avec les 500 dernières barres quotidiennes. Cela permet au modèle de s’adapter aux changements de regime.
Exercice 1 : Definition des labels de direction
Le Temporal CNN predit 3 classes : hausse (UP), baisse (DOWN), stationnaire (STATIONARY). Le label depend du rendement sur les 5 jours suivants.
Objectif : Implementez direction_label(future_return, threshold=0.0001) qui retourne 0 (DOWN), 1 (STATIONARY) ou 2 (UP). Testez avec différents rendements et seuils.
Indices : - Indice : Si |return| < threshold, c’est STATIONARY. Sinon UP si > 0, DOWN si < 0. - Indice : Le seuil de 0.01% est très faible, la plupart des jours seront UP ou DOWN.
Exercice 2 : Preparation des données OHLCV pour un CNN
Le Temporal CNN prend en entree des données OHLCV (Open, High, Low, Close, Volume) sur 15 jours. Les données doivent etre normalisees avant d’etre presentees au modèle.
Objectif : Implementez normalize_ohlcv(ohlcv_window) qui normalise chaque feature par le prix de cloture du premier jour de la fenêtre. Verifiez que les valeurs sont dans une plage raisonnable.
Indices : - Indice : Normaliser par le close du jour 0 : feature / close[0]. - Indice : Le volume peut etre normalise par la moyenne du volume sur la fenêtre.
# Exercice 1 : Preparation des donnees OHLCV pour un CNN
# TODO etudiant : implementer normalize_ohlcv(ohlcv_window)
# Indice : normaliser par close[0] pour les prix, mean(volume) pour le volume
import numpy as np
def normalize_ohlcv(ohlcv_window):
# ohlcv_window : array (15, 5) [O, H, L, C, V]
# TODO etudiant : normaliser les prix par close[0]
# TODO etudiant : normaliser le volume par mean(volume)
return None # TODO etudiant : retourner les donnees normalisees
# Donnees simulees
np.random.seed(42)
close = 100 + np.cumsum(np.random.randn(15) * 0.5)
sim_ohlcv = np.column_stack([
close + np.random.randn(15) * 0.2, # Open
close + np.abs(np.random.randn(15)) * 0.5, # High
close - np.abs(np.random.randn(15)) * 0.5, # Low
close, # Close
np.random.randint(1000000, 5000000, 15), # Volume
])
result_norm = None # TODO etudiant : normaliser les donnees
print("Exercice a completer : normalisation OHLCV")2. Paramètres de la stratégie
| Paramètre | Valeur | Justification |
|---|---|---|
training_samples |
500 barres | Environ 2 ans de données quotidiennes |
universe_size |
3 actions | Top 3 ponderations du QQQ |
| Confidence threshold | 55% | Seuil minimum pour trader |
n_tsteps |
15 jours | Fenêtre d’entree du CNN |
| Rolling avg window | 5 jours | Fenêtre de calcul du label (direction) |
| Stationary threshold | 0.01% | Seuil pour classifier un mouvement comme stationnaire |
| Epochs | 20 | Cycles d’entrainement par retrain |
| Rebalance | Hebdomadaire | Retrain + prediction chaque lundi |
3. Résultats QC Cloud
Projet QC Cloud : 29816576 (HandsOn-Ex14-Temporal-CNN) Periode : 2018-12-31 au 2024-01-01 (5 ans) Capital initial : $100,000
Résultat principal (Ex14-Temporal-CNN-v1)
| Metrique | Valeur |
|---|---|
| Sharpe Ratio | 0.734 |
| CAGR | 20.51% |
| Max Drawdown | 21.6% |
| Net Profit | +154.1% |
| Total Trades | 594 |
| Win Rate | 1.29 |
| Loss Rate | -1.22 |
| Alpha | 0.11 |
| Beta | 0.264 |
| PSR | 28.701 |
| Sortino Ratio | N/A |
| Treynor Ratio | 0.517 |
4. Analyse des performances
4.1 Le meilleur Sharpe du catalogue
Avec un Sharpe de 0.734, le Temporal CNN est la meilleure stratégie du catalogue Cloud, devant le Sector Rotation (0.614) et le Risk Parity Composite (0.558). Le CAGR de 20.51% est impressionnant, avec un MaxDD de seulement 21.6%.
4.2 Alpha significatif
L’alpha de 0.11 (11% annualise) est le plus eleve de toutes les stratégies. Combine avec un beta de seulement 0.264, cela signifie que la stratégie genere des rendements independants du mouvement du marche. C’est la marque d’un veritable edge predictif.
4.3 Probabilistic Sharpe Ratio (PSR) eleve
Le PSR de 28.7 est exceptionnellement eleve. Le PSR mesure la probabilite que le Sharpe observe soit superieur a un benchmark (généralement 0). Un PSR > 2.0 est considere comme significatif. A 28.7, il n’y a pratiquement aucun doute que la performance n’est pas due au hasard.
4.4 Caveats
Malgre les metriques impressionnantes, plusieurs reserves s’appliquent :
- Univers restreint : 3 actions seulement (top QQQ). La stratégie est concentree sur un petit nombre de positions.
- Entrainement inline : Le CNN est entraine directement dans l’algorithme QC (TensorFlow/Keras). Les performances dependent de la qualite de l’entrainement sur un nombre limite d’epochs (20) et de données (500 barres).
- Pas de validation croise : Pas de split train/test ou de walk-forward explicite dans l’algorithme. Le reentrainement hebdomadaire sur les 500 dernières barres est une forme implicite de validation, mais pas une garantie.
- Surapprentissage potentiel : Un CNN avec 30 filtres Conv1D sur 500 echantillons peut surapprendre, surtout avec 20 epochs sans early stopping.
5. Comparaison avec les autres stratégies Cloud
| Stratégie | Sharpe | CAGR | MaxDD | Edge |
|---|---|---|---|---|
| Risk Parity v4 (Cloud-01) | 0.278 | 6.17% | 20.4% | Allocation diversifiee |
| Sector Rotation v3 (Cloud-02) | 0.614 | 10.76% | 15.5% | Trend following multi-asset |
| Dual Momentum v2 (Cloud-03) | 0.392 | 8.79% | 23.6% | Momentum + univers diversifie |
| Mean Reversion v2 (Cloud-04) | 0.307 | 5.89% | 14.6% | RSI + regime filter |
| PCA Stat Arb (Cloud-06) | 0.399 | 12.65% | 31.8% | PCA + OLS residuals |
| Temporal CNN (Cloud-07) | 0.734 | 20.51% | 21.6% | Conv1D direction prediction |
Observations
Le Temporal CNN domine : Meilleur Sharpe (0.734), meilleur CAGR (20.51%), avec un MaxDD raisonnable (21.6%). La stratégie combine le meilleur des deux mondes : rendement eleve et risque contrôle.
L’edge du deep learning : Contrairement aux stratégies basees sur des indicateurs techniques (RSI, SMA, MACD), le Temporal CNN apprend ses propres caractéristiques a partir des données brutes. C’est un avantage quand les motifs de marche changent au fil du temps.
Beta faible (0.264) : La stratégie est largement decorrelee du marche. Le rendement ne depend pas de la direction générale du marche mais de la capacite predictive du modèle.
Reserve : Le univers restreint (3 actions) et l’absence de validation croisee formelle rendent ce résultat preliminaire. Une validation walk-forward multi-seed serait necessaire pour confirmer.
6. Lecons principales
6.1 Le deep learning bat les indicateurs techniques
Le Temporal CNN (Sharpe 0.734) surpasse toutes les stratégies basees sur des indicateurs techniques. La capacity du CNN a extraire des motifs non lineaires a partir des données brutes est un avantage decisif par rapport aux indicateurs fixes.
6.2 La classification bat la regression
Predire la direction (3 classes) plutot que le prix exact est plus robuste. Le modèle n’a pas besoin de predire l’amplitude du mouvement, seulement sa direction. Cela reduit le bruit dans les signaux.
6.3 Le reentrainement est essentiel
Le modèle est reentraine chaque semaine. Sans reentrainement, les performances se degraderaient rapidement car les motifs de marche evoluent. Le reentrainement hebdomadaire est un compromis entre la fraicheur du modèle et le cout computationnel.
6.4 La confiance filtre le bruit
Le seuil de confiance a 55% elimine les predictions incertaines. Un modèle qui ne trade que lorsqu’il est confiant reduit le nombre de trades mais ameliore la qualite moyenne.
Exercice 3 : Probabilistic Sharpe Ratio (PSR)
Le Temporal CNN a un PSR de 28.7, ce qui est exceptionnellement eleve. Le PSR mesure la probabilite que le Sharpe observe soit reellement superieur a un benchmark.
Objectif : Implementez probabilistic_sharpe_ratio(sharpe, n_observations) en utilisant la formule de Bailey & Lopez de Prado. Testez avec les Sharpe des stratégies cloud.
Indices : - Indice : PSR suit une distribution normale : z = (sharpe - benchmark) / SE. - Indice : Un PSR > 2.0 est considere comme statistiquement significatif.
# Exercice 3 : Probabilistic Sharpe Ratio (PSR)
# TODO etudiant : implementer probabilistic_sharpe_ratio(sharpe, n_obs)
# Indice : PSR = Phi(z) ou z = (sharpe - benchmark) / SE
import numpy as np
from scipy import stats
def probabilistic_sharpe_ratio(sharpe, n_observations, skewness=0, kurtosis=3, benchmark=0):
# TODO etudiant : calculer SE du Sharpe
# TODO etudiant : calculer z et PSR via stats.norm.cdf
return None # TODO etudiant : retourner le PSR
cloud_sharpes = {"Temporal CNN": 0.734, "Sector Rotation": 0.614, "Regime Switch": 0.622}
result_psr = None # TODO etudiant : calculer PSR pour chaque strategie
print("Exercice a completer : Probabilistic Sharpe Ratio")7. Pour aller plus loin
Walk-forward validation : Implementer une validation walk-forward 5-fold avec 4 seeds pour confirmer que le Sharpe de 0.734 est robuste et non un artefact du seed.
Early stopping : Ajouter un callback d’early stopping dans l’entrainement Keras pour eviter le surapprentissage.
Univers elargi : Tester avec 5-10 actions au lieu de 3 pour verifier si l’edge est scalable.
Architecture LSTM/Transformer : Comparer le Temporal CNN avec un LSTM ou un Transformer temporel pour voir si une architecture plus recente ameliore les performances.
Ensemble de modèles : Combiner les predictions de plusieurs CNN entraines avec des seeds différents pour reduire la variance des predictions.
Reference : Broad, J. (2025) — Hands-On AI Trading with Python, QuantConnect, and AWS, Chapter 6, Example 14.