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

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

バックテスト中に手仕舞いする ◆ Backtrader 最初の戦略その4.1

Python
Photo by Chris Ried on Unsplash

前回の振り返りと今回の内容

この記事は、下記記事の続きの記事である。手仕舞い戦略の部分の説明を追加する。

how-to-make-stock-trading-system.dogwood008.com

main.py の修正

各メソッドについて、内容を下記のように変更した。行頭の - は削除行、 + は追加行を示す。修正後のファイル全体はバックテスト中に手仕舞いする ◆ Backtrader 最初の戦略その4.0 - 株のシステムトレードをしよう - 1から始める株自動取引システムの作り方を見てほしい。

next() の修正内容

     def next(self):
         # Simply log the closing price of the series from the reference
-        self._debug('Close, %.2f' % self._dataclose[0])
+        self._debug('[Close, position] = %.2f, %s' % (self._dataclose[0], self.getposition()))

        if self._dataclose[0] < self._dataclose[-1]:
             # current close less than previous close

            if self._dataclose[-1] < self._dataclose[-2]:
                # previous close less than the previous close

                # BUY, BUY, BUY!!! (with all possible default parameters)
                self._info('BUY CREATE, %.2f' % self._dataclose[0])
-               self.buy()
+               self.buy(size=self.params.size)

+           if self._dataclose[-2] * .97 > self._dataclose[-1]:
+               # 前日が前々日の3%を超える下落時に手仕舞い
+               self.close()

next(self) はバックテスト中の仮想の時刻が各ティック毎に Backtrader から呼ばれる。もし読み込むデータが日足であれば、1日切り替わる毎になるし、時間足であれば1時間毎に呼ばれる。 self._dataclose[-2]self._dataclose[-1] には、それぞれ「前々日」と「前日」の終値が入っている。前々日の 0.97 倍の終値よりも前日の終値の方が小さければ、 self.close() で手仕舞いを行う。

このストラテジーでは説明を簡単にするため、買い建玉しか持っていなかったため、手仕舞いはその反対売買である売りになる。もし信用売りで建玉を持てば、当然手仕舞いは返済買いとなる。

self.params.size については、各ストラテジー毎にパラメータを持てる機能を使用している。これを利用し、次の行で発注する数量(株数)をそこから読み込むようにしている。

self.buy(size=self.params.size) は前述したとおりである。 buy(size=数量) で呼ぶ事で、指定した数量で株を購入する注文を出す。

+    def notify_order(self, order: Order) -> None:
+        ''' backtraderから呼ばれる '''
+        if order.status == Order.Completed:
+            if order.isbuy():
+                self._info('BUY: %.2f' % order.executed.price)

notify_order() は注文が発生した際に Backtrader から呼ばれる。 ここでは、注文が通ったときにログを出力するために使用した。

 class TestStrategyWithLogger(bt.Strategy):
+    params = (
+        ('size', 1000),
+    )

params = () でそれぞれのストラテジー毎に持つパラメータのデフォルト値を指定できる。ここでは 1000 としているが、ストラテジーを celebro.addstrategy() でセットするときに、一緒にパラメータを渡すことができる

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