Strategi RSI Momentum Dinamis

Penulis:ChaoZhang, Tanggal: 2023-10-07 15:47:42
Tag:

Gambaran umum

Gagasan inti dari strategi ini adalah untuk membuat periode penyelarasan indikator RSI dinamis, secara otomatis menyesuaikannya berdasarkan korelasi antara harga dan momentum, sehingga meningkatkan kegunaan indikator RSI.

Logika Strategi

Strategi ini pertama menghitung momentum harga, kemudian menghitung koefisien korelasi antara harga dan momentum. Ketika koefisien korelasi mendekati 1, itu berarti harga dan momentum berkorelasi positif. Ketika koefisien korelasi mendekati -1, itu berarti harga dan momentum berkorelasi negatif.

Berdasarkan korelasi antara harga dan momentum, periode perataan indikator RSI dapat disesuaikan. Ketika korelasi tinggi, periode RSI yang lebih pendek digunakan. Ketika korelasi rendah, periode RSI yang lebih lama digunakan.

Secara khusus, strategi ini menetapkan rentang periode RSI menjadi 20-50 secara default. Setelah menghitung koefisien korelasi antara harga dan momentum, ia menggunakan pemetaan linier untuk memetakan koefisien korelasi ke rentang 20-50 sebagai periode penyelarasan RSI akhir.

Ini memungkinkan parameter RSI untuk disesuaikan secara otomatis berdasarkan kondisi pasar. Ketika perubahan harga berkorelasi kuat dengan perubahan momentum, RSI periode yang lebih pendek digunakan untuk membuatnya lebih sensitif. Ketika korelasi lemah, RSI periode yang lebih lama digunakan untuk mengurangi dampak kebisingan pada sinyal.

Analisis Keuntungan

  • Penyesuaian parameter dinamis beradaptasi dengan perubahan pasar
  • Menghindari keterbatasan indikator periode tetap
  • Periode pelumasan dioptimalkan secara otomatis, tidak perlu secara manual memilih parameter terbaik
  • RSI yang dapat dikonfigurasi bekerja untuk rentang periode produk yang berbeda

Analisis Risiko

  • Perhitungan korelasi itu sendiri memperkenalkan lag, mungkin melewatkan titik balik harga
  • Hanya mempertimbangkan korelasi harga-momentum terlalu sederhana, mengabaikan faktor lain
  • Jangka waktu RSI default mungkin tidak sesuai dengan semua produk, perlu dioptimalkan
  • Pertimbangkan untuk memasukkan faktor lain seperti volatilitas untuk menyesuaikan periode RSI

Arahan Optimasi

  • Cobalah metode perhitungan korelasi yang berbeda untuk mengurangi lag
  • Pertimbangkan lebih banyak faktor, bukan hanya korelasi, untuk menentukan periode RSI
  • Backtest pada produk yang berbeda untuk menemukan rentang periode RSI default optimal
  • Dapat mengatur bobot faktor korelasi, alih-alih pemetaan linier murni
  • Tambahkan filter untuk menghindari periode RSI yang tidak cocok di lingkungan pasar tertentu

Ringkasan

Ide untuk menyesuaikan periode perataan RSI secara dinamis layak dipelajari, tetapi implementasi spesifik memiliki banyak ruang untuk perbaikan. Kuncinya adalah mengidentifikasi faktor-faktor penentu yang mempengaruhi pemilihan parameter RSI, dan mengubahnya menjadi indikator yang dapat diukur. Juga, jangan hanya mengandalkan model, optimasi empiris rentang parameter diperlukan. Secara keseluruhan ini adalah ide yang sangat inovatif, dengan potensi praktis setelah optimasi dan perbaikan lebih lanjut.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 )

// +++++++++++++++++++++
// ++      INPUT      ++ 
// +++++++++++++++++++++

// Momentum
len = input.int(10, "Momentum Length", 1,      group = "Dynamic RSI Momentum")
src = input.source(close, "Source",   group = "Dynamic RSI Momentum")

min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum")
max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum")

upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum")
dnLvl = input.float(30, "OverSold",   0, 100, group = "Dynamic RSI Momentum")

// +++++++++++++++++++++
// ++   CALCULATION   ++ 
// +++++++++++++++++++++

// RMA Function
rmaFun(src, len) =>
    sma   = ta.sma(src, len) 
	alpha = 1/len
	sum   = 0.0
	sum  := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])

// RSI Function 
rsiFun(src, len) =>     
    100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / 
                     rmaFun(src[1] - src > 0 ? src[1] - src : 0, len))

// Momentum
momVal = src - src[len]

// Calculation Price vs Momentum
corr  = ta.correlation(src, momVal, len)
corr := corr > 1 or corr < -1 ? float(na) : corr

rsiLen = 0
rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0))

rsiMom = rsiFun(src, rsiLen)


// +++++++++++++++++++++
// ++    STRATEGY     ++ 
// +++++++++++++++++++++

long  = ta.crossover(rsiMom, dnLvl)
short = ta.crossunder(rsiMom, upLvl) 


// +++> Long <+++++
if long and not na(rsiMom)
    strategy.entry("Long", strategy.long)

// +++> Short <+++++
if short and not na(rsiMom)
    strategy.entry("Short", strategy.short)

// +++++++++++++++++++++
// ++      PLOT       ++ 
// +++++++++++++++++++++

plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow)

hline(50, "Mid Line", color.gray)

upperLine = hline(upLvl, "Upper Line", color.gray)
lowerLine = hline(dnLvl, "Lower Line", color.gray)
fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")



Lebih banyak