概要
昨日の記事で、 backtrader.Analyzer
を使えば、バックテストの結果を解析することができそうだという技術メモを残した。
how-to-make-stock-trading-system.dogwood008.com
今日はそれを実際に使っていく。試しに「ドローダウン」と「年次リターン」を表示するように変更する。
ソースコード
今回の変更に関わる部分のみ抜粋している。全体は後述の Gist を参照のこと。
import backtrader.analyzers as btanalyzers class BackTest: def __init__(self, strategy: bt.Strategy, cheat_on_open=True): self.cerebro = bt.Cerebro(tz='Asia/Tokyo', cheat_on_open=cheat_on_open) # Set cheat-on-close # self.cerebro.brokerj.set_coc(True) data = KabuPlusJPCSVData( dataname=path_to_csv, fromdate=datetime(2020, 1, 1), todate=datetime(2020, 11, 30), reverse=False) self.cerebro.adddata(data) # Add a strategy IN_DEVELOPMENT = False # このフラグにより、ログレベルを切り替えることで、本番ではWARN以上のみをログに出すようにする。 # フラグの切り替えは、環境変数で行う事が望ましいが今は一旦先送りする。 loglevel = DEBUG if IN_DEVELOPMENT else WARN self.cerebro.broker.setcash(100 * 10000 * 3) # 信用取引なので3倍 self.cerebro.addstrategy(strategy, loglevel) self.cerebro.addanalyzer(btanalyzers.DrawDown, _name='drawdown') self.cerebro.addanalyzer(btanalyzers.AnnualReturn, _name='annualreturn') # self.cerebro.optstrategy(StFetcher, idx=StFetcher.COUNT()) def run(self): initial_cash = self.cerebro.broker.getvalue() thestrats = self.cerebro.run() thestrat = thestrats[0] print('Initial Portfolio Value: {val:,}'.format(val=initial_cash)) print('Final Portfolio Value: {val:,}'.format(val=int(self.cerebro.broker.getvalue()))) print('DrawDown:', thestrat.analyzers.drawdown.get_analysis()) print('Annual Return:', thestrat.analyzers.annualreturn.get_analysis()) save_file = False if USE_BOKEH: if save_file: b = Bokeh(style='bar', plot_mode='single', scheme=Tradimo(), output_mode='save', filename='chart.html') else: b = Bokeh(style='bar', plot_mode='single', scheme=Tradimo()) return self.cerebro.plot(b, iplot=not save_file) else: return self.cerebro.plot(use='agg')
出力
Initial Portfolio Value: 3,000,000 Final Portfolio Value: 5,385,350 DrawDown: AutoOrderedDict([('len', 23), ('drawdown', 4.487128326549434), ('moneydown', 253000.0), ('max', AutoOrderedDict([('len', 27), ('drawdown', 15.976233973567702), ('moneydown', 655500.0)]))]) Annual Return: OrderedDict([(2020, 0.7951166666666667)])
- 上段
- 青線
- 資産評価額
- 赤線
- 現金
- 青線
- 下段
- 上向き緑三角
- 買い注文
- 下向き赤三角
- 売り注文
- 上向き緑三角