前回の振り返りと今回の内容
この記事は、下記記事の続きの記事である。手仕舞い戦略の部分の説明を追加する。
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()
でセットするときに、一緒にパラメータを渡すことができる。