Bonjour et merci pour l'accueil
Je vais parler dans ce message de la première stratégie que j'avais implémentée, de l'arbitrage triangulaire entre trois paires de devises.
Après des simulations à gros grain très positives, j'ai décidé d'affiner mes calculs pour avoir plus de précision. Les API qui renvoient uniquement le prix sont peu fiables car elles ne permettent pas d'anticiper le
slippage. Je ne prenais pas non plus en compte les frais de transactions.
Il s'est avéré que l'implémentation d'un algorithme exact était beaucoup plus difficile que ce que j'avais pensé initialement. J'ai dû créer un
Carnet d'ordres local, alimenté à 100ms, plus toute l'infrastructure technique (je vous passe les détails). Quant à l'algorithme en lui-même, il doit prendre en compte le
Carnet d'ordres pour déterminer la quantité qui donne le meilleur profit. Si par exemple au meilleur prix, avec une quantité 1, on a un profit de 3%, mais qu'avec une quantité 100 on a un profit de 1%, c'est la dernière quantité qui fournit le meilleur gain.
Le calcul de ces quantités est complexe, il faut simuler le calcul entre les 3 paires et revenir en arrière lorsqu'on a trouvé une quantité, et itérer pour calculer toutes les quantités qui correspondent à une ligne du
Carnet d'ordres, pour l'une des paires. Sans compter que la paire peut être dans le bon ordre (par ex : B/A, C/B, A/C) ou dans n'importe quel ordre (A/B, C/B, A/C), ce qui complexifie encore les calculs.
J'ai également dû prendre en compte les filtres sur les ordres (step sur les quantités, etc.). Enfin, pour avoir une estimation correcte du
rendement, il faut faire des conversions de devises lorsque les frais sont comptés dans la devise de la paire (sur Binance, la plateforme que j'utilise, ce n'est pas toujours le cas, on peut payer les frais en BNB, mais j'ai fait des tests avec les deux solutions, bien que les frais soient moindres en BNB).
Tant qu'à partir sur un algorithme complexe, j'en ai profité pour l'implémenter avec un nombre de paires arbitraires. J'ai nommé cet algo arbitrage multi-niveau.
Pour que les transactions soient instantanées, l'algo passe des ordres au marché, mais puisque j'ai un carnet d'ordre local, je suis censé connaître précisément le prix auquel l'ordre va être déclenché.
Mon logiciel est capable d'observer des dizaines de trio de paires simultanément. Dans les faits, lors de mes essais en réel, j'en observais entre 10 et 20.
Une fois l'algorithme au point, j'ai assez rapidement décidé de passer en réel. L'avantage de cet algorithme est que les pertes sur un trade sont faibles puisque les transactions sont très rapides.
Le bilan de ces tests a été négatif. Sur quelques centaines de trades, avec une mise maxi de 100 euros, j'ai perdu entre 30 et 40 euros, avec très peu de trades gagnants.
J'ai essayé de comprendre pour quelle raison ça n'avait pas fonctionné. Après analyse des traces, je pense que mon algorithme est correct et n'a pas de bugs. Ce qu'il se passe, c'est qu'il y a toujours une paire dont le prix change entre le moment où je réalise les calculs et le moment où je passe les ordres.
Le temps d'exécution des ordres tourne autour des 3 secondes (une seconde par ordre), et j'ai remarqué, sauf erreur, que ce n'est jamais le premier ordre qui ne correspond pas au prix de la simulation utilisé par l'algo.
Je suppose donc que des ordres sont passés avant les miens. Je suspecte que je ne suis pas le seul à utiliser cette technique et que mes "concurrents" sont capables de passer des ordres plus rapidement que les miens.
Je pensais avoir des moyens techniques d'augmenter la rapidité de mes trades, mais après vérification, ce n'est pas le cas malheureusement. La seule solution serait de disposer à l'avance d'un montant équivalent sur les 3 devises, mais cela demande plus de capital, et limiterait le nombre de trios de paires que je peux observer simultanément.
En ce qui concerne l'arbitrage sur plus de 3 paires, je l'ai testé de manière moins approfondie car les premières simulations étaient beaucoup moins bonnes qu'avec l'arbitrage triangulaire. Je suppose, sans certitude, que plus on ajoute de paires de devises, plus on introduit la possibilité d'une correction négative sur le gain potentiel de l'arbitrage. Je n'ai jamais tradé en réel avec plus de trois paires.
Après cet échec, j'ai donc décidé d'arrêter de travailler sur cet algo et, fatigué par l'effort important que j'y avais consacré, j'ai fait une pause durant quelques semaines. J'ai quand même appris énormément, sur les API, sur la logique générale des algorithmes (la prise en compte du "sens" de la paire, i.e. A/B ou B/A rend les calculs beaucoup plus complexes que ce qu'on pourrait croire au premier abord), etc. J'ai aussi mis en place une architecture qui est utilisable pour d'autres stratégies avec la capacité d'en faire tourner un grand nombre simultanément.
Si vous avez des retours sur ces essais et sur la raison possible de l'échec de cette stratégie, je les lirai avec intérêt