RSIトレンドフォロー・トレーリングストップ戦略
概要
本戦略は、RSIインジケーターを利用してトレンドを識別し、移動平均線でトレンドを確認し、ストップロスとテイクプロフィットを設定する自動取引戦略です。RSIが68を超え、かつ現在の移動平均線が前の移動平均線を上抜けた場合にロング、RSIが28未満で、かつ現在の移動平均線が前の移動平均線を下抜けた場合にショートします。同時にストップロスとテイクプロフィットのポイントを設定します。
戦略の原理
本戦略は主にRSIインジケーターを使用して買われ過ぎ・売られ過ぎを判断し、トレンドを識別します。RSIが70を超えると買われ過ぎ、30未満で売られ過ぎとされます。移動平均線のゴールデンクロスとデッドクロスを組み合わせてトレンドを確認します。具体的な取引シグナルは以下の通りです。
ロングシグナル:RSIが68を超え、かつ現在の移動平均線が前の移動平均線を上抜けた場合、ロング。
ショートシグナル:RSIが28未満で、かつ現在の移動平均線が前の移動平均線を下抜けた場合、ショート。
ストップロスとテイクプロフィットは、各ポイントごとに異なる比率を設定し、緩やかなものから厳格なものまで以下の通りとします。
ロングのテイクプロフィット:高値の1.4%で半分のポジションを利確、高値の0.8%で全ポジションを決済。
ロングのストップロス:エントリー価格の2%でストップロス。
ショートのテイクプロフィット:安値の0.4%で半分のポジションを利確、安値の0.8%で全ポジションを決済。
ショートのストップロス:エントリー価格の2%でストップロス。
また、トレンドが反転した場合、例えばロング中にRSIが30を下回った場合は成行で全ポジションを決済、ショート中にRSIが60を上回った場合は成行で全ポジションを決済します。
戦略の優位性
- RSIインジケーターを使用して買われ過ぎ・売られ過ぎを判断し、高値掴みや底値売りを回避。
- 移動平均線によるトレンドフィルターで、非主流方向の取引を低減。
- 段階的なテイクプロフィット設定で利益を最大化。
- 比較的高めのストップロス設定でトレンドに適切な余地を与える。
- トレンド転換指標を用いた逆方向の手仕舞い戦略により、急なイベントに迅速に対応。
戦略のリスク
- RSIパラメーター設定の問題により、識別効果が不十分となる可能性。
- 移動平均線パラメーター設定の問題により、フィルター効果が不十分となる可能性。
- ストップロスが緩すぎて損失が拡大するリスク。
- テイクプロフィットが厳しすぎて利益を最大化できないリスク。
- 逆方向手仕舞い戦略の判断ミスにより不必要な損失が発生するリスク。
上記リスクに対して、パラメーターは複数回のテストと最適化が必要です。ストップロスとテイクプロフィットは適切に設定し、ある程度の幅を持たせ、市場の変動に応じてパラメーターを調整します。手仕舞い戦略は慎重に行い、インジケーターの誤判定による損失を回避します。
最適化の方向性
以下の観点からさらに最適化できます。
- より多くのフィルター指標を追加し、シグナルの精度を向上(例:出来高フィルターの追加)。
- ストップロス戦略を調整し、最高値・最安値を追跡することで移動ストップロスを実現。
- 部分的なテイクプロフィットをトレーリングストップに変更し、利益を最大化。
- データソースの切り替えを追加し、異なる銘柄で異なる時間足などのパラメーター組み合わせを使用。
- 先物の空売り保有コストを考慮し、ストップロスとテイクプロフィットを動的に調整。
まとめ
本戦略は全体的に成熟度の高い信頼性のあるトレンドフォロー戦略です。RSIで買われ過ぎ・売られ過ぎを判断して取引方向を決定し、移動平均線でフィルタリングと確認を行います。同時に適切なストップロスと段階的なテイクプロフィットを設定します。トレンド相場で良好なリターンを得ることができます。パラメーターのチューニングが適切であれば、トレンド相場で優れたパフォーマンスを発揮します。さらなる最適化により、より優れた成果が期待できます。
// © CRabbit
//@version=5
// Starting with $100 and using 10% of the account per trade
strategy("RSI Template", shorttitle="RSI", overlay=false, initial_capital=100, default_qty_value=10, default_qty_type=strategy.percent_of_equity)
// RSI Indicator
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)- 1

