はじめに
前回の記事、株価分析(RSI) の続編です。今回はMACDを使用します。MACDは移動平均を使った指標です。前にSMA(単純移動平均線)についての記事を書いていますが、MACDではEMA(指数平滑移動平均線)を使用しています。MACDについての詳しい説明は他に譲るとして1、早速使っていきたいと思います。
MACDの戦略は下記のようにしました。
- MACDとMACDシグナルのゴールデンクロスで買い
- MACDとMACDシグナルのデッドクロスで売り
- MACDがマイナスからプラスになったら買い
- MACDがプラスからマイナスになったら売り
今回は下記のような流れで進めていきたいと思います。
- 2011年〜2018年の8年間で最適な長期、短期、シグナル期間の組み合わせを見つける。
- 上記の最適な組み合わせを使用して、2019年〜2020年のシミュレートを行う。
- 2011年〜2020年の10年間の最適な長期、短期、シグナル期間の組み合わせを見つける。
MACD Strategyクラス
MACD Strategyクラスは下記のように実装しました。
MACDの計算はいつも通りTA-Libで行っています。
期間はTA-Libのデフォルト値と同じ値にしています。
class MacdStrategy(Strategy):
'''
MACD Strategy
'''
fastperiod = 12
slowperiod = 26
signalperiod = 9
def init(self):
close = self.data['Adj Close']
self.macd, self.macdsignal, _ = self.I(
talib.MACD, close,
fastperiod=self.fastperiod,
slowperiod=self.slowperiod,
signalperiod=self.signalperiod)
def next(self):
'''
MACDとMACDシグナルのゴールデンクロスで買い
MACDとMACDシグナルのデッドクロスで売り
MACDがマイナスからプラスになったら買い
MACDがプラスからマイナスになったら売り
'''
if crossover(self.macd, self.macdsignal):
self.buy()
elif crossover(self.macd, self.macdsignal):
self.sell()
elif crossover(self.macd, 0):
self.buy()
elif crossover(0, self.macd):
self.sell()
このデフォルト値を使った状態で2011年〜2020年の日経平均株価でをシミュレートしてみるとリターンは177%でした。年率で考えると10.7%です。前回求めたRSIの最適値でのリターンが214%(年率13.5%)だったことを考えると、期待できそうな予感がします。
2011年〜2018年の8年間の最適な組み合わせを見つける
日経平均株価を使用して、2011年〜2018年の8年間の最適な組み合わせを見つけていきます。
各期間の範囲は下記のようにしました。
また、EMA長期期間 > EMA短期期間 となるように制約も入れています。
期間 | 最小値 | 最大値 |
---|---|---|
EMA短期 | 5 | 50 |
EMA長期 | 5 | 50 |
MACDシグナル期間 | 5 | 50 |
bt = Backtest(
df,
MacdStrategy,
cash=INIT_CASH,
trade_on_close=False,
exclusive_orders=True
)
stats, heatmap = bt.optimize(
fastperiod=range(5, 51),
slowperiod=range(5, 51),
signalperiod=range(5, 51),
return_heatmap=True,
constraint=lambda p: p.fastperiod < p.slowperiod)
この期間の最適な組み合わせでのリターンは216%でした。8年間で216%なので、年率で考えると15.4%くらいになります。
Start 2011-01-04 00:00:00
End 2018-12-28 00:00:00
Duration 2915 days 00:00:00
Exposure Time [%] 97.1007
Equity Final [$] 3.16202e+06
Equity Peak [$] 3.6104e+06
Return [%] 216.202
Buy & Hold Return [%] 92.4849
Return (Ann.) [%] 15.9004
Volatility (Ann.) [%] 23.5399
Sharpe Ratio 0.675464
Sortino Ratio 1.12638
Calmar Ratio 0.599543
Max. Drawdown [%] -26.5209
Avg. Drawdown [%] -3.45087
Max. Drawdown Duration 484 days 00:00:00
Avg. Drawdown Duration 32 days 00:00:00
# Trades 145
Win Rate [%] 62.7586
Best Trade [%] 18.9492
Worst Trade [%] -10.4943
Avg. Trade [%] 0.799388
Max. Trade Duration 84 days 00:00:00
Avg. Trade Duration 20 days 00:00:00
Profit Factor 1.79997
Expectancy [%] 0.889616
SQN 2.0116
_strategy MacdStrategy(fas...
_equity_curve ...
_trades Size Entry...
最適な期間の組み合わせは、EMA短期=9日、EMA長期=48日、シグナル=5日 となりました。
MacdStrategy(fastperiod=9,slowperiod=48,signalperiod=5)
2019年〜2020年の2年間でシミュレートしてみる
では、上記の最適値を使って2019年〜2020年をシミュレートしてみます。
MacdStrategyクラス内の期間を下記のように変更してプログラムを実行します。
class MacdStrategy(Strategy):
'''
MACD Strategy
'''
fastperiod = 9
slowperiod = 48
signalperiod = 5
(以下省略)
下記が実行結果です。リターンは54%と少なく感じますが、2年間なので年率に換算すると24%くらいになりかなり良い結果です。2019年〜2020年の間にはコロナによる株価の暴落もあったのですが、それもうまく乗り越えられたようです。
Start 2019-01-04 00:00:00
End 2020-12-30 00:00:00
Duration 726 days 00:00:00
Exposure Time [%] 87.3706
Equity Final [$] 1.54643e+06
Equity Peak [$] 1.54694e+06
Return [%] 54.643
Buy & Hold Return [%] 40.2936
Return (Ann.) [%] 25.5397
Volatility (Ann.) [%] 22.5301
Sharpe Ratio 1.13358
Sortino Ratio 2.23523
Calmar Ratio 1.62558
Max. Drawdown [%] -15.7111
Avg. Drawdown [%] -3.0758
Max. Drawdown Duration 194 days 00:00:00
Avg. Drawdown Duration 25 days 00:00:00
# Trades 27
Win Rate [%] 51.8519
Best Trade [%] 16.1861
Worst Trade [%] -6.4028
Avg. Trade [%] 1.63782
Max. Trade Duration 64 days 00:00:00
Avg. Trade Duration 24 days 00:00:00
Profit Factor 2.82347
Expectancy [%] 1.77853
SQN 1.72547
_strategy MacdStrategy
_equity_curve ...
_trades Size EntryB...
2010年〜2020年の10年間の最適な組み合わせを見つける
では、10年間を通した最適な組み合わせはどうなるのでしょうか?
結果だけを載せます。
Start 2011-01-04 00:00:00
End 2020-12-30 00:00:00
Duration 3648 days 00:00:00
Exposure Time [%] 97.7134
Equity Final [$] 5.74037e+06
Equity Peak [$] 5.74225e+06
Return [%] 474.037
Buy & Hold Return [%] 163.934
Return (Ann.) [%] 19.7
Volatility (Ann.) [%] 23.7815
Sharpe Ratio 0.828377
Sortino Ratio 1.4699
Calmar Ratio 0.702859
Max. Drawdown [%] -28.0284
Avg. Drawdown [%] -2.88859
Max. Drawdown Duration 925 days 00:00:00
Avg. Drawdown Duration 32 days 00:00:00
# Trades 227
Win Rate [%] 55.9471
Best Trade [%] 22.0555
Worst Trade [%] -10.5505
Avg. Trade [%] 0.775317
Max. Trade Duration 80 days 00:00:00
Avg. Trade Duration 16 days 00:00:00
Profit Factor 1.92129
Expectancy [%] 0.856358
SQN 2.87072
_strategy MacdStrategy(fas...
_equity_curve ...
_trades Size Entry...
なんとリターンは474%となりました。年率に換算すると19%です。
最適な期間の組み合わせは、EMA短期=5日、EMA長期=47日、シグナル=6日 となりました。
MacdStrategy(fastperiod=5,slowperiod=47,signalperiod=6)
最後に
時期や銘柄によって最適な組み合わせは変化すると思いますが、このMACDは活用できそうです。
MACDは人気のある指標だと言われていますが、その理由がわかったような気がします。
これまでの結果を下記にまとめておきます。
指標 | リターン(10年) | リターン(年率) | 売買戦略 |
---|---|---|---|
SMA | 140% | 9% | 短期と長期のゴールデンクロス/デッドクロスで売買。 |
RSI | 214% | 12% | 基準となる上限/下限を超えたときに売買。 |
MACD | 474% | 19% | MACDとMACDシグナルのゴールデンクロス/デッドクロスで売買。 MACDの符号が変わったときに売買。 |
※年率は複利換算。 |
プログラムソースはGitHubに置いています。
-
MINKABのページ「MACDとは?特徴・使い方を基礎から応用まで徹底解説」の説明が詳しいですね。 ↩