Retour au catalogue
Season 39 7 Épisodes 25 min 2026

Zipline Backtesting Engine

v3.1 — Édition 2026. Un guide complet de 2026 pour maîtriser le moteur de backtesting et de live-trading Zipline 3.1 pour le trading algorithmique.

Trading algorithmique Science des données Analyse de données
Zipline Backtesting Engine
Lecture en cours
Click play to start
0:00
0:00
1
Le moteur de backtesting orienté événements
Cet épisode présente Zipline, un moteur de backtesting Pythonique orienté événements. Les auditeurs découvriront l'architecture sous-jacente qui empêche le biais d'anticipation (look-ahead bias) et comprendront les dépendances complexes aux extensions C nécessaires pour une installation locale robuste.
3m 29s
2
Le cycle de vie de l'algorithme et la gestion de l'état
Cet épisode couvre le cycle de vie principal d'un algorithme Zipline. Les auditeurs apprendront à gérer l'état à travers des milliers d'événements de trading en utilisant l'objet context et à passer des ordres simples.
3m 43s
3
Les Market Data Bundles et l'ingestion personnalisée
Cet épisode explore les Market Data Bundles et l'ingestion de données. Les auditeurs apprendront comment contourner les chargements massifs de fichiers CSV en précompilant les données de prix et en créant des pipelines d'ingestion personnalisés.
3m 40s
4
L'Algorithm API et les interactions avec BarData
Cet épisode plonge dans l'Algorithm API, en se concentrant sur l'objet BarData et les fonctions de planification. Les auditeurs apprendront comment interroger en toute sécurité un historique point-in-time et automatiser le rééquilibrage de portefeuille.
4m 09s
5
Trading Calendars personnalisés et marchés mondiaux
Cet épisode explique comment configurer des Trading Calendars personnalisés. Les auditeurs apprendront à définir les heures d'ouverture des bourses, à gérer les jours fériés et à construire un calendrier 24/7 pour des actifs comme les cryptomonnaies.
3m 16s
6
Métriques de performance de risque et évaluation personnalisée
Cet épisode se concentre sur le suivi et l'évaluation des performances de la stratégie. Les auditeurs apprendront à interpréter le DataFrame de performance et à se greffer au cycle de vie de la simulation pour calculer des métriques de risque personnalisées.
3m 46s
7
Extension de l'architecture de Zipline
Ce dernier épisode couvre l'architecture extensible de Zipline. Les auditeurs apprendront comment échanger les composants principaux et enregistrer un blotter personnalisé pour l'intégration du live-trading.
3m 56s

Épisodes

1

Le moteur de backtesting orienté événements

3m 29s

