株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

戦略:前日比x%以下で買い、前日比y%以上で売り その12 アナライザの使用

Analysis
Photo by Lukas from Pexels

概要

昨日の記事で、 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)])

取引結果グラフ
取引結果グラフ

  • 上段
    • 青線
      • 資産評価額
    • 赤線
      • 現金
  • 下段
    • 上向き緑三角
      • 買い注文
    • 下向き赤三角
      • 売り注文

Gist

gist.github.com

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.