トレンドフォローRSIと移動平均を組み合わせた定量取引戦略

RSI MA SMA TP SL
作成日: 2025-01-06 10:58:42 最終変更日: 2025-01-06 10:58:42
コピー: 4 クリック数: 376
1
フォロー
1617
フォロワー

トレンドフォローRSIと移動平均を組み合わせた定量取引戦略

概要

この戦略は、相対力指数 (RSI) と単純移動平均 (SMA) を組み合わせたトレンド追跡取引システムです。この戦略では、移動平均を使用して市場トレンドの方向を決定し、RSI インジケーターを使用して勢いを確認して、トレンドと勢いが共鳴したときに取引を行います。この戦略では、リスクを効果的に制御できる完全なストッププロフィットおよびストップロスメカニズムを設計しました。

戦略原則

この戦略のコアロジックは、2 つのテクニカル指標を組み合わせて使用​​することに基づいています。

  1. 移動平均 (MA): 全体的な傾向を判断するために使用されます。価格が MA を上回っている場合は上昇傾向とみなされ、そうでない場合は下降傾向とみなされます。
  2. 相対力指数 (RSI): 価格の勢いを確認するために使用されます。 RSI が設定されたしきい値 (55 など) を超えると上昇の勢いが確認され、しきい値 (45 など) を下回ると下降の勢いが確認されます。

取引シグナル生成ロジック:

  • ロング条件: 価格がMAを上回り、RSIが買いしきい値より大きい
  • 空売り条件: 価格がMAを下回り、RSIが売り閾値を下回る

リスク管理では、それぞれエントリー価格の固定パーセンテージとして設定されるパーセンテージ ストップ ロスとテイク プロフィットの方法が使用されます。

戦略的優位性

  1. 信号の安定性: トレンドとモメンタムの二重確認を組み合わせることで、誤った信号を効果的に減らすことができます。
  2. 完璧なリスク管理: 固定パーセンテージのストップロスとテイクプロフィットが設定されており、各取引のリスクを効果的に管理します。
  3. パラメータの柔軟性: MA 期間、RSI しきい値などの主要なパラメータは、さまざまな市場特性に応じて最適化できます。
  4. 戦略ロジックは明確です。取引ルールはシンプルで直感的であり、理解しやすく実行しやすいです。
  5. 高い適応性: さまざまな期間の取引に適用できます。

戦略リスク

  1. トレンド反転リスク: トレンドの転換点において継続的なストップロスが発生する可能性があります。
  2. 不安定な市場のリスク: レンジ相場では、頻繁に取引を行うと損失が発生する可能性があります。
  3. パラメータ依存性: 最適なパラメータは市場環境によって大きく異なる場合があります。
  4. スリッページリスク: 市場が激しく変動すると、大きなスリッページが発生する可能性があります。
  5. テクニカル指標の遅れ: MA と RSI はどちらも一定の遅れがあり、エントリータイミングが遅れる可能性があります。

戦略最適化の方向性

  1. 動的パラメータ最適化: 市場のボラティリティに応じて MA 期間と RSI しきい値を動的に調整する適応型パラメータ メカニズムを導入します。
  2. 市場環境フィルタリング: ボラティリティの高い環境でポジションを調整したり取引を一時停止したりするためのボラティリティフィルタリングメカニズムを追加します。
  3. 複数期間分析: より長期的なトレンド確認を導入して、取引方向の精度を向上させます。
  4. ストップロスの最適化: 利益をより適切に保護するために、トレーリング ストップロス メカニズムを導入します。
  5. シグナルフィルタリング: 取引量などの補助指標を追加して、シグナルの信頼性を向上させます。

要約する

この戦略は、トレンドとモメンタム指標を組み合わせて、明確なロジックと制御可能なリスクを備えた取引システムを構築します。固有のリスクはあるものの、この戦略は合理的なパラメータ設定とリスク管理を通じて優れた実用性を示しています。その後の最適化の方向性は、主に動的パラメータの調整、市場環境の特定、信号品質の改善に重点が置かれ、これにより戦略の安定性と収益性がさらに向上することが期待されます。

ストラテジーソースコード
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © raiford87

