Overfitting de backtest : vos meilleurs paramètres sont-ils réels ou chanceux ?

Trier une optimisation de paramètres par score donne toujours un gagnant. Le PBO, l'un des tests contre l'overfitting de backtest, mesure s'il s'agit d'un vrai edge ou de la combinaison la plus chanceuse.

Overfitting de backtest : vos meilleurs paramètres sont-ils réels ou chanceux ?

Sur 519 croisements de moyennes mobiles testés en long sur le Bitcoin, le gagnant affiche un Sharpe de 1,19.

Pourtant, si l'on refait cette optimisation sur une moitié de l'historique et qu'on vérifie son gagnant sur l'autre, une fois sur deux ce gagnant finit sous la médiane.

Cette part de découpages où le gagnant finit sous la médiane de ses rivaux est ce que mesure la probabilité d'overfitting de backtest, ou PBO (Probability of Backtest Overfitting), un test proposé dans un article de recherche sur le surapprentissage des backtests.

Ce gagnant a été retenu parce que son score était le plus haut des 519 sur cet historique.

Ce meilleur score appartient soit à la combinaison qui a un vrai edge, soit à celle qui a le mieux épousé le bruit de cet historique précis, et le score seul ne dit pas lequel.

Comment fonctionne le PBO, le test d'overfitting de backtest

Pour montrer le PBO en pratique, nous l'avons appliqué à un exemple complet, celui du Sharpe de 1,19.

Nous avons pris les clôtures quotidiennes du Bitcoin sur Binance, d'août 2017 à septembre 2026, et testé dessus 519 croisements de moyennes mobiles, uniquement en long.

Ces croisements associent une moyenne rapide de 5 à 100 jours par pas de 5 et une moyenne lente de 20 à 310 jours par pas de 10, et les paires où la lente est plus longue donnent les 519 combinaisons.

Pour chacune, nous avons gardé ses rendements quotidiens, que le PBO utilise tous.

Le PBO pose une question simple, celle de savoir si un gagnant choisi sur une partie de l'historique se classe encore dans la meilleure moitié sur le reste.

Pour y répondre, il découpe l'historique en seize périodes de même longueur, environ sept mois chacune sur nos neuf ans de Bitcoin.

Ce nombre résulte d'un compromis. Plus il y a de périodes, plus il y a de façons de les combiner et plus le PBO est précis, mais chaque période raccourcit.

Trop courte, une période ne contient plus un morceau représentatif du comportement de la stratégie, et seize est le compromis d'usage.

Il prend ensuite huit de ces seize périodes et les met de côté. Elles ne sont pas forcément consécutives, par exemple la fin 2017, la fin 2018 et le second semestre 2020.

Ce sont les périodes in-sample, celles sur lesquelles on choisira le gagnant. Les huit autres sont les périodes out-of-sample, celles sur lesquelles on le vérifiera.

Sur les périodes in-sample, il choisit le gagnant, la combinaison au meilleur Sharpe, comme un trader le ferait.

Sur les périodes out-of-sample, il regarde ensuite où ce même gagnant se classe parmi les 519 combinaisons.

Le graphique suivant montre un de ces découpages, pris sur notre optimisation Bitcoin :

Les deux échelles verticales classent les 519 combinaisons par Sharpe, du 1er en haut au 519e en bas, in-sample à gauche et out-of-sample à droite.

Chaque ligne grise relie les deux places d'une même combinaison.

La ligne pointillée marque la médiane.

La ligne noire est celle du gagnant. Premier in-sample, il finit 398e sur 519 out-of-sample, sous la médiane.

Calculer le PBO sur tous les découpages in-sample et out-of-sample

Un seul découpage pourrait tomber par hasard sur des périodes out-of-sample favorables, ou défavorables.

Le PBO refait donc l'exercice pour toutes les façons de choisir 8 périodes parmi 16, soit 12 870 découpages.

Chaque découpage désigne son propre gagnant in-sample et lui donne une place out-of-sample.

Le PBO est la part de ces découpages où le gagnant finit sous la médiane du classement out-of-sample.

Par convention, un gagnant dont cette part dépasse 5 % est écarté.

Cette méthode repose sur l'idée qu'un vrai edge devrait rester dans la meilleure moitié quelles que soient les périodes out-of-sample, alors qu'un gagnant chanceux devrait retomber dès que les périodes changent.

En code, cela tient en une boucle sur les découpages :

from itertools import combinations
import numpy as np

