見出し画像

Backtesting.pyの使い方 その3

さてさて今回からはTa-libを使いますよ。

インストールしてない方は以下の記事を参考にしてくださいね。

次に前回のコードを以下のように書き換えます。

from backtesting import Strategy
from backtesting.lib import crossover
from backtesting import Backtest
import pandas as pd
import pandas_datareader.data as web
import datetime
import talib as ta

start = datetime.date(2018,1,1)
end = datetime.date.today()
data = web.DataReader('AAPL', 'yahoo', start, end)

def SMA(values, n):
    return pd.Series(values).rolling(n).mean()

def MACD(values, m1, m2, ms):
    macd, macdsignal, macdhist = ta.MACD(data.Close, fastperiod=m1, slowperiod=m2, signalperiod=ms)
    return macd, macdsignal, macdhist

class MDCross(Strategy):
    n1 = 10
    n2 = 20
    m1 = 10
    m2 = 20
    ms = 5

    def init(self):
        self.sma1 = self.I(SMA, self.data.Close, self.n1)
        self.sma2 = self.I(SMA, self.data.Close, self.n2)
        self.macd, self.macdsignal, self.macdhist = self.I(MACD, self.data.Close, self.m1, self.m2, self.ms)

    def next(self):
        if crossover(self.macd, self.macdsignal):
            self.position.close()
            self.buy()

        elif crossover(self.macdsignal, self.macd):
            self.position.close()
            self.sell()

bt = Backtest(data, MDCross, cash=10_000, commission=.002)

stats = bt.run()
print(stats)
bt.plot()
'''
stats=bt.optimize(m1=range(5, 100, 10),m2=range(5, 100, 10),ms=range(5, 100, 10),maximize='Equity Final [$]', method='grid', constraint=lambda p: p.m1 < p.m2)
print(stats)
bt.plot()
'''

さっそく実行してみましょう。シンプルなMACDのドテン売買です

Start                     2018-01-02 00:00:00
End                       2022-06-08 00:00:00
Duration                   1618 days 00:00:00
Exposure Time [%]                   97.314235
Equity Final [$]                  13037.65786
Equity Peak [$]                   14239.96622
Return [%]                          30.376579
Buy & Hold Return [%]              246.383381
Return (Ann.) [%]                    6.166994
Volatility (Ann.) [%]               34.015564
Sharpe Ratio                         0.181299
Sortino Ratio                        0.282052
Calmar Ratio                         0.141514
Max. Drawdown [%]                  -43.578836
Avg. Drawdown [%]                  -13.457611
Max. Drawdown Duration      715 days 00:00:00
Avg. Drawdown Duration      174 days 00:00:00
# Trades                                  119
Win Rate [%]                        45.378151
Best Trade [%]                      18.733326
Worst Trade [%]                    -14.296012
Avg. Trade [%]                        0.22302
Max. Trade Duration          43 days 00:00:00
Avg. Trade Duration          14 days 00:00:00
Profit Factor                        1.194528
Expectancy [%]                       0.377643
SQN                                  0.480891
_strategy                             MDCross
_equity_curve                             ...
_trades                        Size  Entry...

このような結果になりました。うわーダメダメですね。
なのでMACDのパラメータを最適化してみます。


stats = bt.run()
print(stats)
bt.plot()
'''
stats=bt.optimize(m1=range(5, 100, 10),m2=range(5, 100, 10),ms=range(5, 100, 10),maximize='Equity Final [$]', method='grid', constraint=lambda p: p.m1 < p.m2)
print(stats)
bt.plot()
'''

このコメントアウトしてある部分を以下のように変更します。

'''
stats = bt.run()
print(stats)
bt.plot()
'''
stats=bt.optimize(m1=range(5, 100, 10),m2=range(5, 100, 10),ms=range(5, 100, 10),maximize='Equity Final [$]', method='grid', constraint=lambda p: p.m1 < p.m2)
print(stats)
bt.plot()

これでMACDのパラメータを最適化します。
さてどうでしょうか?

Start                     2018-01-02 00:00:00
End                       2022-06-08 00:00:00
Duration                   1618 days 00:00:00
Exposure Time [%]                   92.479857
Equity Final [$]                 47730.476709
Equity Peak [$]                  50594.125619
Return [%]                         377.304767
Buy & Hold Return [%]              247.005708
Return (Ann.) [%]                   42.278489
Volatility (Ann.) [%]               41.427961
Sharpe Ratio                          1.02053
Sortino Ratio                        2.268281
Calmar Ratio                         1.527398
Max. Drawdown [%]                  -27.680067
Avg. Drawdown [%]                   -4.551442
Max. Drawdown Duration      463 days 00:00:00
Avg. Drawdown Duration       27 days 00:00:00
# Trades                                   38
Win Rate [%]                        44.736842
Best Trade [%]                      70.141308
Worst Trade [%]                     -7.637213
Avg. Trade [%]                        4.20454
Max. Trade Duration         166 days 00:00:00
Avg. Trade Duration          40 days 00:00:00
Profit Factor                        4.589204
Expectancy [%]                       5.078274
SQN                                  1.826652
_strategy                 MDCross(m1=65,m2...
_equity_curve                             ...
_trades                       Size  EntryB...

結果はこのようになりました。

Equity Final [$]                 47730.476709
Equity Peak [$]                  50594.125619
Return [%]                         377.304767
Buy & Hold Return [%]              247.005708

単純移動平均のドテンよりもちょっとイイ感じですね。最適なパラメータは65,75,5のようです。

今回はここまで。
次はビットコインFXのデータでやってみようと思いますのでよろしく。
それでは。

この記事が気に入ったらサポートをしてみませんか?