Aller au contenu
← Tous les articles
Article

Backtest d’indicateurs techniques sur plusieurs tickers avec Python

Écouter en version balado

Ne vous fiez pas à un seul ticker · 2:13 · voix synthétiques, script rédigé avec l’IA

Transcription

Sylvie : Imaginez une règle de trading qui rapporte près de deux cents pour cent sur une crypto, alors que la simple détention perd environ quatre-vingts. Bonne règle ?

Thierry : Ça a l'air génial. Mais je parie que ce n'est pas si simple.

Sylvie : Non. Dans cet article, Antoine fait passer son moteur BatchBacktesting à l'échelle : beaucoup de tickers, actions et cryptos, deux stratégies, puis une lecture honnête des classements.

Thierry : Pourquoi autant de tickers ?

Sylvie : Parce qu'un backtest sur un seul titre flatte toujours. Une grille répond à d'autres questions : la règle ne marche-t-elle que sur un symbole héroïque ? Les désastres se concentrent-ils dans un secteur ou une période ? Les cryptos dominent-elles parce que la volatilité n'a pas de limite dans la simulation ?

Thierry : Et les deux stratégies ?

Sylvie : Un croisement d'E M A : achat quand la moyenne sur vingt périodes passe au-dessus de celle sur quatre-vingts, avec un stop loss de dix pour cent et une prise de profit de vingt-cinq pour cent. Et un croisement MACD, sans stop ni prise de profit. Les deux utilisent backtesting point py.

Thierry : Et le classement ?

Sylvie : Le meilleur résultat EMA, c'est BTCBUSD, environ deux cent quatre-vingt-quatorze pour cent. Le pire, BTTBUSD, à moins quatre-vingt-dix-neuf virgule neuf pour cent. Compagnies aériennes et croisières figurent parmi les perdants.

Thierry : Et cette crypto qui bat le buy-and-hold ?

Sylvie : OMGUSD. Environ deux cents pour cent avec la règle, alors que le buy-and-hold perdait autour de quatre-vingts. La règle a gagné en restant vendeuse pendant l'effondrement. BTCBUSD, elle, a monté dans les deux cas, ce qui en dit plus sur la période que sur la règle.

Thierry : Donc un gros rendement peut venir de la chance ou d'une longue hausse.

Sylvie : Exactement. Et avant de dire que MACD bat EMA, il faut comparer le rendement médian sur tous les tickers, pas seulement les cinq premiers.

Thierry : Alors c'est utile à quoi ?

Sylvie : À des tests de fumée : trouver où une règle casse, pas où placer son capital. Ce n'est pas un conseil financier, et les frais, les suspensions et la qualité des données comptent.

Thierry : L'article complet a les graphiques et le code.

Backtest d’indicateurs techniques sur plusieurs tickers avec Python
Table des matières

Même moteur BatchBacktesting[1] que l’expérience précédente sur les indicateurs, mais à l’échelle d’un portefeuille : beaucoup de tickers, deux stratégies, actions et cryptos, puis les meilleurs et les pires résultats agrégés.

1. Pourquoi lancer beaucoup de tickers à la fois

Un backtest sur un seul ticker flatte toujours. Une grille répond à d’autres questions :

  • La règle ne fonctionne-t-elle que sur un seul symbole héroïque ?
  • Les désastres se concentrent-ils dans un secteur ou une période ?
  • Les cryptos dominent-elles le classement parce que la volatilité n’a pas de limite dans la simulation ?

2. Architecture (celle de BatchBacktesting)

CoucheRôle
Adaptateurs de donnéesRécupération FMP et Binance
StratégiesJeux de paramètres EMA et MACD
ExécuteurPool de threads, sortie CSV, graphiques en option
output/Artefacts par exécution, non versionnés sur GitHub par défaut

Les résultats précalculés ne sont pas dans le dépôt (trop dépendants de chaque utilisateur). On les génère en local, puis on les consulte dans output/charts/....

3. Les deux stratégies

Les deux stratégies utilisent backtesting.py[2] avec les indicateurs de pandas_ta.

Croisement d’EMA. Achat quand l’EMA 20 périodes passe au-dessus de l’EMA 80 périodes, vente au croisement inverse. Chaque entrée a un stop loss de 10 % et une prise de profit de 25 %.

