08 · La boîte à outils¶
Panorama complet des bibliothèques, formats, bases et plateformes utiles à un bot d'order flow retail, avec une recommandation par poste.
Le piège transversal : la collectionnite d'outils
Elle remplace le travail sur l'edge par du shopping logiciel. Un trader qui change de framework tous les mois n'a jamais 200 trades validés sur quoi que ce soit.
Choisissez un outil par poste, adapté à votre vitesse de trading, et tenez-vous-y. Ce chapitre est une carte pour choisir une fois, pas un catalogue à parcourir régulièrement.
La pile recommandée en une page¶
| Poste | Recommandation | Alternative |
|---|---|---|
| Connexion Rithmic | async_rithmic (Python) |
rithmic-rs (Rust) |
| Connexion ProjectX | project-x-py |
REST/SignalR à la main |
| Sérialisation | msgspec |
orjson |
| Boucle d'événements | uvloop |
asyncio standard |
| Stockage brut | Parquet + partitionnement par jour | DuckDB |
| Analyse | Polars | DuckDB si la RAM est limitée |
| Backtest event-driven | Rejeu maison du journal | NautilusTrader |
| Backtest de file (passif) | hftbacktest | — |
| Validation statistique | purgedcv |
Code maison (voir annexes) |
| Données historiques MBO | Enregistrement maison | Databento |
| Supervision | cron + fichier sentinelle | Prometheus/Grafana |
Le reste du chapitre justifie chaque ligne.
Connexion et exécution¶
Rithmic¶
| Bibliothèque | Langage | État | Notes |
|---|---|---|---|
async_rithmic |
Python 3.10+ | Active (1.5.x en 2026), MIT | Async, reconnexion, retry, multi-comptes, streaming L2 |
rithmic-rs |
Rust | Active | Clients par plant, trois stratégies de reconnexion |
pyrithmic |
Python | Ancêtre d'async_rithmic |
Moins maintenu |
async_rithmic annonce le streaming de profondeur L2 (tous les bids/asks
sur plusieurs niveaux). Le MBO n'apparaît pas dans ses fonctionnalités
annoncées.
ProjectX / TopstepX¶
project-x-py est un SDK Python async
mature (version 3.3.x) : gestion complète du cycle de vie des ordres,
positions, données OHLCV temps réel multi-timeframe, carnet L2 avec analyse de
microstructure, et une suite d'indicateurs techniques. Il expose notamment de
la détection de spoofing.
Le SDK ProjectX est plus complet que les bibliothèques Rithmic
C'est contre-intuitif — Rithmic est la plateforme la plus « pro » — mais l'écosystème open source de ProjectX est plus riche, parce que l'API est plus simple à envelopper (REST + SignalR contre protobuf + plants).
Si votre firme est chez Topstep, c'est un argument de plus en faveur de ProjectX, en complément de ceux du chapitre Alternatives.
Performance en Python¶
Trois bibliothèques qui changent réellement quelque chose, dans cet ordre de priorité :
msgspec¶
Sérialisation et validation. Ses auteurs annoncent décoder et valider du JSON
plus vite qu'orjson ne le décode seul, et des structures msgspec.Struct
5 à 60 fois plus rapides que des dataclass sur les opérations courantes
(msgspec).
Remplacez vos dataclasses par des Struct
Les types du chapitre Architecture (Trade,
Quote, Intent) sont créés à chaque message de marché. Sur un flux ES en
séance, c'est le poste d'allocation dominant du bot. Le passage à
msgspec.Struct est un remplacement quasi mécanique, avec un gain mesurable
et aucun risque.
uvloop¶
Remplacement de la boucle d'événements asyncio, écrit en Cython au-dessus de
libuv. Gains annoncés de 2 à 4 fois sur le débit et la latence.
import uvloop
uvloop.install() # avant tout asyncio.run()
Une ligne, aucun changement de code applicatif.
Polars et DuckDB¶
Pour l'analyse et l'agrégation de données tick.
| Outil | Force | Faiblesse |
|---|---|---|
| Polars | Vitesse brute, API expressive, group_by_dynamic pour le rééchantillonnage |
Consommation mémoire élevée sur gros volumes |
| DuckDB | Empreinte mémoire maîtrisée par streaming, SQL, lit le Parquet directement | Un peu moins rapide sur les cas en mémoire |
Les mesures publiées montrent DuckDB gardant une empreinte de l'ordre de 0,5 à 2,4 Go là où Polars monte de 1,7 à 23 Go sur les mêmes volumes (codecentric).
Le critère de choix est la RAM, pas la vitesse
Si vos données tiennent en mémoire : Polars. Si vous analysez plusieurs années de ticks sur une machine modeste : DuckDB. Les deux lisent le même Parquet, le changement est donc réversible — c'est le seul poste de cette liste où hésiter ne coûte rien.
Ne mettez ni l'un ni l'autre dans le chemin critique
Polars et DuckDB sont des outils de recherche et de backtest. Le bot en production agrège son footprint avec du Python pur, dictionnaire par dictionnaire, comme au chapitre Construire le footprint. Charger un DataFrame à chaque tick est une erreur d'architecture, pas une optimisation.
Stockage¶
| Solution | Quand |
|---|---|
| Parquet partitionné | Par défaut. Gratuit, portable, lu par tous les outils Python |
| DuckDB | Quand vous voulez interroger en SQL sans charger en mémoire |
| ArcticDB | Open source (Man Group), pensé pour Python et les données financières |
| QuestDB | Si vous ingérez en continu et interrogez en temps réel |
| ClickHouse | Volumes très importants, requêtes analytiques colonnaires |
| kdb+/q | Jamais, en retail. Cher, langage exotique |
QuestDB publie un débit d'ingestion annoncé de plusieurs millions de lignes par seconde et se positionne explicitement sur les ticks financiers (QuestDB).
Commencez en Parquet, un fichier par jour et par instrument
data/
MES/
2026-07-29.parquet
2026-07-30.parquet
C'est suffisant pour des années de données, ça se lit en une ligne avec Polars ou DuckDB, et ça ne demande aucun serveur à administrer. Passez à QuestDB ou ClickHouse le jour où cette organisation vous gêne réellement — pas avant.
Trois erreurs de stockage à ne pas commettre
- Stocker en CSV : lent, lourd, formats de date ambigus.
- Ne pas versionner : impossible de reproduire un backtest ancien à l'identique.
- Mélanger brut et nettoyé : gardez le brut intact et en lecture seule, régénérez le propre par un traitement rejouable.
Données historiques¶
Databento¶
Client Python officiel, format DBN binaire compressible, schémas mbo,
mbp-10, tbbo, trades, ohlcv. Documentation dédiée à la
reconstruction du carnet à partir du MBO, avec des instantanés qui
réinsèrent chaque ordre en attente en préservant la priorité de file
(Databento).
Le point qui compte : les instantanés préservent la priorité
Sans cela, il est impossible de démarrer une reconstruction de carnet en milieu de séance sans perdre la position en file. C'est ce qui rend Databento utilisable pour évaluer une stratégie passive — ce que le History Plant de Rithmic ne permet pas.
Sierra Chart / Denali¶
Pour ceux qui passent par une plateforme plutôt que par une API : le flux Denali de Sierra Chart est décrit comme fournissant des données non filtrées avec des volumes bid et ask exacts, horodatés à la source par la bourse, et de l'historique tick sur les futures CME populaires depuis 2011 (Sierra Chart).
C'est une source de données de qualité professionnelle à prix retail, et elle est indépendante du courtier.
La heatmap historique exige un enregistrement
Le « Market Depth Historical Graph » de Sierra Chart n'existe que si vous avez enregistré (ou téléchargé) les données de carnet. Et son affichage par défaut montre la quantité maximale vue à chaque niveau pendant la barre, pas la quantité finale : un mur affiché deux secondes puis annulé peint toute la colonne.
En relecture, les leurres paraissent donc bien plus persistants qu'ils ne l'ont été. Un réglage (« Use Last Quantity Instead Of Max Quantity ») corrige l'affichage. Vérifiez-le avant de juger un niveau « défendu » sur l'historique — sinon vous entraînerez votre œil, ou votre bot, sur un artefact.
Frameworks de backtest¶
| Framework | Type | Pertinence order flow |
|---|---|---|
| NautilusTrader | Event-driven, Rust + Python | Élevée. Nanoseconde, adaptateur Databento, indicateur de déséquilibre de carnet intégré |
| hftbacktest | Rust + Python | Élevée pour le passif. Modèles de file et de latence |
| vectorbt | Vectorisé | Exploration massive de paramètres uniquement |
| backtesting.py | Event-driven minimal | Test rapide d'une idée simple |
| Backtrader | Event-driven | Mûr mais quasi plus maintenu |
| QuantConnect / LEAN | Plateforme + moteur | Tout-en-un, apprentissage exigeant |
| PyBroker | Orienté ML | Validation intégrée |
hftbacktest en détail¶
L'outil de référence si votre stratégie repose sur des ordres passifs. Il modélise :
- la position en file avec plusieurs modèles (
RiskAverseQueueModel,ProbQueueModel,L3FifoQueueModel) ; - des latences distinctes à l'aller et au retour ;
- la reconstruction complète du carnet à partir de flux L2 (MBP) ou L3 (MBO) ;
- une structure
ROIVectorMarketDepthlimitant le carnet à une plage de prix d'intérêt, pour la performance (DeepWiki).
Vous n'en avez probablement pas besoin
hftbacktest résout le problème de l'exécution passive. Or le chapitre Anatomie d'une stratégie recommande de commencer agressif, précisément parce que le passif est inévaluable en retail.
Installez hftbacktest le jour où vous avez une stratégie passive validée en agressif et du MBO historique. Pas avant : c'est un outil lourd pour un problème que vous n'avez pas encore.
Vectorisé contre event-driven¶
| Architecture | Vitesse | Risque de look-ahead |
|---|---|---|
| Vectorisé | Très élevée | Élevé : un décalage d'une ligne oublié suffit |
| Event-driven | Faible | Structurellement protégé |
Le pipeline correct
Vectorisé pour explorer vite (balayer 2 000 combinaisons), event-driven pour la validation finale et le déploiement. Et le même code event-driven passe en réel sans réécriture — c'est l'argument décisif.
Le test qui détecte une fuite d'information
Remplacez les prix futurs par du bruit aléatoire. Si la performance tient, il y a une fuite. C'est dix lignes de code et cela attrape la classe de bugs la plus coûteuse du backtest.
Validation statistique¶
| Bibliothèque | État | Contenu |
|---|---|---|
purgedcv |
Active | Compatible scikit-learn : purge, embargo, CPCV, Deflated Sharpe |
mlfinlab |
Fermé | Relicencié en produit payant à source fermée |
timeseriescv |
Abandonné | Plus de release depuis 2018, problèmes de correction connus |
RiskLabAI |
Code de recherche | Référence, pas une dépendance |
L'implémentation canonique n'est plus libre
mlfinlab, l'implémentation de référence des méthodes de López de Prado, a
été relicenciée en produit payant à source fermée. purgedcv comble le vide
laissé, avec purge, embargo, validation croisée purgée combinatoire et
Deflated Sharpe Ratio dans une interface compatible scikit-learn.
Alternative pour un besoin limité : les implémentations en Python pur de l'annexe code, qui couvrent le PSR, le DSR, le Minimum Backtest Length et la triple barrière sans aucune dépendance.
Le détail méthodologique fait l'objet du chapitre suivant, Validation statistique.
Plateformes graphiques¶
Quand l'API directe est refusée, ou pour la supervision humaine en parallèle du bot :
| Plateforme | Langage d'extension | Spécificité order flow |
|---|---|---|
| Sierra Chart | C++ (ACSIL) | Numbers Bars jusqu'à 3 colonnes par barre, TPO et profils natifs, heatmap de profondeur historique |
| NinjaTrader 8 | C# (NinjaScript) | Order Flow+, SuperDOM, stratégies ATM, market replay intégré |
| ATAS | C# | Clusters, détecteurs d'icebergs, graphique Cumulative Trades (gros prints filtrés) |
| Quantower | C# | DOM Surface (heatmap maison), scanner Power Trades (rafales) |
| Bookmap | Java, Python | Données non filtrées et non agrégées, profondeur complète, API de trading complète |
| Jigsaw daytradr | — | Reconstructed Tape, alertes iceberg / block / gros trade, position en file affichée |
Bookmap reste l'option la plus sous-estimée pour un bot
C'est la seule plateforme de cette liste dont l'API se programme en Python, donne accès à des données véritablement non agrégées avec la profondeur complète, et permet l'exécution — sans conformance Rithmic à passer.
Si votre prop firm autorise Bookmap mais pas l'API Rithmic, c'est le chemin le plus court vers un bot d'order flow réel.
Le piège des ordres stop simulés
NinjaTrader distingue deux mécanismes qu'il est facile de confondre :
| Type | Où il est tenu | Survit à une déconnexion ? |
|---|---|---|
| Ordre stop réel | À la bourse | Oui |
| Ordre stop simulé | Sur votre machine | Non |
Les ordres simulés ne fonctionnent que tant que la plateforme tourne : une coupure de connexion ou un plantage laisse la position sans protection. Un décalage de la connexion ou une lenteur de la plateforme peut aussi retarder la détection du prix de déclenchement (NinjaTrader — forum support).
Les stratégies ATM disposent par ailleurs d'un mode côté serveur depuis la version 8.1.1.0.
Vérifiez lequel des deux vous utilisez — c'est un réglage, pas une fatalité. C'est exactement le scénario contre lequel le chapitre Architecture recommande les protections côté serveur.
Supervision¶
| Besoin | Outil minimal | Outil complet |
|---|---|---|
| Signal de vie | Fichier + cron | Prometheus + Alertmanager |
| Métriques | Fichier texte lu en SSH | Grafana |
| Alertes | Script + notification | PagerDuty, ntfy |
| Journal | Fichier JSONL gzippé | Loki, ClickHouse |
Restez au minimal aussi longtemps que possible
Une pile Prometheus/Grafana ajoute des services qui peuvent tomber eux-mêmes, et une charge d'administration. Un cron qui lit un fichier et envoie une notification ne tombe pas.
Le seuil de bascule : quand vous faites tourner plus de trois bots, ou quand vous voulez des graphiques historiques de latence. Pas avant.
Ce que vous n'avez pas besoin d'écrire¶
Un rappel utile, parce que la tentation est forte :
| Tentation | Ce qui existe déjà |
|---|---|
| Un moteur de backtest | NautilusTrader, ou le rejeu de votre journal en 15 lignes |
| Un client Rithmic | async_rithmic |
| Un modèle de file d'attente | hftbacktest |
| Un format de stockage | Parquet |
| Une validation croisée purgée | purgedcv |
| Un reconstructeur de carnet | Databento (documentation et exemples) |
Ce que vous devez écrire vous-même : votre moteur de signaux, votre couche de risque, et votre journal. Le reste est de la plomberie déjà résolue.
Résumé¶
- Une pile recommandée par poste, à choisir une fois.
msgspecetuvloop: deux gains réels et quasi gratuits en Python.- Polars ou DuckDB selon la RAM — jamais dans le chemin critique du bot.
- Parquet partitionné par jour suffit longtemps.
- NautilusTrader pour l'event-driven, hftbacktest seulement si stratégie passive.
mlfinlabn'est plus libre ;purgedcvle remplace.- Bookmap : la seule plateforme avec API Python, données non agrégées et exécution.
- Les ordres stop simulés de NinjaTrader ne survivent pas à une déconnexion.
Chapitre précédent : Mise en production et supervision · Chapitre suivant : Validation statistique