Otama's Playground > 投資 > Backtraderを使った簡単バックテスト:リバランス編

Backtraderを使った簡単バックテスト:リバランス編

Backtraderは、Pythonでのバックテストを容易にする強力なライブラリです。本記事では、リバランスを実装し、過去10年間のデータを使用してバックテストを行う方法を簡単に説明します。

1. 環境準備

ライブラリのインストール

Python
# install requirement
%pip install backtrader yfinance matplotlib

2. ライブラリのインポート

必要なライブラリをインポートします

Python
# import libs
import datetime
import backtrader as bt
import yfinance as yf
import matplotlib.pyplot as plt

3. パラメータ設定

必要なパラメータを設定します。

Python
## 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
# リバランスの戦略を実装する
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. バックテストを実行する

データの読みこみを行い、バックテストを実行します。

Python
# 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が適宜行われていることがわかります。

Python
plt.rcParams['figure.figsize'] = [12, 10]
cerebro.plot(iplot=False)
リバランスのバックテスト結果

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です