Backtraderは、Pythonでのバックテストを容易にする強力なライブラリです。本記事では、リバランスを実装し、過去10年間のデータを使用してバックテストを行う方法を簡単に説明します。
1. 環境準備
ライブラリのインストール
# install requirement%pip install backtrader yfinance matplotlib2. ライブラリのインポート
必要なライブラリをインポートします
# import libsimport datetimeimport backtrader as btimport yfinance as yfimport matplotlib.pyplot as plt3. パラメータ設定
必要なパラメータを設定します。
## 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を実装する
Strategy - Backtrader
python backtesting trading algotrading algorithmic quant quantitative analysis
# リバランスの戦略を実装する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 = dtdef rebalance_portfolio(self):total_value = self.broker.getvalue()for data in self.datas:ticker = data._nameallocation = data.targettarget_value = total_value * allocationcurrent_value = self.getposition(data).size * data.close[0]difference = target_value - current_valueif 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 = targetcerebro.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.00Final Portfolio Value: 13314.386. バックテストの結果を可視化
BuyとSellが適宜行われていることがわかります。
plt.rcParams['figure.figsize'] = [12, 10]cerebro.plot(iplot=False)









