Valider une stratégie automatique grâce aux stress-tests

  • 1874
  • 0
  • Qui a voté?
Après avoir évaluer ma stratégie de trading automatique au premier coup d’œil, je fais subir une petite série de stress-tests à mon système de trading automatique afin de confirmer sa robustesse. Pour réaliser ces tests, nous allons utiliser la plateforme ProRealTime et quelques fonctions codées en Python.

(Retrouvez la version PDF à imprimer en bas de cet article)


Augmentation du spread



Simuler une augmentation du spread est le premier stress test que je fais pour tester la robustesse d’une stratégie. C’est le moyen le plus rapide et le plus facile pour savoir si une stratégie est sur-optimisée.

Il suffit d’augmenter le spread facturé à chaque transaction jusqu’à ce que la performance de la stratégie devienne neutre ou légèrement perdante :
Si votre stratégie devient trop rapidement perdante, c’est à dire après une petite augmentation de spread, cela signifie que votre stratégie est sur-optimisée.
Si votre stratégie supporte une trop grande augmentation du spread, cela pourrait signifier que votre stratégie est sous-optimisée.

Déroulement du stress test


Habituellement, je découpe ce stress-tests en deux parties : une simulation du stress test en Python et l’exécution du stress test avec Probacktest sur la plateforme Prorealtime.

Simulation du stress test en Python
Je réalise d’abord une simulation des conséquences de l’augmentation du spread sur ma stratégie. J’utilise une fonction codée en Python pour réaliser ce test. Cette première simulation m’aide à visualiser sur un graphique l’effet de l’augmentation du spread sur ma stratégie.

Exécution du stress test sur ProBacktest
Dans un deuxième temps je lance mon backtest sur la plateforme Prorealtime en augmentant le spread de manière itérative. Après chaque itération, j’analyse les positions qui ont été impactées par l’augmentation du spread, notamment celle qui deviennent perdantes.

Simulation de l’augmentation du spread


Je vais commencer par simuler l’effet de l’augmentation du spread sur une stratégie à partir de ses propriétés. J’entends par « propriétés » le capital de départ, le taux de réussite, le gain moyen et la perte moyenne.

La fonction est codée en Python et prend en paramètre les propriétés de la stratégie. En plus de ces propriétés, elle intègre le spread et le nombre de positions qui seront ouvertes. Elle retourne le résultat de la simulation sous forme d’une matrice qui sera convertie en image png.

Code source de la fonction


# import des bibliothèques
import random
import matplotlib.pyplot as plt

# instanciation des objets nécessaires
rnd = random.Random()

# déclaration de la fonction
def backtest(capital, successRate, gain, loss, spread, numberFlips):
resultat = []
trade = 0
startupCapital = capital
failureRate = 100 - successRate
i = numberFlips

while i > 0 and capital > 0:
trade = rnd.choices([gain, loss], weights=(successRate, failureRate))
capital = capital + trade[0] - spread
resultat.append(capital)
if capital <= 0:
break
i-=1

plt.figure(figsize=(12,5))
plt.axhline(startupCapital, color="gray")
plt.plot(resultat)
plt.show()
plt.close()


# Exemple d’appel de la fonction
backtest(10000, 55, 28, -25, 1, 1000)

Algorithme de la fonction de simulation
L’algorithme de la fonction est assez simple, un trade est simulé tant que le capital est positif :
TANT QUE CAPITAL > 0 FAIRE
SIMULER UN TRADE
INTÉGRER LE RÉSULTAT AU CAPITAL
FIN-TAN QUE

Déroulement de l’algorithme
Cette boucle s’exécute tant que le capital est positif.
A chaque itération, un trade est simulé.
Ce trade génère une perte ou un gain.
Le résultat de ce trade est intégré au capital.
La variable « capital » est ajoutée à la matrice « resultat ».

Paramètres de la fonction
Les paramètres suivants vont vous permettre de créer une simulation personnalisée :


Explication du code de la fonction
Vous trouverez les explications du code source de cette fonction de simulation sur mon site via ce lien : Simulation of spread increasing with Python

