Guide du module graphique ABC bourse - Partie 4
OK
Accueil  > Marchés Boursiers

Guide du module graphique ABC Bourse - Partie 4

Tester des stratégies

Le graphique ABC Bourse intègre un module de "backtesting" qui vous permet de tester des stratégies sur vos valeurs. Le module repose sur un langage de script simple qui vous permet d'écrire vos stratégies avec une syntaxe très facile à appréhender.

Pour lancer le module, cliquez sur l'icône La fenêtre de contrôle s'ouvre alors sous le graphique.

backtesting

Le module dédié aux stratégies comporte plusieurs zones :

1) L'onglet "code" : c'est ici que vous indiquez la définition de votre stratégie, sur l'exemple il y a un système simple de croisement de moyennes mobiles.
2) "Liste des transactions" : dans cet onglet s'affichent les transactions effectuées par la simulation
3) "Bilan de la stratégie" : passez en revue toutes les statistiques de vos opérations et évaluez la pertinence du modèle stratégique.
4) Pour commencer, vous avez à votre disposition quelques exemples de stratégies. Sélectionnez-en une dans le menu déroulant et vous verrez son code associé dans la zone du dessous. La stratégie sera également appliquée instantanément à la valeur courante.
5) La zone de code : c'est ici que vous pouvez saisir le code de votre stratégie.
6) Enfin, le bouton qui vous permet de lancer le calcul de la simulation.

Résultats de la simulation

Dès que vous avez lancé la simulation, et si des transactions sont réalisées compte-tenu des conditions que vous avez indiqué, les résultats s'affichent sur le graphique.

résultats backtest

Des flèches de couleurs matérialisent les transactions, achat ou vente et sous le graphique, le tracé de l'évolution de votre portefeuille tout au long de la simulation, apparait.

Les onglets du module de stratégie, situés sous le graphique, vous permettent alors de voir le détail des transactions mais aussi toutes les statistiques sur les opérations.

résultats détails

Les colonnes du tableau des transactions sont assez parlantes sur leur description. Un mot toutefois sur le "drawdown" qui indique la perte latente maximale sur la transaction considérée. C'est donc une mesure du risque que vous avez pris en tenant cette position.

backtest sumary

Le bilan de la stratégie vous offre des statistiques complètes sur la simulation effectuée. Retrouvez ci-dessous l'explication des éléments les moins évidents :

Ratio gains/pertes Ratio du montant total des transactions en bénéfice par le total des transactions en perte.
Stratégie "buy and hold" Calcule ce qu'on aurait gagné ou perdu si on avait acheté la valeur le premier jour de la simulation et revendue le dernier jour. En gros, fallait-il multiplier les transactions ou pas.
Efficacité des trades Rapport du nombre de transactions gagnantes sur les transactions perdantes.

Utilisation du langage de script des stratégies

Pour réaliser des simulations, tout l'enjeu est de comprendre la syntaxe de base du code. Vous trouverez ci-dessous les règles à suivre :

Généralités

1) Chaque ligne de code représente une instruction : définir un paramètre, poser les conditions d'un signal d'achat ou de vente, etc. Vous devez donc retourner à la ligne après chaque instruction donnée au module.

2) A la fin de chaque ligne il faut mettre un point-virgule (;) pour indiquer au programme que l'on passe à l'instruction suivante.

Les signaux d'achat et de vente

Le but de la simulation est de produire des signaux d'achat et de vente pour les appliquer sur une valeur. Ces signaux sont au nombre de 4 :

openlong : ouverture d'une position à l'achat (on achète)
closelong : clôture d'une position acheteuse (on revend)
openshort : ouverture d'une position en vente à découvert (on vend)
closeshort : clôture d'une position en vente à découvert (on rachète)

Lors de l'écriture d'une stratégie vous devez indiquer une seule fois chaque signal. Nous verrons plus loin que l'on peut multiplier les conditions pour un signal, mais sa définition ne doit apparaître qu'une fois. Vous devez également avoir au moins une instruction "open", c'est à dire "openlong" ou "openshort".

Chaque nom de signal (openlong, closelong, etc.) est suivi d'un espace et de deux points (:) puis d'un espace et des conditions de déclenchement de ce signal.

Exemple

openlong : mm(20) crossup close;
closelong : mm(20) crossdown low;

Le code ci-dessus représente une syntaxe de base pour une stratégie simple : j'achète si la moyenne mobile à 20 jours passe au-dessus du cours de clôture. Je revends si la moyenne mobile 20 passe sous le plus bas du jour.