class EMA(Strategy):
    n1 = 20
    n2 = 80

    def init(self):
        close = self.data.Close
        self.ema20 = self.I(taPanda.ema, close.s, self.n1)
        self.ema80 = self.I(taPanda.ema, close.s, self.n2)

    def next(self):
        price = self.data.Close
        if crossover(self.ema20, self.ema80):
            self.position.close()
            self.buy(sl=0.90 * price, tp=1.25 * price)
        elif crossover(self.ema80, self.ema20):
            self.position.close()
            self.sell(sl=1.10 * price, tp=0.75 * price)

Croisement MACD. La ligne MACD est l’EMA 12 périodes moins l’EMA 26 périodes ; la ligne de signal est une EMA 9 périodes de cette différence. Achat quand la MACD passe au-dessus de son signal, vente au croisement inverse. Pas de stop loss ni de prise de profit ici.

class MACD(Strategy):
    short_period = 12
    long_period = 26
    signal_period = 9

    def init(self):
        close = self.data.Close
        self.macd = self.I(taPanda.macd, close.s, self.short_period, self.long_period, self.signal_period)

    def next(self):
        macd_line = self.macd.macd
        signal_line = self.macd.signal
        if crossover(macd_line, signal_line):
            self.position.close()
            self.buy()
        elif crossover(signal_line, macd_line):
            self.position.close()
            self.sell()

4. Lancer à grande échelle

tickers = get_SP500()
run_backtests(tickers, strategy=EMA, num_threads=12, generate_plots=True)
run_backtests(tickers, strategy=MACD, num_threads=12, generate_plots=True)

tickers = get_all_crypto()
run_backtests(tickers, strategy=EMA, num_threads=12, generate_plots=True)
run_backtests(tickers, strategy=MACD, num_threads=12, generate_plots=True)

Chaque appel se répartit sur un pool de threads. Ajustez num_threads à votre machine et aux limites d’API de Financial Modeling Prep et de Binance.

5. Classement EMA

Les cinq meilleurs rendements de la stratégie EMA :

InstrumentRendement
BTCBUSD293,78 %
ALB205,97 %
OMGUSD199,62 %
BBWI196,82 %
GRMN193,47 %

Les cinq pires :

InstrumentRendement
BTTBUSD−99,93 %
UAL−82,63 %
NCLH−81,51 %
LNC−78,02 %
CHRW−76,38 %

Meilleurs rendements EMA à côté du buy-and-hold pour les mêmes instruments

C’est le graphique de droite qui compte. OMGUSD a rapporté environ 200 % avec la règle EMA alors que le buy-and-hold perdait environ 80 % : la règle a gagné en restant vendeuse pendant l’effondrement. BTCBUSD et ALB ont monté dans les deux cas, ce qui en dit plus sur la période que sur la règle.

Les rendements élevés mélangent souvent de longues phases haussières sur des paires crypto volatiles, des signaux chanceux sur des actions sans tendance et des paramètres qui collent par hasard à une période. Les pertes profondes signalent des symboles peu liquides que la simulation négocie quand même, des règles de tendance dans des secteurs en chute (aérien et croisières ci-dessus) et des paires cassées ou retirées traitées comme des tickers normaux.

Avant de dire « MACD bat EMA », comparez le rendement médian sur tous les tickers, pas seulement les cinq premiers.

6. Limites honnêtes

  • Ce n’est pas un conseil financier.
  • Frais, emprunt de titres, suspensions et opérations sur titres ne valent que ce que valent le flux de données et les réglages par défaut de la bibliothèque.
  • Un résultat passé ne garantit aucun avantage futur.

7. À retenir

Servez-vous des backtests multi-tickers comme de tests de fumée pour vos règles : trouver où elles cassent, pas où placer votre capital.

8. Articles liés


Publié à l’origine sur Medium[3] (en anglais). Code complet : BatchBacktesting[1].

Références

  1. AlgoETS. (). BatchBacktesting. [Software repository] github.com.
  2. backtesting.py. (). [Web page] kernc.github.io.
  3. Medium. (). [Article] medium.com.

Les références utilisent la date de publication de cet article.