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のデータでやってみようと思いますのでよろしく。
それでは。