Vous pouvez néanmoins avoir en même temps une stratégie d'achat-vente classique ainsi qu'une stratégie de vente à découvert comme dans l'exemple ci-dessous :

openlong : mm(20) crossup close;
closelong : mm(20) crossdown low;
openshort : rsi > 70;
closeshort : momentum < 0;

Nous avons ici ajouté deux signaux complémentaires : vendre à découvert si le RSI dépasse le niveau des 70 et racheter si le momentum est inférieur à 0.

Syntaxe des conditions des signaux

La forme des conditions d'un signal est toujours la même : une fonction - un opérateur de comparaison - une fonction (ou une valeur)

Les fonctions sont les mots clefs du langage : mm() pour une moyenne mobile, close pour le cours de clôture, rsi() pour un indicateur RSI, etc.

Les opérateurs de comparaison sont les suivants :

= égalité
> supérieur
< inférieur
crossup croisement en hausse
crossdown croisement en baisse

Les fonctions du langage

Les fonctions nécessitent parfois des paramètres, souvent ils sont optionnels. Les paramètres s'indiquent entre parenthèses à la suite du nom de la fonction. Le tableau ci-dessous indique les fonctions disponibles actuellement. Attention car le langage évolue souvent et de nouvelles fonctions sont ajoutées régulièrement.

Cours et indicateurs

