활성화 함수 최적화를 통한 정규화된 벡터 거래 전략 확장


생성 날짜: 2024-01-22 09:02:30 마지막으로 수정됨: 2024-01-22 09:02:30
복사: 0 클릭수: 578
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

활성화 함수 최적화를 통한 정규화된 벡터 거래 전략 확장

개요

이 전략은 drkhodakarami의 규모 통합 벡터 전략에 대한 개량이며, 주로 활성화 함수를 추가하여 전략의 성능을 향상시킨다. 전략은 시간축 이차를 활용하여 시장의 변화율을 계산하고, 경량 판단을 통해 더 많은 공백 신호를 한다. 또한, 전략은 스위시, ReLU 및 step 활성화 함수를 도입하여, 이차 분산 서열을 평행하여 신호 판단의 정확성을 향상시킨다.

전략 원칙

  1. 세팅 시간 축에 있는 클로즈 가격의 차이 비율 변화 x를 계산
  2. x를 활성화 함수에 전달하여 처리된 시퀀스 p를 얻습니다.
  3. 음의 정적값을 설정하여, p가 위쪽을 통과할 때 더하고, 아래쪽을 통과할 때 공백
  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)