ダブルMACD定量取引戦略
概要
本戦略は、二重EMA移動平均線システムとRSIインジケーターの組み合わせを用い、市場のトレンドを判断しつつ取引シグナルを補助的に発出する、トレンドフォロー戦略です。シンプルで使いやすく、多くの主要株価指数や暗号通貨に適用可能で、2013年から現在までのバックテストにおいて500%以上の累積収益を達成しています。
戦略の原理
本戦略では、パラメータの異なる2つのMACDを主要な取引指標として使用します。1つ目のMACDは短い移動平均10期間、長い移動平均22期間、シグナル線は9期間とします。2つ目のMACDは短い移動平均21期間、長い移動平均45期間、シグナル線は20期間とします。
1つ目のMACDのDIFFラインがゼロラインを上抜けたときに買いシグナル、下抜けたときに売りシグナルが発生します。2つ目のMACDのDIFFラインから発せられるシグナルは、1つ目のMACDシグナルの確認として機能します。
また、本戦略では価格モメンタムを計算する式も採用しており、最新のローソク足の終値+高値を前のローソク足の終値+高値で割った結果が1より大きい場合は上昇トレンドにあると判断し買いシグナル、逆の場合は売りシグナルを発生させます。
最後に、Stoch RSIのKラインが20より大きい場合も売りシグナルを確認します。
優位性分析
本戦略は二重EMAの組み合わせでトレンドを判断するため、偽のブレイクアウトを効果的にフィルタリングできます。補助的なモメンタム式により、レンジ相場での誤シグナルも回避できます。Stoch RSI指標の活用により、買われすぎ・売られすぎの領域で売りシグナルを発生させ、天井追いを防ぎます。
本戦略はよく使われる指標のシンプルな組み合わせのみで構成され、複雑な論理関係はなく、非常に理解しやすく修正もしやすいです。パラメータ設定も汎用的で、銘柄ごとに最適化する必要がなく、適応性が高いです。
バックテスト結果によると、本戦略は株式指数や暗号通貨など様々な銘柄で良好な累積収益を上げており、最大ドローダウンの制御も比較的良好です。非常に汎用的なトレンドフォロー戦略として使用できます。
リスク分析
本戦略の主なリスクは移動平均線を用いた判定にあり、価格が大きく揉み合うとWhipsaw(往復ビンタ)が発生しやすく、損失を被る可能性があります。また、単一取引の損失を抑えるためのストップロスも設定されていません。
Stoch RSIによる買われすぎ・売られすぎの判定はあまり理想的ではなく、反転シグナルを見逃しやすい場合があります。
価格が急落してもMACDがデッドクロスを形成していない場合、本戦略はポジションを保有し続け、損失が拡大する可能性があります。
最適化の方向性
単一取引の損失を抑えるため、ストップロスを設定することを検討できます。例えばATRストップロスや、終値が低い方の移動平均線でストップロスを設定する方法があります。
他の指標を追加して補助することもできます。例えばKD指標やボリンジャーバンドをStoch RSIと組み合わせることで、より信頼性の高い買われすぎ・売られすぎの判断が可能になります。
出来高の分析を追加することも考えられます。例えば大量のポジション减少時にはストップロスを引き上げる、出来高が不足している場合は建玉を避けるなどの対策です。
異なるパラメータの組み合わせをテストし、MACDの期間パラメータを最適化できます。また、異なる期間のMACDを追加して多重確認を構成することもテストできます。
まとめ
本二重MACD定量取引戦略は全体としてシンプルかつ明確な考え方を持ち、二重EMAの組み合わせでトレンドを判断し、モメンタム指標で誤シグナルを回避することで、良好な取引タイミングを選別できます。パラメータ設定は汎用的で実際のパフォーマンスも安定しており、ベース戦略として最適化・調整に利用できます。次のステップとして、ストップロス方式の修正、出来高分析の追加、他の指標との組み合わせなどにより、戦略の安定性と収益率をさらに強化することができます。
/*backtest
start: 2023-10-13 00:00:00
end: 2023-11-12 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("Multiple MACD RSI simple strategy", overlay=true, initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=80, pyramiding=0, calc_on_order_fills=true)
fastLength = input(10)- 1

