2
1

More than 1 year has passed since last update.

backtesting.pyを活用してローソク足チャートを描画する

Last updated at Posted at 2022-06-30

backtesting.pyが出力するチャートはドラッグやスクロール操作が快適で、また様々なテクニカル指標を表示することができます。
バックテストの結果を可視化するのが主な使い方ですが、ただのローソク足チャートとして使うのもおすすめなので、やり方をメモしておきます。

まずStrategyを継承したクラスを作ります。initとnextメソッドを入れないと動かないので、以下のようにメソッドを作っておきます。メソッドの中身はとりあえずなくて構いません。

from backtesting import Strategy

class MyStrategy(Strategy):
    
    def init(self):
        pass

    def next(self):
        pass

準備ができたので、Backtestクラスを走らせます。runメソッドのあとにplotメソッドを呼びます。

from backtesting import Backtest
from backtesting.test import GOOG  # テスト用のグーグルの株価をプロットします。

bt = Backtest(GOOG, MyStrategy)
bt.run()
bt.plot(filename='google.html', superimpose=False)

superimposeをFalseにしているのは、日足のみ描画したかったからです。週足や月足を重ねて描画したい場合はFalseの代わりに'W'や'M'などをいれてください。

これで図のようなローソク足チャートが出力されます。

bokeh_plot (4).png
bokeh_plot (5).png

テクニカル指標を追加したい場合は、MyStrategyクラスのinitメソッドに登録していきます。
様々なテクニカル指標を計算するライブラリ TA-Libの関数も利用できます。
よくある移動平均 SMAだと以下の通りで、Iメソッドに計算したい関数と、関数の引数を指定します。dataをfloatに変換しているのは、データが整数だとTA-Libの関数が受け付けないことがあるためです。
オプションで、凡例名や色などを変えることができます。

from backtesting import Strategy
from talib import SMA

class MyStrategy(Strategy):
    
    def init(self):
        # 終値の15日平均を描画する
        self.I(SMA, self.data.Close.astype('float'), 15, name='15日平均', color='tomato')

    def next(self):
        pass

適当なところを拡大すると図のようになります。ちゃんとできてそうですね。

bokeh_plot (6).png

TA-Libの関数に戻り値が複数ある場合でも同様です。

from backtesting import Strategy
from talib import BBANDS, MA_Type

class MyStrategy(Strategy):
    
    def init(self):
        # ボリンジャーバンド
        self.I(BBANDS, self.data.Close.astype('float'), matype=MA_Type.T3, color='tomato')

    def next(self):
        pass

bokeh_plot (9).png

RSIみたいにローソク足に重ねにくいインジケーターは自動で新しいチャートを追加してくれます。すごいですね。

bokeh_plot (12).png
bokeh_plot (11).png

チャートを微調整したい場合は、bt.plot()がBokehのGridBoxのインスタンスを返すので、それをBokehのドキュメントを見ながらゴニョゴニョします。
以下では、ローソク足チャートの高さを変えて、この投稿で説明したダブルタップで軸をリセットする機能を追加しています。

from bokeh.io import save
from bokeh.events import DoubleTap
from bokeh.models import CustomJS

・・・

fig = bt.plot()
# figからメインの日足チャートを探す 参照渡しなので、一度新しい変数に格納するとよい
fig_ohlc = fig.children[0].chilren[0][0]
# 以下で高さの変更と機能追加を行う 詳しい説明はBokehのドキュメントを見る
fig_ohlc.height = 200
fig_ohlc.js_on_event(DoubleTap, CustomJS(args=dict(p=fig_ohlc), code='p.reset.emit()'))
save(fig, filename='google.html')

自分で一からつくるよりも楽に洗練されたプロットができますし、テクニカル分析もはかどると思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1