RSIトレンド反転戦略

RSI ATR
作成日: 2024-04-28 13:33:19 最終変更日: 2024-04-28 13:33:19
コピー: 1 クリック数: 546
1
フォロー
1617
フォロワー

RSIトレンド反転戦略

概要

RSIトレンド反転戦略は,相対的に強い指数 (RSI) と平均実際の波幅 (ATR) をベースにした量化取引戦略である.この戦略は,動的にストップ・ストラップ・ロスを調整することによって,急速な市場の変動に対応し,トレンド反転の機会を捕捉する.この戦略は,RSIを中心に,ATRを組み合わせて波動を測定し,次の2つの自適化ダイナミック波段をポジションの平衡の基礎として使用する.この戦略は,単独で使用でき,他の戦略のストップ・ストラップ・モジュールとしても使用できます.

戦略原則

RSIのトレンドリバース戦略の核心は,ダイナミックなストップ・ストラップ・バンドの構築である.まずは,カスタムされたhighest_customとlowest_customの関数を使用して,前回の交差以来の最高値と最低値を見つけ,波段の基礎を形成する.次に,RSIとATRの長さをそれぞれ計算し,次の計算を行う.

  1. 下線 = 最高値 ×[1 - (ATR/価格 + 1/(RSI下位線 × マリプライザー))
  2. 上線 = 最安値 ×[1 + (ATR/価格 + 1/(RSI上線 × マリピレーター)) ]

このうち,multiplierはユーザがカスタマイズした波段の拡大因子である。価格が上方突破すると多し,下方突破すると空しである。同時に,この2つの帯の色は,価格の相対波段の位置に応じて変化し,観察するのが容易である。

戦略的優位性

  1. 適応性があり,価格の変動に応じて自動的に調整し,市場状況の変化に適時に対応します.
  2. パラメータは調整可能で,length,multiplierなどのパラメータを調整することで,戦略の感度を柔軟に制御できます.
  3. 論理が明確で,コードの構造は合理的で,理解し易く二次開発できる.
  4. 適用範囲は広く,戦略の独自に使用することも,他の戦略に停止損失機能を追加することもできます.
  5. 計算効率が高く,highest_customなどの関数をカスタマイズすることで,series型を使用すると引き起こされる大量の重複計算を回避する.

戦略リスク

  1. パラメータの選択が不適切である場合,追加のリスクが生じることがあります.例えば,長さが小さすぎると頻繁に取引が起こり,倍数が大きすぎると,ストップが過度に緩やかになる可能性があります.
  2. 特定の市場の状況では効果が悪くなることがあります.例えば,波動的な市場で頻繁に整合や偽ブレークが起こり,損失を伴う取引が多く発生する可能性があります.
  3. 策略自体はトレンド判断機能がないので,他のシグナルと連携して使用する必要があります.

戦略最適化の方向性

  1. 移動平均などのトレンド判断指標を導入することを検討し,大きなトレンド方向の逆転点のみで取引を行う.
  2. このパラメータを最適化して,最適の length,multiplierなどのパラメータの組み合わせを見つけることができます.
  3. 他の技術指標や市場情緒指標と組み合わせて,平仓のポイント開設の精度を向上させることができる.
  4. ポジション管理を追加することで,取引毎のリスクエッジを厳格に制御できます.

要約する

RSIトレンド反転戦略は,RSIとATRを利用して自己適応波段を構築し,ストップ・ストロップ・ポイントを動的に調整し,市場の変化に適時に対応します.この戦略の論理は明確で,適用範囲は広いので,量化トレーダーの強力なツールとして使用できます.しかし,実際の使用では,パラメータ選択とリスク管理に注意を払う必要があります.

ストラテジーソースコード
/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false)


//INPUTS 
rsi_length = input.int(title = "Lenght", defval = 8)
rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05)
lookback = input.int(title = "Delay to prevent idealization", defval = 1)
sltp = input.float(title = "Minimum Difference", defval = 10)
src = input.source(title = "Source Input", defval = close)

//PARAMETERS INITILIZATION
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//FUNCTION INITILIZATION
highest_custom(src, length) =>
    x = src
    for i = 0 to length
        if src[i] > x
            x := src[i]
    x
lowest_custom(src, length) => 
    x = src
    for i = 0 to length
        if src[i] < x
            x := src[i]
    x
rsilev(src, length, mult, sltp) =>
    sl = (100 - sltp) / 100
    tp = (100 + sltp) / 100
    var bool crossup = na
    var bool crossdown = na
    var float dir = na
    dir_change = ta.change(dir)
    var float BearGuy = 0
    BullGuy = ta.barssince(crossup or crossdown)
    if na(BullGuy)
        BearGuy += 1
    else
        BearGuy := BullGuy
    var float upper = na
    var float lower = na
    rsilower = ta.rsi(src, length)
    rsiupper = math.abs(ta.rsi(src, length) - 100)
    atr = ta.atr(length) / src
    lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy)
    upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy)
    var float thresh = na
    if na(thresh)
        thresh := lower
    if na(dir)
        dir := 1
    if crossdown
        dir := -1
    if crossup
        dir := 1
    if dir == 1
        thresh := lower
    if dir == -1
        thresh := upper
    crossup := ta.crossover(src, thresh)
    crossdown := ta.crossunder(src, thresh)
    thresh

rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp)

//PLOTTING
var color col = color.lime
if hclose > rsiclose
    col := color.lime
if hclose < rsiclose
    col := color.red
plot(rsiclose, linewidth = 2, color = col)

//STRATEGY
buy = ta.crossover(hclose, rsiclose)
sell = ta.crossunder(hclose, rsiclose)

if buy[lookback]
    strategy.entry("long", strategy.long)
if sell[lookback]
    strategy.entry("Short", strategy.short)