Cet épisode présente Zipline, un moteur de backtesting Pythonique orienté événements. Les auditeurs découvriront l'architecture sous-jacente qui empêche le biais d'anticipation (look-ahead bias) et comprendront les dépendances complexes aux extensions C nécessaires pour une installation locale robuste.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Zipline Backtesting Engine, épisode 1 sur 7. La plupart des algorithmes de trading ont l'air géniaux sur le papier, mais perdent instantanément de l'argent sur les marchés réels. Le coupable habituel, c'est le look-ahead bias. Ton code regarde par accident le prix de clôture de demain pour faire le trade d'aujourd'hui. L'Event-Driven Backtesting Engine de Zipline 3.0 empêche complètement ça. Dans un backtester vectorisé standard, tu charges un énorme dataframe de prix historiques et tu appliques des opérations pandas sur toute la timeline en une seule fois. C'est rapide, mais c'est complètement faussé pour simuler la réalité. Tu peux facilement écrire une logique qui déclenche un ordre d'achat aujourd'hui en te basant sur une moyenne mobile qui inclut par accident des données de la semaine prochaine. Zipline t'enlève cette possibilité en te forçant dans un stream event-driven strict. Il simule une vraie bourse. Quand tu lances un backtest, le moteur agit comme un timekeeper strict. Il avance dans l'historique, tick par tick, ou minute par minute. À chaque étape, il déclenche un event. Ton code reçoit uniquement les données disponibles à cette microseconde précise. Tu inspectes l'état actuel, tu passes tes ordres, et ensuite tu attends que le moteur avance l'horloge. Tu ne peux pas regarder en avant, parce que les données futures n'ont pas encore été streamées au moteur. Cette architecture garantit que ton backtest reflète les vraies contraintes du live trading. Par contre, traiter une timeline financière event par event en pur Python crée un énorme bottleneck. Tu pourrais avoir à traiter des années de données de prix à la minute sur des milliers d'actions individuelles. Pour rendre cette event loop viable au niveau des calculs, Zipline délègue énormément de travail à des C-extensions. Le moteur principal s'appuie sur des routines précompilées pour faire les calculs assez vite pour que ce soit utile. Cette dépendance aux C-extensions introduit un gros point de friction. Mettre en place un environnement quantitatif robuste from scratch est notoirement difficile. Zipline n'est pas un outil Python standalone. Il nécessite une intégration profonde avec des librairies scientifiques au niveau système. Par exemple, il utilise TA-Lib, une librairie standard pour générer des indicateurs techniques de marché. Il repose aussi sur des packages qui ont besoin de LAPACK et BLAS pour les gros calculs d'algèbre linéaire. Ce sont des codebases C et Fortran complexes et legacy. Si tu essaies de build cet environnement avec une simple commande pip install, tu vas presque certainement te prendre un mur d'erreurs de compilation. Pip télécharge le source code de ces dépendances et essaie de les compiler localement. Ça demande que ton système d'exploitation ait un compilateur C bien configuré, un compilateur Fortran, et les bons header files système déjà en place. La plupart des systèmes d'exploitation de base n'ont pas ça out of the box. C'est pour ça que la documentation de Zipline recommande explicitement d'utiliser conda au lieu de pip. Conda n'est pas juste un package manager Python. C'est un manager d'environnement et de binaries au niveau système. Quand tu crées un environnement conda et que tu installes Zipline via le channel conda-forge, tu ne compiles rien depuis les sources. Conda télécharge des binaries précompilés pour ton système d'exploitation spécifique. Il gère les C-extensions, TA-Lib et LAPACK de façon transparente. Le dependency tree est résolu pour toi, ce qui te donne un environnement stable prêt pour le développement algorithmique. Voici l'idée clé. L'event loop stricte qui rend Zipline mathématiquement honnête est exactement ce qui le force à s'appuyer sur de lourdes dépendances C compilées pour tourner à grande échelle. En comprenant cette architecture, tu comprends pourquoi l'installation est complexe, et pourquoi conda est la seule façon sensée de build ton environnement. Si tu veux aider à faire vivre l'émission, tu peux nous soutenir en cherchant DevStoriesEU sur Patreon. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à build !
2

Le cycle de vie de l'algorithme et la gestion de l'état

3m 43s

