Estratégia de vetor normalizada em escala com funções de ativação, vers.4

Autora:ChaoZhang, Data: 2024-01-22 09:02:30
Tags:

img

Resumo

Esta é uma melhoria da estratégia de vetor normalizado escalado da drkhodakarami, principalmente adicionando funções de ativação para melhorar o desempenho da estratégia. A estratégia calcula a taxa de mudança no mercado com base em diferenças de prazos e determina sinais longos e curtos com base em valores de limiar.

Estratégia lógica

  1. Calcular a variação percentual do preço x de fechamento no prazo definido
  2. Passe x para a função de ativação para obter a seqüência processada p
  3. Definir limiares positivos e negativos th, ir longo quando p cruza acima th, e ir curto quando cruza abaixo -th
  4. Desativar a repintura para evitar sinais falsos

Análise das vantagens

  1. As funções de ativação ajudam a filtrar o ruído e a melhorar o julgamento do sinal
  2. A nova entrada e a lógica próxima permitem a negociação automatizada
  3. Mais personalização de parâmetros adapta-se a mais mercados
  4. Excelente visualização apresenta intuitivamente sinais comerciais

Análise de riscos

  1. Definições de limiares inadequadas podem fazer perder oportunidades comerciais
  2. Funções de activação inadequadas podem filtrar excessivamente as informações de mercado
  3. As distorções de sinal induzidas por reencadernação necessitam de testes

Soluções:

  1. Ajustar parâmetros de limiar para encontrar o ideal
  2. Tente diferentes funções de ativação para encontrar a melhor correspondência
  3. Adicionar lógica de detecção de repintura para confirmar sinais válidos

Orientações de otimização

  1. Adicionar definição de limiar adaptável
  2. Otimizar os parâmetros da função de ativação
  3. Incorporar stop loss automático
  4. Filtrar sinais com mais fatores

Conclusão

Baseada no trabalho de drkhodakarami, esta estratégia introduz funções de ativação para melhorar o desempenho. A personalização de parâmetros expandida se adapta melhor às mudanças do mercado. Enquanto isso, a excelente visualização apresenta intuitivamente oportunidades de negociação. Os próximos passos são otimizar ainda mais as funções de ativação e as configurações de limiar, incorporar lógica de stop loss e mais filtragem de sinal para alcançar uma eficácia de estratégia ainda melhor.


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


Mais.