En la carga de los recursos... Cargando...

Estrategia de vectores normalizados a escala con funciones de activación, ver.4

El autor:¿ Qué pasa?, Fecha: 2024-01-22 09:02:30
Las etiquetas:

img

Resumen general

Esta es una mejora de la estrategia de vector normalizado escalado de drkhodakarami, principalmente añadiendo funciones de activación para mejorar el rendimiento de la estrategia. La estrategia calcula la tasa de cambio en el mercado en función de las diferencias de marco de tiempo, y determina señales largas y cortas basadas en valores de umbral. Mientras tanto, se introducen funciones de activación de swish, ReLU y paso para suavizar la secuencia diferencial y mejorar la precisión del juicio de la señal.

Estrategia lógica

  1. Calcular el porcentaje de cambio de precio x de cierre en el marco de tiempo establecido
  2. Pasa x a la función de activación para obtener la secuencia procesada p
  3. Establecer umbrales positivos y negativos th, ir largo cuando p cruza por encima de th, y ir corto cuando cruza por debajo de -th
  4. Deshabilitar la pintura para evitar señales falsas

Análisis de ventajas

  1. Las funciones de activación ayudan a filtrar el ruido y a mejorar el juicio de la señal
  2. La nueva entrada y la lógica cerrada permiten la negociación automatizada
  3. Más personalización de parámetros se adapta a más mercados
  4. Una excelente visualización presenta de forma intuitiva las señales comerciales

Análisis de riesgos

  1. La imposición incorrecta de umbrales puede hacer que se pierdan oportunidades comerciales
  2. Las funciones de activación inadecuadas pueden filtrar demasiado la información del mercado
  3. Las distorsiones de la señal inducidas por la pintura requieren pruebas

Soluciones:

  1. Ajustar los parámetros de umbral para encontrar óptimo
  2. Prueba diferentes funciones de activación para encontrar la mejor coincidencia
  3. Añadir la lógica de detección de repintado para confirmar señales válidas

Direcciones de optimización

  1. Añadir ajuste de umbral adaptativo
  2. Optimización de los parámetros de la función de activación
  3. Incorporar el stop loss automático
  4. Filtrar señales con más factores

Conclusión

Basado en el trabajo de drkhodakarami, esta estrategia introduce funciones de activación para mejorar el rendimiento. La personalización de parámetros ampliada se adapta mejor a los cambios del mercado. Mientras tanto, la excelente visualización presenta intuitivamente oportunidades comerciales. Los próximos pasos son optimizar aún más las funciones de activación y la configuración de umbral, incorporar lógica de stop loss y más filtración de señales para lograr una eficacia de estrategia aún mejor.


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


Más.