Estrategia cuantitativa de inversión de pivote basada en puntos de pivote

El autor:¿ Qué pasa?, Fecha: 2024-02-20 14:22:13
Las etiquetas:

img

Resumen general

La idea central de esta estrategia es utilizar puntos de giro para el comercio cuantitativo. Busca altos y bajos importantes y realiza operaciones de reversión cuando los precios rompen estos niveles clave.

Estrategia lógica

La estrategia primero define las funciones pivotHighSig() y pivotLowSig() para localizar los puntos altos y bajos.

Específicamente, para los máximos de swing, busca múltiples máximos más altos a la izquierda y múltiples máximos más bajos a la derecha.

Después de localizar los máximos y mínimos del swing, la estrategia selecciona puntos de pivote de esos puntos de pivote, es decir, puntos importantes de los pivots.

Finalmente, las operaciones de reversión se realizan cuando los precios rompen los puntos de pivote de los pivots.

Ventajas

Esta estrategia cuantitativa basada en puntos de pivote tiene las siguientes ventajas:

  1. Se aprovecha de los niveles de soporte y resistencia en el mercado donde a menudo ocurren cambios
  2. Identifica puntos altos y bajos importantes para el comercio bilateral
  3. Los puntos de giro son puntos extremos sobresalientes y romperlos da señales fuertes
  4. El uso de puntos de pivote de los pivots hace que la señal sea aún más confiable

Riesgos y soluciones

También hay algunos riesgos con esta estrategia:

  1. La solución es ajustar los parámetros de rango izquierda/derecha para identificar los puntos de pivote con mayor precisión.
  2. La solución es filtrar señales que combinan otros factores como volumen, impulso, etc.

Áreas de mejora

Esta estrategia puede mejorarse en los siguientes ámbitos:

  1. Añadir mecanismos de stop loss para hacer la estrategia más estable
  2. Incorporar más indicadores técnicos para el filtrado de señales
  3. Desarrollar modelos de reversión de PRED utilizando el aprendizaje automático para mejorar aún más la predicción de puntos de pivote
  4. Construir en los parámetros adaptativos

Conclusión

En general, esta estrategia tiene un buen rendimiento. La idea central es detectar puntos de pivote importantes y negociar sus breakouts.


/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Pivot of Pivot Reversal Strategy [QuantNomad]", shorttitle = "PoP Reversal Strategy [QN]", overlay=true)

// Inputs 
leftBars   = input(4,   title = 'PP Left Bars')
rightBars  = input(2,   title = 'PP Right Bars')
atr_length = input(14,  title = 'ATR Length')
atr_mult   = input(0.1, title = 'ATR Mult')

// Pivot High Significant Function
pivotHighSig(left, right) =>
    pp_ok = true
    atr   = atr(atr_length)
    
    for i = 1 to left
        if (high[right] < high[right+i] + atr * atr_mult)
            pp_ok := false
    for i = 0 to right-1
        if (high[right] < high[i] + atr * atr_mult)
            pp_ok := false
    
    pp_ok ? high[right] : na

// Pivot Low Significant Function
pivotLowSig(left, right) =>
    pp_ok = true
    atr   = atr(atr_length)
    
    for i = 1 to left
        if (low[right] > low[right+i] - atr * atr_mult)
            pp_ok := false
    for i = 0 to right-1
        if (low[right] > low[i] - atr * atr_mult)
            pp_ok := false
    
    pp_ok ? low[right] : na


swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig (leftBars, rightBars)

swh_cond = not na(swh)

hprice = 0.0
hprice := swh_cond ? swh : hprice[1]

le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])

swl_cond = not na(swl)

lprice = 0.0
lprice := swl_cond ? swl : lprice[1]

se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])

// Pivots of pivots
ph1 = 0.0
ph2 = 0.0
ph3 = 0.0

pl1 = 0.0
pl2 = 0.0
pl3 = 0.0

pphprice = 0.0
pplprice = 0.0

ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1])
ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1])
ph1 := swh_cond ? hprice     : nz(ph1[1])

pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1])
pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1])
pl1 := swl_cond ? lprice     : nz(pl1[1])

pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1])
pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1])


if (le)
    strategy.entry("PP_RevLE", strategy.long, comment="PP_RevLE", stop=pphprice + syminfo.mintick)

if (se)
    strategy.entry("PP_RevSE", strategy.short, comment="PP_RevSE", stop=pplprice - syminfo.mintick)
    
// Plotting 
plot(lprice, color = color.red,   transp = 55)
plot(hprice, color = color.green, transp = 55)

plot(pplprice, color = color.red,   transp = 0, linewidth = 2)
plot(pphprice, color = color.green, transp = 0, linewidth = 2)

Más.