Estrategia RSI mejorada por la probabilidad

El autor:¿ Qué pasa?, Fecha: 2023-12-20 15:05:05
Las etiquetas:

img

Resumen general

Esta es una estrategia sencilla de largo plazo que utiliza el indicador RSI para determinar los niveles de sobrecompra y sobreventa. La mejoramos agregando stop loss y take profit, e integrando un módulo de probabilidad a la negociación de refuerzo solo cuando la probabilidad de negociación rentable reciente es mayor o igual al 51%. Esto mejoró enormemente el rendimiento de la estrategia al evitar posibles operaciones perdedoras.

Principios

La estrategia utiliza el indicador RSI para juzgar las condiciones de sobrecompra y sobreventa del mercado. Específicamente, se va largo cuando el RSI cruza por debajo del límite inferior de la zona de sobreventa; y cierra la posición cuando el RSI cruza por encima del límite superior de la zona de sobrecompra. Además, establecemos los coeficientes de stop loss y take profit.

La clave es que hemos integrado un módulo de juicio de probabilidad. Este módulo calcula el porcentaje rentable de las operaciones largas en períodos recientes (definido por el parámetro de retroceso). Solo permite la entrada si la probabilidad de operaciones rentables recientes es mayor o igual a 51%. Esto evita muchas operaciones potenciales perdedoras.

Ventajas

Como estrategia de RSI mejorada de probabilidad, tiene las siguientes ventajas en comparación con las estrategias simples de RSI:

  1. Las pérdidas de transacción no incluidas en el modelo de referencia se consideran como pérdidas de transacción.
  2. El módulo de probabilidad integrado evita los mercados de baja probabilidad
  3. El módulo de probabilidad es ajustable para diferentes entornos de mercado
  4. El mecanismo de duración limitada es fácil de entender e implementar

Análisis de riesgos

La estrategia sigue teniendo algunos riesgos:

  1. Solo a largo plazo, sin poder sacar provecho de la caída del mercado
  2. Un juicio incorrecto del módulo de probabilidad podría perder oportunidades
  3. Dificultad para encontrar la mejor combinación de parámetros, diferencia significativa de rendimiento entre entornos del mercado
  4. Configuración de stop loss flexible, aún es posible una gran pérdida de una sola operación

Soluciones:

  1. Considere la posibilidad de añadir un mecanismo corto
  2. Optimizar el módulo de probabilidad para reducir la tasa de errores de juicio
  3. Utilice el aprendizaje automático para optimizar dinámicamente los parámetros
  4. Establecer un nivel de stop loss más conservador para limitar las pérdidas

Direcciones de mejora

La estrategia podría optimizarse aún más en los siguientes aspectos:

  1. Aumentar el módulo corto para el comercio bidireccional
  2. Utilice el aprendizaje automático para la optimización de parámetros dinámicos
  3. Pruebe otros indicadores de sobrecompra/sobreventa
  4. Optimizar el stop loss/take profit para mejorar el ratio de ganancias
  5. Añadir otros factores para filtrar las señales y mejorar la probabilidad

Resumen de las actividades

Esta es una estrategia de RSI simple mejorada por un módulo de probabilidad integrado. En comparación con las estrategias de RSI de vainilla, filtra algunas operaciones perdedoras y mejora la relación de retirada y ganancia general. El siguiente paso podría ser mejorarla agregando optimización corta y dinámica, etc. para hacerla más robusta.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © thequantscience

//@version=5
strategy("Reinforced RSI",
     overlay = true,
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100,
     pyramiding = 1,
     currency = currency.EUR, 
     initial_capital = 1000,
     commission_type = strategy.commission.percent, 
     commission_value = 0.07)

lenght_rsi = input.int(defval = 14, minval = 1, title = "RSI lenght: ")
rsi = ta.rsi(close, length = lenght_rsi)

rsi_value_check_entry = input.int(defval = 35, minval = 1, title = "Oversold: ")
rsi_value_check_exit = input.int(defval = 75, minval = 1, title = "Overbought: ")

trigger = ta.crossunder(rsi, rsi_value_check_entry)
exit = ta.crossover(rsi, rsi_value_check_exit)

entry_condition   = trigger 
TPcondition_exit  = exit

look = input.int(defval = 30, minval = 0, maxval = 500, title = "Lookback period: ")

Probabilities(lookback) =>

    isActiveLong = false
    isActiveLong := nz(isActiveLong[1], false)
    isSellLong = false
    isSellLong := nz(isSellLong[1], false)

    int positive_results = 0
    int negative_results = 0

    float positive_percentage_probabilities = 0 
    float negative_percentage_probabilities = 0 

    LONG = not isActiveLong and entry_condition == true 
    CLOSE_LONG_TP = not isSellLong and TPcondition_exit == true

    p = ta.valuewhen(LONG, close, 0)
    p2 = ta.valuewhen(CLOSE_LONG_TP, close, 0)

    for i = 1 to lookback

	    if (LONG[i])
            isActiveLong := true
		    isSellLong := false

        if (CLOSE_LONG_TP[i])
	        isActiveLong := false
	        isSellLong := true

        if p[i] > p2[i]
            positive_results += 1
        else 
            negative_results -= 1 

	    positive_relative_probabilities = positive_results / lookback
	    negative_relative_probabilities = negative_results / lookback
	    positive_percentage_probabilities := positive_relative_probabilities * 100
	    negative_percentage_probabilities := negative_relative_probabilities * 100

    positive_percentage_probabilities
	
probabilities = Probabilities(look) 

lots = strategy.equity/close

var float e = 0 
var float c = 0 

tp = input.float(defval = 1.00, minval = 0, title = "Take profit: ")
sl = input.float(defval = 1.00, minval = 0, title = "Stop loss: ")

if trigger==true and strategy.opentrades==0 and probabilities >= 51
    e := close
    strategy.entry(id = "e", direction = strategy.long, qty = lots, limit = e) 
takeprofit = e + ((e * tp)/100)
stoploss = e - ((e * sl)/100)
if exit==true
    c := close 
    strategy.exit(id = "c", from_entry = "e", limit = c)
if takeprofit and stoploss 
    strategy.exit(id = "c", from_entry = "e", stop = stoploss, limit = takeprofit)

Más.