Cet épisode couvre le cycle de vie principal d'un algorithme Zipline. Les auditeurs apprendront à gérer l'état à travers des milliers d'événements de trading en utilisant l'objet context et à passer des ordres simples.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Zipline Backtesting Engine, épisode 2 sur 7. Tu configures un simple compteur dans ta logique de trading en utilisant une variable globale Python, et à la moitié du backtest, il se réinitialise ou renvoie une erreur. Dans le backtesting event-driven, les variables globales standards sont un piège. Pour survivre à des milliers d'events de marché simulés, tu as besoin d'un moyen sûr de suivre le state, et c'est exactement là que le Algorithm Lifecycle et le State Management de Zipline entrent en jeu. Chaque algorithme Zipline nécessite au moins deux fonctions de base : initialize et handle data. Zipline est un système event-driven. Il parcourt les données historiques chronologiquement, en déclenchant un event pour chaque tranche de temps. La fonction initialize s'exécute exactement une fois quand ton backtest démarre. Elle prend un seul argument appelé context. Vois context comme la mémoire persistante de ton algorithme. C'est un simple dictionnaire Python sous le capot, mais il agit comme un namespace dédié. Au lieu de déclarer des variables globales standards, tu attaches ton state directement à context. Si tu veux suivre un asset spécifique, comme l'action Apple, tu le cherches dans initialize et tu l'assignes à context point asset. Ça garantit que la référence survit du premier au dernier jour du backtest. Ensuite, il y a la fonction handle data. Elle est appelée à chaque fois qu'il y a un nouvel event de marché, comme une nouvelle barre de trading quotidienne. Elle prend deux arguments : context et data. Tu connais déjà context. C'est là que tu lis le state que tu as configuré plus tôt ou que tu mets à jour tes variables en cours. Le deuxième argument, data, représente l'environnement de marché actuel. C'est ta vision de la simulation à cet instant précis. Tu utilises data pour vérifier si un asset est actuellement tradable, pour récupérer son prix actuel, ou pour demander une fenêtre historique de prix. Prends l'exemple d'une stratégie classique de crossover de deux moyennes mobiles. Dans ta fonction initialize, tu définis ton asset cible et tu l'attaches à context. Dans handle data, tu demandes à l'objet data les prix des trente derniers jours pour calculer une moyenne mobile courte, et des trois cents derniers jours pour une moyenne mobile longue. Tu compares les deux moyennes. Si la moyenne courte passe au-dessus de la moyenne longue, c'est un signal d'achat. Tu exécutes ça en appelant la fonction order, en lui passant ton context point asset et un nombre cible d'actions. Le trading n'est que la moitié du boulot. Tu dois aussi suivre la performance de tes indicateurs au fil du temps. Zipline fournit une fonction built-in appelée record. À la fin de ton bloc handle data, tu appelles record et tu lui passes ta moyenne mobile courte, ta moyenne mobile longue, et le prix actuel. Zipline collecte ces valeurs enregistrées à chaque étape et les attache au dataframe de performance final renvoyé à la fin du backtest. Quand ton code est prêt, tu as deux façons de le lancer. La première, c'est via la command line interface. Tu passes ton script Python à la commande run de Zipline, en spécifiant tes dates de début et de fin, ton capital initial, et un fichier d'output pour les résultats de performance. C'est idéal pour les pipelines automatisés ou l'exécution à distance. La deuxième méthode est interactive. Si tu utilises Jupyter Notebooks, tu peux utiliser la magic command zipline built-in. En tapant pourcent pourcent zipline en haut d'une cellule de notebook, tu définis et tu exécutes l'algorithme inline, en passant tes dates et ton capital comme arguments à la magic command. Les résultats sont injectés directement dans un dataframe local, prêts pour une analyse immédiate. Voici l'idée clé. Zipline te force à séparer ton algorithme en deux objets distincts : context pour le state interne que tu contrôles, et data pour l'environnement de marché externe. Respecte cette limite, et ton state management restera parfaitement synchronisé sur des milliers de trades. C'est tout pour cet épisode. À la prochaine !
3

Les Market Data Bundles et l'ingestion personnalisée

3m 40s

