Trading quotidien LONG/SHORT par Machine
Learning
Application à la série Close d’Exxon Mobil (XOM)
Ethan Ada Tom Cohen Valentin Beaufils
10 février 2026
Résumé
Ce rapport présente un pipeline complet et reproductible pour construire une stratégie de
trading quotidienne sur une action, en s’appuyant sur un classifieur supervisé. Conformément aux
consignes de l’examen, toutes les variables explicatives sont dérivées du Close (transformations
et indicateurs techniques), la cible est définie à partir de rendements futurs, la validation est
temporelle (TimeSeriesSplit), et la stratégie est backtestée out-of-sample avec frais de transaction.
L’objectif n’est pas de maximiser la performance brute mais de justifier les choix méthodologiques
(métriques, sélection de variables, tuning, robustesse) et d’analyser de manière critique les résultats.
1 Objectif et cadre du projet
L’objectif est de produire chaque jour une décision de trading sur Exxon Mobil :
positiont ∈ {−1, +1}, (1)
avec +1 une position LONG et −1 une position SHORT. La contrainte imposée est LONG/SHORT
uniquement : la stratégie est toujours investie (pas de cash). Le livrable principal est un rapport
sans code expliquant les étapes (nettoyage, labelling, features, métriques, modèle, validation, backtest
et analyse critique).
2 Données et préparation
2.1 Source et périmètre
Le jeu de données contient une série temporelle quotidienne avec au minimum : Date et Close.
La période out-of-sample considérée va de 2015-06-15 à 2023-01-04.
2.2 Nettoyage et alignements
La préparation suit une démarche standard sur séries temporelles :
— conversion de Date en format date, tri chronologique strict ;
— conversion de Close en numérique ;
— gestion des valeurs manquantes créées par les fenêtres glissantes (indicateurs) ;
— remplacement de ±∞ par NaN ;
— complétion par forward fill si nécessaire, puis drop final des lignes restantes non valides ;
— alignement exact entre les features X et la cible y afin d’éviter toute fuite temporelle.
2.3 Contrôles de cohérence (sanity checks)
Un bloc de vérification systématique a été ajouté pour sécuriser le pipeline (dimensions, NaN/inf,
split, équilibre de classes). Les contrôles observés sur la version finale sont résumés ci-dessous.
1
Table 1 – Résumé des contrôles de cohérence
Élément Valeur
Dimensions dataframe (9519, 50)
Dimensions X (9519, 45)
Dimensions y (9519, )
NaN / Inf dans X 0/0
Split temporel Train (7615, 45) ; Test (1904, 45)
Balance classes (Train) {1 : 0.502, 0 : 0.498}
Balance classes (Test) {0 : 0.515, 1 : 0.485}
3 Labelling : définition de la cible
3.1 Rendement futur
On définit le rendement futur à horizon H jours :
Closet+H
rt→t+H = − 1. (2)
Closet
Le problème de classification consiste à prédire, à la date t, un proxy directionnel de rt→t+H .
3.2 Encodage LONG/SHORT
La cible économique naturelle est yttrade ∈ {−1, +1}. Pour compatibilité avec XGBoost (classes
entières), on utilise : (
1 si LONG
yt = (3)
0 si SHORT.
En post-traitement, ŷ ∈ {0, 1} est reconverti en position p̂ ∈ {−1, +1} pour le backtest.
3.3 Seuils et règle sticky
Deux logiques de labelling ont été testées :
— seuil zéro : LONG si rt→t+H > 0 ;
— seuil médian : LONG si rt→t+H dépasse la médiane (classes plus équilibrées).
En trading, la stabilité du signal est critique car les changements de position génèrent du turnover
et donc des coûts. Nous avons donc ajouté une règle sticky basée sur la probabilité prédite P(LONG) :
— LONG si p(LONG) > u ;
— SHORT si p(LONG) < ℓ ;
— sinon, conservation de la position précédente.
Cette règle respecte la contrainte LONG/SHORT (jamais flat) tout en contrôlant le nombre de flips.
4 Feature engineering (inputs)
Conformément à la consigne, toutes les variables explicatives sont dérivées du Close. L’objectif
est de fournir au modèle plusieurs points de vue : tendance, momentum, volatilité et normalisation.
— Rendements : rendement simple et log-rendement.
— Tendance / momentum : SMA/EMA multi-fenêtres, momentum k-jours, ratios (ex. Close/SMA(20)-1).
— Volatilité et z-scores : volatilité rolling des rendements ; z-score rolling du prix.
— Indicateurs techniques (TA-Lib ou équivalents) : RSI(14), MACD(12,26,9), Bandes de
Bollinger (20, 2σ) et dérivés (
2
5 Split temporel, métriques et validation
5.1 Split train/test
Le split est strictement chronologique (aucun shuffle). Il simule un usage réel : entraînement
sur le passé, évaluation sur une période future non vue.
5.2 Validation croisée temporelle
Pour le tuning, nous utilisons TimeSeriesSplit (3 folds) afin de limiter la fuite d’information et
d’obtenir une estimation plus robuste que le seul test.
5.3 Choix des métriques
En classification directionnelle LONG/SHORT, l’accuracy seule est insuffisante (déséquilibre
possible, coûts asymétriques). Nous utilisons :
— F1 macro comme objectif de tuning : elle pénalise un modèle qui ne prédirait qu’une seule
classe et traite les classes de manière symétrique.
— Matrice de confusion et classification report pour diagnostiquer les erreurs.
— Backtest OOS comme critère final : equity, drawdown, Sharpe et turnover, car une légère
hausse de métriques ML ne garantit pas un edge exploitable une fois les coûts inclus.
6 Modèle, pipeline et optimisation
6.1 Choix du modèle
Nous retenons XGBClassifier (gradient boosting) car il capture des non-linéarités, fonctionne
bien sur données tabulaires d’indicateurs, et fournit des probabilités utiles pour la règle sticky.
6.2 Pipeline de modélisation
Le pipeline utilisé est :
StandardScaler → SelectKBest → XGBClassifier.
SelectKBest réduit la dimension, limite l’overfitting et accélère la recherche d’hyperparamètres.
6.3 GridSearch (baseline) et Optuna
Une première étape de GridSearchCV sert de référence méthodologique, puis Optuna est employé
pour explorer plus efficacement l’espace de paramètres.
Table 2 – Tuning : meilleurs scores observés (objectif = F1 macro en CV)
Méthode Meilleur score CV Commentaire
GridSearch 0.5328 Baseline (40 candidats, 3 folds)
Optuna (Run A) 0.5352 Recherche bayésienne/heuristique
Optuna (Run B) 0.5355 Nouvelle exploration (robustesse)
3
7 Résultats ML (classification)
Nous reportons les performances sur train et test, ainsi qu’un modèle dummy en benchmark.
Table 3 – Performance en test : modèle vs baseline
Modèle (Test) Accuracy F1 macro
XGB + GridSearch 0.4916 0.4916
XGB + Optuna (Run A) 0.5058 0.5058
Dummy (classe majoritaire) 0.4848 0.3265
Analyse. Les scores en test sont proches de 0.50, ce qui indique un signal faible, typique sur un
seul actif avec des features techniques classiques. L’écart Train > Test suggère un sur-apprentissage
partiel. Néanmoins, le modèle bat le dummy en F1 macro, car il apprend à prédire les deux classes.
8 Backtest out-of-sample
8.1 Règles de backtest
Le backtest respecte des conventions réalistes :
— la décision au jour t s’applique au rendement du jour suivant (shift t → t + 1) ;
— position toujours LONG/SHORT ;
— coût de transaction appliqué lors d’un flip (changement de signe).
8.2 Impact des seuils sticky (frais = 0.5%)
Table 4 – Backtest OOS avec règle sticky (Optuna Run A, frais par trade = 0.005)
Seuils (u/ℓ) Equity finale strat. Equity stock Sharpe strat. Flips
0.55 / 0.45 0.1825 1.2759 -0.6086 275
0.60 / 0.40 0.2927 1.2759 -0.3996 167
0.65 / 0.35 0.2251 1.2759 -0.5162 83
8.3 Diagnostic : isoler l’effet des frais
Pour distinguer un problème de signal d’un problème de coûts, on compare l’equity finale en
faisant varier les frais (exemple sur sticky 0.55/0.45) :
Table 5 – Sensibilité aux frais (sticky 0.55/0.45)
Frais par trade Equity finale Turnover Flips
0.000 0.7231 0.1445 275
0.001 0.5493 0.1445 275
0.005 0.1825 0.1445 275
Analyse. Même sans frais, l’equity est inférieure à 1 (0.72–0.77 dans nos diagnostics), ce qui
suggère que le signal est structurellement insuffisant sur la période. L’ajout de frais réalistes dégrade
fortement la performance nette, surtout lorsque les flips sont nombreux.
4
8.4 Figures
Figure 1 – Courbes d’equity OOS : stratégie vs buy&hold.
Figure 2 – Drawdowns OOS : stratégie vs buy&hold.
Figure 3 – Histogramme des rendements nets journaliers (OOS).
5
9 Discussion critique et pistes d’amélioration
Les résultats obtenus sont cohérents avec un contexte de signal faible sur une action isolée :
— Faible généralisation. Les métriques proches de 0.5 en test indiquent que les patterns appris
ne sont pas stables.
— Turnover. Le nombre de flips (83 à 275 selon les seuils) rend les coûts déterminants.
— Objectif ML vs objectif trading. Optimiser F1 macro améliore l’équilibre de prédiction,
mais ne garantit pas un PnL positif.
Axes d’amélioration (méthodologiques) :
— enrichir l’information (si autorisé) : volume, high/low, facteurs de marché ;
— labels plus robustes : triple-barrier, seuils dépendants de la volatilité, horizon multiple ;
— réduire la variance : bagging / ensembles, calibration des probabilités, régularisation accrue ;
— politique de trading : filtre de tendance (régime), neutralisation (si multi-actifs), gestion du
risque (stop/position sizing).
10 Conclusion
Nous avons construit un pipeline complet de ML appliqué à une stratégie LONG/SHORT sur
Exxon Mobil : labelling via rendements futurs, features techniques à partir du Close, split temporel,
validation TimeSeriesSplit, tuning (GridSearch puis Optuna), et backtest out-of-sample avec coûts
de transaction. Les résultats confirment qu’une légère amélioration des métriques de classification ne
suffit pas à générer une performance nette positive : la stabilité du signal et le turnover (donc les
coûts) sont déterminants. Le travail reste néanmoins conforme aux bonnes pratiques attendues pour
un framework ML de trading (pas de fuite, validation temporelle, benchmark, backtest et analyse
critique).