Comment Valider Vos Backtests Crypto Sans Vous Mentir : Skfolio, Walk Forward et HRP

Découvrez skfolio pour valider vos portefeuilles crypto : Walk Forward, CVaR et CombinatorialCV. Évitez l'overfitting et optimisez sans vous mentir.

Comment Valider Vos Backtests Crypto Sans Vous Mentir : Skfolio, Walk Forward et HRP

Imaginons deux backtests de portefeuilles crypto. Le premier affiche +120% sur trois ans, un ratio de Sharpe de 2.5, et un drawdown maximal de 18%. Le second présente +75% sur la même période, un Sharpe de 1.3, et un drawdown de 28%. Lequel choisir ?

La réponse dépend d’une seule chose : comment ces backtests ont-ils été validés ? Si le premier a été optimisé sur toutes les données sans validation séparée, ses chiffres impressionnants ne valent pas grand-chose. Si le second a été testé en Walk Forward sur des périodes jamais vues par le modèle, ses performances modestes sont beaucoup plus honnêtes.

Dans notre newsletter sur le Walk Forward en trading, nous avons exploré cette technique pour pallier la suroptimisation des bots de trading. Aujourd’hui, nous l’appliquons à l’optimisation de portefeuille crypto avec skfolio, une librairie Python construite sur scikit-learn.

Hierarchical Risk Parity (HRP) : Optimisation Portefeuille Crypto avec Skfolio

Un des atouts majeurs de la librairie skfolio, c’est qu’elle permet d’utiliser directement Hierarchical Risk Parity (HRP) pour optimiser des portefeuilles. Pour comprendre pourquoi c’est important, il faut d’abord voir ce que font la plupart des gens.

L’approche classique, celle qu’on apprend dans tous les cours de finance, c’est Markowitz et la mean-variance optimization. Vous prenez vos rendements historiques, vous calculez une matrice de covariance entre tous les actifs, vous l’inversez, et ça vous donne les poids optimaux pour maximiser le ratio rendement/risque. Ça marche bien sur le papier.

Le problème en crypto ? Les corrélations changent tout le temps. BTC et ETH peuvent monter ensemble pendant deux mois, puis évoluer indépendamment le mois suivant. SOL peut suivre le marché général un jour et faire sa vie le lendemain. Quand vous inversez une matrice de covariance qui bouge constamment, vous amplifiez ces instabilités. Résultat : des poids de portefeuille complètement aberrants.

HRP contourne ce problème. Au lieu d’inverser une matrice, il regroupe d’abord les actifs similaires par clustering hiérarchique (BTC et ETH ensemble, SOL à part, etc.), puis répartit le risque de manière équilibrée entre ces groupes. Pas d’inversion de matrice, donc beaucoup plus robuste face à des corrélations changeantes. Pour du crypto long terme, c’est une base solide.

Dans notre notebook (trouvez-le ici), nous testons HRP sur un portefeuille simple : BTC, ETH, SOL. Toutes les approches utilisent HRP comme méthode d’optimisation de base. On va maintenant voir comment valider ces optimisations correctement.

Backtest Naïf : L’Erreur d’Overfitting à Éviter en Validation Portefeuille

Commençons par l’approche naïve que beaucoup utilisent instinctivement : optimiser un portefeuille sur une période passée, puis appliquer ces mêmes poids figés sur la période suivante.

Dans le notebook, nous optimisons HRP sur toute l’année 2023, puis appliquons ces poids figés sur 2024.

Poids optimisés sur 2023 :

  • BTC : 44.6%
  • ETH : 39.4%
  • SOL : 16.0%

Performance sur 2023 (période d’optimisation) :

  • Rendement annualisé : +83.3%
  • Max drawdown : -23.5%

Excellent, non ? +83% de rendement avec seulement 23% de drawdown. Le modèle a trouvé une allocation équilibrée entre BTC (défensif), ETH (milieu), et SOL (risqué). Tout semble parfait.

Maintenant, on garde exactement ces mêmes poids et on les applique sur 2024, une année que le modèle n’a jamais vue pendant l’optimisation.