Cet épisode explore les Market Data Bundles et l'ingestion de données. Les auditeurs apprendront comment contourner les chargements massifs de fichiers CSV en précompilant les données de prix et en créant des pipelines d'ingestion personnalisés.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Moteur de backtesting Zipline, épisode 3 sur 7. Ta logique de trading est peut-être irréprochable, mais si tu charges d'énormes fichiers CSV en mémoire à chaque fois que tu lances une simulation, ta vitesse d'itération va s'effondrer. Le bottleneck est rarement ton algorithme. C'est ton data pipeline. Zipline résout ce problème grâce aux Market Data Bundles et à la Custom Ingestion. Un data bundle, c'est une collection de prix d'actifs et de metadata qui a été précompilée dans un format de stockage ultra optimisé. Au lieu de parser des fichiers texte bruts pendant un run, Zipline lit à partir d'un stockage binaire compressé et d'une base de données locale rapide. Cette séparation entre le traitement des données et l'exécution de la stratégie rend les backtests exceptionnellement rapides. Tu déclenches cette compilation depuis la ligne de commande avec la commande zipline ingest, suivie du nom du bundle. Zipline est fourni avec un bundle par défaut appelé Quandl, qui récupère des données historiques quotidiennes standard sur les actions depuis Internet et les écrit directement sur ton disque local. La plupart des environnements professionnels s'appuient sur des données propriétaires. Pour utiliser tes propres données, tu dois créer un custom bundle. Créer un custom bundle nécessite d'écrire une fonction ingest. Cette fonction agit comme un traducteur dédié entre ta source de données brutes et le format de stockage interne de Zipline. Voici le point essentiel. La fonction ingest ne retourne pas un dataset personnalisé. À la place, Zipline passe plusieurs objets writer à ta fonction, et ton code injecte les données brutes dans ces writers. La signature de la fonction ingest requiert des paramètres spécifiques pour gérer ce routing. Elle prend une configuration d'environnement, le trading calendar, les sessions de début et de fin, et les objets writer. Les deux objets critiques avec lesquels tu vas interagir sont l'asset database writer et le daily bar writer. L'asset database writer gère tes metadata. Tu lui passes une table structurée contenant tes symboles, leurs dates de début et de fin, et les noms de leurs exchanges. Le writer compile ça dans une base de données locale pour que le moteur sache exactement quels actifs existent sur n'importe quelle session de trading donnée. Le daily bar writer traite le price action réel. Tu lui fournis un itérateur qui yield des blocs de données de prix. Chaque bloc contient un identifiant d'actif interne associé à une table de ses données open, high, low, close et volume. Le writer prend ces blocs et les compresse sur le disque. Zipline fournit un mécanisme built-in pour gérer les fichiers plats standards en utilisant le bundle CSV directory, couramment appelé csvdir. Tu configures tes données propriétaires en sauvegardant des fichiers CSV individuels dans un seul dossier, en nommant chaque fichier avec son ticker. Tu enregistres ensuite ce répertoire dans un script de configuration Zipline spécifique appelé le fichier extension. L'enregistrement lie simplement le nom de ton custom bundle à la fonction ingest sous-jacente pour que l'outil en ligne de commande sache qu'il existe. Quand tu lances zipline ingest avec ton nouveau nom custom, le système pointe la fonction ingest vers ton dossier. Il boucle sur les fichiers CSV, extrait les metadata, alimente l'asset database writer, et pompe les lignes de prix historiques dans le daily bar writer. Le parsing de texte, lent et coûteux, se produit exactement une fois. Après l'ingestion, tes données propriétaires sont stockées de manière permanente dans le format optimisé, instantanément accessibles pour des milliers d'itérations de backtest à haute vitesse. La véritable puissance de la custom ingestion, c'est qu'elle découple strictement la préparation de tes données de l'exécution de ta stratégie, garantissant que la logique de parsing lente ne pollue jamais ton environnement de test. C'est tout pour cet épisode. À la prochaine !
4

L'Algorithm API et les interactions avec BarData

4m 09s

Cet épisode plonge dans l'Algorithm API, en se concentrant sur l'objet BarData et les fonctions de planification. Les auditeurs apprendront comment interroger en toute sécurité un historique point-in-time et automatiser le rééquilibrage de portefeuille.

