Estrategia de arbitraje transversal basada en múltiples indicadores

El autor:¿ Qué pasa?, Fecha: 2024-01-29 11:10:33
Las etiquetas:

img

Resumen general

Esta estrategia utiliza una combinación de tres indicadores técnicos diferentes para construir una estrategia de arbitraje transversal que captura las tendencias de precios en diferentes plazos de tiempo para lograr rendimientos excesivos de bajo riesgo.

Estrategia lógica

Los tres indicadores técnicos utilizados en esta estrategia son Keltner Channel (KC), Volatility Stop (Vstop) y Williams Alligator (WAE). El canal de Keltner se utiliza para determinar si los precios están fuera del rango del canal y, por lo tanto, generar señales comerciales.

  1. Cuando el precio es más alto que el carril superior del canal de Keltner, se considera una señal alcista.

  2. La posición de stop loss se establece en función de la volatilidad de los precios y el ancho del canal, y se puede ajustar dinámicamente para garantizar una posición de stop loss, evitando al mismo tiempo posiciones de stop loss excesivamente conservadoras.

  3. El indicador Williams Alligator juzga si los precios están en una fuerte tendencia alcista o bajista calculando el ancho del canal MACD y la banda de Bollinger.

Al combinar estos tres indicadores, las señales a través de diferentes marcos de tiempo se validan entre sí. Esto reduce la probabilidad de error de juicio y construye una lógica de estrategia optimizada.

Análisis de ventajas

La mayor ventaja de esta estrategia es la precisión de las señales de negociación proporcionadas por la combinación de múltiples indicadores. Los tres indicadores funcionan en diferentes marcos de tiempo y se validan entre sí, lo que puede reducir efectivamente la probabilidad de error de juicio y mejorar la precisión de las señales. Además, la configuración de Volatility Stop es dinámica y puede ajustar la posición de stop loss de acuerdo con la volatilidad en tiempo real para controlar aún más los riesgos.

En comparación con las estrategias de un solo indicador, esta estrategia combinada puede proporcionar señales comerciales más precisas y eficientes.

Análisis de riesgos

El principal riesgo de esta estrategia es que la configuración inadecuada de parámetros puede causar sobreajuste. Los tres indicadores tienen 8 parámetros en total. La configuración inadecuada puede afectar negativamente a la estrategia. Además, la relación de peso entre los indicadores también debe configurarse correctamente, de lo contrario las señales pueden neutralizarse entre sí y volverse inválidas.

Para reducir estos riesgos, la adaptabilidad a diferentes entornos de mercado debe considerarse plenamente durante la configuración de parámetros, y la combinación óptima de parámetros debe ajustarse a través del análisis de backtesting. Además, ajuste adecuadamente los pesos entre los indicadores para garantizar que las señales comerciales puedan activarse de manera efectiva. Cuando ocurran pérdidas consecutivas, considere reducir el tamaño de la posición para controlar las pérdidas.

Direcciones de optimización

El espacio de optimización de esta estrategia se centra principalmente en dos aspectos: ajuste de parámetros y mejora de las estrategias de stop loss.

  1. Elegir parámetros de indicadores de manera más científica y optimizar las combinaciones de parámetros. Los algoritmos se pueden utilizar para encontrar los parámetros óptimos con objetivos como la maximización del rendimiento y la minimización del riesgo.

  2. Mejorar la estrategia de stop loss para reducir aún más las pérdidas de stop innecesarias al tiempo que se garantiza la stop loss, mejorando así la tasa de ganancia.

  3. Optimizar los pesos entre los indicadores y la lógica de los juicios de señales comerciales para reducir la tasa de errores de juicio.

  4. Trate de introducir modelos de aprendizaje automático para lograr la optimización automática de parámetros o utilice programación de aprendizaje de refuerzo profundo para la evaluación y mejora de la estrategia.

Resumen de las actividades

Esta estrategia construye un sistema de arbitraje de ciclo cruzado a través de la combinación de Keltner Channel, Volatility Stop y Williams Alligator. La combinación de múltiples indicadores mejora la precisión de la señal y controla los riesgos de stop loss dinámicos.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("QuarryLake", overlay=true)  ///Ultilized modified full kelly for this strategy = 36%

///Keltner channel///
nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1)
Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1)
xPrice = ema(hlc3, nPeriod)
xMove = ema(high - low, nPeriod)
xMoveMult = xMove * Mult
xUpper = xPrice + xMoveMult
xLower = xPrice - xMoveMult

// plot(xPrice, color=red, title="KSmid")
p1 = plot(xUpper, color=color.white, title="KSup")
p2 = plot(xLower, color=color.white, title="KSdn")
fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white)

kclongcondition = close > xUpper
kcshortcondition = close < xLower
kccloselongcondition = crossunder(close, xUpper)
kccloseshortcondition = crossover(close, xLower)

///Volatility Stop///
length = input(title="Vstop length", type=input.integer, defval=3, minval=1)
mult1 = 1.5

atr_ = atr(length)
max1 = 0.0
min1 = 0.0
is_uptrend_prev = false
stop = 0.0
vstop_prev = 0.0
vstop1 = 0.0
is_uptrend = false
is_trend_changed = false
max_ = 0.0
min_ = 0.0
vstop = 0.0
max1 := max(nz(max_[1]), close)
min1 := min(nz(min_[1]), close)
is_uptrend_prev := nz(is_uptrend[1], true)
stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_
vstop_prev := nz(vstop[1])
vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend := close - vstop1 >= 0
is_trend_changed := is_uptrend != is_uptrend_prev
max_ := is_trend_changed ? close : max1
min_ := is_trend_changed ? close : min1
vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : 
   vstop1

plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1)

vstoplongcondition = close > vstop
vstoplongclosecondition = crossunder(close, vstop)
vstopshortcondition = close < vstop
vstopshortclosecondition = crossover(close, vstop)

///Waddah Attar Explosion///
sensitivity = input(150, title="Sensitivity")
fastLength = input(20, title="FastEMA Length")
slowLength = input(40, title="SlowEMA Length")
channelLength = input(20, title="BB Channel Length")
mult = input(2.0, title="BB Stdev Multiplier")
DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7
calc_macd(source, fastLength, slowLength) =>
    fastMA = ema(source, fastLength)
    slowMA = ema(source, slowLength)
    fastMA - slowMA
calc_BBUpper(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis + dev
calc_BBLower(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis - dev
t1 = (calc_macd(close, fastLength, slowLength) - 
   calc_macd(close[1], fastLength, slowLength)) * sensitivity
t2 = (calc_macd(close[2], fastLength, slowLength) - 
   calc_macd(close[3], fastLength, slowLength)) * sensitivity
e1 = calc_BBUpper(close, channelLength, mult) - 
   calc_BBLower(close, channelLength, mult)
trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1
waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1

///Long Entry///
longcondition = kclongcondition and vstoplongcondition and waelongcondition
if longcondition
    strategy.entry("Long", strategy.long)

///Long exit///
closeconditionlong = kccloselongcondition or vstoplongclosecondition
if closeconditionlong
    strategy.close("Long")

///Short Entry///
shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition
if shortcondition
    strategy.entry("Short", strategy.short)

///Short exit///
closeconditionshort = kccloseshortcondition or vstopshortclosecondition
if closeconditionshort
    strategy.close("Short")

///Free Hong Kong, the revolution of our time///


Más.