Fonction Paramètres Description Exemples
open aucun Cours d'ouverture open
high aucun Cours le plus haut high
low aucun Cours le plus bas low
close aucun Cours de clôture close
mm(periode, source) période (obligatoire) : période de la moyenne mobile
source (optionnel) : source du calcul de la moyenne
Calcule une moyenne mobile arithmétique mm(20) : moyenne mobile 20 jours
mm(20, "h") : même chose mais calculée sur les plus hauts
mme(periode, source) période (obligatoire) : période de la moyenne mobile
source (optionnel) : source du calcul
Calcule une moyenne mobile exponentielle mme(20) : moyenne mobile 20 jours
mme(20, "h") : même chose mais calculée sur les plus hauts
mmp(periode, source) période (obligatoire) : période de la moyenne mobile
source (optionnel) : source du calcul
Calcule une moyenne mobile pondérée mmp(20) : moyenne mobile 20 jours
mmp(20, "h") : même chose mais calculée sur les plus hauts
mmt(periode, source) période (obligatoire) : période de la moyenne mobile
source (optionnel) : source du calcul
Calcule une moyenne mobile triangulaire mmt(20) : Moyenne triangulaire 20 jours
mmt(20, "h") : même chose mais calculée sur les plus hauts
hull(periode, source) période (obligatoire) : période de la moyenne mobile de Hull
source (optionnel) : source du calcul de la moyenne
Calcule une moyenne mobile de Hull hull(15) : moyenne mobile de Hull 15 jours
hull(15, "h") : même chose mais calculée sur les plus hauts
dema(periode, source) période (obligatoire) : période de la moyenne mobile
source (optionnel) : source du calcul
Calcule une double moyenne mobile exponentielle dema(20) : Dema sur 20 jours
dema(20, "h") : même chose mais calculée sur les plus hauts
tema(periode, source) période (obligatoire) : période de la moyenne mobile
source (optionnel) : source du calcul
Calcule une triple moyenne mobile exponentielle tema(20) : Tema sur 20 jours
tema(20, "h") : même chose mais calculée sur les plus hauts
linearc(periode, source) période (obligatoire) : période de calcul
source (optionnel) : source du calcul
Calcule une courbe de regression linéaire linearc(20) : Courbe sur 20 jours
linearc(20, "l") : même chose mais calculée sur les plus bas
rsi(periode, source) période (optionnel) : période du RSI (14, par défaut)
source (optionnel) : source du calcul
Calcule un RSI rsi : RSI 14 jours
rsi(12) : RSI 12 jours
rsi(10, "o") : RSI 10 jours calculé sur les cours d'ouverture
macd(p1, p2, p3, source) p1 (optionnel) : période 1 de la MACD (12, par défaut)
p2 (optionnel) : période 2 de la MACD (26, par défaut)
p3 (optionnel) : période 3 de la MACD (9, par défaut)
source (optionnel) : source du calcul
Calcule une MACD macd : MACD classique
macd(10, 20, 9) : MACD de périodes 10, 20 et 9
macd(10, 20, 9, "h") : La même mais calculée sur les plus hauts
macds(p1, p2, p3, source) p1 (optionnel) : période 1 de la MACD (12, par défaut)
p2 (optionnel) : période 2 de la MACD (26, par défaut)
p3 (optionnel) : période 3 de la MACD (9, par défaut)
source (optionnel) : source du calcul
Ligne de signal d'une MACD macds : Signal de MACD classique
macds(10, 20, 9) : Signal de MACD de périodes 10, 20 et 9
stoch(p1, p2, p3, source) p1 (optionnel) : période 1 du Stochastique (14, par défaut)
p2 (optionnel) : période 2 du Stochastique (3, par défaut)
p3 (optionnel) : période 3 du Stochastique (3, par défaut)
source (optionnel) : source du calcul
Calcule un Stochastique stoch : Stochastique classique
stoch(12, 5, 5) : Stochastique de périodes 12, 5 et 5
stoch(12, 5, 5, "h") : Le même mais calculé sur les plus hauts
stochs(p1, p2, p3, source) p1 (optionnel) : période 1 du Stochastique (14, par défaut)
p2 (optionnel) : période 2 du Stochastique (3, par défaut)
p3 (optionnel) : période 3 du Stochastique (3, par défaut)
source (optionnel) : source du calcul
Ligne de signal du Stochastique stochs : Stochastique classique
stochs(12, 5, 5) : Signal de Stochastique de périodes 12, 5 et 5
momentum(periode, source) période (optionnel) : période (12, par défaut)
source (optionnel) : source du calcul
Calcule un Momentum momentum : Momentum 12 jours
momentum(15) : Momentum 15 jours
momentum(15, "o") : Momentum 10 jours calculé sur les cours d'ouverture
bollinger(type, période, écart-type, source) type (obligatoire) : "inf" pour la bande inférieure et "sup" pour la bande supérieure
période (optionnel) : période (20, par défaut)
écart-type (optionnel) : période (2, par défaut)
source (optionnel) : source du calcul
Calcule une bande de Bollinger, inférieure ou supérieure bollinger("inf") : Bande de Bollinger inférieure
bollinger("sup") : Bande de Bollinger supérieure
bollinger("inf", 10, 1) : Bande de Bollinger inférieure, de période 10 jours et d'écart-type 1
cci(periode, source) période (optionnel) : période du CCI (20, par défaut)
source (optionnel) : source du calcul
Calcule un CCI cci : CCI 14 jours
cci(12) : CCI 20 jours
cci(10, "o") : CCI 10 jours calculé sur les cours d'ouverture
roc(periode, source) période (optionnel) : période du ROC (10, par défaut)
source (optionnel) : source du calcul
Calcule un ROC roc : ROC 10 jours
roc(15) : ROC 15 jours
trix(periode, source) période (optionnel) : période du TRIX (10, par défaut)
source (optionnel) : source du calcul
Calcule un TRIX trix : TRIX 10 jours
trix(12) : TRIX 12 jours
dmip(periode) période (optionnel) : période du DMI (14, par défaut) Calcule un DI+ (DMI) dmip : DI+ 14 jours
dmip(12) : DI+ 12 jours
dmim(periode) période (optionnel) : période du DMI (14, par défaut) Calcule un DI- (DMI) dmim : DI- 14 jours
dmim(12) : DI- 12 jours
supertrend(periode, coefficient) période (optionnel) : période de calcul (10, par défaut)
coefficient (optionnel) : 3, par défaut
Calcule un Supertrend supertrend : supertrend standard
supertrend(15, 5) : supertrend de période 15 jours et coefficient 5
kijun(periode 1, période 2) période 1 (optionnel) : 26, par défaut
période 2 (optionnel) : 9, par défaut
Calcule un Kijun-Sen (Ichimoku) kijun : standard
kijun(19, 6) : avec périodes personnalisées
tenkan(periode 1, période 2) période 1 (optionnel) : 26, par défaut
période 2 (optionnel) : 9, par défaut
Calcule un Tenkan-Sen (Ichimoku) tenkan : standard
tenkan(19, 6) : avec périodes personnalisées
chikou(periode 1, période 2) période 1 (optionnel) : 26, par défaut
période 2 (optionnel) : 9, par défaut
Calcule un Chikou-Span (Ichimoku) chikou : standard
chikou(19, 6) : avec périodes personnalisées
senkoua(periode 1, période 2) période 1 (optionnel) : 26, par défaut
période 2 (optionnel) : 9, par défaut
Calcule un Senkou-A (Ichimoku) senkoua : standard
senkoua(19, 6) : avec périodes personnalisées
senkoub(periode 1, période 2) période 1 (optionnel) : 26, par défaut
période 2 (optionnel) : 9, par défaut
Calcule un Senkou-B (Ichimoku) senkoub : standard
senkoub(19, 6) : avec périodes personnalisées

