Guide du développeur ProBacktest 1.0c édition 2004
SOMMAIRE Présentation du ProBacktest...2 Commandes spécifiques au ProBacktest...3 Simulation de la passation d ordres...3 Simulation de stop-loss gérés par programmation...7 Stratégies de backtest...8 Variables d état...10 Variables de suivi de position...12 Accès aux barres relativement au dernier ordre...14 Performance du dernier trade réalisé...16 Exemples...17 PennyStocks...17 Entrée optimisée...19 Tendance détectée sur les prix...21 Sell in may and go away!...22 Break out Intraday...23 1
Présentation du ProBacktest ProBacktest est l outil dédié au backtesting de ProRealTime. Sa syntaxe est analogue à celle du ProBuilder. Cela lui confère une compatibilité qui permet par exemple de poser des conditions sur les indicateurs crées à l aide du ProBuilder. Il s agit donc d un langage de type BASIC, avec lequel vous allez pouvoir construire vos systèmes de trading automatisés susceptibles de s appliquer aux cotations de n importe quel instrument coté dans ProRealTime. Les cotations sont soit :? le cours d ouverture de chaque barre? le cours de clôture de chaque barre? le plus haut de chaque barre? le plus bas de chaque barre? le nombre de titres échangés. Les barres sont celles paramétrables dans l interface graphique. Les backtests développés sous ProBacktest sont représentés à l écran par des flèches qui indiquent les niveaux d achat/vente correspondants à votre système. Par ailleurs, ProBacktest calcule l equity curve qui vous indique la performance de votre système. L equity curve apparaît comme un indicateur au-dessus des cours. L interpréteur ProBacktest évalue les données de chaque barre de prix depuis la plus ancienne jusqu à la plus récente, et exécute la formule développée dans le langage afin de déterminer les ordres éventuels à simuler sur chaque barre. 2
Commandes spécifiques au ProBacktest Simulation de la passation d ordres Un ordre est une commande qui précise : le sens de la transaction à simuler, le nombre de titres en jeu, les modalités d exécution, ainsi que la date d exécution. Un ou plusieurs de ces paramètres peut parfois être omis suivant le contexte. Sens de la transaction Buy, sell BUY count SHARES (AT MARKET AT price LIMIT AT price STOP) Cette commande rentre sur le marché à l achat. Si le portefeuille de backtest est court au moment où l ordre doit être exécuté, les positions courtes sont soldées, afin que la position résultante corresponde bien à count titres longs. Si le portefeuille de backtest est déjà long au moment où l ordre doit être exécuté, les règles de pyramidage s appliquent suivant les critères que vous définissez dans la rubrique Money Management. SELL [count SHARES] (AT MARKET AT price LIMIT AT price STOP) Cette commande sort du marché les positions longues. Si le portefeuille de backtest est liquide ou court au moment où l ordre doit être exécuté, rien ne se passe. S il est long, count positions sont soldées. Même lorsque count est supérieur au nombre de titres détenus, on ne passe pas court (ou short) sur le marché, par contre les positions longues sont vendues. Si count est omis, tous les titres détenus à l achat sont vendus. Sellshort, exitshort SELLSHORT count SHARES (AT MARKET AT price LIMIT AT price STOP) Cette commande rentre sur le marché à la vente. Si le portefeuille de backtest est long au moment où l ordre doit être exécuté, les positions longues sont soldées, afin que la position résultante corresponde bien à count titres courts. Si le portefeuille de backtest est déjà court au moment où l ordre doit être exécuté, les règles de pyramidage s appliquent suivant les critères que vous définissez dans la rubrique Money Management. EXITSHORT [count SHARES] (AT MARKET AT price LIMIT AT price STOP] Cette commande sort du marché les positions courtes. Si le portefeuille de backtest est liquide ou long au moment où l ordre doit être exécuté, rien ne se passe. S il est court, count positions sont rachetées. Même lorsque count est supérieur au nombre de titres vendus, on ne passe pas long sur le marché, par contre les positions courtes sont rachetées. Si count est omis, tous les titres détenus en vente à découvert sont rachetés. 3
Nombre de titres Le nombre de titres peut être exprimé en unités de cash, en fraction du capital, ou encore en fraction des liquidités disponibles.? SHARES nombre de titres? CASH montant de la transaction en unités de cash (comme ou $)? %CAPITAL montant de la transaction en fraction du capital? %LIQUIDITY montant de la transaction en fraction des liquidités Exemple Cash REM Achat pour 1000 (pour un titre côté en euros) BUY 1000 Cash AT MARKET Exemple %Capital REM Achat avec 70% de la valorisation courante du portefeuille BUY 70 %Capital AT MARKET Exemple %Liquidity REM Achat avec 40% des liquidités disponibles BUY 40 %Liquidity AT MARKET Remarque : Pour les ordres de sortie du marché (SELL, EXITSHORT), le nombre de titres est facultatif. REM Solde toutes les positions longues SELL AT MARKET 4
Modalités d exécution Il existe trois types d ordres : au prix du marché, à la meilleure limite et à seuil de déclenchement.? AT MARKET au prix du marché? AT price LIMIT à la meilleure limite? AT price STOP à seuil de déclenchement Exemple AT MARKET REM Achat de 100 titres au prix du marché BUY 100 Shares AT MARKET Exemple LIMIT REM Achat de 100 titres au cours limite de 15.45 BUY 100 Shares AT 15.45 LIMIT Exemple STOP REM Achat de 100 titres à seuil de déclenchement pour un seuil de 16.18 BUY 100 Shares AT 16.18 STOP 5
Date d exécution Par défaut, chaque ordre s exécute sur la barre suivante. Cependant, dans le cas d ordres au prix du marché, il est possible d avancer ou de reculer la date d exécution à l aide d une des commandes suivantes :? ThisBarOnClose à la clôture de la barre courante? NextBarOpen à l ouverture de la barre suivante (ordre par défaut)? NextBarClose à la clôture de la barre suivante?? TodayOnClose à la clôture de la journée (utilisé en intraday)? TomorrowOpen à l ouverture de la journée suivante (utilisé en intraday)? TomorrowClose à la clôture de la journée suivante (utilisé en intraday) Exemple ThisBarOnClose REM Achat de 100 titres à la clôture de la barre courante BUY 100 Shares AT MARKET ThisBarOnClose Exemple NextBarClose REM Achat de 100 titres à la clôture de la barre suivante BUY 100 Shares AT MARKET NextBarClose Exemple TodayOnClose REM Achat de 100 titres à la clôture de la journée courante (intraday) BUY 100 Shares AT MARKET TodayOnClose Exemple TomorrowOpen REM Achat de 100 titres à l ouverture du lendemain (intraday) BUY 100 Shares AT MARKET TomorrowOpen Exemple TomorrowClose REM Achat de 100 titres à la clôture du lendemain (intraday) BUY 100 Shares AT MARKET TomorrowClose 6
Simulation de stop-loss gérés par programmation Set Stop SET STOP price Cette commande vous permet d ajouter un stop dont vous gérez vous-même la formule. Veuillez toutefois noter que 4 types de stops classiques peuvent être simulés dans l interface de ProBacktest sans avoir à les programmer. Exemple Set Stop REM Un stop suiveur IF close > AVERAGE[30] AND NOT OnMarket THEN BUY 100 Shares AT MARKET REM Détermine l écart entre le cours d exécution effectif et le cours idéal Spread = openofnextbar low REM Détermine le cours le +haut depuis l entrée sur le marché Haut = openofnextbar REM Stop suiveur qui maintient un écart constant avec le cours le plus haut IF OnMarket THEN Haut = MAX(Haut, high) SET STOP (Haut Spread) 7
Stratégies de backtest AS Les commandes et les variables du ProBackTest sont associées à une ou plusieurs stratégies. Il est possible d en définir autant que l on veut. Si vous ne spécifiez pas de noms de stratégie, ProBackTest n en crée qu une implicitement et tous vos ordres s y rattachent. Si vous définissez plusieurs stratégies, il faut les nommer. Ainsi, lorsque vous saisissez une commande ou une variable en nommant le nom de votre stratégie, cette commande ou variable s applique uniquement à la stratégie en question. A contrario, si vous ne spécifiez pas de stratégie lors de la saisie de votre commande ou variable, elle s applique à l ensemble des stratégies. Pour définir une stratégie, il suffit d ajouter le mot clé AS et le nom de celle-ci à la suite de votre ordre : Exemple ordres liés à une seule stratégie REM Stratégie moyenne mobile IF close > AVERAGE[30](close) AND NOT OnMarket THEN BUY 100 Shares AT MARKET AS «moyenne mobile» Ainsi, toutes les considérations relatives à la position en cours (liquide, court, long) sont faites dans le contexte propre de la stratégie. Vous pouvez être court globalement, mais pas du point de vue de la stratégie en cours. Mais dans l exemple ci-dessous (sans stratégie spécifiée): 8
Exemple ordres liés à toutes les stratégies REM Ordre envoyé sur toutes les stratégies simultanément SELL 50 Shares AT MARKET L ordre est en fait répercuté sur toutes les stratégies. Si vous en avez deux, cela déclenchera en fait la vente de 2 * 50 titres = 100 titres. Cela peut s avérer utile pour solder toutes les positions en cours à l aide d une seule instruction. Ces principes s appliquent aussi à l utilisation des variables de backtesting en dehors des commandes d achat et de vente. Exemple EntryIndex, stratégies REM Stratégie moyenne mobile IF close > AVERAGE[30](close) AND NOT OnMarket THEN BUY 100 Shares AT MARKET AS «moyenne mobile» REM Vente sur cassure du plus bas de la barre d entrée IF close < low[barindex - EntryIndex AS «moyenne mobile»] THEN SELL AT MARKET AS moyenne mobile 9
Variables d état OnMarket, LongOnMarket, ShortOnMarket Ces variables indiquent à tout moment l état du portefeuille de backtest. Celui-ci peut être liquide, acheteur ou vendeur (à découvert). Description Ces constantes sont d une grande importance, car elles renseignent sur l état actuel du portefeuille. Généralement, à un signal donné un système réagit différemment suivant que les positions en cours soient longues, courtes ou liquides. En effet, vendre à découvert, ou vendre une position longue sont deux choses bien différentes. Dans un cas, on initie une position, dans l autre on y met fin. Les conditions associées à l exécution d ordres sont généralement variées. Par exemple on initie une position lorsqu un signal nous indique la naissance d une tendance, et on y met fin lorsqu un signal inverse apparaît ou que le money management nous y incite. Exemple OnMarket REM Achat sur cassure de moyenne mobile Signal = close > AVERAGE[30](close) REM Le signal suffit à rentrer sur le marché IF NOT OnMarket THEN IF Signal THEN BUY 10 SHARES AT MARKET REM Nous avons deux signaux de sortie 10
IF OnMarket THEN REM La ligne ci-dessous génère un signal de sortie sur cassure d un plus bas SignalSortie = close < LOWEST[10](low[1]) REM Le signal de sortie final est double (non symétrique par rapport à l entrée) IF NOT Signal OR SignalSortie THEN SELL 10 SHARES AT MARKET 11
Variables de suivi de position CountOfLongShares, CountOfShortShares, CountOfPosition Représentent respectivement :? le nombre de titres joués à la hausse? le nombre de titres joués à la baisse? le nombre d ordres accumulés dans le même sens (si le pyramidage est sélectionné) Description Ces constantes offrent une information plus précise par rapport aux constantes d état. Non seulement, elles permettent de savoir si on est sur le marché, mais en plus elles comptabilisent le nombre de titres accumulés, ainsi que le nombre d ordres. On peut donc affiner les prises de décision. Non seulement on va pouvoir indiquer des conditions différentes pour l entrée et la sortie du marché, mais en plus on va pouvoir gérer les accumulations (à la hausse ou à la baisse). Exemple CountOfLongShares, CountOfPosition REM Achat sur cassure de moyenne mobile Signal = close > AVERAGE[30](close) REM Le signal suffit à rentrer sur le marché IF NOT OnMarket THEN IF Signal THEN BUY 10 SHARES AT MARKET REM Accumulation jusque 3 fois tant que le signal est valide 12
IF OnMarket THEN REM La ligne ci-dessous génère un signal de sortie sur cassure d un plus bas SignalSortie = close < LOWEST[10](low[1]) REM Le signal de sortie final est double (non symétrique par rapport à l entrée) IF NOT Signal OR SignalSortie THEN SELL CountOfLongShares SHARES AT MARKET REM Accumulation des positions jusque 3 fois s il n y a pas de signal de sortie ELSIF CountOfPosition < 3 THEN BUY 10 SHARES AT MARKET Remarques : Pour que l accumulation des ordres soit possible, l option «Cumuler les positions» doit être activée. Cette option se trouve dans la section «Gestion Capital» de la fenêtre ProBacktest. Lorsque l option «1 stop pour l ensemble des positions» est activée, toutes les positions sont fusionnées en une seule. Dans ce cas, la variable CountOfPostion ne peut pas dépasser le chiffre 1. 13
Accès aux barres relativement au dernier ordre EntryIndex Renvoie l index de la barre sur laquelle a été exécuté le dernier ordre. Description Cette constante permet par exemple d exploiter les caractéristiques du chandelier sur lequel on est entré sur le marché, afin d ajuster les stop. Exemple EntryIndex REM Achat sur cassure de moyenne mobile IF NOT OnMarket THEN IF close > AVERAGE[30](close) THEN BUY 100 %CAPITAL AT MARKET REM Sortie sur cassure du plus bas du chandelier sur lequel on est entré IF OnMarket THEN SELL AT low[barindex - EntryIndex] STOP EntryQuote Représente la valeur du cours d exécution du dernier ordre. Description Cette constante permet par exemple de calculer un stop basé sur le cours d entrée du dernier ordre simulé 14
Exemple EntryQuote REM Achat sur cassure de moyenne mobile IF NOT OnMarket THEN IF close > AVERAGE[30](close) THEN BUY 100 %CAPITAL AT MARKET REM Sortie sur cassure du cour où s est réalisé l ordre d achat IF OnMarket THEN SELL AT EntryQuote STOP 15
Performance du dernier trade réalisé PreviousTrade(n) Renvoie la performance en % du n ième trade antérieur réalisé. Description Cette constante permet d évaluer par exemple si le dernier trade réalisé était gagnant ou perdant. Exemple PreviousTrade REM Achat sur croisement de moyennes mobiles IF AVERAGE[10] CROSSES OVER AVERAGE[30] THEN REM Ne trade pas si le trade précédent était perdant IF PREVIOUSTRADE(1) > 0 THEN Interdiction = 0 IF NOT Interdiction THEN BUY 100 %CAPITAL AT MARKET Interdiction = 0 REM Vente sur croisement de moyennes mobiles IF LONGONMARKET THEN IF AVERAGE[10] CROSSES UNDER AVERAGE[30] THEN SELL AT MARKET Interdiction = 1 16
Exemples PennyStocks Description Nous vous présentons ici un système long (uniquement des positions à l achat) dont le but est de générer le moins de signaux possibles et de profiter d opportunités intéressantes. Il comporte donc un «filtre» qui se base sur la valeur absolue des cours, en l occurrence le système se concentre sur les «penny stocks» (dont le cours est inférieur à 10 ) Les signaux d entrée sont classiques : sur un nouveau plus haut lorsqu une moyenne mobile confirme la tendance. Le signal de sortie est donné par une non moins classique cassure de moyenne mobile (sauf qu ici c est une moyenne mobile des plus bas pour limiter les faux signaux). L idée est de profiter pleinement des quelques opportunités qui se présentent, de laisser courir les profits le plus possible, quitte à perdre un peu plus sur la sortie et sur les mauvais trades. Attention : ce système peut s avérer non rentable. Nous vous le présentons à titre d exemple car il a des vertus pédagogiques vis-à-vis de la programmation de systèmes. Vous serez certainement amené à l optimiser voire à en modifier les conditions d entrée et de sortie. Exemple PennyStocks REM CONDITIONS D'ACHAT REM le +haut du jour dépasse le +haut des 10 jours précédents ha1 = high > highest[10](high[1]) REM le +haut du jour est supérieur à MM13 ha2 = high > exponentialaverage[13](close) REM le cours est inférieur à 10 ha3 = close < 10 17
REM clôture supérieure à l'ouverture ha4 = close > open IF ha1 AND ha2 AND ha3 AND ha4 THEN BUY 70 %capital AT MARKET REM CONDITION DE SORTIE REM le +bas croise MM30 des plus bas à la baisse IF low CROSSES UNDER exponentialaverage[30](low) THEN SELL AT MARKET 18
Entrée optimisée Description Nous vous présentons ici un système long (uniquement des positions à l achat) qui s attache à n entrer sur le marché que sur un repli significatif des cours à l intérieur d une tendance haussière. La tendance est déterminée par la moyenne mobile pondérée à 26 barres. Afin de rentrer sur le «meilleur» repli en terme de rentabilité/risque, nous optons ici pour l indicateur «Parabolic SAR». Il agit comme un suiveur de tendance, qui nous permettre en plus de trouver nos points d entrée. En effet, lorsque l indicateur est sous les cours, il offre la double propriété de confirmer le trend haussier, et de nous indiquer jusqu où les cours peuvent refluer sans inverser la tendance. Nous achèterons sur ces niveaux (à cours limite). Le risque est de voir ce niveau cassé. Cependant, en tenant compte de la condition sur la moyenne mobile pondérée à 26 barres, nous avons une bonne assurance pour juger de la tendance en cours. Et comme chacun sait, une tendance a beaucoup plus de chance de se poursuivre que de s inverser. Nous misons làdessus. Bien sûr, toute cassure de cette moyenne mobile invaliderait notre scénario, et nous sortirions alors sans tarder. Attention : ce système peut s avérer non rentable. Nous vous le présentons à titre d exemple car il a des vertus pédagogiques vis-à-vis de la programmation de systèmes. Vous serez certainement amené à l optimiser voire à en modifier les conditions d entrée et de sortie. 19
Exemple Entrée optimisée REM Parabolic SAR en suiveur de tendance suiveur = SAR REM la clôture est-elle supérieure à la moyenne mobile pondérée à 26 semaines? ha1 = close > weightedaverage[26](close) REM le Parabolic SAR est-il sous les cours? ha2 = close > suiveur IF ha1 THEN IF ha2 THEN BUY 80 %capital AT suiveur LIMIT ELSE SELL AT MARKET 20
Tendance détectée sur les prix Description A présent, voici un système long/court qui est investi en permanence : soit à l achat, soit à la vente à découvert. Le but du jeu est d inverser la position pour profiter des mouvements de panique que ce soit à l achat ou a la vente. Afin de détecter ces mouvements, on se base sur les prix. La variation des prix indique la tendance. Nous supposerons que toute variation plus forte que la moyenne est un signe précurseur d une tendance à venir. Le money management est assez simple ici : 70% du capital joué à la hausse, et 40% à la baisse. On prends moins de risques quand on joue à la baisse car les mouvements sont généralement bien plus dévastateurs. Cela évite aussi de se retrouver dans une situation trop périlleuse en cas de mouvement adverse (la perte potentielle lors d une vente à découvert est théoriquement illimitée!) Attention : ce système peut s avérer non rentable. Nous vous le présentons à titre d exemple car il a des vertus pédagogiques vis-à-vis de la programmation de systèmes. Vous serez certainement amené à l optimiser voire à en modifier les conditions d entrée et de sortie. Exemple Tendance détectée sur les prix REM détermine la variation moyenne des cours d une journée à l autre avt = AverageTrueRange[20](close) REM critère d achat : la hausse est plus forte que la variation moyenne (=panique à l achat) IF close > close[1] + avt THEN BUY 70 %capital AT MARKET REM critère de vente : la baisse est plus forte que la variation moyenne (=panique à la vente) IF close < close[1] - avt THEN SELLSHORT 40 %capital AT MARKET 21
Sell in may and go away! Description Il est aussi possible de concevoir des systèmes qui font abstraction du graphique des cours, mais qui se basent plutôt sur des données statistiques. Une anomalie statistique bien connue a donné naissance au dicton «Sell in may and go away!». Une étude approfondie des marchés sur de longs historiques montre en effet, que ceux-ci réalisent leurs pires performances entre le mois de mai et le mois de septembre compris. Ce système est conçu pour fonctionner en daily, voire en weekly. (les résultats sont quasiment les mêmes) Il offre une équity curve de plutôt bonne qualité car il s oblige à alterner achats et ventes à découvert quels que soient les pièges tendus par le marché (et avec statistiquement un bon timing!). Cela limite donc l effet des contre-tendances trop prolongées. Attention : ce système peut s avérer non rentable. Nous vous le présentons à titre d exemple car il a des vertus pédagogiques vis-à-vis de la programmation de systèmes. Vous serez certainement amené à l optimiser voire à en modifier les conditions d entrée et de sortie. Exemple Tendance détectée sur les mois (!!) REM d après le titre. Bah on va vendre en mai! IF Month = 5 THEN SELLSHORT 50%capital AT MARKET REM c est pas dans le titre, mais une fois en octobre on a généralement touché le fond REM et avec les fêtes qui approchent, la bourse ne peut plus tomber! ELSIF Month = 10 THEN BUY 50%capital AT MARKET 22
Break out Intraday Description Maintenant, voici un exemple célèbre de système intraday qui consiste à jouer les cassures de supports/résistances déterminés par les deux premières barres de la journée. La sortie se fait à la clôture du jour. Attention : ce système peut s avérer non rentable. Nous vous le présentons à titre d exemple car il a des vertus pédagogiques vis-à-vis de la programmation de systèmes. Vous serez certainement amené à l optimiser voire à en modifier les conditions d entrée et de sortie. Exemple Break out intraday REM Cloture de la seconde barre (indice 1) IF intradaybarindex = 1 THEN plushaut = Highest[2](high) plusbas = Lowest[2](low) REM Achat / Vente sur cassure entre la 3e barre et 16:00:00 (heure locale) IF intradaybarindex > 1 AND Time < 160000 THEN REM Cassure de résistance IF close > plushaut THEN BUY 70%capital AT MARKET SELL AT MARKET TodayOnClose REM Cassure de support ELSIF close < plusbas THEN SELLSHORT 70%capital AT MARKET EXITSHORT AT MARKET TodayOnClose 23