Estrategia de negociación de vectores normalizados a escala con optimización de la función de activación


Fecha de creación: 2024-01-22 09:02:30 Última modificación: 2024-01-22 09:02:30
Copiar: 0 Número de Visitas: 578
1
Seguir
1617
Seguidores

Estrategia de negociación de vectores normalizados a escala con optimización de la función de activación

Descripción general

La estrategia es una mejora de la estrategia de drkhodakarami de vectores de escala unificada, principalmente con la adición de la función de activación para mejorar el rendimiento de la estrategia. La estrategia utiliza el diferencial de la línea de tiempo para calcular la tasa de cambio en el mercado y hace más señales de descuento a través del juicio de los umbrales. Además, la estrategia introduce las funciones de activación de swish, ReLU y step, que se pueden nivelar las secuencias de diferenciación, para mejorar la precisión de los juicios de señal.

Principio de estrategia

  1. Calcula el porcentaje de variación del precio de cierre en la línea de tiempo de configuración x
  2. Transmite x a la función de activación y obtiene la secuencia procesada p
  3. Establecer un umbral positivo-negativo de th, haciendo más cuando p pasa por th y vacío cuando p pasa por -th
  4. Apagar el rediseño para evitar señales falsas

Análisis de las ventajas

  1. Introducción de la función de activación para filtrar el ruido y mejorar la calidad de la señal
  2. Nuevas lógicas de apertura y cierre de posiciones para operaciones automáticas
  3. Aumentar el espacio de personalización de parámetros para adaptarse a más mercados
  4. El diseño visual es excelente, refleja las señales de negociación de forma intuitiva

Análisis de riesgos

  1. La configuración incorrecta de los umbrales puede conducir a oportunidades de negociación perdidas
  2. La selección incorrecta de la función de activación puede filtrar la información del mercado
  3. Se necesita probar la distorsión de la señal causada por el rediseño

La solución:

  1. Ajustar los parámetros de umbral para encontrar el valor óptimo
  2. Probar diferentes funciones de activación para encontrar la que mejor se ajuste
  3. Agregar rediseño de la lógica de detección para confirmar la validez de la señal

Dirección de optimización

  1. Aumento de la configuración de los límites de adaptación
  2. Optimización de los parámetros de la función de activación
  3. Adición de la lógica automática de parada de pérdidas
  4. Combinación de más señales de filtro de factores

Resumir

La estrategia se basa en drkhodakarami, la introducción de la función de activación para mejorar el rendimiento, la expansión del espacio de optimización de parámetros, para adaptarse mejor a los cambios en el mercado. Al mismo tiempo, el diseño visual es excelente y refleja visualmente las oportunidades de negociación. Posteriormente, se puede seguir optimizando la función de activación y la configuración de los umbrales, y se puede agregar lógica de stop loss y más filtración de señales, con la esperanza de obtener mejores efectos de la estrategia.

Código Fuente de la Estrategia
/*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)