Lancement d’une simulation


Nous pouvons maintenant simuler l’effet de l’augmentation du spread sur une stratégie. Notre stratégie aura les propriétés suivantes :

Cette stratégie démarre avec un capital de 10000$, le taux de réussite sera de 55 % avec un gain moyen de 28 points, une perte moyenne de 25 points et un spread initial de 1 point. Au total, 1000 positions seront ouvertes.

Pour lancer cette simulation, il suffira d’appeler la fonction « backtest » de cette manière :
backtest(capital, taux de réussite, gain moyen, perte moyenne, spread, nombre de tirage)


Simulation de la stratégie avec un spread de 1 point
# Appel de la fonction
backtest(10000, 55, 28, -25, 1, 1000)


Cette stratégie est globalement profitable et offre une performance de 17.5 % sur 1000 trades. Maintenant voyons ce qui se passerait avec un spread de 2 points.

Simulation de la stratégie avec un spread de 2 points
# Appel de la fonction
backtest(10000, 55, 28, -25, 2, 1000)


Avec une augmentation du spread de 1 point on observe une augmentation de la volatilité de la stratégie et une performance de 7.5 % soit une baisse de plus de 50 % par rapport à la simulation précédente.

Simulation de la stratégie avec un spread de 5 points
# Appel de la fonction
backtest(10000, 55, 28, -25, 5, 1000)


Cette stratégie ne semble pas supporter l’augmentation du spread. On voit la performance se dégrader très vite jusqu’à devenir perdante avec un spread de 5 points. La raison vient d’une trop petite différence entre le positionnement du stoploss et celui du target.

Augmentation du spread sur ProBacktest


Maintenant que nous avons une idée des conséquences de l’augmentation du spread sur une stratégie, nous allons soumettre notre stratégie à ce test sur ProBacktest.

Pour réaliser ce test il suffit simplement d’augmenter le spread sur l’interface de ProBacktest et de relancer votre stratégie.


Nous allons augmenter le spread facturé à chaque transaction jusqu’à ce que la stratégie devienne neutre ou légèrement perdante.

Comportement d’une stratégie sur-optimisée


Je vais commencer par vous montrer comment se comporte une stratégie sur-optimisée quand on augmente le spread.

Stratégie avec 1 point de spread


Stratégie avec 2 points de spread

Stratégie avec 5 points de spread

Interprétation du résultat
Les stratégies sur-optimisées sont très sensibles à l’augmentation du spread. Elles deviennent rapidement perdantes.

Le simple fait d’avoir augmenté le spread de 1 point sur cette stratégie a suffi pour faire baisser le taux de réussite de trade gagnant à 55 %. La stratégie est devenue perdante quand le spread a atteint un tiers des gains moyens.

Comportement d’une stratégie sous-optimisée



Stratégie avec 1 point de spread


Stratégie avec 2 points de spread

Stratégie avec 5 points de spread

Stratégie avec 20 points de spread

Interprétation du résultat
Les stratégies sous-optimisées sont très insensibles à l’augmentation du spread. Leur résultat n’est pratiquement pas impacté. Même avec 20 points de spread, qui représente un tiers des gains moyens initiaux, le taux de réussite n’a pas changé et la stratégie est toujours gagnante.

Conclusion sur l’augmentation du spread



En simulation
On voit que lors de notre simulation, l’augmentation du spread a un fort impact sur la performance.

Il est facile de comprendre ce résultat car un spread de 5 points est supérieur à l’espérance moyenne de gain qui était de 4 points (28 – 25 = 4). Cependant, il faut savoir que dans la réalité, la variation du spread fait varier la probabilité de réussite d’un trade. Si les stoploss sont exprimés en points, le taux de réussite peut baisser.