Performance sur 2024 (avec les poids figés de 2023) :

  • Rendement annualisé : +55.2%
  • Max drawdown : -32.5%

On est passé de +83% à +55%. Une dégradation de 28 points de pourcentage. Le drawdown augmente aussi : de 23% à 32%. Certes, on reste en territoire positif, mais les performances se dégradent significativement.

Le portefeuille optimisé sur 2023 a mémorisé les corrélations et les rendements relatifs de 2023. Appliqué sur 2024 avec les mêmes poids figés, il sous-performe parce que le régime de marché a changé. En conditions réelles, personne ne ferait ça. Vous réajusteriez votre allocation régulièrement en voyant que le marché évolue.

C’est exactement ce que Walk Forward fait automatiquement.

Walk Forward Validation : Adaptation Portefeuille Crypto aux Changements de Marché

Au lieu de figer les poids du portefeuille, le Walk Forward les réajuste régulièrement en fonction des données les plus récentes. C’est ce que vous feriez naturellement en conditions réelles : réévaluer votre allocation tous les mois ou tous les trimestres.

Reprenons la période 2023-2024, mais cette fois avec Walk Forward. On découpe l’historique en fenêtres glissantes de 6 mois d’entraînement et 1 mois de test :

  1. Optimiser sur juillet-décembre 2022 → tester sur janvier 2023
  2. Optimiser sur août 2022-janvier 2023 → tester sur février 2023
  3. Optimiser sur septembre 2022-février 2023 → tester sur mars 2023
  4. Etc. jusqu’à fin 2024 (24 périodes au total)

À chaque étape, le modèle réoptimise les poids du portefeuille avec les 6 derniers mois de données, puis applique ces poids pendant le mois suivant. Avec 6 mois de train, le modèle capture mieux les variations de corrélations et différents régimes de marché. Les poids s’ajustent progressivement au fil de 2023-2024.

Le code skfolio rend ça trivial :

from skfolio.model_selection import WalkForward, cross_val_predict
cv_wf = WalkForward(train_size=180, test_size=30, freq='D')
portfolio_wf = HierarchicalRiskParity()
pred_wf = cross_val_predict(portfolio_wf, X=returns_wf, cv=cv_wf, portfolio_params={'compounded': True})

Résultat Walk Forward sur 2023-2024 (24 périodes) :

  • Rendement annualisé : +79.3%
  • Max drawdown : -31.4%

Comparaison complète naïf vs Walk Forward :

  • Rendements : Naïf 2024 (+55.2%) vs Walk Forward 2023-24 (+79.3%) = +24.1 points
  • Drawdowns : Naïf 2024 (-32.5%) vs Walk Forward 2023-24 (-31.4%) = +1.1 point de protection

Dans notre cas, Walk Forward surpasse l’approche naïve de manière significative. Mais attention : ce n’est pas toujours le cas. Sur certaines périodes ou certains portefeuilles, Walk Forward peut donner des performances inférieures à l’optimisation naïve.

L’important, ce n’est pas que Walk Forward donne de meilleures performances. L’important, c’est qu’il donne des performances plus honnêtes. Walk Forward simule ce qui se passerait en conditions réelles : vous réoptimisez régulièrement avec les données disponibles, et vous vivez avec cette allocation jusqu’au prochain rééquilibrage. Chaque test est out-of-sample, le modèle n’a jamais vu ces données avant.

Si Walk Forward donne des performances bien inférieures au naïf, ça signifie que votre stratégie est fragile et suradaptée aux données historiques. Si les performances sont similaires (ou meilleures, comme ici), votre stratégie est plus robuste.

Walk Forward vous donne une adaptation constante aux changements de marché. Quand les corrélations changent, il ajuste l’allocation. Il ne prédit pas le futur, mais il s’adapte aux données récentes.

Mais comment savoir si 6/1 mois sont les bons choix ? Comment être sûr que nos résultats ne dépendent pas trop du timing choisi ? C’est là que CombinatorialPurgedCV de skfolio entre en jeu.

