PythonのvectorbtでFXバックテストを高速化する方法【2026年版】
Photo by Maxim Hopman on Unsplash
最終更新: 2026年06月
FXシステム開発で一番しんどいのは、バックテストの待ち時間だと思う。SMAの期間を5から200まで総当たりしようとしたとき、素朴なループ実装だと数十分平気でかかる。vectorbtはその問題に「行列思考」で切り込むPythonライブラリで、2026年4月リリースのv1.0.0時点でPython 3.10以上をサポートしている(出典: PyPI)。本稿では、FX通貨ペア(USD/JPY)に特化した実装コードを具体的に見せながら、速度面の正直な評価と限界まで踏み込む。
vectorbtとは何か──「行列思考」のバックテスター
Photo by Nick Chong on Unsplash
vectorbtとは、pandasとNumPyを基盤とし、NumbaとRustで演算を高速化したPython製バックテストライブラリだ。
"Thinks in matrices. Backtests at scale."──これがvectorbtの公式コンセプト。
従来のイベント駆動型バックテスターはfor文でローソク足を一本ずつ処理する。vectorbtはその発想をひっくり返して、複数の戦略パラメータを「ループではなく配列に詰め込んで一括処理」する設計になっている。内部ではpandasとNumPyのオブジェクトに乗り、NumbaとRustで演算を高速化する構造だ。GitHubスター数は約8,000、フォーク数は約1,000に達しており(出典: GitHub polakowo/vectorbt)、バックテストコミュニティでの採用実績はそれなりに積み上がっている。
エディションはオープンソース版(無償)とvectorbt PRO(有償)の2種類。本稿では無償版を前提にするが、パフォーマンス比較数値は公式PROドキュメントから引っ張っている。
なぜvectorbtはFXバックテストに速いのか
結論から言えば、vectorbtはPandasの単純実装と比較してSortino比率計算で約343倍の高速化を記録しており、NumbaのJITコンパイルと並列化がその主要因だ。
速度差は「速い/遅い」という定性表現より、数字で見たほうが腹落ちする。
vectorbt PRO公式パフォーマンスページによると、ローリング平均の計算速度はPandasの45.6msに対してNumba非並列5.33ms、Numba並列1.82msを記録。Sortino比率の計算ではQuantStatsの2.79秒に対してvectorBTは8.12ms、約343倍の高速化だ(出典: vectorbt PRO公式 https://vectorbt.pro/features/performance/)。Pandas(45.6ms)とNumba並列(1.82ms)から逆算すると約25倍に相当する(数値の出典: vectorbt PRO公式)。
ただし注意が必要だ。 これらの数値はPROエディションのベンチマークで、無償版の実環境での速度とは話が変わる。計測条件(CPU・メモリ・データサイズ)も公開されていないから、自分の環境で同じ数字が出るとは思わないほうがいい。
速度比較については、VectorBTはbacktesting.pyより高速で、btやBacktraderと比べると大幅な優位を持つとされている(出典: hasanjaved.me)。ただ用途によって最適解は変わってくる。
FX通貨ペア(USD/JPY)での実装コード
インストールはpipで完結する。Python 3.10以上の環境で以下を実行すれば基本機能がすぐ使える(出典: PyPI)。
pip install -U vectorbt # 基本版
pip install -U "vectorbt[rust]" # Rustエンジン込み
yfinanceでUSD/JPYデータを取得するときは、ティッカーシンボルに "USDJPY=X" を指定する。SMAクロス戦略の最小実装がこれだ。
import vectorbt as vbt
import yfinance as yf
# USD/JPYの日次データ取得
data = yf.download("USDJPY=X", start="2022-01-01", end="2025-12-31")
close = data["Close"].squeeze()
# SMAクロス(複数パラメータを一括評価)
fast_windows = range(5, 50, 5)
slow_windows = range(20, 200, 10)
fast_ma = vbt.MA.run(close, window=list(fast_windows), short_name="fast")
slow_ma = vbt.MA.run(close, window=list(slow_windows), short_name="slow")
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
pf = vbt.Portfolio.from_signals(close, entries, exits, init_cash=100_000)
print(pf.stats())
このコードのポイントは、fastとslowの全組み合わせを「ループ不要」で一括処理している点だ。イベント駆動型だと二重ループになる処理が、行列演算一発に変わる。慣れると手放せなくなる感覚がある。
インジケータの設計ロジックをAIと対話しながら検証したい場合は、Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
免責事項: 上記コードのバックテスト結果は過去のデータに基づくものであり、将来の利益を保証するものではありません。FX取引には元本損失リスクが伴います。
ベクトル化の限界:スリッページと部分約定
Photo by Sasun Bughdaryan on Unsplash
vectorbtが苦手とするのはスリッページ・部分約定といった「状態依存の処理」であり、ここはイベント駆動型バックテスターと明確にトレードオフがある。
ここは正直に書いておきたい。vectorbtが苦手な領域は確かに存在する。
ベクトル化設計は全ローソク足を同時に処理する構造上、「状態依存の処理」と噛み合わない。具体的にはスリッページ(約定価格のズレ)と部分約定(注文量の一部しか成立しないケース)のモデリングが制約される。無償版では約定価格を終値固定で扱うため、FXのbid/askスプレッドを正確に再現するには別途データと実装が要る。
高精度なFXバックテストをやろうとしたとき、yfinanceの日次終値データだけでは足りない。DukascopyやOANDA Historical Dataのようなティックデータを別途調達して、スプレッドをコストとして手動でモデル化するのが現実的な対応になる。
パラメータ最適化の実際
vbt.Portfolio.from_signals() と idxmax() の組み合わせで、全パラメータ組み合わせの中から最良値を一括抽出できる。
vectorbtの本領はパラメータ最適化で特に発揮される。上のコードの fast_windows と slow_windows の範囲を広げても、実行時間の増加はループ型の数分の一に収まる。
# 最良パラメータの抽出
total_return = pf.total_return()
best_idx = total_return.idxmax()
print(f"最良の組み合わせ: fast={best_idx[0]}, slow={best_idx[1]}")
print(f"トータルリターン: {total_return[best_idx]:.2%}")
ただし「バックテスト上の最良パラメータ」がそのまま将来の有効性を示すわけではない。過剰最適化(カーブフィッティング)は定量検証でも繰り返し引っかかる落とし穴で、ウォークフォワード分析やアウトオブサンプル検証を組み合わせてはじめて統計的に信頼できる評価に近づく。最適化の数字が良すぎるときほど疑ったほうがいい。
パラメータ最適化の試行サイクルをAIと対話しながら加速したい場合は、Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
本記事の内容はシステム設計・技術解説を目的としており、特定の取引を推奨するものではありません。FX取引は元本割れリスクを含む金融商品です。取引に際しては金融機関の提供するリスク説明書を十分にお読みください。
よくある質問(FAQ)
Q: vectorbtはFXの通貨ペアに対応していますか?
A: はい、対応しています。yfinanceでは "USDJPY=X" のようなシンボル形式を指定することでUSD/JPYを含む主要通貨ペアのデータを取得できますが、ティックデータ・スプレッドの再現には別途データソースが必要です。
Q: backtesting.pyとの速度差はどのくらいですか? A: ベンチマーク条件によって異なりますが、VectorBTはbacktesting.pyと比較して高速な傾向があります(出典: hasanjaved.me)。パラメータ最適化を伴うタスクでvectorbtの優位が出やすい傾向があります。
Q: vectorbt無料版とPROの違いは何ですか? A: 無料版はオープンソースで基本的なバックテスト機能を提供します。PRO版はRustエンジンによる更なる高速化、ポートフォリオ最適化、プレミアムサポートなどが追加されます。本稿の速度ベンチマーク数値はPRO版のものです。
Q: バックテスト結果は実際のFX取引の利益を保証しますか? A: 保証しません。バックテストは過去データへの当てはめであり、将来の相場環境が同一である保証はありません。スリッページ・スプレッド・流動性リスクはバックテストで再現しきれない要因です。FX取引には元本損失リスクが伴います。
Q: vectorbtのインストール方法を教えてください。
A: pip install -U vectorbt で基本版をインストールできます(Python 3.10以上が必要。出典: PyPI)。Rustエンジンを含む場合は pip install -U "vectorbt[rust]" を使用します。
Q: スリッページはどのように設定しますか?
A: vbt.Portfolio.from_signals() の slippage 引数に小数値を渡すことで設定できます(例: slippage=0.001 で0.1%)。ただし無償版での再現精度には限界があり、ティックデータと組み合わせた実装が高精度なFXバックテストには推奨されます。
Q: AIを活用してvectorbtのインジケータを設計できますか? A: はい。インジケータのロジック設計やパラメータ選定はAIとの対話で効率化できます。Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
著者情報
著者名: [著者名プレースホルダー] プロフィール: [著者プロフィールプレースホルダー] 執筆記事一覧: [執筆記事一覧プレースホルダー]
