📝仮想通貨bot開発

📝仮想通貨bot開発

📝仮想通貨botの開発に特化したないようはこのメモにまとめていく.

取引所別 #

開発ライブラリ #

なんかこまったらccxtとpybottersのコードを除くとヒント得られるかも.

ccxt #

https://docs.ccxt.com/en/latest/manual.html

pybotters #

https://github.com/MtkN1/pybotters

まちゅけんさん作成.

なにかと評判はいいので使わなくてもテクニックは参考になるかも. websocket周りに実装がかんたんになる.

いろいろ開発の動機はあるもののasyncioにインスパイヤされたことが大きいとか.

まちゅけんさんのasyncio解説のZenn記事.

🔍 仮想通貨bot開発言語 #

Python #

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

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

🔖Python

Rust #

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

Solana bot開発の場合, プロトコル言語がRustの関係でRustが選択肢に上がる.

ただ言語による処理速度が必要かどうかは場合による. ネットワークレイテンシが問題になることのほうが大きい.

🔖Rust

LISP #

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

📝Clojure Algo Trading

References #

情報取得 #

板情報キャッシュにSortedDictをつかう #

SortedDictは追加した要素が自動的にkeyの値で昇順にソートされるシーケンス型です。要素の追加・削除は計算量O(log(n))であるため、O(1)の組み込みのdictに比べると若干遅いですが、板情報を現在価格から近い順に参照したい場合、追加のsort(通常計算量がO(n log(n))以上)が必要ないため、結果的に高速に動作します。

賛否両論ある.

;; https://mobile.twitter.com/arms22/status/1354972612875542531

sorteddict なんていらんかったんや。使う直前にsort一回すればええんやで。

板情報の更新にsorteddictつかったんだけど更新のたびにソートが走るので僕の用途にはあわないなぁと思った次第。

約定履歴検索に二分探索をつかう #

idが時系列の数字であることに注目.

[二分探索]少ないAPIリクエストで効率的にbitFlyer約定履歴を検索する|Nagi|note

板情報を自炊してローカルメモリ同期 #

websocketから流れてくるtickからWeb画面で見られるような板情報を自作する. そうすると売り買いのマッチングである約定判断やポジション管理もできるようになる.

これができるようになると情報取得コストを削減できるし, たまに発生する通信遅延や失敗を回避できる.

ポジションずれ問題 #

取引所からポジションのデータがエラーで取得できなかったりといった理由で遅延して送られてくること.

データ分析 #

Bigquery #

Bigqueryの活用ってどうなんだろう.

仮想通貨の自動売買に挑戦した話 | コーラは1日500mlまで

バックテスト #

フォワードテスト #

高速化 #

💡 言語による処理速度 #

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

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


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

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


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

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

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

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

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

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

(おそらく)アビトラ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セッション作ってがっつりポーリングさせるようなスレッド立ててみてください。死にますよ

private api #

ブラウザからの情報取得. 🔖Private API

References #