Overview

📝仮想通貨botの開発に特化したコンテンツはこのメモにまとめていく.

トピックが大きくなったので, APIクライアントについての話題は📄仮想通貨bot: API開発にまとめる.

取引所別

botフレームワーク

btc_bot_framework

暗号通貨高頻度取引bot用websocketベースフレームワーク.

https://github.com/penta2019/btc_bot_framework

BFSX3

くもすけさんの開発するbot開発用フレームワーク. ネットでの評判はよいが値段は高い. BFSX2の後継がBFSX3なので, 雰囲気はBFSX2の過去記事でもわかる.

R2 Bitcoin Arbitrager

アービトラージ特化.

OSSとしてGitHubに公開されているので, GitHub Issue/アーキテクチャともに参考になる.

仮想通貨Bot開発アーキテクチャ

設計Basics

Basicsといっても, なんとなくこういうコンポーネントが必要というまとめ.

注文管理

注文状況を管理する.

ポジション管理

自分の保持しているポジションを管理, 及び損益を管理する.

事前分析機能

アルゴリズムのパラメータを決定する際の計算コストのかかるもの事前に計算してキャッシュしておく. もしくは, 機械学習サービス.

サーバ/マーケット監視

サーバやマーケットのステータスを監視して, 状況によりbotの注文を制限.

🔖トレードモデリング

トレードで必要なデータはだいたい決まってる. 用語は統一したいところ.


tickerはスナップショット的な統計情報という概念なのでモデルは不要かもしれないが, たいてい取引所ではticker取得のAPIはついている.

publicな取引情報とprivateなわたしの約定履歴を区別するためにexecutionとtradeという言葉は分けたほうがいいかも. なおexecutionやtradeという用語はどちらも約定を指して取引所によって用語はバラバラ.

同様な関係はpublicなorderbookとわたしのprivateな orderの関係にもある.


仮想通貨のbotを作りたいが、みんなどう書いてるの?

💡共有メモリでの排他制御はProducer-consumer Pattern

Pythonで実装するときのパフォーマンス改善では大抵2スレッドでqueueを監視し合うProducer-Consumer Patternを採用することになる.

マルチプロセッシング

multiprocessing.Queueをつかうとプロセス間通信がPythonでできるとか(未検証).

ref. https://docs.python.org/ja/3/library/multiprocessing.html

以下の記事の図がとてもわかりやすい.

ref. HFTボットのアーキテクチャ実例|Hoheto (仮想通貨botter)|note


並行処理で考慮すべき観点として, 💡性能のボトルネックがCPUバウンドかIOバウンドかという軸がある. IOバウンドはREST通信をしているときに待たされることをどう回避するかということだが, websocketだったり非同期REST Requestを駆使するとIOバウンドの課題は解決できるため, HFTだとCPUバウンドの課題が残る.

たいていの解決策としてマルチスレッドによってリソースを効率的に使い切る方法が必要. Pythonの場合はThreadingのようでそうでないので, multiprocessing.Queueによってマルチプロセッシングを実現することは戦力を倍にするよいアプローチ.

🔍botの設計の知見ツイートメモ

(おそらく)アビトラbotの設計の知見ツイートメモ

リプ欄にいろいろ.

  • https://twitter.com/ni_ch/status/1494556603156033538
    • CPUバウンドならマルチプロセス, IOバウンドならマルチスレッド.
  • https://twitter.com/Ros_1224/status/1494551683115806721
    • 自分ならasyncioでredisに格納しつつ参照するプロセスは分ける形かな. 板の処理とかをPython上でやるのであれば、pybind11やpyo3あたりでネイティブ化したい。苦肉の策でProcessPoolExecutorにコルーチン投げる形でマルチプロセス. え?マルチスレッドは選択の余地ないです🤣
    • https://twitter.com/Ros_1224/status/1494553271565832192
      • マルチスレッドを使わない理由 1.GILがあってそもそもPythonの命令は並列処理になりまてん。CPU依存の処理は並列処理されまてん 2.並列化されないのにスレッドのスイッチのオーバーヘッド 3.数十のHTTPセッション作ってがっつりポーリングさせるようなスレッド立ててみてください。死にますよ

仮想通貨bot開発Topics

高速化はこっち: 📍HFT bot高速化

💡言語による処理速度