Télécharger
Bonjour, c'est Alex de DEV STORIES DOT EU. Zipline Backtesting Engine, épisode 4 sur 7. Les splits d'actifs et les dividendes peuvent instantanément invalider ton historique de prix. Si une action subit un split de deux pour un, une boucle de backtesting naïve va penser que le prix vient de chuter de cinquante pour cent. Tu évites ça en utilisant l'API Algorithm et les interactions BarData, qui gèrent automatiquement les ajustements point-in-time. Dans Zipline, le cœur de la logique de ton algorithme interagit avec un objet généralement nommé data, qui est une instance de BarData. Il est passé à tes event handlers, comme ton data handler principal ou tes scheduled functions. Son rôle principal est de servir les données de prix et de volume exactement telles qu'elles apparaissaient à ce moment précis de la simulation, empêchant complètement le look-ahead bias. Quand tu appelles data dot current, tu lui passes un asset et un field, comme le prix ou le volume. Ça te donne la valeur la plus récente disponible à cette minute ou ce jour exact de la simulation. Quand tu as besoin d'une lookback window pour calculer une moyenne mobile ou une volatilité historique, tu appelles data dot history. Tu lui donnes l'asset, le field, le nombre de bars, et la fréquence, comme un jour ou une minute. Voici le point clé. current et history ajustent toutes les deux automatiquement les données retournées pour les corporate actions, mais uniquement jusqu'au temps de simulation actuel. Tes moyennes mobiles ne vont pas être complètement faussées à une date ex-dividende, car les prix historiques sont ajustés pour s'aligner parfaitement avec le price frame actuel. Tu obtiens une time series mathématiquement continue sans avoir à gérer toi-même les multiplicateurs de corporate actions. Avant d'agir sur ces données de prix, tu dois vérifier si l'asset est réellement tradable à ce moment précis. Passer ton asset à data dot can trade vérifie si l'exchange est ouvert pour cet asset et s'il est activement listé. Si une action a été delistée hier, ou n'a pas encore fait son IPO, ça retourne false. Ensuite, tu as data dot is stale. Si un asset est très illiquide et n'a pas été tradé pendant la bar actuelle, Zipline va forward-fill le dernier prix connu pour éviter les erreurs de missing data. Cependant, si tu fais tourner une stratégie de mean-reversion sur des prix forward-filled, tu trades sur des ghost data. Data dot is stale retourne true si le prix que tu vois est reporté d'une période précédente plutôt que d'un trade récent. Vérifier à la fois la tradability et la staleness avant de placer un ordre évite une catégorie massive d'erreurs de simulation. Ça couvre les inputs, passons à l'execution timing. Par défaut, Zipline appelle ton data handler principal à chaque bar de simulation. Si tu fais tourner une stratégie au niveau de la minute, exécuter une logique de rebalance complexe toutes les soixante secondes va ralentir ton backtest à l'extrême et déclencher des coûts de transaction irréalistes. La solution, c'est la méthode schedule function. Tu l'utilises dans la phase d'initialisation de ton algorithme pour enregistrer une custom function spécifique à exécuter sur un calendrier précis. Elle prend trois arguments principaux. Premièrement, la fonction que tu veux exécuter. Deuxièmement, une date rule. Troisièmement, une time rule. Supposons que tu veuilles lancer un rebalance de portfolio exactement trente minutes avant la fermeture du marché. Tu passes ta fonction de rebalance comme premier argument. Pour la date rule, tu utilises la helper method date rules dot every day. Pour la time rule, tu utilises time rules dot market close, en passant trente minutes comme argument d'offset. Maintenant, au lieu de se déclencher des centaines de fois par jour, ta logique de rebalance s'exécute exactement une fois, juste quand la session de trading touche à sa fin. La séparation entre l'objet BarData pour un data access sécurisé et la scheduling API pour l'execution timing garantit que la logique principale de ton algorithme s'exécute uniquement quand elle le doit, en utilisant des prix qui existaient réellement à ce moment précis. J'aimerais prendre un moment pour te remercier de ton écoute — ça nous aide beaucoup. Passe une excellente journée !
5

Trading Calendars personnalisés et marchés mondiaux

3m 16s

