Estrategia de señales de negociación cuadrática

El autor:¿ Qué pasa?, Fecha: 23 de septiembre de 2023 15:40:57
Las etiquetas:

Resumen general

Esta estrategia ajusta una curva cuadrática a los puntos altos/bajos de las barras para generar señales de negociación cuando el precio rompe las líneas ajustadas.

Estrategia lógica

Los componentes y reglas clave son:

  1. Ajuste de curvas en puntos altos/bajos utilizando regresión cuadrática.

  2. Compra señal cuando se rompe cerca por encima de la banda superior.

  3. Venda la señal cuando el cierre se rompa por debajo de la banda inferior.

  4. N períodos de verificación para evitar las roturas falsas.

  5. No hay reglas de salida fijas, optimizar las salidas a través de backtesting.

La estrategia trata de identificar los precios clave matemáticamente y comerciar los breakouts, un sistema de breakout típico.

Ventajas

En comparación con otros sistemas de escape, las principales ventajas son:

  1. El ajuste matemático es más objetivo que el juicio subjetivo.

  2. Un nuevo enfoque que combina el análisis técnico y los modelos estadísticos.

  3. La verificación de varios períodos evita las roturas falsas.

  4. Las pruebas de retroceso pueden optimizar las salidas y el período de espera.

  5. Fácil de implementar con ajustes flexibles.

  6. Actualización automática del modelo sin intervención manual.

  7. Puede probar la robustez de los parámetros a través de productos y plazos.

  8. Potencial para optimizar aún más con el aprendizaje automático.

  9. En general, un enfoque novedoso con valor exploratorio.

Los riesgos

Sin embargo, los riesgos son:

  1. El rendimiento del ajuste depende del ajuste de parámetros, riesgo de sobreajuste.

  2. Las líneas de montaje se retrasan, no pueden evitar completamente las pérdidas.

  3. No hay confirmación de volumen, el riesgo de quedar atrapado.

  4. El arbitraje estadístico es un reto para el alfa persistente.

  5. Período de prueba de retroceso limitado, necesidad de verificar la robustez.

  6. La adaptabilidad a múltiples mercados requiere validación.

  7. El tamaño fijo carece de ajuste dinámico.

  8. Necesita una evaluación estricta de las relaciones de recompensa/riesgo.

Mejoras

Basándose en el análisis, las mejoras pueden incluir:

  1. Prueba de la robustez de los parámetros en todos los regímenes de mercado.

  2. Añadir indicadores de confirmación de volumen.

  3. Optimizar la lógica de entrada/salida para señales de mayor calidad.

  4. Construir modelos dinámicos de dimensionamiento de la posición.

  5. Incorporar paradas para limitar las pérdidas.

  6. Optimizar las estrategias de gestión de riesgos.

  7. Validación de las pruebas de retroceso de la ventana rodante.

  8. Evaluar la estabilidad de los mercados múltiples.

  9. Aprovechar el aprendizaje automático para la optimización del modelo.

Conclusión

En resumen, esta estrategia tiene cierto valor innovador y mérito de experimentación. Pero la viabilidad a largo plazo del arbitraje estadístico sigue sin probarse.


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1) 


Más.