CombinatorialPurgedCV Skfolio : Mesurer la Robustesse de Vos Backtests Crypto

Walk Forward génère un seul chemin de validation. Nous avons choisi 6 mois de train, 1 mois de test, et un rééquilibrage mensuel. Ces paramètres sont raisonnables en theorie, mais comment savoir s’ils sont optimaux ? Et si changer légèrement le timing changeait drastiquement les résultats ?

CombinatorialPurgedCV teste plusieurs scénarios différents de périodes train/test. Au lieu d’obtenir un chiffre unique (+79%), vous obtenez une distribution complète : médiane, pire cas, meilleur cas, écart. Cette distribution révèle la robustesse de votre stratégie.

Si tous les scénarios donnent des résultats similaires, votre stratégie est robuste. Si les résultats varient énormément (écart >20%), votre stratégie est fragile et dépend trop du timing.

Avant de lancer ces scénarios, le notebook applique deux protections critiques :

  • Purging : Supprime du train set toute observation dont le calcul chevauche la période de test. Dans notre cas, si le modèle s'entraîne sur des rendements calculés avec des prix qui incluent la période de test, il y a fuite d'information. Le purging garantit une séparation stricte entre les données d'entraînement et de test.
  • Embargoing : Crée une "zone tampon" après chaque période de test. Les marchés crypto sont fortement autocorrélés : ce qui se passe aujourd'hui influence demain. Si vous testez sur janvier, les données de février portent encore l'empreinte de janvier. L'embargoing exclut quelques jours après le test avant de réutiliser ces données pour l'entraînement. Cela évite que le modèle capte des échos de la période de test.

Résultat sur notre portefeuille (BTC/ETH/SOL, 2022-2024) :

  • Résultat typique (médiane) : 57-58%
  • Pire cas : 56.7%
  • Meilleur cas : 58.4%
  • Écart (max - min) : 1.7%

Un écart de seulement 1.7% est encourageant : la méthode réduit la variance de performance entre les différents scénarios. Certes, cet écart faible s'explique aussi en partie par des conditions de marché similaires sur la période testée.

Cette robustesse nous conforte que notre stratégie HRP avec Walk Forward capture des principes solides de diversification, pas juste un ajustement sur des données spécifiques.

Quand utiliser CombinatorialPurgedCV : Réservez cette méthode pour la validation finale, après avoir éliminé les approches non-viables avec Walk Forward simple. Tester plusieurs scénarios prend beaucoup plus de temps. Pour de gros portefeuilles (50+ actifs) ou des optimisations complexes, le temps de calcul devient prohibitif.

Utilisez CombinatorialPurgedCV quand vous devez prendre une décision binaire : déployer ou non en production ? Si le pire cas est acceptable, déployez. Si le pire cas est catastrophique, abandonnez ou revoyez votre stratégie.

Conclusion : Validation Backtest Honnête avec Walk Forward et Skfolio

Le but du Walk Forward n’est pas d’améliorer les performances de vos backtests. Le but est d’améliorer votre confiance dans vos backtests et dans les choix que vous avez faits pour être meilleur dans le futur. Et plus encore, skfolio rend cette analyse très facile à faire, et donne une touche additionnelle encore meilleure sur la confiance notamment avec CombinatorialPurgedCV.

Dans ce notebook, nous avons utilisé HRP (Hierarchical Risk Parity) comme méthode d’optimisation. Mais skfolio offre aussi une méthode alternative basée sur CVaR (Conditional Value at Risk). CVaR optimise spécifiquement pour les crashs extrêmes en minimisant la perte moyenne des pires jours historiques. Si vous détenez un portefeuille long terme et voulez vous protéger contre les effondrements de type bear market, Mean-CVaR vaut le coup d’être testé. Il sacrifie généralement un peu de rendement pour limiter les drawdowns maximaux.

Le code est disponible ici https://github.com/CryptoRobotFr/General-code-trading-bot/blob/main/skfolio-portfolio-optimisation.ipynb