Skala Vektor Strategy dengan fungsi aktivasi, ver.4

Penulis:ChaoZhang, Tanggal: 2024-01-22 09:02:30
Tag:

img

Gambaran umum

Ini adalah peningkatan dari strategi drkhodakarami's Scaled Normalized Vector, terutama menambahkan fungsi aktivasi untuk meningkatkan kinerja strategi. Strategi ini menghitung tingkat perubahan di pasar berdasarkan perbedaan kerangka waktu, dan menentukan sinyal panjang dan pendek berdasarkan nilai ambang. Sementara itu, swish, ReLU dan fungsi aktivasi langkah diperkenalkan untuk meluruskan urutan diferensial dan meningkatkan akurasi penilaian sinyal.

Logika Strategi

  1. Menghitung persentase perubahan harga x dari penutupan pada kerangka waktu yang ditetapkan
  2. Pass x ke fungsi aktivasi untuk mendapatkan urutan diproses p
  3. Tetapkan ambang positif dan negatif th, pergi panjang ketika p melintasi di atas th, dan pergi pendek ketika melintasi di bawah -th
  4. Menonaktifkan repainting untuk menghindari sinyal palsu

Analisis Keuntungan

  1. Fungsi aktivasi membantu menyaring kebisingan dan meningkatkan penilaian sinyal
  2. Masuk baru dan logika dekat memungkinkan perdagangan otomatis
  3. Lebih banyak penyesuaian parameter beradaptasi dengan lebih banyak pasar
  4. Visualisasi yang sangat baik secara intuitif menyajikan sinyal perdagangan

Analisis Risiko

  1. Pengaturan ambang batas yang tidak tepat dapat kehilangan peluang perdagangan
  2. Fungsi aktivasi yang tidak sesuai dapat terlalu menyaring informasi pasar
  3. Distorsi sinyal yang diinduksi dengan mewarnai kembali perlu diuji

Solusi:

  1. Sesuaikan parameter ambang untuk menemukan optimal
  2. Coba fungsi aktivasi yang berbeda untuk menemukan pertandingan terbaik
  3. Tambahkan logika deteksi repainting untuk mengkonfirmasi sinyal yang valid

Arahan Optimasi

  1. Tambahkan pengaturan ambang adaptif
  2. Mengoptimalkan parameter fungsi aktivasi
  3. Masukkan stop loss otomatis
  4. Filter sinyal dengan lebih banyak faktor

Kesimpulan

Berdasarkan karya drkhodakarami, strategi ini memperkenalkan fungsi aktivasi untuk meningkatkan kinerja. kustomisasi parameter yang diperluas lebih beradaptasi dengan perubahan pasar. Sementara itu, visualisasi yang sangat baik secara intuitif menyajikan peluang perdagangan. Langkah selanjutnya adalah untuk lebih mengoptimalkan fungsi aktivasi dan pengaturan ambang, menggabungkan logika stop loss dan lebih banyak penyaringan sinyal untuk mencapai efektivitas strategi yang lebih baik.


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

//@version=4
// author: capissimo
strategy("Scaled Normalized Vector Strategy, ver.4", precision=2, overlay=false)
// This is a modification of my Scaled Normalized Vector Strategy  
// original: Drkhodakarami (https://www.tradingview.com/script/Fxv2xFWe-Normalized-Vector-Strategy-By-Drkhodakarami-Opensource/)

price    = input(close,  "Price Data")
tf       = input(18,     "Timeframe", minval=1, maxval=1440)
thresh   = input(14.,    "Threshold", minval=.1, step=.1) 
div      = input(1000000,"Divisor", options=[1,10,100,1000,10000,100000,1000000,10000000,100000000])
mmx      = input(233,    "Minimax Lookback", options=[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584])
showVol  = input(false,  "Volume")
useold   = input(true,   "Use Old System")
method   = input("Swish", "Activation", options=["Step", "LReLU", "Swish", "None"])

scaleMinimax(X, p, min, max) => 
    hi = highest(X, p), lo = lowest(X, p)
    (max - min) * (X - lo)/(hi - lo) + min

getdiff(prc, tf) =>
    prev  = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), prc[1], barmerge.gaps_off, barmerge.lookahead_on) 
                                 : security(syminfo.tickerid, tostring(tf), prc[1])), tf, 0, 1)
    curr  = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), hlc3, barmerge.gaps_off, barmerge.lookahead_on)  
                                 : security(syminfo.tickerid, tostring(tf), hlc3)), tf, 0, 1)
    (curr/prev) - 1

relu(x) => max(x, 0)
lrelu(x, alpha) => relu(x) - alpha * relu(-x)
step(x) => x >= 0 ? 1 : -1
log2(x) => log(x) / log(2)
sigmoid(x) => 1 / (1 + exp(-x))
swish(x) => x * sigmoid(x)

f(m) => method==m

vol  = useold ? security(syminfo.tickerid, tostring(tf), volume, barmerge.gaps_off, barmerge.lookahead_on) 
              : security(syminfo.tickerid, tostring(tf), volume)
obv  = cum(change(price) > 0 ? vol : change(price) < 0 ? -vol : 0*vol)
prix = showVol ? obv : price
x    = getdiff(prix, tf)
p    = f("Swish") ? swish(x) : f("Step") ? step(x) : f("LReLU") ? lrelu(x, .8) : x
th   = thresh/div
long = crossover(p, th)
short= crossunder(p, -th)

lime  = color.new(color.lime, 10), fuchsia = color.new(color.fuchsia, 10), 
black = color.new(color.black, 100), gray = color.new(color.gray, 50)
bg    = long ? lime : short ? fuchsia : black
cl    = p > th ? color.green : p < -th ? color.red : color.silver

bgcolor(bg, editable=false)
plot(scaleMinimax(th, mmx, -1, 1), color=lime, editable=false, transp=0)
hline(0, linestyle=hline.style_dotted, title="base line", color=gray, editable=false)
plot(scaleMinimax(-th, mmx, -1, 1), color=fuchsia, editable=false, transp=0)
plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_histogram, transp=70, editable=false)
plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_linebr, title="prediction", transp=0, editable=false)

strategy.entry("L", true, 1, when=long)
strategy.entry("S", false, 1, when=short)

alertcondition(long, title='Long', message='Long Signal!')
alertcondition(short, title='Short', message='Short Signal!')

//*** Karobein Oscillator
per  = input(8, "Karobein Osc Lookback")

prix2 = ema(price, per)
a = ema(prix2 < prix2[1] ? prix2/prix2[1] : 0, per)
b = ema(prix2 > prix2[1] ? prix2/prix2[1] : 0, per)
c = (prix2/prix2[1])/(prix2/prix2[1] + b)
d = 2*((prix2/prix2[1])/(prix2/prix2[1] + c*a)) - 1

plot(scaleMinimax(d, mmx, -1, 1), color=color.orange, transp=0)


Lebih banyak