「Pythonのバックテスターは遅すぎる、でもC++で全部書くのはツライ……」
そんな悩みを解決するために開発中の、Rust製コアを持つPython向け仮想通貨バックテスター crypto-rs-backtester を紹介します。
Google Colabで手軽に試せるので、ぜひ遊んでみてください!
🚀 なぜ作ったのか? (Goal)
高頻度取引(HFT)やマーケットメイク(MM)botのバックテストにおいて、既存のPython製フレームワークでは以下の課題がありました。
- 遅い: PythonのforループでTickごとの処理を書くと、バックテストに数時間かかる。
- 再現性がない: 浮動小数点数(float)の誤差や、イベント処理順序の曖昧さで、同じコードでも微妙に結果が変わる。
- 未来予知(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