Stratégie de négociation quantitative basée sur les bandes de Bollinger et le RSI

Auteur:ChaoZhang est là., Date: 2023-12-20 à 15h39
Les étiquettes:

img

Résumé

Cette stratégie conçoit une stratégie de trading quantitative basée sur les bandes de Bollinger et l'indice de force relative (RSI). Elle combine le suivi des tendances et le jugement sur les surachats/survente pour entrer sur le marché au début d'une tendance et sortir à des niveaux de surachat/survente pour réaliser un profit.

Principe de stratégie

La stratégie utilise les bandes de Bollinger pour déterminer les tendances des prix et les niveaux de support/résistance. Les prix qui s'approchent de la bande de Bollinger inférieure sont considérés comme un signal de survente, tandis que les prix qui s'approchent de la bande de Bollinger supérieure sont considérés comme un signal de surachat.

Les règles de trading spécifiques sont les suivantes: aller long lorsque le prix est inférieur à la bande de Bollinger inférieure et que le RSI est inférieur à 30; aller court lorsque le prix est supérieur à la bande de Bollinger supérieure et que le RSI est supérieur à 70.

Les avantages

La stratégie combine la capacité de suivi de tendance des bandes de Bollinger et le jugement sur les surachats/survente du RSI pour capturer un bon moment de début de tendance.

Comparée à l'utilisation d'un seul indicateur comme les bandes de Bollinger ou le RSI seul, cette stratégie utilise plusieurs indicateurs et paramètres pour améliorer la précision des décisions.

Les risques

La stratégie repose fortement sur l'optimisation des paramètres. Des paramètres incorrects peuvent entraîner des tendances manquantes ou générer de faux signaux.

La stratégie dépend également de l'instrument de négociation. Pour les actifs très volatils, les paramètres de la bande de Bollinger doivent être ajustés en conséquence. Pour les instruments dont les tendances ne sont pas claires, la performance peut également en souffrir.

Les tests d'optimisation des paramètres sont recommandés pour évaluer les niveaux de prise de profit/arrêt de perte et les performances de différents actifs et régimes de marché.

Directions d'optimisation

Plusieurs aspects peuvent être améliorés:

  1. Évaluer et optimiser les paramètres des bandes de Bollinger et de l'indicateur RSI afin de mieux correspondre aux caractéristiques des instruments de négociation

  2. Incorporer des indicateurs supplémentaires tels que KDJ, MACD pour construire un modèle multifactoriel

  3. Évaluer les stratégies de prise de profit/arrêt de perte, telles que le stop loss de suivi ou la sortie à l'échelle

  4. Effectuer un réglage dynamique des paramètres en fonction des actifs spécifiques et des conditions du marché

  5. Ajouter des modèles d'apprentissage automatique pour juger de la qualité du signal et des niveaux de risque

Résumé

Cette stratégie intègre les bandes de Bollinger et le RSI pour un système global de suivi des tendances. Il y a encore de la place pour améliorer l'efficacité et la stabilité grâce au réglage des paramètres et à la gestion des risques. Des ajustements et des optimisations personnalisés sont recommandés en fonction des besoins individuels et des préférences en matière de risque pour une meilleure performance.


/*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)

Plus de