Partie 1 : Présentation, utilisation de base, indicateurs principaux et secondaires
Partie 2 : Comparaison de valeurs, détection de figures, paramètres généraux et plein écran
Partie 3 : Les différents tracés et la sauvegarde de modèles personnalisés
Partie 4 : Tests de stratégies, module de backtesting
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.
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.
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.
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.
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.
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. |
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
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 :
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.
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 :
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 |
bollb(periode, source) |
période (optionnel) : période du Bollinger %B (20, par défaut) source (optionnel) : source du calcul |
Calcule un Bollinger %B |
bollb : Bollinger %B 20 jours bollb(12) : Bollinger %B 12 jours bollb(10, "o") : Bollinger %B 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 12 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 |
sar(point extrême, facteur accélération) |
point extrême (optionnel) : 0.20 par défaut facteur accélération (optionnel) : 0.02 par défaut |
Calcule un SAR Parabolique | sar : SAR standard |
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.
Si le paramètre "source" est présent, les autres paramètres de la fonction doivent l'être aussi. Par exmple pour un indicateur RSI calculé sur les cours d'ouverture on écrira rsi(14, "o") et non pas rsi("o").
Avec la notation crochets [ et ], vous pouvez accéder aux jours précédents sur le calcul d'un indicateur. Exemple pour avoir le cours de clôture de la veille last[1] ou celui d'il y a 5 jours last[5]
Même chose pour les indicateurs mm(20)[3] renvoit la valeur de la moyenne mobile il y a 3 jours.
L'exemple ci-dessous passera acheteur si le rsi est passé sous le niveau 30 il y a 2 jours.
openlong : rsi(14)[2] < 30
Important : la notation des crochets doit apparaître en dernier et après d'éventuels paramètres, ceci est correct macd(12,26,9)[1] mais pas ceci macd[1](12,26,9)
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 |
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
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.
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