En backtest
- Stratégies sur-optimisées sont très sensibles à l’augmentation du spread et deviennent rapidement perdantes.
Vous pouvez essayer de résoudre ce problème en augmentant vos stoploss et vos target à condition que le taux de réussite ne soit pas trop impacté. Si l’élargissement de vos stoploss et de vos target profit provoque une chute du nombre de trade gagnants alors le problème vient peut-être de vos points d’entrés.
- Les stratégies sous-optimisées sont peu voir insensibles à l’augmentation du spread. Leur taux de réussite sera peu impacté par le spread.
Vous pouvez essayer de résoudre ce problème en resserrant vos stoploss et vos target. Comme vu précédemment, Si le resserrement de vos stoploss et de vos target provoque une chute du nombre de trades gagnants alors le problème vient peut-être de vos points d’entrés. 

Dans la réalité

Dans la réalité, l’augmentation du spread n’arrive jamais au hasard. Elle se produit le plus souvent lors d’événements importants tel que les annonces des banques centrales ou lors de la survenue d’un événement imprévu.

J’ai déjà remarqué que le spread avait aussi tendance à augmenter lorsque le prix de l’actif sur-lequel je suis en position est très proche de mon stoploss. Cette augmentation est souvent faible et de très courte durée mais suffisante pour faire exécuter le stoploss.

Il est donc important de vous donner un peu de marge lors de vos backtest en veillant à ce que le ratio target/stoploss soit toujours supérieur à 1.


Faite exécuter les stoploss à un point près



C’est une variante de la méthode précédente qui vous permettra de mesurer l’effet d’une chasse au stop sur votre stratégie. Lorsque le marché s’approche de vos stoploss à un point près, en backtest votre position sera conservée, en revanche en réel vous pouvez être sûre que votre stoploss sera exécuté.

Pourquoi faire ce test ?


Cette variante est importante car le test de l’augmentation du spread via l’interface ProBacktest a une faiblesse. Quand vous augmentez le spread, cela est équivalent à un resserrement de vos stoploss mais aussi à une augmentation de vos target. Donc il y a un léger biais négatif.

La pire façon de suroptimiser une stratégie serait d’optimiser les stoploss et les targets de manière optimale, c’est à dire à un point près voire même à 0.1 point près. Si vous faites cela, vous avez l’assurance que votre stratégie très gagnante en backtest sera très perdante en réel.

Faire ce test permet de savoir si vos stoploss ne sont pas sur-optimisées à un point près. Il suffit de réduire votre stoploss de 1 point et d’observer la variation du taux de réussite de votre stratégie.

Vous pourrez faire l’opération inverse pour vos target en les augmentant de 1 point.

Méthode


Le test consiste à déclencher l’exécution de votre stoploss lorsque le marché s’en approche de 1 point. Pour réaliser ce test, vous avez deux possibilités :

1 Vous pouvez soustraire un point à votre stoploss initial,
2 Vous pouvez ajouter une ligne de code conditionnelle qui coupera votre position si le marché est trop proche de votre stoploss.

Soustraire un point à votre stoploss initial
monStopLoss = 30 // votre stoploss initial
SET STOP pLOSS monStopLoss – 1

Déclencher la clôture
Déclencher la clôture de votre position si le marcher s’approche trop près de votre stoploss

Cas d’une position longue
IF low ≤ POSITIONPRICE - monStopLoss + 1 THEN
SELL AT MARKET
END-IF

Cas d’une position courte
IF high ≥ POSITIONPRICE + monStopLoss - 1 THEN
SELLSHORT AT MARKET
END-IF


Généralisation de cette méthode à un système


Il est possible de généraliser cette méthode à toutes les variables d’un système de trading impliquées dans la prise de décision.

Dans mon livre « Trading Automatique avec ProrealTime » au chapitre « Les valeurs orphelines », je vous présente une méthode pour débusquer les variables sur-optimisées de votre stratégie, qu’il s’agisse de stoploss, de target ou de variables d’indicateurs techniques.

Maintenant, nous allons faire quelques simulations à propos du taux de réussite d’une stratégie pour en observer les conséquences sur le résultat final.


Simuler un retour au pile-ou-face



Le test du retour au pile ou face, avec celui de l’augmentation du spread est l’un des plus importants en trading algorithmique. Il consiste à simuler le résultat que la stratégie aurait si le taux de réussite des prises de positions retombait à 50 %.

