27
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rust × Python × Polars で実現する、秒間420万イベントの爆速・高精度バックテスター「crypto-rs-backtester」

27
Posted at

「Pythonのバックテスターは遅すぎる、でもC++で全部書くのはツライ……」

そんな悩みを解決するために開発中の、Rust製コアを持つPython向け仮想通貨バックテスター crypto-rs-backtester を紹介します。

Google Colabで手軽に試せるので、ぜひ遊んでみてください!
Open In Colab


🚀 なぜ作ったのか? (Goal)

高頻度取引(HFT)やマーケットメイク(MM)botのバックテストにおいて、既存のPython製フレームワークでは以下の課題がありました。

  1. 遅い: PythonのforループでTickごとの処理を書くと、バックテストに数時間かかる。
  2. 再現性がない: 浮動小数点数(float)の誤差や、イベント処理順序の曖昧さで、同じコードでも微妙に結果が変わる。
  3. 未来予知(Look-ahead Bias): 意図せず未来のデータを使ってしまうバグが入りやすい。

これらを解決するために、「重い処理はRust、研究開発はPython」 というハイブリッド構成を採用しました。

✨ 特徴 (Key Features)

1. 爆速パフォーマンス (Rust Core + Polars)

コアロジックはRustで実装され、PythonとはFFI(PyO3)で連携します。
また、データロードには Polars を採用し、Apache Arrow形式でメモリコピーを最小限に抑えつつRust側にデータを渡します。

デモ(Colab)でのベンチマークでは、Pythonコールバックを含めても 秒間420万イベント 以上の処理速度を記録しています。

2. 高精度な市場シミュレーション

単なるOHLCV(ローソク足)バックテストではなく、Tick(約定)レベル のシミュレーションを行います。

  • 遅延(Latency)モデル: 通信遅延を考慮し、Strategyが見ている時刻(ts_local)と実際の市場時刻(ts_exchange)を分離。
  • イベント駆動: 注文受付、約定、キャンセルなどのイベントを厳密な時系列順で処理。

3. 完全な決定論的動作 (Determinism)

「同じシード値なら、何度実行しても1bitたりとも違わない結果が出る」ことを保証しています。

  • 価格・数量計算には f64 ではなく固定小数点数(i64)を使用。
  • 乱数生成器のシード固定を徹底。

4. 2つのPython実行モード

研究用途に合わせて使い分けられます。

  • Tick Mode: on_tick(tick) で1件ずつ処理。直感的でデバッグしやすい。
  • Batch Mode: on_ticks(ticks) でまとめて処理。Python呼び出しのオーバーヘッドを削減し、最大スループットを発揮。

🛠️ 使ってみよう (Usage)

以下は Google Colab で動く最小限のサンプルです。

import polars as pl
import rust_backtester as rb

# 1. データの準備 (Polars LazyFrame)
lf = pl.DataFrame({
    'ts_exchange': [1000, 2000, 3000, 4000],
    'price': [100_00000000, 101_00000000, 99_00000000, 100_00000000], # 固定小数点(1e-8)
    'qty': [1_00000000, 1_00000000, 1_00000000, 1_00000000],
    'side': [1, -1, 1, -1],
    'seq': [0, 1, 2, 3],
}).lazy()

# 2. バックテスターの初期化
bt = rb.Backtester(
    data={'binance:BTC/USDT': lf},
    seed=42,
    python_mode='tick' # または 'batch'
)

# 3. 戦略の定義 (コールバック)
class MyStrategy:
    def on_tick(self, tick, ctx):
        # ここにロジックを書く
        pass

# 4. 実行
stats = bt.run(MyStrategy())
print(stats)

📈 今後のロードマップ

現在は開発初期段階(WIP)ですが、今後は以下の機能を実装予定です。

  • 板情報(Orderbook)の再現: L2/L3データのサポート
  • 約定シミュレーションの強化: 自分の注文が列のどこに並んでいるか(Queue Position)の推定
  • 複数取引所(Multi-Venue)対応: アービトラージ戦略のテスト

RustとPythonの良いとこ取りをした crypto-rs-backtester、ぜひGitHubでスター⭐️をお願いします!
開発に参加してくれる方も募集中です。

🔗 GitHub Repository: https://github.com/takurot/crypto-rs-backtester

27
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?