//@version=6
strategy("RSI + MA Trend Strategy (v6)",
     shorttitle="RSI_MA_Trend_v6",
     overlay=true,
     initial_capital=50000,
     default_qty_type=strategy.fixed,
     default_qty_value=1)

// ─────────────────────────────────────────────────────────────────────────────────────
// 1. USER INPUTS
// ─────────────────────────────────────────────────────────────────────────────────────
maLength       = input.int(50,   "Moving Average Length")
rsiLength      = input.int(14,   "RSI Length")
rsiBuyLevel    = input.int(55,   "RSI > X for Buy",  minval=1, maxval=99)
rsiSellLevel   = input.int(45,   "RSI < X for Sell", minval=1, maxval=99)

stopLossPerc   = input.float(1.0,  "Stop Loss %",    minval=0.1)
takeProfitPerc = input.float(2.0,  "Take Profit %",  minval=0.1)

// ─────────────────────────────────────────────────────────────────────────────────────
// 2. INDICATOR CALCULATIONS
// ─────────────────────────────────────────────────────────────────────────────────────
maValue = ta.sma(close, maLength)
rsiVal  = ta.rsi(close, rsiLength)

// Trend conditions
bullTrend = close > maValue
bearTrend = close < maValue

// RSI conditions
rsiBull   = rsiVal > rsiBuyLevel
rsiBear   = rsiVal < rsiSellLevel

// ─────────────────────────────────────────────────────────────────────────────────────
// 3. ENTRY CONDITIONS
// ─────────────────────────────────────────────────────────────────────────────────────
longCondition  = bullTrend and rsiBull
shortCondition = bearTrend and rsiBear

if longCondition
    strategy.entry("RSI MA Long", strategy.long)
if shortCondition
    strategy.entry("RSI MA Short", strategy.short)

// ─────────────────────────────────────────────────────────────────────────────────────
// 4. STOP LOSS & TAKE PROFIT
// ─────────────────────────────────────────────────────────────────────────────────────
stopLossLevel   = stopLossPerc   * 0.01
takeProfitLevel = takeProfitPerc * 0.01

if strategy.position_size > 0
    stopPriceLong = strategy.position_avg_price * (1 - stopLossLevel)
    tpPriceLong   = strategy.position_avg_price * (1 + takeProfitLevel)
    strategy.exit("Exit Long", from_entry="RSI MA Long", stop=stopPriceLong, limit=tpPriceLong)

if strategy.position_size < 0
    stopPriceShort = strategy.position_avg_price * (1 + stopLossLevel)
    tpPriceShort   = strategy.position_avg_price * (1 - takeProfitLevel)
    strategy.exit("Exit Short", from_entry="RSI MA Short", stop=stopPriceShort, limit=tpPriceShort)

// ─────────────────────────────────────────────────────────────────────────────────────
// 5. PLOT SIGNALS & LEVELS
// ─────────────────────────────────────────────────────────────────────────────────────
plot(maValue, color=color.yellow, linewidth=2, title="Moving Average")

plotchar(longCondition,  title="Long Signal",  char='▲', location=location.belowbar, color=color.green, size=size.tiny)
plotchar(shortCondition, title="Short Signal", char='▼', location=location.abovebar, color=color.red,   size=size.tiny)

// Plot Stop & TP lines
posIsLong  = strategy.position_size > 0
posIsShort = strategy.position_size < 0

plotStopLong = posIsLong ? strategy.position_avg_price * (1 - stopLossLevel) : na
plotTpLong   = posIsLong ? strategy.position_avg_price * (1 + takeProfitLevel): na
plotStopShort= posIsShort? strategy.position_avg_price * (1 + stopLossLevel) : na
plotTpShort  = posIsShort? strategy.position_avg_price * (1 - takeProfitLevel): na

plot(plotStopLong,  color=color.red,   linewidth=2, style=plot.style_line, title="Stop Loss Long")
plot(plotTpLong,    color=color.green, linewidth=2, style=plot.style_line, title="Take Profit Long")
plot(plotStopShort, color=color.red,   linewidth=2, style=plot.style_line, title="Stop Loss Short")
plot(plotTpShort,   color=color.green, linewidth=2, style=plot.style_line, title="Take Profit Short")