Estratégia de negociação quantitativa baseada em bandas de Bollinger e RSI

Autora:ChaoZhang, Data: 2023-12-20 15:39:19
Tags:

img

Resumo

Esta estratégia projeta uma estratégia quantitativa de negociação baseada em Bandas de Bollinger e no Índice de Força Relativa (RSI).

Princípio da estratégia

A estratégia usa Bandas de Bollinger para determinar tendências de preços e níveis de suporte / resistência. Os preços que se aproximam da faixa de Bollinger inferior são vistos como um sinal de sobrevenda, enquanto os preços que se aproximam da faixa de Bollinger superior são vistos como um sinal de sobrecompra. Ao mesmo tempo, incorpora o indicador RSI para determinar se existem condições de sobrevenda ou sobrecompra.

As regras específicas de negociação são: ir longo quando o preço está abaixo da faixa de Bollinger inferior e o RSI está abaixo de 30; ir curto quando o preço está acima da faixa de Bollinger superior e o RSI está acima de 70. Para obter lucro, defina a faixa de Bollinger média ou a faixa de Bollinger oposta como o nível de lucro. O stop loss é definido em uma certa porcentagem do preço de entrada.

Vantagens

A estratégia combina a capacidade de rastreamento de tendências de Bollinger Bands e o julgamento de sobrecompra/supervenda do RSI para capturar um bom momento de início da tendência.

Em comparação com o uso de um único indicador como Bollinger Bands ou RSI sozinho, esta estratégia utiliza múltiplos indicadores e parâmetros para melhorar a precisão da decisão.

Riscos

A estratégia depende fortemente da otimização de parâmetros. Configurações incorretas de parâmetros podem levar a tendências em falta ou gerar sinais falsos. Por exemplo, o desajuste do período de Bollinger pode causar tais problemas.

A estratégia também depende do instrumento de negociação. Para ativos altamente voláteis, os parâmetros da banda de Bollinger precisam ser ajustados em conformidade. Para os instrumentos com tendências pouco claras, o desempenho também pode sofrer. Também afetado por custos de transação, deslizamento e eventos extremos do mercado.

Recomenda-se testes de otimização de parâmetros para avaliar os níveis de tomada de lucro/paragem de perdas e o desempenho em diferentes ativos e regimes de mercado.

Orientações de otimização

Vários aspectos podem ser melhorados:

  1. Avaliação e otimização dos parâmetros das bandas de Bollinger e do RSI para melhor corresponder às características dos instrumentos de negociação

  2. Incorporar indicadores adicionais como KDJ, MACD para construir um modelo multifator

  3. Avaliação das estratégias de captação de lucro/stop loss, tais como stop loss ou saída escalada

  4. Realizar ajustes dinâmicos de parâmetros com base em ativos específicos e condições de mercado

  5. Adicionar modelos de aprendizagem de máquina para julgar a qualidade do sinal e os níveis de risco

Resumo

Esta estratégia integra Bandas de Bollinger e RSI para um sistema abrangente de tendência. Há ainda espaço para melhorar a eficácia e a estabilidade através do ajuste de parâmetros e gestão de riscos.


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

//@version=4
strategy("BB + RSI Estrategia", overlay=true)

longitud = input(20, title="Longitud BB", minval=5, maxval=50, step=1)
multiplicador = input(2.0, title="Multiplicador BB", type=input.float, step=0.1)
timeframe_bb = input("D", title="Marco de Tiempo BB", type=input.resolution)
rsi_length = input(14, title="Longitud RSI", minval=5, maxval=50, step=1)
rsi_overbought = input(70, title="Nivel de sobrecompra RSI", minval=50, maxval=80, step=1)
rsi_oversold = input(30, title="Nivel de sobreventa RSI", minval=20, maxval=50, step=1)
take_profit = input("Central", title="Take Profit (banda)", options=["Central", "Opuesta"])
stop_loss = input(2.00, title="Stop Loss", type=input.float, step=0.10)

var SL = 0.0

[banda_central, banda_superior, banda_inferior] = security(syminfo.tickerid, timeframe_bb, bb(close, longitud, multiplicador))
rsi_value = rsi(close, rsi_length)

comprado = strategy.position_size > 0
vendido = strategy.position_size < 0

if not comprado and not vendido
    if close < banda_inferior and rsi_value < rsi_oversold
        // Realizar la compra
        cantidad = round(strategy.equity / close)
        strategy.entry("Compra", strategy.long, qty=cantidad, when=cantidad > 0)
        SL := close * (1 - (stop_loss / 100))

    if close > banda_superior and rsi_value > rsi_overbought
        // Realizar la Venta
        cantidad = round(strategy.equity / close)
        strategy.entry("Venta", strategy.short, qty=cantidad, when=cantidad > 0)
        SL := close * (1 + (stop_loss / 100))

if comprado
    // Verificar el take profit
    if take_profit == "Central" and close >= banda_central
        strategy.close("Compra", comment="TP")
        SL := 0

    if take_profit == "Opuesta" and close >= banda_superior
        strategy.close("Compra", comment="TP")
        SL := 0
    // Verificar el stop loss
    if close <= SL
        strategy.close("Compra", comment="SL")
        SL := 0

if vendido
    // Verificar el take profit
    if take_profit == "Central" and close <= banda_central
        strategy.close("Venta", comment="TP")
        SL := 0

    if take_profit == "Opuesta" and close <= banda_inferior
        strategy.close("Venta", comment="TP")
        SL := 0
    // Verificar el Stop loss
    if close >= SL
        strategy.close("Venta", comment="SL")
        SL := 0

// Salida
plot(SL > 0 ? SL : na, style=plot.style_circles, color=color.red)
g1 = plot(banda_superior, color=color.aqua)
plot(banda_central, color=color.red)
g2 = plot(banda_inferior, color=color.aqua)
fill(g1, g2, color=color.aqua, transp=97)

// Dibujar niveles de sobrecompra/sobreventa del RSI
hline(rsi_overbought, "RSI Overbought", color=color.red)
hline(rsi_oversold, "RSI Oversold", color=color.green)

Mais.