액티베이션 함수와 함께 확장 표준화된 벡터 전략, ver.4

저자:차오장, 날짜: 2024-01-22 09:02:30
태그:

img

전반적인 설명

이것은 drkhodakarami의 확장 표준 벡터 전략의 개선이며, 주로 전략의 성능을 향상시키기 위해 활성화 기능을 추가합니다. 전략은 시간 프레임 차이에 따라 시장의 변화율을 계산하고, 임계값에 따라 길고 짧은 신호를 결정합니다. 한편, 스윙, ReLU 및 단계 활성화 기능은 미분 순서를 매끄럽게하고 신호 판단의 정확성을 향상시키기 위해 도입됩니다.

전략 논리

  1. 설정된 시간 프레임에 닫는 비율 가격 변화 x를 계산
  2. x를 활성화 함수로 전달하여 처리된 순서 p를 얻습니다.
  3. 긍정과 음의 문턱을 설정 th, p를 넘어서면 길게, -th를 넘어서면 짧게
  4. 가짜 신호를 피하기 위해 재칠을 비활성화

이점 분석

  1. 활성화 기능은 소음을 필터링하고 신호 판단을 향상시키는 데 도움이됩니다.
  2. 새로운 입점과 긴 논리 자동화 거래가 가능
  3. 더 많은 매개 변수 사용자 정의는 더 많은 시장에 적응
  4. 우수한 시각화 직관적으로 무역 신호를 제공합니다

위험 분석

  1. 부적절한 문턱 설정은 무역 기회를 놓칠 수 있습니다.
  2. 부적절한 활성화 기능은 시장 정보를 과도하게 필터링할 수 있습니다.
  3. 회색으로 인한 신호 왜곡은 테스트가 필요합니다.

해결책:

  1. 최적을 찾기 위해 임계 매개 변수를 조정
  2. 다른 활성화 기능을 시도하여 가장 적합한 것을 찾으십시오.
  3. 유효 신호를 확인 하려면 재 칠 감지 로직을 추가

최적화 방향

  1. 적응적 임계 설정 추가
  2. 활성화 기능 매개 변수를 최적화
  3. 자동 스톱 손실을 포함
  4. 더 많은 요소로 신호를 필터

결론

이 전략은 drkhodakarami의 작업을 기반으로 성능을 향상시키기 위해 활성화 기능을 도입합니다. 확장된 매개 변수 사용자 정의는 시장 변화에 더 잘 적응합니다. 한편, 우수한 시각화는 직관적으로 거래 기회를 제시합니다. 다음 단계는 활성화 기능과 임계 설정을 더 최적화하고, 스톱 로스 논리와 더 많은 신호 필터링을 통합하여 더 나은 전략 효과를 달성하는 것입니다.


/*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)


더 많은