PythonのBacktesting.pyでバックテストを実施したときのメモの巻

PythonのBacktesting.pyでバックテストを実施したときのメモの巻

Backtesting.pyを使ったときの備忘録です。

テスト用データについて

テスト用データはOHLCV(’Open’, ‘High’, ‘Low’, ‘Close’, ‘Volume’)の形であることが必要です(’Volume’は無くても良い)。

なのでOHLCVになっていないデータの場合はpandasなどで整形してから使う必要があります。

なお、OHLCV以外のカラムがあっても問題ないみたい。

使用可能なインジケーターと設定例

Backtesting.pyをインストールしただけではインジケーターはSMA(Simple Moving Average;単純移動平均)しか使えない(たぶん)ので、

TA-LibというラッパーをインストールしてTA-Libにあるインジケーターを使用すれば良い、と。

MACD、EMA、RSI、ADX、ボリンジャーバンド、その他多くのインジケーターが使えるようになります。詳しくは公式サイトでご確認ください。


<設定例>

・EMA(Exponential Moving Average;指数平滑移動平均)

・ADX(Average Directional Movement Index;平均方向性指数)

#EMAの定義
def EMA_Backtesting(values, n):
    """
    Return exponential moving average of 'values', at each
    step taking into acount 'n' previous values.
    """
    close = pd.Series(values)
    return talib.EMA(close, timeperiod=n)

#ADXの定義
def adx(array, n):
    gain = pd.DataFrame(array)
    gain = gain.T
    gain.columns = ['close', 'high', 'low']
    gain['adx'] = talib.ADX(gain['high'], gain['low'], gain['close'], n)
    return gain['adx']

#ストラテジーの設定
class myST(Strategy):
    n = 10  #ADXの期間を設定
    n1 = 4  #EMAの期間を設定

    def init(self): #ストラテジーの事前処理
        self.ema1 = self.I(EMA_Backtesting, self.data.Close, self.n1)#EMAをインジケーターとして追加
        self.adx = self.I(adx, [self.data.Close, self.data.High, self.data.Low], self.n)#ADXをインジケーターとして追加


現在価格の確認

self.data.Close[-1] が現在価格を表します。(価格リストの一番後ろということですね)

オーダーサイズの設定

buyまたはsellのオーダーを出す際にsizeオプションでポジションサイズを設定できる、と。

<例>100ユニットの買いオーダーを出す場合

self.buy(size = 100)

sizeの数値を0から1までに設定すると資金に対するその割合をオーダーする(たぶん)。なので、デフォルト(size = 0.9999999999999998)だと資金(cash)が許す限り買い(売り)オーダーを出すことになる、と。

1以上の数字に設定すると任意のポジションサイズにできる、と。


Jupyter notebookで表示させたときに、Optimizeの結果で検討したパラメーターの数値が見切れるので別途確認する

見たいところが見えません。。。

<解決方法> ._strategyを見てやれば良い

<例>ストラテジーmySTにおいて、st_valとtp_valをoptimizeして、結果名をstatsとして実行した場合

print(stats._strategy)
myST(sl_val=0.0015,tp_val=0.0095)

これでパラメーターを確認できた。


取引内容一覧の表示

グラフだけだと細かく確認しづらい。。。

<解決方法> ._tradesを見てやれば良い。

<例>

output = bt.run() 

のように結果名を’output’として実行していた場合、

display(output._trades)
backtesting_trades

これで取引内容を確認できた。

環境

この記事の内容は
Python; 3.7.2
Backtesting; 0.2.1
TA-Lib; 0.4.18
pandas; 1.0.5
jupyter; 1.0.0
にて実施しました。

おしまい



このブログはエックスサーバー で運営しております。


Word Press専用クラウド型レンタルサーバーwpX Speed


WordPressを使うならロリポップ!
簡単インストール完備で楽々スタート!

世界にたった一つ、あなただけのドメインを登録しよう!
格安ドメイン取得サービス─ムームードメイン─