Pour qu’une stratégie reste rentable avec un taux de réussite de 50 %, il faut absolument que les gains moyens soient strictement supérieurs au pertes moyennes. Il faut aussi que le plus gros gain soit supérieur à la plus grande perte.

Le fait qu’une stratégie reste gagnante même avec un taux de réussite de 50 % est un véritable gage de sécurité pour votre capital. Il vous permet de tester des nouvelles stratégies à moindre coût. Cela vous permet aussi de supporter les conséquences d’une stratégie devenue obsolète.

Exemple d’une stratégie dissymétrique


Prenons l’exemple d’une stratégie ayant un fort taux de réussite mais avec un stoploss beaucoup plus important que le target. On acceptera par exemple un taux de réussite de 85 % avec un target à 10 points et un stoploss à 30 points. Le stoploss est donc 3 fois supérieur à l’espérance de gain.

Voici le résultat d’une simulation de cette stratégie


Sur le papier, cette stratégie semble gagnante puisqu’elle affiche une performance de 28% de gains en 1000 trades.

Si on fait un zoom sur le résultat de cette stratégie, on observera des gros décrochages de performance lorsqu’il y a des pertes :


Maintenant nous allons simuler les conséquences sur le résultat de cette stratégie si le taux de réussite retournait à 50 % :

On voit que cette stratégie provoque une perte de 100 % du capital de départ (10 000$) en un peu plus de 400 trades.

Retour au pile ou face d’une stratégie dissymétrique


Voici le comportement le plus probable que cette stratégie dissymétrique et sur-optimisée aurait dés sont lancement sur votre compte réel :


Les 800 premiers trades représentent la performance affichée durant le backtest et les 200 trades suivants correspondent au résultat de la stratégie trading réel.

La violence de la chute vient du déséquilibre entre les pertes et les gains puisque le système ne gagne que 10 points quand il en perd 30.

Exemple d’une stratégie symétrique


Cette fois-ci nous allons tester une stratégie symétrique, c’est à dire une stratégie pour laquelle l’espérance de gain est légèrement supérieure au risque de perte. Nous fixerons un target à 30 points et un stoploss à 25 points avec un spread de 1 point. Le taux de réussite initiale de la stratégie sera de 65 % avec un capital de départ à 10000$.

Voici le résultat d’une simulation de cette stratégie


Cette stratégie semble très gagnante et affiche une performance de 80 % de gains en 1000 trades.

Maintenant nous allons simuler les conséquences sur le résultat de cette stratégie si le taux de réussite retournait à 50 % :


Il y a clairement plus de volatilité mais la stratégie reste tout de même légèrement gagnante avec une performance proche des 5 % en 1000 trades.

Retour au pile ou face d’une stratégie symétrique


Voici le comportement le plus probable que cette stratégie dissymétrique sur-optimisée aurait à son lancement sur votre compte réel :


Les 800 premiers trades représentent la performance affichée durant le backtest et les 200 trades suivants correspondent au résultat de la stratégie trading réel.

On voit que la stratégie a du mal à créer de la performance lors du retour au pile ou face mais sans pour autant engendrer une énorme perte.

Cette approche qui consiste à définir une espérance de gain supérieure au risque de perte est plus sécurisée que la première et personnellement, c’est celle que j’ai choisi.

Réalisez vos propres simulations


Je vais vous présenter la fonction Python « successChanger » que j’ai développé pour simuler les conséquences du retour au pile ou face d’une stratégie. C’est une dérivation de la fonction « backtest » que je vous avais présenté au chapitre « Simulation de l’augmentation du spread ».

Code de la fonction successChanger :
def successChanger(capital, successRate1, successRate2, realSet, gain, loss, spread, numberFlips):
resultat = []
startedCapital = capital
successRate = 0
lossRate = 0

i = numberFlips
while i > 0 and capital > 0:
if i > (numberFlips * realSet):
successRate = successRate1
lossRate = 100 - successRate1
else:
successRate = successRate2
lossRate = 100 - successRate2

a = rnd.choices([gain, loss], weights=(successRate, lossRate))