プログラミングの処理速度よりもネットワークレイテンシが課題になることが多いため, 現状のbot開発で差別化ポイントにならない(らしい). 取引所サーバと近いサーバをクラウドで借りる対策のほうがいい.

ただし, みんなPythonを選んでいる都合, 速い言語で書き直してどうなのかを検証している人はちらほらいる.


;; https://zenn.dev/link/comments/7e165cb85142bf

メイカータイプのボット(少し離れたところに指値を置く)であれば、ミリ秒以下のスピードアップの必要性は感じません。逆に、テイカータイプのボットや、SFDボットは発注までのスピードにこだわっていますし、こだわる必要があると思います。


;; https://zenn.dev/link/comments/30a8d4a8a59994 スピードを追求しなくてもあまり影響ないロジックを使っているから。現状、こちら側のレイテンシーよりもAPIサーバ側のレイテンシーのほうの影響が大きすぎる。「こちら側の遅延をどう解決するか」よりも、「取引所側の遅延をどうハンドリングするか」のほうがテーマとして大きいです。自分の話をすると、ミリ秒単位の増減は気にしますが、マイクロ秒単位の増減は気にしていません。

一応、以下は注意しています。

APIサーバとなるべく近いロケーションのサーバで動かす。受信から発注の間で、明らかに遅くなる処理は除去したり、IO系は非同期にする。

Kill Switch

ある指標をしきい値にしてbotを止める.

Kill Switch - Hummingbot Docs


ちょっと推測を含むが, マーケットメイクをしすぎて在庫がたまり過ぎたら止まることをkill switchと呼んでいるのかな?

How To Build a Market Maker Algorithm (in Python) - YouTube

メンテナンス時間対応

取引所のメンテナンス時間にはBotを止める. bot停止機能.

🤖サーバレスbot

📝サーバレス行環境でbot開発.

🔍仮想通貨bot開発言語

Python

Pythonをつかう人がほとんど. Pythonのメリットは,

  • ライブラリ充実. とくにデータサイエンスが絡むと一択.
  • 処理速度のハンディキャップが問題になりにくい.
    • プログラムの処理速度 << ネットワークレイテンシ.
  • 利用者が多いためサンプルコードやツールも充実.
    • noteはだいたいPythonで書かれている.

🔖Python

Rust

処理速度を追い求めるならば最適解.

Solana bot開発の場合, プロトコル言語がRustの関係でRustが選択肢に上がる. ただ言語による処理速度が必要かどうかは場合による. ネットワークレイテンシが問題になることのほうが大きい.

;; https://twitter.com/quant_arb/status/1525120747189960705r

Rust is faster than C++ bc you give the compiler more hints. Way faster to code because you can actually use multithreading without fear. Maybe 1/2-1/3 the time spent coding with Rust. It’s beautifully designed and once you get the hang of it you’ll love it. There’s a reason…

🔖Rust

Go

Java

ファイナンスの世界で古くから使われている歴史ある言語.

https://blogs.oracle.com/javamagazine/post/finance-quant-forex-java16

ただし今はどうなんだろう, 古い記事もおおい. 昔はC++/Javaな感じだったらしく, HFTだと結局ネットワークがボトルネックとなるのでC++がJavaより速くてもそこの速度はあまりなかったとか.


このJava で HFTをする秘密兵器が面白い. Javaが特にHFTで嫌われるのがガベージコレクション. いわゆるStop-the-worldのGCによって突然数百ミリの完全停止が不定期に起こるのはHFTにとっては致命的. それを, Zing JVMというGCアルゴリズムをつかうことでなんとGCによるアプリの停止がなくなったとか.

Why we chose Java for our High-Frequency Trading application | by Jad Sarmo | Medium

🔖Java

LISP

Clojureをつかっている人はいない, Common Lispも.

📝Clojure Algo Trading

💡quant_arbさんのアドバイス

(理解がまちがっているかもわからないけど), まあPythonでもJSでも好きな言語でやればいいし低レイヤの言語の知識よりも分散システムのチューニングのほうが大事だよと.

;; https://twitter.com/quant_arb/status/1584355484223492096

Use whatever language you think you are best at, if you’re a lifelong xx programmer don’t force yourself into Python, Rust, or C++.

References

References

up: 📁仮想通貨bot