Backtesting.pyで始めるバックテスト入門【Python自動売買】

Python実装・コード

Backtesting.pyとは?なぜバックテストが重要なのか

自動売買システムを作ったはいいけれど、「本当に儲かるの?」と不安に思ったことはありませんか?そこで欠かせないのがバックテストです。バックテストとは、過去の株価データを使って「もしこの戦略で売買していたらどうなっていたか」を検証するプロセスです。

Pythonには Backtesting.py という非常に使いやすいバックテスト専用ライブラリがあります。2026年現在、個人トレーダーの間でも広く使われており、シンプルなAPIで本格的な戦略検証が可能です。今回は初心者でもすぐに使えるよう、基本的な使い方を丁寧に解説します。

Backtesting.pyのインストールと基本構造

まずはインストールから始めましょう。pip一発でOKです。

pip install backtesting

Backtesting.pyでは戦略を Strategy クラスを継承して定義します。主に init()next() の2つのメソッドを実装します。

  • init():戦略の初期化処理(インジケーターの設定など)
  • next():各バーごとに呼ばれる売買ロジック

ゴールデンクロス戦略のバックテスト実装例

最もシンプルな戦略として「移動平均線のゴールデンクロス」を実装してみましょう。短期移動平均が長期移動平均を上回ったら買い、下回ったら売りというルールです。

import yfinance as yf
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
import talib

# 株価データを取得(例:トヨタ自動車)
df = yf.download("7203.T", start="2022-01-01", end="2026-01-01")
df.columns = [c[0] for c in df.columns]  # MultiIndex解消

class GoldenCrossStrategy(Strategy):
    short_window = 20
    long_window = 60

    def init(self):
        close = self.data.Close
        self.sma_short = self.I(talib.SMA, close, timeperiod=self.short_window)
        self.sma_long  = self.I(talib.SMA, close, timeperiod=self.long_window)

    def next(self):
        if crossover(self.sma_short, self.sma_long):
            self.buy()
        elif crossover(self.sma_long, self.sma_short):
            self.sell()

bt = Backtest(df, GoldenCrossStrategy, cash=1_000_000, commission=0.001)
stats = bt.run()
print(stats)

結果の見方:重要な指標を解説

バックテストを実行すると様々な指標が出力されます。特に注目すべき指標を説明します。

print(f"最終資産: {stats['Equity Final [$]']:,.0f}円")
print(f"リターン: {stats['Return [%]']:.2f}%")
print(f"最大ドローダウン: {stats['Max. Drawdown [%]']:.2f}%")
print(f"シャープレシオ: {stats['Sharpe Ratio']:.2f}")
print(f"勝率: {stats['Win Rate [%]']:.2f}%")
print(f"総トレード数: {stats['# Trades']}")

中でも重要なのが 最大ドローダウン(Max Drawdown)です。これは最高値から最安値への最大下落幅を示しており、この値が大きいほどリスクが高い戦略と言えます。一般的に20%以内が許容範囲の目安とされています。

パラメータの最適化

Backtesting.pyの強力な機能の一つがパラメータ最適化です。bt.optimize()を使うと、複数のパラメータの組み合わせを自動で試してくれます。

best_result = bt.optimize(
    short_window=range(10, 30, 5),
    long_window=range(40, 80, 10),
    maximize='Sharpe Ratio',
    constraint=lambda p: p.short_window < p.long_window
)
print(best_result._strategy)

ただし、最適化には過学習(オーバーフィッティング)のリスクがあります。過去データにだけ完璧に合わせてしまうと、実際のトレードでは通用しないことが多いです。必ずアウトオブサンプルデータ(検証期間外のデータ)で確認するようにしましょう。

可視化でトレードを視覚的に確認する

Backtesting.pyにはインタラクティブなチャート表示機能も内蔵されています。

bt.plot()

このチャートでは、エントリー・エグジットポイント、残高推移、ドローダウンなどを一目で確認できます。戦略の弱点を視覚的に発見するのに非常に役立ちます。

まとめ

今回はPythonのBacktesting.pyを使ったバックテストの基本を解説しました。バックテストは自動売買戦略開発において非常に重要なステップですが、あくまでも過去データに基づく検証です。バックテストで良い結果が出ても、実際のトレードでは手数料・スリッページ・サバイバーシップバイアスなどの影響で異なる結果になることがあります。まずは小さい資金でデモトレードや少額運用から始め、バックテストの結果と実際の結果を照らし合わせながら戦略を磨いていくのがベストな方法です。次回は、より高度なウォークフォワード分析についても解説する予定です!

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