capital = capital + a[0] - spread
resultat.append(capital)
if capital <= 0:
break
i-=1

plt.figure(figsize=(12,5))
plt.axhline(startedCapital, color="gray")
plt.axvline(500, color="gray")

plt.plot(resultat)
plt.show()
plt.close()


# Exemple d’appel de la fonction
successChanger(10000, 65, 50, 0.5, 30, -25, 1, 1000)

Algorithme de la fonction
L’algorithme de la fonction est similaire à celui de la fonction « backtest ». La différence réside dans le fait que la fonction « successChanger » divise la simulation en deux parties : une partie « backtest » et une partie « réel ». Chacune de ces parties aura son propre taux de réussite de trades.

TANT QUE CAPITAL > 0 FAIRE
SI PREMIERE-PARTIE ALORS
SIMULER UN TRADE(taux-réussite-1)
INTÉGRER LE RÉSULTAT AU CAPITAL
SI-NON ALORS
SIMULER UN TRADE(taux-réussite-2)
INTÉGRER LE RÉSULTAT AU CAPITAL
FIN-TAN QUE

Déroulement de l’algorithme
• Cette boucle s’exécute tant que le capital est positif.
• Vérifier si on est dans la première ou la seconde partie de la simulation.
• Détermination du taux de réussite d’un trade.
• Un trade est simulé.
• Ce trade génère une perte ou un gain.
• Le résultat de ce trade est intégré au capital.
• La variable « capital » est ajoutée à la matrice « resultat ».

Paramètres de la fonction
Les paramètres suivants vont vous permettre de créer une simulation personnalisée :


Exemple d’appel de la fonction

Voici un exemple complet d’une simulation avec la fonction « successChanger » :
successChanger(10000, 65, 50, 0.5, 30, -25, 1, 1000)

Analyse des paramètres
Maintenant analysons chaque paramètre passé dans la fonction successChanger :


Résultat de l’appel de la fonction

Cette simulation montre que la stratégie affiche une plus-value de 40 % lorsque le taux de réussite est de 65 %. Puis, lorsque le taux de réussite retombe à 50 %, cette même stratégie est toujours légèrement gagnante avec une performance de 2.5 %.

Conclusion du test du retour au pile ou face


Le test du retour à 50 % du taux de réussite est très important car bon nombre de stratégies de trading, figées dans le temps, finissent par devenir obsolètes. Et quand cela arrive, on voit souvent le taux de réussite s’articuler autour des 50 %.

Un des moyens de se prémunir contre des grandes pertes est de faire en sorte que l’espérance de gain de votre stratégie soit légèrement supérieure au risque de perte.

Pour y parvenir, le paramétrage des stoploss, des target et du début de la sécurisation des gains devraient être positionnés de la manière suivante :
• Vos target devraient être deux fois supérieurs à vos stoploss. Donc si vous mettez votre stoploss à 30 points, votre target devrait être initialisé à 60 points.
• Le début de la sécurisation des gains strictement supérieurs à vos stoploss. Concrètement, cela implique de commencer à sécuriser les gains lorsque que le gain latent d’une position ouverte est égal à votre niveau de stoploss + quelques points supplémentaires.

C’est l’exemple de la deuxième stratégie « symétrique » que je vous ai montré précédemment. Cette configuration respecte l’approche tactique que je pratique personnellement. C’est à dire que je dois toujours gagner un tout petit peu plus que ce que je suis prêt à perde.


Il m’arrive encore aujourd’hui de mettre en production des stratégies prometteuses qui affichent un fort taux de réussite en backtest mais qui finalement gagne une fois sur deux sur mon compte réel.

Grace à cette approche, je peux tester des nouvelles stratégies avec un minimum de risques.


Succession de pertes et pire cas possible



Estimer le coût d’une succession de pertes


Même une bonne stratégie peut à un moment donné subir une succession de trades perdants. Il ne faut pas qu’une succession de pertes ait un impact trop important sur votre compte de trading. Une succession de dix positions perdantes ne devraient pas représenter plus de 20 % de votre capital. Cela nous ramène à 2 % de risque par trade, qui est un classique du monnaie management.

