Backtraderの使い方入門:Pythonで始めるシンプルなバックテスト

ライブラリ

Pythonで株式トレード戦略のバックテストを行いたいとき、強力な選択肢が「Backtrader」です。シンプルなコードで柔軟な戦略が組め、チャートも描画可能。今回はGoogle Colab環境での動作を前提に、Backtraderの導入からグラフ出力までを一通り解説します。

今回紹介する内容のコードはこちら

準備:必要なライブラリのインストール

以下のコードをColabで実行し、必要なライブラリをインストールします。

!pip install backtrader yfinance

データ取得と整形(yfinance)

次に、Yahoo Finance から株価データ(例:AAPL)を取得し、Backtraderが理解できる形式に整えます。

import backtrader as bt
import yfinance as yf
import pandas as pd

# データ取得
data = yf.download('AAPL', start='2019-01-01', end='2020-01-01')

# インデックスの整形と列の統一(Backtraderが必要とする形式)
data.index = pd.to_datetime(data.index)
data.columns = ['Open', 'High', 'Low', 'Close', 'Volume']

データフィードを作成

Backtrader のエンジン(Cerebro)に渡す形式に変換します。

datafeed = bt.feeds.PandasData(dataname=data)

戦略の定義:SMAクロス戦略

単純移動平均(SMA)の短期・長期線のクロスで売買するシンプルな戦略です。

class SmaCross(bt.Strategy):
    params = (('short_period', 10), ('long_period', 30),)

    def __init__(self):
        self.sma_short = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.short_period)
        self.sma_long = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.long_period)
        self.crossover = bt.indicators.CrossOver(self.sma_short, self.sma_long)

    def next(self):
        if not self.position:
            if self.crossover > 0:
                self.buy()
                print(f'Buy at {self.datas[0].datetime.date(0)}')
        else:
            if self.crossover < 0:
                self.sell()
                print(f'Sell at {self.datas[0].datetime.date(0)}')

Cerebroのセットアップと実行

資金、手数料などの設定をして戦略を走らせます。

cerebro = bt.Cerebro()
cerebro.adddata(datafeed)
cerebro.addstrategy(SmaCross)

# 初期資金と手数料の設定
cerebro.broker.setcash(1_000_000)
cerebro.broker.setcommission(commission=0.001)

print(f'Starting Portfolio Value: {cerebro.broker.getvalue():,.2f}')
cerebro.run()
print(f'Final Portfolio Value: {cerebro.broker.getvalue():,.2f}')

6. グラフの描画(Google Colab対応)

Backtraderのチャートは通常の notebook では表示できますが、Google Colab では明示的に画像として保存して表示させる必要があります。

以下のコードを実行してください。

import matplotlib.pyplot as plt
from IPython.display import Image

# チャートを画像に保存して表示
chart_file = 'result.png'
cerebro.plot(style='candlestick')[0][0].savefig(chart_file, dpi=300, bbox_inches='tight')
Image(open(chart_file, 'rb').read())

最後に:このコード一式をまとめてコピペ!

以下にすべてをまとめた完全コードを用意しました:

!pip install backtrader yfinance

import backtrader as bt
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import Image

# データ取得
data = yf.download('AAPL', start='2019-01-01', end='2020-01-01')
data.index = pd.to_datetime(data.index)
data.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
datafeed = bt.feeds.PandasData(dataname=data)

# 戦略定義
class SmaCross(bt.Strategy):
    params = (('short_period', 10), ('long_period', 30),)

    def __init__(self):
        self.sma_short = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.short_period)
        self.sma_long = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.long_period)
        self.crossover = bt.indicators.CrossOver(self.sma_short, self.sma_long)

    def next(self):
        if not self.position:
            if self.crossover > 0:
                self.buy()
                print(f'Buy at {self.datas[0].datetime.date(0)}')
        else:
            if self.crossover < 0:
                self.sell()
                print(f'Sell at {self.datas[0].datetime.date(0)}')

# Cerebro実行
cerebro = bt.Cerebro()
cerebro.adddata(datafeed)
cerebro.addstrategy(SmaCross)
cerebro.broker.setcash(1_000_000)
cerebro.broker.setcommission(commission=0.001)

print(f'Starting Portfolio Value: {cerebro.broker.getvalue():,.2f}')
cerebro.run()
print(f'Final Portfolio Value: {cerebro.broker.getvalue():,.2f}')

# グラフ出力
chart_file = 'result.png'
cerebro.plot(style='candlestick')[0][0].savefig(chart_file, dpi=300, bbox_inches='tight')
Image(open(chart_file, 'rb').read())

まとめ

  • Backtrader は戦略のバックテストや検証に非常に便利なライブラリ。
  • yfinance でデータ取得→Backtraderの形式に整形して分析。
  • Google Colab では cerebro.plot() の結果をファイル保存&表示することでチャート確認が可能。
タイトルとURLをコピーしました