Cet épisode explique comment configurer des Trading Calendars personnalisés. Les auditeurs apprendront à définir les heures d'ouverture des bourses, à gérer les jours fériés et à construire un calendrier 24/7 pour des actifs comme les cryptomonnaies.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Zipline Backtesting Engine, épisode 5 sur 7. Ton algorithme repère un signal de sortie parfait et déclenche un ordre de vente massif. Le problème, c'est qu'on est samedi. Si ton backtesting engine ne sait pas que l'exchange est fermé, cet ordre va soit s'exécuter sur un marché fantôme, soit faire planter toute ta simulation. Les Custom Trading Calendars reproduisent la réalité des horaires des marchés mondiaux pour éviter exactement ce scénario. Dans Zipline, un trading calendar est la source de vérité absolue pour les sessions de marché. Il dicte quand la data peut être ingérée et quand les ordres peuvent être processés. Par défaut, Zipline part du principe qu'on utilise les horaires standards des actions américaines. Si tu veux trader des actions internationales, des futures ou des assets alternatifs, tu dois définir les règles spécifiques de ces exchanges. Tu fais ça en créant une classe custom qui hérite de la classe de base Trading Calendar de Zipline. Tu as juste besoin de configurer quelques properties spécifiques pour établir les limites de la journée de trading. Premièrement, tu définis l'open time. Ça dicte l'heure et la minute exactes où le marché commence à accepter les ordres. Deuxièmement, tu définis le close time, qui marque la dernière minute de la session de trading. Troisièmement, tu définis les regular holidays. C'est une collection de dates spécifiques où l'exchange est complètement fermé, comme les jours fériés nationaux. Zipline ne fait pas tous ces calculs de dates from scratch. Il utilise énormément la librairie pandas, et plus spécifiquement les classes pandas Holiday Calendar et Custom Business Day. Quand tu fournis ta liste de regular holidays, tu popules essentiellement un objet pandas Holiday Calendar. Zipline combine cette logique pandas avec tes open et close times pour générer un index massif et précalculé de chaque minute de trading valide pour toute la durée de ton backtest. Ce calcul en amont est crucial. Ça veut dire que ton algorithme n'évalue pas des calculs de dates complexes à chaque tick de la simulation. Il fait simplement une query sur un array hautement optimisé. C'est la partie qui compte. Tous les marchés ne dorment pas. Si tu simules des trades de cryptomonnaies, les hypothèses standards sur les week-ends vont ruiner l'alignement de ta data. Tu dois builder un calendar continu vingt-quatre sept. Voyons comment en builder un, qu'on va appeler le TFS Exchange Calendar. Tu définis ta nouvelle classe et tu hérites de la classe de base standard. Pour l'open time, tu spécifies minuit. Pour le close time, tu spécifies vingt-trois heures cinquante-neuf, ce qui te donne un cycle quotidien complet. Comme les exchanges de cryptomonnaies n'observent pas les jours fériés traditionnels, tu set la property regular holidays pour retourner une liste vide. La dernière étape, c'est d'ajuster le planning hebdomadaire. Les trading calendars traditionnels utilisent un objet pandas Custom Business Day configuré strictement du lundi au vendredi. Pour ton TFS calendar, tu override cette property weekmask pour inclure explicitement le samedi et le dimanche. Une fois la classe terminée, tu l'enregistres dans l'environnement Zipline en utilisant un identifiant string custom. À partir de là, tes bundles d'ingestion de data et tes algorithmes de trading vont reconnaître le planning continu. Les ordres vont être processés séquentiellement sans sauter les week-ends, et la data à la minute va matcher parfaitement avec les timestamps du monde réel. Si les règles de ton calendar sont mal configurées, ta data de prix sera désalignée et tes metrics de performance seront complètement fictives. Les limites de temps dictent chaque action dans un event-driven engine, et les trading calendars sont exactement la façon dont tu appliques ces limites. C'est tout pour cet épisode. Merci d'avoir écouté, et keep building !
6

Métriques de performance de risque et évaluation personnalisée

3m 46s

