Hydre : trading algorithmique automatisé
Un système autonome qui décide et engage de l’argent réel sur un marché de prédiction, construit seul, sur des données gratuites, et en gain net depuis son passage en réel.
- Python 3.12
- asyncio
- PostgreSQL
- Docker
- Prometheus
- Grafana
- Ce que c’est
Un système qui décide seul et engage de l’argent réel sur un marché de prédiction, sans qu’aucune décision soit relue avant de partir.
- Ce qui était dur
Aucune donnée payante, aucun quota acheté, aucune astreinte. Ce qui est disponible gratuitement doit suffire, et le système doit tenir sans moi.
- Ce que ça prouve
Il tourne, il est en gain net, et chacune de ses décisions porte le motif qui l’a produite.
Projet personnel, développé et opéré seul, sur mes fonds propres. Conçu en février 2026. 2sur troisproductionStratégies engagées en argent réel : 2 sur trois (production). tournent en argent réel, et le système fonctionne au moment où j’écris ces lignes.
Le pari
Le prix est déjà une probabilité. Un marché de prédiction vend des parts dont le prix, entre zéro et un, est la probabilité que le marché attribue à un événement. À la résolution, la part gagnante vaut un, la perdante vaut zéro.
D’où la question, et c’est la seule : suis-je capable de produire une probabilité mieux calibrée que celle du marché, sur un sous-ensemble de marchés, avec des données que personne ne facture ?
Ce qui rend la chose difficile
Budget nul sur les données. Prévisions météorologiques d’ensemble publiques, scores sportifs en direct d’une API ouverte, flux public des transactions du marché. Aucun flux payant, aucun quota acheté.
Le système décide seul, sans surveillance continue. Il tourne en permanence, il engage de l’argent, et personne ne relit ses décisions avant qu’elles ne partent. Surtout, un ordre émis produit un effet de bord que rien ne rejoue : il n’existe aucune transaction englobante qui remettrait le monde extérieur dans son état antérieur. C’est ce qui impose de persister l’intention avant l’envoi plutôt qu’après.
Les sources extérieures sont instables et hors de mon contrôle. Fournisseurs de données, interface du marché, réseau, chaîne de règlement : chacune peut tomber, bégayer, ou répondre faux.
Un seul opérateur. Personne d’astreinte, personne pour remarquer un silence.
Comment le système décide
De la probabilité à la décision
- Probabilité
- du modèle
- Prix du marché
- comme a priori
Mélange
- Cascade de calibration
- hiérarchique bayésienne, puis post-modèle, puis prédiction conforme
- Verrou de validation
- favorable, défavorable, ou données insuffisantes
- jamais favorable à ce jour
- Une fourchette, pas un chiffre unique
- le système sait dire à quel point il est sûr
- Parier seulement si le coup tient dans le pire cas
- plus le système hésite, moins il engage
Trois sources de prédiction indépendantes, et cette indépendance n’est pas déclarée : elle est établie par un contrôle rejouable en une commande, sans base ni réseau, dont le verdict est affiché plus bas. Une prévision météorologique ensembliste corrigée par post-traitement statistique, un ensemble de modèles de résultats sportifs en direct, et une notation d’agents par système de rating bayésien à incertitude.
Une chaîne de décision unique, partagée par les trois. Aucune stratégie ne calibre chez elle : une probabilité brute traverse une cascade commune, correction hiérarchique bayésienne, calibration post-modèle, puis prédiction conforme qui produit un intervalle plutôt qu’un point. La sortie n’est pas une probabilité, c’est une probabilité accompagnée de son incertitude.
La règle d’engagement tient en une phrase : le système ne mise que si son avantage tient encore dans le pire scénario crédible. S’il hésite entre « bonne affaire » et « piège », il s’abstient. Conséquence voulue : plus le modèle est incertain, plus il lui est difficile d’agir, et l’incertitude réduit d’elle-même la taille engagée. Un plafond de bankroll borne le reste.
Une couche d’exploitation : supervision de tâches, détection de stagnation, chien de garde externe, réconciliation avec la chaîne, journalisation intégrale des décisions, refus compris.
artefact reproductibleIdempotence des ordres par intention persistée avant envoi, avec refus d’émettre si la trace ne peut pas être écrite.
Ce que j’ai tranché en route
Calibrer avant de chercher un avantage
Une probabilité mal calibrée rend toute décision d’engagement fausse, quel que soit le modèle qui la produit. Sur la famille sportive, la mise en commun partielle des segments à faible effectif vers la moyenne globale fait passer l’erreur de calibration de 0,132d’erreur de calibrationjeu de testErreur de calibration avant correction hiérarchique : 0,132 d’erreur de calibration (jeu de test). à 0,061d’écart moyenjeu de testQuand le système annonce « 70 % de chances », la réalité tombe en moyenne à six points de ce qu’il annonce, contre treize avant la correction : l’écart a été divisé par deux., mesurée hors échantillon, à protocole et jeu identiques. Seul le calibrateur change.
C’est un gain réel et c’est aussi une leçon : mieux calibrer rend les probabilités honnêtes, cela ne les rend pas meilleures que le prix.
Répondre à la panne selon sa nature, pas selon sa gravité apparente
Après trois incidents de la même famille, le constat s’est imposé : un garde-fou conçu pour un danger permanent, appliqué à un incident transitoire, avec une conséquence définitive. Un fournisseur qui bégaie quelques secondes déclenchait le même gel qu’une fuite de capital.
| Nature du danger | Réaction | Reprise |
|---|---|---|
| Transitoire, un tiers qui hoquette | pause en mémoire | automatique, dès que la cause disparaît |
| Permanent, perte réelle, divergence confirmée | gel persisté | humaine, obligatoirement |
La pause ne survit pas au processus, et c’est voulu : au redémarrage la condition est réévaluée à neuf, jamais héritée. Elle bloque toute entrée. Elle ne bloque jamais les sorties : une panne de tiers ne doit pas emprisonner du capital dans une position ouverte.
Ne jamais créditer ce qui n’est pas confirmé
Un gain n’est pas crédité tant que la contrepartie n’est pas réellement encaissée sur la chaîne, et le montant crédité est celui lu dans le reçu, jamais un montant calculé.
Corollaire trouvé à la dure : la divergence entre comptabilité interne et solde réel est signée. Un déficit est un danger, de l’argent manque. Un excès borné par des gains attendus est un simple retard d’écriture. Les deux avaient d’abord le même seuil, et le système se coupait parce qu’il gagnait.
Refuser un avantage trop beau
Le système sait aussi refuser un pari dont l’avantage apparent est trop grand. Un écart énorme entre ma probabilité et celle du marché n’est pratiquement jamais une opportunité : c’est le signe que mon modèle s’est trompé, ou que le marché sait quelque chose que j’ignore.
arbitrage documentéRéponse proportionnée aux pannes de tiers : pause réversible et automatique pour le transitoire, gel à reprise humaine pour le permanent, et jamais de blocage des sorties.
Ce que ça donne
Il tourne - et il est en gain net
785prédictionsproductionAutant de fois où le système a misé de l’argent tout seul, sans que personne ne relise sa décision. ont été engagées en argent réel, sans qu’aucune ne soit relue avant de partir. Au 27 août 2026, le compte est en gain net, frais déduits, sur toute la période d’activité.
C’est un fait daté, pas une projection, et il se dit sans montant. Aucun chiffre de capital, de résultat ou de rendement n’est publié, ni ici ni ailleurs : l’échelle se dit en nature, quelques centaines de dollars engagés. Ce n’est pas de la pudeur, c’est que le montant ne prouve rien. Et quelques mois ne distinguent pas un avantage d’une série chanceuse. Sur quelques centaines de paris, un résultat positif reste parfaitement compatible avec l’absence de tout avantage réel, ce que la section des limites détaille.
Ce qui se défend ici n’est donc pas le gain. C’est qu’un système autonome ait pris huit cents décisions financières sans supervision, et que le compte soit positif à l’arrivée.
Ce qu’il a fallu construire pour en arriver là
12,2 MdécisionsproductionDécisions journalisées avec leur motif : 12,2 M décisions (production)., chacune accompagnée du motif qui l’a produite, refus compris. C’est ce qui rend le système analysable : sans journal des refus, la question « mes filtres écartent-ils vraiment les mauvais cas ? » est indécidable.
1 004testsproductionTests exécutés, tous verts : 1 004 tests (production). avant chaque déploiement, dont je ne peux pas dire ce qu’ils couvrent : le taux de couverture n’est pas mesurable dans l’environnement actuel. Compter des tests sans savoir ce qu’ils atteignent est exactement le reproche que je fais ailleurs à un chiffre publié sans référence. Il vaut ici contre moi.
1sur deuxproductionContrats d’architecture tenus : 1 sur deux (production). : l’indépendance des trois stratégies est garantie mécaniquement, le contrat de couches ne l’est pas. Le contrôle tourne à chaque déploiement et la remise en conformité est engagée : l’audit interne a conclu qu’une part des manquements décrit l’architecture voulue plutôt qu’une dette, le contrat est donc réécrit avant d’être à nouveau opposable. Un contrat périmé qu’on laisse échouer apprend à ignorer son propre outil.
Sortie de l’outil de contrôle, rejouable en une commande, sans base, sans réseau et sans argent engagé.
135fichiers
323dépendances
Hydre layered architectureBROKENWorkers mutually independentKEPT
1 contrat tenu · 1 contrat rompu
La fiabilité s’est construite par post-mortem
Le système n’est pas robuste par conception, il l’est devenu incident après incident, et trois pannes de la même famille ont été nécessaires pour que j’en tire la bonne règle.
En juillet 2026, l’arrêt le plus long : 4,5joursproductionLe service est resté à l’arrêt quatre jours et demi sans que rien ne m’alerte : c’est la panne que je raconte parce qu’elle m’a échappé.. C’est là que j’ai cessé de corriger le chemin qui avait cassé pour recenser tous les chemins de la même famille : 21cheminsproductionChemins d’arrêt recensés après le dernier incident : 21 chemins (production).. Les pannes précédentes avaient chacune reçu un correctif ponctuel, et la suivante était arrivée par la porte d’à côté.
En août, le dernier en date : trois échecs réseau de quelques secondes ont gelé les stratégies réelles pendant plus d’une journée. 0euro perduproductionTrente heures de gel en argent réel, et pas un euro perdu : le gel bloque les entrées, jamais les sorties.. Le gel bloque les entrées et jamais les sorties, aucune position n’était exposée. L’arrêt n’a pas non plus été détecté, et c’est ce défaut-là, pas la panne, qui a produit le correctif suivant.
Ce qui reste fragile
C’est le résultat le plus solide du projet, et il joue contre lui. Sur l’univers traité, le taux de réussite observé égale le prix d’entrée pour les trois stratégies, dont une n’a jamais quitté la simulation, et une régression de l’issue sur ma probabilité et sur le prix ne retient que le prix. Le plafond structurel est donc le point mort, moins les frais, et le gain net constaté ne le contredit pas : il est compatible avec une série favorable sur une durée courte.
Le contexte est mesuré : 77,9 MparisbacktestParis résolus rejoués sur l’historique du marché : 77,9 M paris (backtest). sur 41moisbacktestDurée couverte par le rejeu : 41 mois (backtest). établissent que le prix de ce marché est déjà calibré, à un point de pourcentage près et à tous les niveaux de prix. C’est la barre à battre.
Le verrou statistique que j’ai construit n’a jamais donné son feu vert. Il tranche en trois états, favorable, défavorable, ou données insuffisantes, et exige que quatre contrôles indépendants passent ensemble. 0feu vertbacktestFeux verts émis par le verrou de validation : 0 feu vert (backtest).. Les stratégies en argent réel sont donc engagées sans son accord, à petite échelle et en connaissance de cause. Je peux défendre l’arbitrage, je ne le présente pas comme une audace.
Trois fragilités restent ouvertes, aucune n’est un oubli, et chacune porte sa suite. Le dispositif d’alerte repose sur un canal unique, identifié comme le risque le plus élevé subsistant : le doublement de ce canal est le premier chantier de la prochaine version, avant toute reprise des modèles. Les trois stratégies n’émettent aucun signe de vie vers le détecteur de stagnation, correctif d’une ligne par fichier, écrit et en attente de la fenêtre de déploiement. Et une dégradation de calibration est silencieuse pour la décision : un artefact illisible fait retomber la couche concernée en passe-plat, et le système continue d’engager de l’argent sur une probabilité non calibrée ; ce repli doit devenir un refus, pas un défaut silencieux, et c’est le correctif suivant.
Un défaut d’unités connu entre le calcul des frais et celui de l’avantage n’est pas encore corrigé, et il l’est délibérément. La raison n’est pas technique : le corriger augmenterait les montants engagés, et je ne veux pas augmenter l’exposition avant d’avoir doublé le canal d’alerte. La correction est écrite, sa mise en service est conditionnée à ce doublement. C’est une décision de risque tenue dans cet ordre, pas un défaut laissé de côté.
Si je recommençais
Je poserais le verrou avant les modèles. J’ai construit trois familles de modèles, puis l’instrument capable de dire s’ils valaient quelque chose. Construit d’abord, il m’aurait fait poser la question qui compte, qu’est-ce qui pourrait battre un prix de marché, et pourquoi ?, avant d’écrire des dizaines de milliers de lignes pour y répondre par défaut.
Je doublerais le canal d’alerte avant tout le reste. Le canal est resté muet un mois entier sans que personne s’en aperçoive, et c’est ce qui a fait naître la seule parade qui marche : un battement quotidien attendu à heure fixe, qui transforme l’absence d’alerte en signal. Un canal unique reste un canal unique.
Je traiterais la classe, pas le cas, dès le premier incident. La règle a coûté trois pannes avant d’être apprise. Le même réflexe a produit le garde-fou anti-dégénérescence, né d’un calibrateur dégénéré qui avait silencieusement éteint les signaux d’une compétition entière : un correctif ponctuel aurait remplacé ce calibrateur, la règle générale refuse désormais toute calibration dégénérée.
Preuves
mesureLe système est en gain net depuis son passage en argent réel. Relevé par l’auteur le 27 août 2026, sur le décompte que le marché tient lui-même pour ce compte. Aucun montant n’est publié.mesureVerrou de validation statistique à trois états, favorable, défavorable ou données insuffisantes, sur séparation hors échantillon purgée avec embargo par événement.mesureSur l’univers traité, le taux de réussite réalisé égale le prix d’entrée pour les trois stratégies ; une régression conjointe attribue tout le poids au prix et un poids nul aux modèles.arbitrage documentéRéponse proportionnée aux pannes de tiers : pause réversible et automatique pour le transitoire, gel à reprise humaine pour le permanent, et jamais de blocage des sorties.artefact reproductibleIdempotence des ordres par intention persistée avant envoi, avec refus d’émettre si la trace ne peut pas être écrite.contrainte tenueUn défaut d’unités connu n’est pas encore corrigé parce que le corriger augmenterait les montants engagés : la correction est écrite, sa mise en service est conditionnée au doublement du canal d’alerte. Décision de risque tenue dans cet ordre, pas décision technique.Chiffres et méthode
15 chiffres et la façon dont chacun a été mesuré
- Prédictions engagées en argent réel
- 785prédictionsproductionAutant de fois où le système a misé de l’argent tout seul, sans que personne ne relise sa décision.Compteur du tableau de bord public du compte, relevé le 27 août 2026. Chaque prédiction est un engagement financier réel sur l’issue d’un événement, décidé et passé par le système sans intervention.Compteur de la plateforme, relevé sur une capture datée : je ne le recalcule pas depuis la base de production.
- Décisions journalisées avec leur motif
- 12,2 MdécisionsproductionComptage des décisions consignées par le système, refus compris, chacune accompagnée du motif qui l’a produite. C’est un chiffre que je relève dans ma base de production.Relevé une fois, pas suivi en continu. Le décompte agrège mes trois stratégies, dont une n’a jamais quitté la simulation.
- Paris résolus rejoués sur l’historique du marché
- 77,9 MparisbacktestRejeu de l’historique public du marché, couvrant quarante et un mois, pour établir empiriquement que le prix affiché est déjà calibré : sur cet univers, le taux de réussite observé ne s’écarte du prix que d’un point de pourcentage environ, quel que soit le niveau de prix.Mesure sur l’historique du marché, pas sur les paris du système : elle décrit ce qu’il faut battre, pas ce que le système obtient. L’écart d’environ un point est un ordre de grandeur rapporté par le rapport, pas un intervalle de confiance.
- Durée couverte par le rejeu
- 41moisbacktestÉtendue temporelle de l’historique rejoué, bornée par la profondeur des données publiques disponibles sur le marché.
- Erreur de calibration avant correction hiérarchique
- 0,132d’erreur de calibrationjeu de testErreur de calibration espérée, mesurée sur une séparation temporelle hors échantillon, avant application de la correction hiérarchique. Elle mesure l’écart moyen entre la probabilité annoncée et la fréquence réellement observée.Mesurée sur une seule famille de marchés, la famille sportive. Elle ne décrit pas la calibration des deux autres.
- Écart entre les probabilités annoncées et la réalité, après correction
- 0,061d’écart moyenjeu de testQuand le système annonce « 70 % de chances », la réalité tombe en moyenne à six points de ce qu’il annonce, contre treize avant la correction : l’écart a été divisé par deux.Même mesure, même séparation hors échantillon, après mise en commun partielle des segments fragiles vers la moyenne globale. Le protocole et le jeu sont identiques à la mesure d’avant : seul le calibrateur change.Une meilleure calibration ne crée aucun avantage : elle rend les probabilités honnêtes, elle ne les rend pas meilleures que le prix.
- Perte pendant l’arrêt de trente heures
- 0euro perduproductionTrente heures de gel en argent réel, et pas un euro perdu : le gel bloque les entrées, jamais les sorties.Relevé après l’incident des 19 et 20 août 2026 : trois échecs réseau de quelques secondes ont gelé les stratégies engagées en argent réel pendant trente heures. Aucune position n’était exposée au moment du gel, et le gel bloque les entrées sans jamais bloquer les sorties.L’absence de perte tient autant à l’état du portefeuille à cet instant qu’à la conception du gel. L’arrêt, lui, n’a pas été détecté par le dispositif d’alerte.
- Tests exécutés, tous verts
- 1 004testsproductionSuite complète exécutée avant déploiement. Le décompte porte sur les cas exécutés : les tests paramétrés se déploient en plusieurs cas à partir d’une même fonction.Le taux de couverture associé n’est pas mesurable en l’état et n’est donc pas publié.
- Feux verts émis par le verrou de validation
- 0feu vertbacktestLe verrou applique une règle conjonctive à trois états sur une séparation hors échantillon purgée avec embargo par événement, combinant quatre contrôles indépendants : probabilité de surapprentissage par validation croisée combinatoire, ratio de Sharpe déflaté, correction Romano-Wolf du risque de première espèce familial, et longueur minimale de rétro-test. Un feu vert exige que tous passent.Y compris pour les deux stratégies engagées en argent réel : le passage s’est fait sans feu vert, à petite échelle et en connaissance de cause.
- Stratégies engagées en argent réel
- 2sur troisproductionBasculement par stratégie depuis le 8 juillet 2026 ; la troisième reste en simulation. Le système fonctionne au moment de la rédaction.
- Contrats d’architecture tenus
- 1sur deuxproductionVérification statique des dépendances entre modules, exécutée sans base, sans réseau et sans engagement financier. Le contrat d’indépendance mutuelle des trois stratégies est tenu ; le contrat de couches ne l’est pas.L’audit interne conclut qu’une partie des manquements du second contrat reflète l’architecture voulue plutôt qu’une dette : le contrat est en partie périmé et n’a jamais été réécrit. Aucun décompte de manquements n’est publié.
- Fichiers parcourus par le contrôle d’architecture
- 135fichiersproductionDécompte rapporté par la sortie de l’outil de contrôle des contrats, exécuté sans base, sans réseau et sans engagement financier.
- Dépendances entre modules parcourues
- 323dépendancesproductionDécompte rapporté par la même exécution que celui des fichiers : ce sont les arcs du graphe d’imports sur lequel les deux contrats sont évalués.
- Interruption de service la plus longue
- 4,5joursproductionLe service est resté à l’arrêt quatre jours et demi sans que rien ne m’alerte : c’est la panne que je raconte parce qu’elle m’a échappé.Mesurée entre l’arrêt du service et sa reprise, le 30 juillet 2026. Déclenchée par une mise à jour système, une porte de démarrage plus stricte que le régime courant, et l’épuisement du quota de redémarrage du gestionnaire de services.La fiche de preuves porte deux relevés divergents pour ce même incident, cinq jours et quatre jours et demi. C’est la seconde valeur, donnée par l’auteur, qui est publiée ; la divergence n’est pas tranchée.
- Chemins d’arrêt recensés après le dernier incident
- 21cheminsproductionInventaire produit en réponse au dernier incident : plutôt que de corriger le seul chemin qui avait cassé, la classe entière du problème a été recensée.