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'などをいれてください。
これで図のようなローソク足チャートが出力されます。
テクニカル指標を追加したい場合は、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
適当なところを拡大すると図のようになります。ちゃんとできてそうですね。
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
RSIみたいにローソク足に重ねにくいインジケーターは自動で新しいチャートを追加してくれます。すごいですね。
チャートを微調整したい場合は、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')
自分で一からつくるよりも楽に洗練されたプロットができますし、テクニカル分析もはかどると思います。