# returns : une colonne de rendements quotidiens par combinaison de paramètres
# sharpe() : ratio de Sharpe de chaque colonne
slices = np.array_split(returns, 16)
deals = list(combinations(range(16), 8))
below = 0

for in_half in deals:
    out_half = [i for i in range(16) if i not in in_half]
    in_sample = sharpe(np.concatenate([slices[i] for i in in_half]))
    out_sample = sharpe(np.concatenate([slices[i] for i in out_half]))

    winner = in_sample.argmax()                 # meilleure combinaison in-sample
    place = (out_sample <= out_sample[winner]).mean()   # part du peloton égalée ou battue
    below += place <= 0.5

print(below / len(deals))

Le nombre 16 de ce code est le paramètre du nombre de périodes, et le résultat en dépend.

Sur le Bitcoin, le PBO vaut 57 % avec huit périodes, 44 % avec douze et 49 % avec seize.

Huit périodes ne donnent que 70 combinaisons possibles, douze en donnent 924 et seize 12 870, et le PBO se stabilise à mesure.

Le verdict ne change pas, puisque le gagnant reste loin au-dessus des 5 %, mais le chiffre bouge, et un PBO se lit donc toujours avec son nombre de périodes.

Lire le résultat du PBO sur le Bitcoin et sur une série témoin

Un test n'est utile que s'il fait les deux choses, écarter un gagnant chanceux et laisser passer un vrai edge.

Le Bitcoin montre le premier cas. Pour montrer le second, nous avons fabriqué une série de prix dans laquelle un edge existe par construction.

Cette série témoin part de rendements quotidiens tirés au hasard, comme des pile ou face, avec une volatilité proche de celle du Bitcoin.

À ce bruit, nous avons ajouté une petite vague régulière qui pousse le prix vers le haut pendant 60 jours puis vers le bas pendant 60 jours, invisible au jour le jour mais bien réelle, ce qu'un croisement de moyennes mobiles est fait pour attraper.

Nous avons ensuite testé les mêmes 519 combinaisons dessus, avec la même boucle.

Le graphique suivant montre tous les résultats de cette boucle, pour le Bitcoin à gauche et la série témoin à droite.

À chaque découpage, le gagnant in-sample obtient une place dans le classement out-of-sample.

Le graphique compte combien de découpages donnent chaque place, de la pire tout à gauche à la meilleure tout à droite, et la ligne pointillée marque la médiane.

Le PBO est la part des découpages à gauche de cette ligne :

À droite, la série témoin donne l'image d'une réussite. Les découpages s'entassent contre le bord « meilleure », et le gagnant ne passe sous la médiane que sur 1 % des découpages, bien sous la barre des 5 %.

À gauche, le Bitcoin donne l'image d'un échec. Les découpages s'étalent sur toute la largeur et la barre la plus haute est contre le bord « pire ».

Son gagnant finit sous la médiane sur 49 % des découpages, loin au-dessus de la barre des 5 %, ce qu'aurait fait une combinaison sans aucun edge.

Pire que la simple suroptimisation, le gagnant d'une période ne dit rien de la suivante, puisqu'il finit parmi les 10 % les pires aussi souvent que parmi les 10 % les meilleurs.

Le PBO a donc rendu deux verdicts, un échec pour le Bitcoin et une réussite pour le témoin, et les deux sont justes.

L'edge du témoin est là par construction, et le gagnant du Bitcoin n'a jamais tenu son rang hors de l'historique qui l'a désigné.

Un trader qui ne regarderait que le Sharpe aurait conclu possiblement à l'inverse.

Le gagnant du témoin affiche 1,06, plus bas que le 1,19 du Bitcoin, et sur ce seul score il aurait gardé le Bitcoin et jeté la seule série qui avait un vrai edge.

Ce qu'il faut retenir

Le PBO mesure, sur tous les découpages possibles de l'historique, la part de ceux où le gagnant in-sample finit sous la médiane out-of-sample.

  • Il porte sur le passé testé : un PBO faible montre que le gagnant a battu son propre peloton de façon constante sur l'historique, jamais qu'il gagnera de l'argent le trimestre prochain.
  • Il traite chaque combinaison comme une tentative distincte : deux croisements voisins, 20/50 et 25/50, sont presque la même stratégie, et les compter deux fois gonfle la taille de l'optimisation.

Le PBO vient de l'article The Probability of Backtest Overfitting, de David Bailey, Jonathan Borwein, Marcos López de Prado et Qiji Jim Zhu. L'exemple sur le Bitcoin et la série témoin sont les nôtres.