Chiến lược giao dịch vectơ chuẩn hóa tỷ lệ với tối ưu hóa hàm kích hoạt


Ngày tạo: 2024-01-22 09:02:30 sửa đổi lần cuối: 2024-01-22 09:02:30
sao chép: 0 Số nhấp chuột: 578
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch vectơ chuẩn hóa tỷ lệ với tối ưu hóa hàm kích hoạt

Tổng quan

Chiến lược này là một cải tiến cho chiến lược biến thể quy mô thống nhất của drkhodakarami, chủ yếu bằng cách thêm hàm kích hoạt để nâng cao hiệu suất của chiến lược. Chiến lược sử dụng chênh lệch thời gian để tính toán tỷ lệ biến đổi của thị trường và làm nhiều tín hiệu giảm giá bằng cách đánh giá giá trị thấp.

Nguyên tắc chiến lược

  1. Tính toán tỷ lệ phần trăm thay đổi của giá đóng trên đường thời gian thiết lập
  2. Chuyển x đến hàm kích hoạt và có được chuỗi xử lý p
  3. Thiết lập ngưỡng âm dương của th, làm nhiều khi p trên th và trống khi th dưới
  4. Tắt vẽ lại để tránh tín hiệu giả

Phân tích lợi thế

  1. Tiến hành chức năng kích hoạt, có thể lọc tiếng ồn, cải thiện chất lượng tín hiệu phán đoán
  2. Logic mở và đóng kho mới, giao dịch tự động
  3. Thêm không gian tùy chỉnh cho các tham số để phù hợp với nhiều thị trường hơn
  4. Thiết kế hình ảnh tốt, phản ánh trực quan tín hiệu giao dịch

Phân tích rủi ro

  1. Thiết lập sai giới hạn có thể dẫn đến cơ hội giao dịch bị bỏ lỡ
  2. Chọn hàm kích hoạt không đúng có thể lọc thông tin thị trường
  3. Cần kiểm tra các vấn đề biến dạng tín hiệu gây ra bởi bản vẽ lại

Giải pháp:

  1. Điều chỉnh tham số giá trị tối thiểu để tìm giá trị tối ưu
  2. Hãy thử các chức năng kích hoạt khác nhau để tìm ra cái phù hợp nhất.
  3. Thêm logic phát hiện bản vẽ lại để xác nhận hiệu quả của tín hiệu

Hướng tối ưu hóa

  1. Thêm thiết lập ngưỡng thích ứng
  2. Tối ưu hóa các tham số của hàm kích hoạt
  3. Thêm logic tự động dừng lỗ
  4. Kết hợp nhiều yếu tố để lọc tín hiệu

Tóm tắt

Chiến lược này dựa trên drkhodakarami, giới thiệu chức năng kích hoạt để cải thiện hiệu suất, mở rộng không gian tối ưu hóa tham số, có thể thích ứng tốt hơn với sự thay đổi của thị trường. Đồng thời, thiết kế trực quan tuyệt vời, phản ánh trực quan cơ hội giao dịch. Tiếp theo, bạn có thể tiếp tục tối ưu hóa chức năng kích hoạt và thiết lập ngưỡng, và thêm logic dừng và lọc tín hiệu nhiều hơn, có thể đạt được hiệu quả chiến lược tốt hơn.

Mã nguồn chiến lược
/*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)