Cet épisode se concentre sur le suivi et l'évaluation des performances de la stratégie. Les auditeurs apprendront à interpréter le DataFrame de performance et à se greffer au cycle de vie de la simulation pour calculer des métriques de risque personnalisées.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Zipline Backtesting Engine, épisode 6 sur 7. Calculer des metrics de risque complexes à chaque tick peut ralentir ton backtest à l'extrême. Tu veux que tes simulations soient rapides, mais tu dois aussi savoir exactement comment ta stratégie se comporte sous pression. Tu peux en fait désactiver le tracking par défaut pendant le debugging, ou écrire des trackers custom hautement optimisés. Cet épisode couvre les Risk Performance Metrics et la Custom Evaluation. Zipline regroupe ses calculs de risque et de performance intégrés dans une structure appelée Metric Set. Le set par défaut génère automatiquement des statistiques standards comme le bêta, le ratio de Sharpe et les rendements totaux. Quand ta simulation se termine, Zipline compile tous ces calculs dans le DataFrame de performance. Chaque metric trackée devient une colonne, et chaque ligne représente un time step dans ta simulation. Si tu n'as pas besoin de toutes ces metrics par défaut, tu peux passer un Metric Set allégé au démarrage du moteur, ce qui te fait gagner un temps de traitement considérable. Quand les metrics par défaut ne capturent pas ton modèle de risque spécifique, tu définis une custom metric. Tu fais ça en créant une subclass de l'objet metric de base de Zipline. Écrire une custom metric, ça veut dire se hooker directement à l'horloge interne de la simulation. Tu contrôles exactement quand ta logique s'exécute en implémentant trois lifecycle methods spécifiques : start of simulation, end of session, et end of bar. Start of simulation, c'est là que tu initialises tes variables et que tu configures le state initial. End of session s'exécute une seule fois à la clôture de la journée de trading. End of bar s'exécute après chaque mise à jour de prix, ce qui est critique pour les stratégies à la minute. À chaque fois qu'un de ces hooks temporels se déclenche, Zipline lui passe deux arguments requis : le ledger et le packet. Le ledger contient le state mathématique en temps réel de ta simulation. Il contient la valeur actuelle de ton portfolio, tes soldes de cash, et toutes tes positions ouvertes. Tu traites le ledger comme de la data en read-only. Le packet, en revanche, est un dictionary vide qui représente le payload de data pour ce time step spécifique. C'est dans le packet que tu écris. N'importe quelle key-value pair que tu assignes au dictionary du packet devient instantanément une colonne dans ton DataFrame de performance final. Voyons comment tracker le maximum intraday drawdown en utilisant le hook end of bar. D'abord, tu définis ta class de custom metric. Dans la méthode start of simulation, tu crées deux variables : une pour tracker la plus haute valeur du portfolio vue jusqu'ici, et une autre pour le maximum drawdown actuel. Les deux commencent à zéro. Voici le point clé. Comme les baisses intraday sont invisibles si tu ne vérifies que les prix de clôture quotidiens, tu dois exécuter ta logique à l'intérieur de la méthode end of bar. Dans cette méthode, tu lis la valeur actuelle du portfolio à partir de l'argument ledger. Si la valeur actuelle est plus élevée que ta plus haute valeur enregistrée, tu mets à jour le high water mark. Si elle est plus basse, tu calcules la baisse en pourcentage. Si cette baisse dépasse ton maximum drawdown enregistré, tu mets à jour la variable de maximum drawdown. Enfin, tu prends ta variable de maximum drawdown et tu l'assignes à une key dans l'argument packet. En écrivant dans le packet à la fin de chaque bar, ton DataFrame de performance final contiendra un historique granulaire, minute par minute, de la pire baisse intraday subie. Les custom metrics sont fondamentalement juste des observateurs qui lisent le ledger de la simulation et écrivent dans le packet de sortie, te donnant un contrôle total sur ce qui est mesuré et quand. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
7

Extension de l'architecture de Zipline

3m 56s

