Backtraderは、Pythonでのバックテストを容易にする強力なライブラリです。本記事では、リバランスを実装し、過去10年間のデータを使用してバックテストを行う方法を簡単に説明します。
1. 環境準備
ライブラリのインストール
# install requirement
%pip install backtrader yfinance matplotlib
2. ライブラリのインポート
必要なライブラリをインポートします
# import libs import datetime import backtrader as bt import yfinance as yf import matplotlib.pyplot as plt
3. パラメータ設定
必要なパラメータを設定します。
## tickerと割合 TICKERS = {"VTI": 0.4, "BND": 0.4, "GLD": 0.2} ## 開始日時と終了日時 FROMDATE = datetime.datetime(2014, 7, 1) TODATE = datetime.datetime(2024, 7, 1)
4. Strategyを実装する
# リバランスの戦略を実装する class RebalanceOncePerMonth(bt.Strategy): def __init__(self): self.last_rebalance = None # 最後にリバランスした日付 def next(self): dt = self.datetime.date() if self.last_rebalance is None or (dt - self.last_rebalance).days >= 30: # 30日以上たっている場合 # self.broker.add_cash(1000) # 積み立ての場合は一定期間ごとにadd_cashを行う self.rebalance_portfolio() self.last_rebalance = dt def rebalance_portfolio(self): total_value = self.broker.getvalue() for data in self.datas: ticker = data._name allocation = data.target target_value = total_value * allocation current_value = self.getposition(data).size * data.close[0] difference = target_value - current_value if difference > 0: # 購入 size = difference // data.close[0] self.buy(data=data, size=size) elif difference < 0: # 売却 size = -difference // data.close[0] self.sell(data=data, size=size)
5. バックテストを実行する
データの読みこみを行い、バックテストを実行します。
# backtraderの初期化 cerebro = bt.Cerebro() cerebro.broker.set_cash(10000) cerebro.addstrategy(RebalanceOncePerMonth) # yahoofinanceからデータを読み込む for ticker, target in TICKERS.items(): data = bt.feeds.PandasData( dataname=yf.download(ticker, start=FROMDATE, end=TODATE) ) data.target = target cerebro.adddata(data, name=ticker) # バックテストの実行 print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
Starting Portfolio Value: 10000.00 Final Portfolio Value: 13314.38
6. バックテストの結果を可視化
BuyとSellが適宜行われていることがわかります。
plt.rcParams['figure.figsize'] = [12, 10] cerebro.plot(iplot=False)