Attention, quand je parle d’une succession de pertes, je fais référence à la plus grande perte qu’un système peut subir. Cela signifie que si votre système affiche que la plus grande perte possible est 20 points alors que votre stoploss est placé à 50 points, vous devez considérer 50 points dans votre calcul de perte.

Il faut agir de cette manière car parfois il arrive que lorsqu’on teste une stratégie, le stop n’est jamais touché. Cela se produit notamment si on teste une stratégie sur une période de marché lui étant très favorable.

Simuler le pire cas possible


Simuler le pire cas possible consiste à calculer en combien de trades perdants consécutifs votre capital sera entièrement perdu. Pour ce test on ne se basera pas non plus sur les pertes moyennes affichées lors du backtest de la stratégie mais sur les plus grandes pertes possibles, c’est à dire les stoploss.

En fait on imagine qu’après chaque ouverture de position, le stoploss est immédiatement touché.

Afin de respecter les règles élémentaires du monnaie management, un système doit pouvoir encaisser 50 pertes successives avant la perte total en capital. Cela correspond à 2 % de risque par trade.

Il est important de connaître le nombre de trades perdants provoquant une perte totale en capital. Ce chiffre sera déterminant par la suite, lorsque vous serez amenez à manager des systèmes de trading automatique.


Simuler un flash krach



Je crois que le flash krach est l’événement que je crains le plus en tant que trader. Être positionné durant un flash krach est la pire chose qui puisse arriver. Et la plupart des traders n’y sont pas préparés. On rejoint l’idée précédente à propos de l’exposition au risque.

Vous devez absolument survivre à une chute de 20 % des marchés qui surviendrait en moins d’une minute. Votre système ne devrait donc jamais dépasser les 500 % d’exposition au risque, qui correspond à un niveau de levier inférieur ou égal à 5.

Flash krach du 15/01/2014 sur l’USD/CHF

Il est toutefois recommandé qu’un système de trading automatique fonctionnant en day-trading ne devrait jamais dépasser 300 % d’exposition au risque, donc un levier inférieur ou égal à 3.

Un robot fonctionnant en swing trading conservant une position plusieurs jours ne devrait jamais dépasser les 100 % d’exposition donc un levier inférieur ou égal à 1.


Synthèse des stress-tests avec Python et Prorealtime



Voici la synthèse du chapitre « Les stress tests » vous présentant les grandes idées à retenir et à appliquer à vos systèmes de trading automatique :
  1. Vôtres système doit supporter une augmentation de spread allant jusqu’à 1/4 de votre espérance de gain.
  2. La distance entre vos stoploss et le prix de l’actif le plus bas après une ouverture de position doit être strictement supérieure à 1 point.
  3. Votre espérance de gain devrait toujours être supérieure à votre risque de perte de manière à supporter un taux de réussite de 50 %.
  4. Votre niveau de levier doit rester raisonnable, c’est à dire inférieur à 3 en intraday et inférieur à 1 en swing trading.
  5. Le ratio gain / perte devrait toujours être supérieur à 50 % en backtest, c’est à dire que votre système devrait avoir un peu plus d’une chance sur deux de gagner.
  6. Une succession de dix positions perdantes ne devraient pas représenter une perte de plus de 20 % de votre capital.
  7. Vous devriez savoir après combien de pertes successives, vous aurez une perte totale en capital.
  8. Votre système doit supporter une baisse de 20 % des marchés en moins d’une minute sans provoquer une perte totale en capital.


Pour aller plus loin



Si vous souhaitez aller plus loin dans le backtesting de stratégie de trading automatique, je présente plusieurs modèles de machine learning dans mon livre « Trading Automatique avec ProrealTime » que j’utilise pour optimiser mes stratégies.

Ces modèles me permettent de choisir une valeur offrant un équilibre entre le gain potentiel et le risque de sur-optimisation.


A propos du posteur

  • 0
  • 0
  • 2
  • 0

Ajouter un commentaire

Commentaires

0 Commentaires