Ce dernier épisode couvre l'architecture extensible de Zipline. Les auditeurs apprendront comment échanger les composants principaux et enregistrer un blotter personnalisé pour l'intégration du live-trading.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Moteur de backtesting Zipline, épisode 7 sur 7. Tu passes des mois à perfectionner un algorithme dans un simulateur, mais le marché réel n'accepte pas les ordres de trade simulés. Zipline a été conçu principalement pour le backtesting, mais son architecture modulaire te permet de bypasser complètement la simulation interne et de router directement vers un moteur d'exécution réel. Étendre l'architecture de Zipline rend cette transition possible. De base, Zipline fonctionne en boucle fermée. Tu lui fournis des données de prix historiques, il calcule des signaux, et il matche tes ordres en interne avec le comportement passé du marché. Le système isole volontairement ton algorithme des réseaux externes. Mais un système de trading moderne finit toujours par devoir communiquer avec le monde extérieur. Tu as besoin d'un moyen de remplacer les composants de simulation internes par des modules custom qui gèrent de la live data et du capital réel. Zipline gère ce besoin via un mécanisme d'extension construit autour d'un fichier d'initialisation spécifique appelé extension point py. Ce fichier sert de registre local pour ton environnement. Quand le framework Zipline démarre, il regarde immédiatement ici pour trouver les overrides définis par l'utilisateur. Tu utilises ce fichier pour enregistrer de nouveaux data bundles, des modèles de commission custom, et des moteurs d'exécution alternatifs. Le composant le plus critique que tu dois remplacer pour le live trading, c'est le Blotter. Le Blotter agit comme le système interne de gestion des ordres. Il tracke les ordres ouverts, les annule quand on lui demande, et traite les trade fills. Le blotter de simulation par défaut fait semblant d'exécuter les trades en se basant sur le volume historique et des algorithmes de slippage. Pour trader en live, tu dois complètement bypasser ça. Tu y parviens en écrivant une classe Blotter custom. Au lieu de simuler l'exécution, les méthodes de ta classe font des appels réseau à l'API d'un vrai broker. Quand l'algorithme demande un trade, ton blotter custom formate cette requête en un ordre live et la transmet à l'exchange. Voici le point clé. Tu ne modifies pas une seule ligne du code source original de Zipline pour implémenter ça. Tu définis ta classe Blotter custom dans ton propre workspace. Ensuite, tu ouvres extension point py. Tu importes la fonction d'enregistrement du blotter depuis le module utilities de Zipline. Tu passes à cette fonction une string unique avec le nom de ton broker, ainsi que ta classe Blotter custom. Ça enregistre ton moteur d'exécution globalement. Enfin, quand tu exécutes ton script de trading depuis la ligne de commande ou un notebook, tu fournis simplement la string du nom de ton blotter custom comme paramètre de lancement. Le framework swappe la mécanique interne automatiquement. Exactement le même algorithme qui tournait en simulation trade maintenant du capital en live. Supporter ce niveau de modularité nécessite des fondations core très stables. Zipline s'appuie fortement sur des dataframes numériques rapides et du stockage en base de données relationnelle pour déplacer l'information entre l'algorithme et le blotter. Avec la release de Zipline 3.0, l'architecture core a reçu une mise à jour structurelle significative pour moderniser cette fondation. Toute la plateforme a été migrée pour supporter Pandas 2.0 et SQLAlchemy 2.0. L'upgrade vers Pandas 2.0 apporte une gestion de la mémoire nettement meilleure et des temps d'exécution plus rapides pour les énormes arrays de time series que Zipline traite à chaque tick. SQLAlchemy 2.0 modernise complètement la façon dont le moteur interagit avec les bases de données SQL sous-jacentes. Il impose des chemins d'exécution de requêtes plus stricts et plus explicites quand le système gère les métadonnées des assets et stocke les résultats de trading. Ces upgrades fondamentaux garantissent que, que tu fasses tourner un backtest historique massif ou que tu routes des ordres live via une extension de broker custom, le moteur fonctionne sur le standard moderne de l'infrastructure de data Python. En séparant la logique de trading de la mécanique d'exécution, l'architecture garantit que ton algorithme reste complètement intact pendant que la couche d'exécution sous-jacente s'adapte à la réalité. Je t'encourage vivement à explorer la documentation officielle et à essayer d'écrire tes propres extensions hands-on. Si tu as des idées sur ce qu'on devrait couvrir ensuite, visite dev stories dot eu pour suggérer des sujets pour nos futures séries. Merci d'avoir passé quelques minutes avec moi. À la prochaine, prends soin de toi.