NautilusTrader入門:2026年注目のPython高速バックテストフレームワークをvectorbtと比較してみた

vectorbtを使い始めて「速い!楽しい!」と喜んでいた矢先、Twitterで「今はNautilusTraderが主流だよ」という投稿を見かけてしまいました。。。え、またフレームワーク変えるの?と思いつつ調べ始めたら、確かにこれは次元が違うポテンシャルを持つツールでした。今回はNautilusTraderの基本と、僕がすでに使っているvectorbtとの比較をまとめます。同じ「新しいツールに目移りしがちな沼」にいる方、一緒に確認しましょう。

NautilusTraderとは

NautilusTraderは、Rustで書かれたコアエンジンをPythonから操作できるバックテスト・ライブトレードフレームワークです。2024年ごろから急速に注目を集めており、2026年現在はPythonの本格的なアルゴトレーディングフレームワークの中では最も「プロ寄り」の選択肢の一つになっています。

特徴をざっくりまとめると:

Rust製コアで超高速:Pythonのループをほぼ使わずイベント処理
バックテストとライブトレードが同一コード:バックテストで書いた戦略がそのまま本番で動く
イベント駆動型:注文約定・ポジション変化などのイベントに対してハンドラーを書くスタイル
スリッページ・手数料の精密なシミュレーション:プロ仕様のバックテストが可能

vectorbt・backtraderとの比較

3つのフレームワークを比較するとこんな感じです:

【backtrader】
・学習コスト:低〜中
・速度:遅い(純Python)
・ライブトレード:○(ブローカー連携あり)
・メンテナンス:2023年以降ほぼ停止中
・向いている用途:学習目的、シンプルな戦略検証

【vectorbt】
・学習コスト:中
・速度:高速(NumPy/Numbaで配列演算)
・ライブトレード:△(有料版vectorbt Proでサポート)
・メンテナンス:活発
・向いている用途:パラメータ最適化、大規模バックテスト

【NautilusTrader】
・学習コスト:高(最初の壁が急)
・速度:最高(Rustコア)
・ライブトレード:○(Binance、Interactive Brokersなど対応)
・メンテナンス:活発
・向いている用途:本番運用を見据えた戦略開発

インストールと最初の動作確認

まずインストールから。Python 3.11以降推奨です。

# インストール
pip install nautilus_trader

# バージョン確認
python -c "import nautilus_trader; print(nautilus_trader.__version__)"

NautilusTraderの核心は「戦略クラス」を定義することです。最もシンプルな移動平均クロス戦略で基本構造を確認しましょう。

from nautilus_trader.trading.strategy import Strategy
from nautilus_trader.config import StrategyConfig
from nautilus_trader.model.data import Bar, BarType
from nautilus_trader.model.enums import OrderSide
from nautilus_trader.model.identifiers import InstrumentId
from nautilus_trader.indicators.average.ema import ExponentialMovingAverage


class MACrossConfig(StrategyConfig, frozen=True):
    instrument_id: InstrumentId
    bar_type: BarType
    fast_ema_period: int = 10
    slow_ema_period: int = 20
    trade_size: float = 100_000  # 1ロット相当


class MACrossStrategy(Strategy):
    """シンプルなEMAクロス戦略"""

    def __init__(self, config: MACrossConfig):
        super().__init__(config)
        self.fast_ema = ExponentialMovingAverage(config.fast_ema_period)
        self.slow_ema = ExponentialMovingAverage(config.slow_ema_period)

    def on_start(self):
        """戦略起動時に呼ばれる"""
        self.instrument = self.cache.instrument(self.config.instrument_id)
        # データサブスクライブ
        self.subscribe_bars(self.config.bar_type)
        self.log.info("MACrossStrategy 起動")

    def on_bar(self, bar: Bar):
        """新しいバー(ローソク足)が来るたびに呼ばれる"""
        # インジケーターを更新
        self.fast_ema.update_raw(bar.close.as_double())
        self.slow_ema.update_raw(bar.close.as_double())

        # インジケーターが初期化されていなければスキップ
        if not self.fast_ema.initialized or not self.slow_ema.initialized:
            return

        fast = self.fast_ema.value
        slow = self.slow_ema.value

        # クロスの検出
        if fast > slow and not self._is_long():
            self._buy()
        elif fast < slow and not self._is_short():
            self._sell()

    def _is_long(self) -> bool:
        return self.portfolio.is_net_long(self.config.instrument_id)

    def _is_short(self) -> bool:
        return self.portfolio.is_net_short(self.config.instrument_id)

    def _buy(self):
        order = self.order_factory.market(
            instrument_id=self.config.instrument_id,
            order_side=OrderSide.BUY,
            quantity=self.instrument.make_qty(self.config.trade_size),
        )
        self.submit_order(order)
        self.log.info(f"BUY {self.config.trade_size} @ {self.fast_ema.value:.3f}")

    def _sell(self):
        order = self.order_factory.market(
            instrument_id=self.config.instrument_id,
            order_side=OrderSide.SELL,
            quantity=self.instrument.make_qty(self.config.trade_size),
        )
        self.submit_order(order)
        self.log.info(f"SELL {self.config.trade_size} @ {self.fast_ema.value:.3f}")

    def on_stop(self):
        """戦略停止時の後処理"""
        self.cancel_all_orders(self.config.instrument_id)
        self.close_all_positions(self.config.instrument_id)

vectorbtと使い分けの指針

正直なところ、NautilusTraderは最初の学習コストが高いです。僕が最初に試したとき、「InstrumentIdってどう定義するの?」「データはどうロードするの?」でかなり詰まりました(笑)。公式ドキュメントとサンプルコードを読み込む時間が相当必要です。

使い分けの目安は:

アイデアを素早く検証したい → vectorbt(コードが短く、パラメータ最適化も爆速)
本番運用に近い精度でバックテストしたい → NautilusTrader(スリッページ・約定シミュレーションが精密)
バックテストのコードをそのまま本番に使いたい → NautilusTrader一択

日本株については、現時点でNautilusTraderが対応しているブローカーAPIは米国・暗号資産中心です。Interactive Brokersを経由すれば日本株にもアクセスできますが、ハードルは高め。ドル円のFX(OANDAなど)のほうが現実的な使い道かもしれません。

まとめ

NautilusTraderはRustの高速コアとPythonの柔軟性を組み合わせた、2026年現在で最も本番寄りのPythonバックテストフレームワークです。学習コストは高いですが、「バックテストと本番が同一コード」という思想は個人投資家にとっても大きなメリットです。

個人的には、まずvectorbtでアイデアを高速に検証して「これは使えそう」と確信できた戦略をNautilusTraderで精密バックテスト→本番検討、という流れがベストだと思っています。まだ入門したてで沼の深さが測り知れませんが、続きは次の記事で!

タイトルとURLをコピーしました