Estrategia de canal de regresión dinámica


Fecha de creación: 2024-02-23 12:14:49 Última modificación: 2024-02-23 12:14:49
Copiar: 0 Número de Visitas: 667
1
Seguir
1617
Seguidores

Estrategia de canal de regresión dinámica

Descripción general

La estrategia de canal de regresión dinámica es una estrategia de negociación cuantitativa que utiliza la regresión lineal para analizar la tendencia de los precios, y combina los paros dinámicos para lograr el seguimiento de la tendencia. La estrategia utiliza la regresión lineal para trazar el canal de los precios, determinar las señales de los precios que rompen el canal, emitir órdenes de compra y venta.

Principio de estrategia

La estrategia primero calcula la curva de regresión lineal del precio para determinar si el precio ha roto el canal de regresión ascendente o descendente. Cuando el precio supera el canal de regresión ascendente, genera una señal de compra; cuando el precio cae el canal de regresión descendente, genera una señal de venta.

Después de entrar en el mercado, la estrategia rastreará en tiempo real si el precio supera la línea media de stop loss. Si se hace un pedido en exceso y el precio cae por debajo de la línea media de stop loss, se emitirá una orden de venta de stop loss; Si se hace un pedido en blanco y el precio supera la línea media de stop loss, se emitirá una orden de compra de stop loss.

Tenga en cuenta que si el precio vuelve a romper el canal para ejecutar la operación de reversión, la estrategia se cancela inmediatamente la posición original en el almacén y se cambia a la operación de reversión.

Análisis de las ventajas

La estrategia combina tendencias y inversiones de la lógica de negociación, lo que permite seguir el movimiento general de los precios y aprovechar las oportunidades de ajuste a corto plazo. La estrategia de stop loss actualizada en tiempo real también puede controlar el riesgo de manera efectiva, y es una forma de negociación más equilibrada.

La estrategia de canal de regresión dinámica es más sensible a los cambios de precio que la simple estrategia de línea de promedio móvil, lo que reduce las operaciones erróneas. Además, la estrategia solo se ejecuta cuando el precio se desvía hacia arriba y hacia abajo de la brecha de canal, lo que ayuda a evitar operaciones radicales desordenadas.

Análisis de riesgos

La estrategia se enfrenta principalmente al riesgo de que la curva de retorno no se ajuste con precisión. Si el rango de los canales de retorno se establece incorrectamente y es demasiado amplio, aumenta la probabilidad de que las transacciones no sean válidas. Si los canales son demasiado estrechos, se pierden las oportunidades de negociación.

Además, la configuración de la posición de parada también es clave. Una parada demasiado cercana puede ser fácilmente activada por fluctuaciones de precios a corto plazo; y una parada demasiado relajada no puede tener el efecto de controlar el riesgo.

Dirección de optimización

Se puede considerar la optimización automática de los parámetros en función de diferentes ciclos o variedades para que la vía de retorno y la línea de parada se ajusten mejor a la tendencia de los precios. Por ejemplo, se puede combinar con algoritmos de aprendizaje automático para entrenar los parámetros óptimos.

Por otro lado, se pueden probar diferentes tipos de regresión, como la regresión múltiple, la regresión localmente ponderada, etc., para una mejor adecuación. O se pueden combinar varios indicadores de regresión para construir reglas de negociación y mejorar la estabilidad de la estrategia.

Resumir

La estrategia de canal de regresión dinámica utiliza una combinación de métodos de análisis de tendencias y reversión para negociar, aprovechando las oportunidades de ajuste a corto plazo, al tiempo que se ajusta al movimiento general de los precios. La configuración de los canales de regresión clave y las posiciones de parada de pérdidas tienen un impacto importante en la eficacia de la estrategia.

Código Fuente de la Estrategia
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)

// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)

// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)

// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0


var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0

// Regressão linear para uso como sinal de entrada 
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)

//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])

// Condição de entrada (reversão da regressão)
if long_entry_signal
    long_signal := true
    short_signal := false
    long_entry_level := high
    long_stop_level := low

if short_entry_signal
    short_signal := true
    long_signal := false
    short_entry_level := low
    short_stop_level := high


// Indica quando o preço cruzou o nível de stop 
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)

// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
    if low > long_entry_level
        long_stop_level := high

// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
    if high < short_stop_level
        short_stop_level := low

// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
    if long_entry_signal //and short_order_open
        strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
        short_order_open:= false
    if short_entry_signal //and long_order_open
        strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
        long_order_open:=false

// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    long_order_id+=1
    // strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level) 
    strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
    long_order_open := true
    // log.info("Open Long:"+str.tostring(long_order_id))

if short_signal and close < short_entry_level and not short_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    short_order_id+=1
    // strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    short_order_open := true
    // log.info("Open Short:"+str.tostring(short_order_id))

// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
    strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
    long_order_open := false

if short_signal and close > short_stop_level and short_order_open
    strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
    short_order_open := false

// Plotagem da regressão e do stop

plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))

plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")

plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)

plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")