Strategi Perdagangan Vektor Skala Normalisasi dengan Optimasi Fungsi Aktivasi


Tanggal Pembuatan: 2024-01-22 09:02:30 Akhirnya memodifikasi: 2024-01-22 09:02:30
menyalin: 0 Jumlah klik: 578
1
fokus pada
1617
Pengikut

Strategi Perdagangan Vektor Skala Normalisasi dengan Optimasi Fungsi Aktivasi

Ringkasan

Strategi ini merupakan peningkatan dari strategi drkhodakarami untuk skala unifikasi vektor, terutama dengan menambahkan fungsi aktivasi untuk meningkatkan kinerja strategi. Strategi ini menggunakan perbedaan sumbu waktu untuk menghitung perubahan pasar, dan melakukan lebih banyak sinyal shorting melalui penilaian nilai rendah. Selain itu, strategi ini memperkenalkan fungsi aktivasi swish, ReLU, dan step, yang dapat meluruskan urutan diferensial, meningkatkan akurasi penilaian sinyal.

Prinsip Strategi

  1. Perhitungan persentase perubahan harga dekat pada garis waktu yang ditetapkan
  2. Membagi x ke fungsi aktivasi, mendapatkan urutan p yang telah diproses
  3. Tetapkan th positif-negatif, lakukan plus saat p di atas th dan kosong saat di bawah th
  4. Matikan gambar ulang untuk menghindari sinyal palsu

Analisis Keunggulan

  1. Fungsi aktivasi yang dapat memfilter kebisingan, meningkatkan kualitas penilaian sinyal
  2. Logika open and close baru, dapat diperdagangkan secara otomatis
  3. Menambahkan ruang kustomisasi parameter untuk lebih banyak pasar
  4. Desain visual yang bagus, mencerminkan sinyal perdagangan secara intuitif

Analisis risiko

  1. Setting threshold yang tidak tepat dapat menyebabkan peluang perdagangan yang hilang
  2. Fungsi aktivasi yang dipilih tidak tepat dapat memfilter informasi pasar
  3. Tes untuk masalah distorsi sinyal yang disebabkan oleh pemetaan ulang

Solusi:

  1. Menyesuaikan parameter threshold untuk mencari nilai optimal
  2. Cobalah berbagai fungsi aktivasi untuk menemukan yang paling cocok.
  3. Tambahkan logik deteksi pemetaan ulang untuk mengkonfirmasi validitas sinyal

Arah optimasi

  1. Meningkatkan pengaturan ambang batas adaptasi
  2. Optimalkan parameter fungsi aktivasi
  3. Menambahkan logika stop loss otomatis
  4. Kombinasi sinyal filter faktor lebih

Meringkaskan

Strategi ini didasarkan pada drkhodakarami, memperkenalkan fungsi aktivasi untuk meningkatkan kinerja, memperluas ruang pengoptimalan parameter, dan lebih baik menyesuaikan diri dengan perubahan pasar. Pada saat yang sama, desain visualnya sangat baik, mencerminkan peluang perdagangan secara intuitif. Selanjutnya, Anda dapat terus mengoptimalkan fungsi aktivasi dan pengaturan threshold, dan menambahkan logika stop loss dan lebih banyak pemfilteran sinyal untuk mendapatkan efek strategi yang lebih baik.

Kode Sumber Strategi
/*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)