Aller au contenu
← Tous les articles
Article

Expérimentation des indicateurs techniques avec Python et Backtesting

Écouter en version balado

La stratégie qui a gagné 200 % en jouant à l'envers · 2:22 · voix synthétiques, script rédigé avec l’IA

Transcription

Sylvie : Antoine a lancé une règle de trading toute simple sur des centaines d'actions et de paires crypto. Une des pièces ressort avec un rendement d'environ deux cents pour cent. Génial, jusqu'à ce qu'on regarde ce qu'aurait donné le simple fait de la garder.

Thierry : Laisse-moi deviner. Elle a perdu gros.

Sylvie : À peu près quatre-vingts pour cent. La règle n'a rien découvert de magique. Elle se trouvait vendeuse pendant que le prix s'effondrait.

Thierry : D'accord, reprenons depuis le début. C'est quoi, la règle ?

Sylvie : Un croisement d'EMA. Une EMA, c'est une moyenne mobile qui donne plus de poids aux prix récents. Quand celle sur vingt périodes passe au-dessus de celle sur quatre-vingts, la stratégie achète. Quand elle repasse dessous, elle vend. Chaque position a un stop loss à dix pour cent et une prise de profit à vingt-cinq pour cent.

Thierry : Et il a fait ça sur tout un marché ?

Sylvie : Oui, avec un outil qui s'appelle BatchBacktesting. Il récupère les prix quotidiens chez Financial Modeling Prep pour le S et P cinq cents, ou chez Binance pour les cryptos. Il applique la stratégie à chaque ticker avec backtesting point py, et écrit des résultats en CSV et des graphiques en option. Le tout sur douze threads.

Thierry : Et le classement, il ressemble à quoi ?

Sylvie : En tête, Bitcoin contre le stablecoin BUSD, à plus deux cent quatre-vingt-quatorze pour cent. En queue, un jeton nommé BTT à moins quatre-vingt-dix-neuf virgule neuf pour cent. Et les actions UAL et NCLH ont perdu plus de quatre-vingts pour cent, parce que la période COVID punit les règles de tendance naïves.

Thierry : Donc on n'achète pas les gagnants demain matin.

Sylvie : Sûrement pas. Antoine dit que les listes du haut et du bas sont des diagnostics, pas des listes d'achat et de vente. Le meilleur résultat est probablement une règle ajustée à cette fenêtre, et le backtest ignore les frais, le glissement et la liquidité.

Thierry : Alors à quoi ça sert ?

Sylvie : À voir la distribution des résultats d'une règle simple. Il le dit précieux pour l'humilité et dangereux en pilote automatique. Et toujours ouvrir le graphique d'un ticker avant de raconter une histoire sur lui.

Thierry : Un outil de criblage, pas un gestionnaire de portefeuille.

Sylvie : C'est presque ses mots. L'article complet a le code, le classement et le graphique de comparaison avec le buy-and-hold.

Expérimentation des indicateurs techniques avec Python et Backtesting
Table des matières

J’ai lancé en lot une stratégie de croisement d’EMA sur le S&P 500 et une liste de paires crypto avec BatchBacktesting[1], en utilisant Financial Modeling Prep pour les actions et Binance pour les cryptos. Ce billet montre ce que fait l’exécuteur, comment lire les lignes extravagantes en haut et en bas du classement, et pourquoi rien de tout ça n’est un système de trading réel.

1. Ce que fait BatchBacktesting

  1. Récupère les données OHLCV quotidiennes de Financial Modeling Prep (liste du S&P 500) ou de Binance (liste de cryptos).
  2. Applique une classe de stratégie à chaque ticker avec backtesting.py[2].
  3. Écrit des résultats CSV et des graphiques HTML optionnels dans output/.

C’est un outil de criblage, pas un gestionnaire de portefeuille.

2. Préparation

pip install numpy httpx rich backtesting pandas_ta

Le notebook définit lui-même les fonctions d’appel à l’API (make_api_request, get_SP500, get_all_crypto, récupération des historiques de prix). Il lui faut seulement les deux URL de base et vos clés :

BASE_URL_FMP = "https://financialmodelingprep.com/api/v3"
BASE_URL_BINANCE = "https://fapi.binance.com/fapi/v1/"
FMP_API_KEY = "YOUR_FMP_API_KEY"
BINANCE_API_KEY = "YOUR_BINANCE_API_KEY"

Gardez les vraies clés dans des variables d’environnement, pas dans le notebook que vous versionnez.

3. La stratégie 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)

4. Lancer le lot

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

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

run_backtests répartit les tickers sur un pool de threads et produit un graphique par instrument, comme ce graphique AAPL[3]. Le dépôt ne contient pas de résultats précalculés : lancez-le en local pour obtenir votre propre dossier output/.

5. Lire le classement

Les cinq meilleurs rendements EMA : BTCBUSD +293,78 %, ALB +205,97 %, OMGUSD +199,62 %, BBWI +196,82 %, GRMN +193,47 %. Les cinq pires : BTTBUSD −99,93 %, UAL −82,63 %, NCLH −81,51 %, LNC −78,02 %, CHRW −76,38 %.

TickerRendementRéflexion
BTCBUSD+293,78 %Volatilité crypto et paramètres ajustés à la période
BTTBUSD−99,93 %Effondrement d’un jeton ; la liquidité n’est pas modélisée
UAL / NCLH−82 % / −81 %Les fenêtres de l’ère COVID punissent les règles de tendance naïves

Les listes du haut et du bas sont des diagnostics, pas des listes d’achat et de vente. Ouvrez le graphique du ticker avant de raconter une histoire sur une ligne.

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

Le graphique place le rendement EMA à côté du buy-and-hold. OMGUSD a gagné environ 200 % avec la règle alors que le buy-and-hold perdait environ 80 % : le gain vient d’une position vendeuse pendant l’effondrement, pas d’un avantage fiable.

6. Où se trouve le code complet

L’article Medium colle toutes les fonctions utilitaires : appels HTTP, threads, écriture CSV et graphiques. Leur place est dans le dépôt BatchBacktesting[1], où elles sont maintenues. Le billet suivant ajoute une stratégie MACD au même exécuteur.

7. Quand ne pas s’en servir

Mauvais usagePourquoi ça fait mal
Déployer le premier ticker en réelSurajusté à la fenêtre
Ignorer frais et glissementLe backtest gonfle les résultats
Sauter les dates hors échantillonUn changement de régime casse la règle

8. À retenir

Les exécutions en lot montrent la distribution des résultats d’une règle simple : précieux pour l’humilité, dangereux en pilote automatique.

9. Articles liés


Publié à l’origine sur Medium[4].

Références

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

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