RSI ベースの自動取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-29 14:14:01
タグ:

img

概要

この戦略は,RSI指標に基づいて,ロングとショートの両方の自動取引システムを設計する.RSIが過剰購入または過剰販売レベルを示したときに取引を開始し,特定の条件によって引き起こすストップ損失で終了する.

戦略の論理

この戦略は,RSIインジケーターを使用して,過剰購入/過剰販売の市場状況を特定します.特に,RSIが過剰販売ラインを下回ると,ロングポジションに入ります.RSIが過剰購入ラインを超えると,ショートポジションに入ります.

また,出口ルールは戦略に設定されています.ロングポジションを開いた後,RSIが再オーバー買いラインを越えた場合,ロングを閉じるストップ損失を誘発します.同様に,ショートを開いた後,RSIが再オーバーセールラインを下回ると,ショートを閉じる.

利点分析

この戦略の最大の利点は,過剰購入/過剰売却シナリオを判断するためにRSI指標を使用することであり,これは定量取引における比較的成熟した信頼性の高い技術分析方法である.単純な移動平均戦略と比較して,この戦略は市場のターニングポイントをより正確に捉えることができ,それによって取引システムの利益の可能性を増加させる.

また,ストップ・ロスのメカニズムは,強烈な一方的なトレンドの際に下向きのリスクを効果的に制御します. これは,ランナーが簡単にトラブルに陥れる伝統的なトレンドフォロー戦略と大きく対照的です.

リスク分析

最大のリスクは,RSIインジケーターが時折間違った取引信号を与える可能性があることです.RSIを含む市場の動きを予測する技術指標は100%正確ではありません.RSIが過剰購入/過剰販売状態について間違った判断を下すと,戦略の誤ったエントリにつながります.

ストップ・ロスは,ストップ・ロスのリスクを軽減するために戦略に実装されている.しかし,ストップ・ロスの引き起こす確率は,強いトレンドの間には依然として高くなり,間違ったポジションを閉鎖するには手動的な介入が必要になる.一般的に言えば,自動化されたシステムが最大限のパフォーマンスを達成するためには,人間の監督と調整が依然として必要である.

オプティマイゼーションの方向性

さらに最適化できる余地があります.

  1. 入力シグナルを確認し,RSIだけで誤った入力を避けるために他の指標を組み込む.移動平均等を追加することができます.

  2. RSI パラメータを最適化して,より正確な過買い/過売り検出のためによりよい長値を見つけます.

  3. 損失防止と早速終了を回避するバランスをとるためにストップ損失配置を精密に調整します.

結論

RSIベースの自動取引戦略は,過剰購入と過剰売却の市場状況を効果的に特定する利点があります.極端なRSIレベル中にロングとショートポジションに入ることで,市場の逆転から利益を得ることを目指します.ストップ損失メカニズムはまた,強い片方的なトレンド中に損失を制限するのに役立ちます.しかし,誤ったRSI信号のリスクは残っています.確認指標,RSIパラメータ,ストップ損失配置のさらなる最適化は,戦略の収益性とリスク管理を向上させることができます.すべての自動化システムと同様に,特別な市場状況での介入には依然として人間の監督が必要です.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=4

strategy("Soran Strategy 2 - LONG SIGNALS", pyramiding=1, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=50, overlay=false)


// ----------------- Inputs ----------------- //

reso = input(title="Resolution", type=input.resolution, defval="")
length = input(20, title="RSI Length", type=input.integer)
ovrsld = input(30, "RSI Oversold level", type=input.float)
ovrbgt = input(85, "RSI Overbought level", type=input.float)
lateleave = input(28, "Number of candles", type=input.integer)
// lateleave : numbers of bars in overbought/oversold zones where the position is closed. The position is closed when this number is reached or when the zone is left (the first condition).

// best parameters BTCUSDTPERP M15 : 20 / 30 / 85 / 28


stratbull = input(title="Enter longs ?", type = input.bool, defval=true)
stratbear = input(title="Enter shorts ?", type = input.bool, defval=true)

stratyear = input(2020, title = "Strategy Start Year")
stratmonth = input(1, title = "Strategy Start Month")
stratday = input(1, title = "Strategy Start Day")
stratstart = timestamp(stratyear,stratmonth,stratday,0,0)


// --------------- Laguerre ----------------- //

laguerre = input(title="Use Laguerre on RSI ?", type=input.bool, defval=false)
gamma = input(0.06, title="Laguerre Gamma")

laguerre_cal(s,g) =>
    l0 = 0.0
    l1 = 0.0
    l2 = 0.0
    l3 = 0.0
    l0 := (1 - g)*s+g*nz(l0[1])
    l1 := -g*l0+nz(l0[1])+g*nz(l1[1])
    l2 := -g*l1+nz(l1[1])+g*nz(l2[1])
    l3 := -g*l2+nz(l2[1])+g*nz(l3[1])
    (l0 + 2*l1 + 2*l2 + l3)/6


// ---------------- Rsi VWAP ---------------- //

rsiV = security(syminfo.tickerid, reso, rsi(vwap(close), length))

rsiVWAP = laguerre ? laguerre_cal(rsiV,gamma) : rsiV


// ------------------ Plots ----------------- //

prsi = plot(rsiVWAP, color = rsiVWAP>ovrbgt ? color.red : rsiVWAP<ovrsld ? color.green : color.white, title="RSI on VWAP", linewidth=1, style=plot.style_line)
hline = plot(ovrbgt, color = color.gray, style=plot.style_line)
lline = plot(ovrsld, color = color.gray, style=plot.style_line)
fill(prsi,hline, color = rsiVWAP > ovrbgt ? color.red : na, transp = 30)
fill(prsi,lline, color = rsiVWAP < ovrsld ? color.green : na, transp = 30)


// ---------------- Positions: only shows Buy and close Buy positions --------------- //

timebull = stratbull 
timebear = stratbear 

strategy.entry("Long", true, when = timebull and crossover(rsiVWAP, ovrsld), comment="")
strategy.close("Long", when = timebull and crossover(rsiVWAP, ovrbgt)[lateleave] or crossunder(rsiVWAP, ovrbgt), comment="")


もっと