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.
Los componentes y reglas clave son:
Ajuste de curvas en puntos altos/bajos utilizando regresión cuadrática.
Compra señal cuando se rompe cerca por encima de la banda superior.
Venda la señal cuando el cierre se rompa por debajo de la banda inferior.
N períodos de verificación para evitar las roturas falsas.
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.
En comparación con otros sistemas de escape, las principales ventajas son:
El ajuste matemático es más objetivo que el juicio subjetivo.
Un nuevo enfoque que combina el análisis técnico y los modelos estadísticos.
La verificación de varios períodos evita las roturas falsas.
Las pruebas de retroceso pueden optimizar las salidas y el período de espera.
Fácil de implementar con ajustes flexibles.
Actualización automática del modelo sin intervención manual.
Puede probar la robustez de los parámetros a través de productos y plazos.
Potencial para optimizar aún más con el aprendizaje automático.
En general, un enfoque novedoso con valor exploratorio.
Sin embargo, los riesgos son:
El rendimiento del ajuste depende del ajuste de parámetros, riesgo de sobreajuste.
Las líneas de montaje se retrasan, no pueden evitar completamente las pérdidas.
No hay confirmación de volumen, el riesgo de quedar atrapado.
El arbitraje estadístico es un reto para el alfa persistente.
Período de prueba de retroceso limitado, necesidad de verificar la robustez.
La adaptabilidad a múltiples mercados requiere validación.
El tamaño fijo carece de ajuste dinámico.
Necesita una evaluación estricta de las relaciones de recompensa/riesgo.
Basándose en el análisis, las mejoras pueden incluir:
Prueba de la robustez de los parámetros en todos los regímenes de mercado.
Añadir indicadores de confirmación de volumen.
Optimizar la lógica de entrada/salida para señales de mayor calidad.
Construir modelos dinámicos de dimensionamiento de la posición.
Incorporar paradas para limitar las pérdidas.
Optimizar las estrategias de gestión de riesgos.
Validación de las pruebas de retroceso de la ventana rodante.
Evaluar la estabilidad de los mercados múltiples.
Aprovechar el aprendizaje automático para la optimización del modelo.
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)