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() の結果をファイル保存&表示することでチャート確認が可能。