Overview
📝仮想通貨botの開発に特化したコンテンツはこのメモにまとめていく.
トピックが大きくなったので, APIクライアントについての話題は📄仮想通貨bot: API開発にまとめる.
- 📝仮想通貨データ分析にデータ分析やバックテストのトピックを移動.
- 📝仮想通貨bot戦略はこちら.
- 開発の愚痴は✏仮想通貨bot開発日誌(Twitterは閲覧だけでやらないので).
取引所別
botフレームワーク
btc_bot_framework
暗号通貨高頻度取引bot用websocketベースフレームワーク.
https://github.com/penta2019/btc_bot_framework
BFSX3
くもすけさんの開発するbot開発用フレームワーク. ネットでの評判はよいが値段は高い. BFSX2の後継がBFSX3なので, 雰囲気はBFSX2の過去記事でもわかる.
- BFSX3の紹介|くもすけ|note
- 【BFSX2】複数取引所に対応した高速botフレームワーク|くもすけ|note
- 【BFS-X】ポジションを自炊して高速に売買を行うbitFlyerでの高速botフレームワーク(mmbotと高速スキャルピングbotのサンプルロジック付属)|くもすけ|note
R2 Bitcoin Arbitrager
アービトラージ特化.
OSSとしてGitHubに公開されているので, GitHub Issue/アーキテクチャともに参考になる.
仮想通貨Bot開発アーキテクチャ
設計Basics
Basicsといっても, なんとなくこういうコンポーネントが必要というまとめ.
注文管理
注文状況を管理する.
ポジション管理
自分の保持しているポジションを管理, 及び損益を管理する.
事前分析機能
アルゴリズムのパラメータを決定する際の計算コストのかかるもの事前に計算してキャッシュしておく. もしくは, 機械学習サービス.
サーバ/マーケット監視
サーバやマーケットのステータスを監視して, 状況によりbotの注文を制限.
🔖トレードモデリング
トレードで必要なデータはだいたい決まってる. 用語は統一したいところ.
-
ticker: ティッカー
-
trades: 取引
-
orderbook: 板
-
execution: 約定
-
order: 注文
-
position: ポジション
tickerはスナップショット的な統計情報という概念なのでモデルは不要かもしれないが, たいてい取引所ではticker取得のAPIはついている.
publicな取引情報とprivateなわたしの約定履歴を区別するためにexecutionとtradeという言葉は分けたほうがいいかも. なおexecutionやtradeという用語はどちらも約定を指して取引所によって用語はバラバラ.
同様な関係はpublicなorderbookとわたしのprivateな orderの関係にもある.
💡共有メモリでの排他制御は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の設計の知見ツイートメモ
- Pythonでボット作るために適したフレームワークはどれ?
リプ欄にいろいろ.
- 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と呼んでいるのかな?
How To Build a Market Maker Algorithm (in Python) - YouTube
メンテナンス時間対応
取引所のメンテナンス時間にはBotを止める. bot停止機能.
🤖サーバレスbot
📝サーバレス行環境でbot開発.
- Botで気軽にビットコイン無限買い【サーバーレスbot】
- 【Botter Advent Calendar2023】仮想通貨で月に1万円を稼ぐC級Botterになろう|QASH_NFT
- クラウド上のサーバーレスのbotを支えるサービス #AWS - Qiita
🔍仮想通貨bot開発言語
Python
Pythonをつかう人がほとんど. Pythonのメリットは,
- ライブラリ充実. とくにデータサイエンスが絡むと一択.
- 処理速度のハンディキャップが問題になりにくい.
- プログラムの処理速度 << ネットワークレイテンシ.
- 利用者が多いためサンプルコードやツールも充実.
- noteはだいたい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…
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
LISP
Clojureをつかっている人はいない, Common Lispも.
💡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
- ビットコイン自動売買BOTをどのプログラミング言語で書くか?|カスタマー|note
- Best Coding Languages for Trading Bots - Java Code Geeks - 2022
- ここではPython/C++/Javaの3つが比較されている.
References
- 文系でもわかる!BitcoinのBOT自動売買トレードの始め方
- トレンドフォローのbot開発のファーストチョイスな無料コンテンツ.
- noteで買える仮想通貨の自動売買botや関連noteをまとめてみた
- bitcoin BOT for「BitFlyer,GMO,Liquid & etc」 猫にビットコイン
- なんか雑多なブックマーク.
- AKAGAMI式 トレードシリーズ botトレーダー養成講座 第1回 PythonによるBitMEXヒストリカルデータ(OHLCV)取得からトレードbotの基本形作成まで|🟥 AKAGAMI|note
- 簡単なSMAによるbot作成例. ターゲットはbotを知らない人向けなので優しい.
- ゼロから始めるBitcoinの自動取引① | Alumi Official Website
- 全4回シリーズ.
- Bitcoinの自動取引botのバックテストをしてみたら思ったより利益出てる - Qiita をわかりやすく書き直したとのこと.
- actchain:非同期・疎結合仮想通貨取引bot実装ツール #Python - Qiita
- botter のためのデプロイ入門
- 仮想通貨BOTの開発論|Ros
👉Related
up: 📁仮想通貨bot