Remarque 1 : Lorsque les paramètres d'une fonction sont optionnels, vous pouvez omettre les parenthèses. Ainsi, si vous utilisez les paramètres par défaut : rsi(14), rsi() ou rsi sont équivalents.

Remarque 2 : Le paramètre "source" qui est optionnel, peut prendre 4 valeurs : "o" (cours d'ouverture), "l" (cours le plus bas), "h" (cours le plus haut) et "c" (cours de clôture, qui est le choix par défaut), il doit toujours être indiqué entre guillemets.

Conditions de recherche

Certaines instructions, liées à la détection de configurations précises, ont une syntaxe un peu différente. En effet, leur opérateur de comparaison est toujours le signal égal (=) suivi de la condition "true", pour "vrai". Dans ces cas, le signal est détecté si la condition est rencontrée (vrai).

Fonction Paramètres Description Exemple
gap("type") type (obligatoire) : "up" ou "down" Recherche les gaps haussiers ("up") ou baissiers ("down") gap("down") = true
engulfing("type") type (obligatoire) : "up" ou "down" Recherche les englobantes haussières ("up") ou baissières ("down") engulfing("down") = true
harami("type") type (obligatoire) : "up" ou "down" Recherche les harami haussiers ("up") ou baissiers ("down") harami("down") = true
newhigh(periode) période (obligatoire) Recherche les nouveaux plus hauts atteints par les cours sur une période donnée newhigh(30) = true : recherche les plus hauts sur 30 jours
newlow(periode) période (obligatoire) Recherche les nouveaux plus bas atteints par les cours sur une période donnée newlow(10) = true : recherche les plus bas sur 10 jours

Les paramètres de la simulation

Par défaut, la simulation est réalisée avec les paramètres suivants :

- Le capital est de 100 000 euros
- Les gains ne sont pas réinvestis
- Il n'y a pas de stops de protection
- Il n'y a pas de frais de transactions

Vous pouvez bien entendu indiquer au simulateur vos propres paramètres avec les fonctions suivantes :

Fonction Paramètres Description Exemple
capital(euros) euros (obligatoire) : montant du capital de départ Fixe le capital de départ de votre portefeuille capital(5000);
stoploss(pourcent) pourcent (obligatoire) : niveau en pourcentage La position sera soldée dès que la perte atteindra le niveau en pourcentage indiqué stoploss(5) : si la perte de la position en cours atteint 5%, la postion est fermée
targetprofit(pourcent) pourcent (obligatoire) : niveau en pourcentage La position sera soldée dès que le bénéfice atteindra le niveau en pourcentage indiqué targetprofit(3) : si le gain de la position en cours atteint 3%, la postion est fermée
pyramiding(condition) condition true ou false (obligatoire) Si "true", les gains sont réinvestis", si "false" ils ne le sont pas (fonctionnement par défaut) pyramiding(true) : les gains sont réinvestis
fees(euros) euros (obligatoire) : niveau des frais en euros Détermine les frais de transactions en euros fees(5) : chaque ordre coutera 5 euros

Exemples

fees(4.5);
stoploss(5);
targetprofit(6);
pyramiding(true);
capital(50000);

Dans l'exemple ci-dessus on fixe les frais à 4,50€ par transaction, un stop de protection à 5% de perte, on prend nos profits dès 6% de gain, on réinvestit ces gains à chaque opération et le capital de départ est fixé à 50000 euros.

Chainer plusieurs conditions

Dans les exemples que nous avons vus jusqu'à présent, il n'y avait qu'une seule condition pour générer les signaux. Vous avez la possibilité de réaliser des conditions plus complexes en les enchainant. Deux opérateurs sont à votre disposition : "&&" pour une condition "ET" et "||" pour une condition "OU".

Exemples

# Achat si la moyenne mobile 20 passe en hausse la moyenne mobile 50 ET que le rsi à 14 jours est sous 50 points
openlong : mm(20) crossup mm(50) && rsi(14) < 50;

# Achat si le RSI passe sous 30 points OU qu'il y a un gap baissier
openlong : rsi crossdown 30 || gap("down") = true;