Pruebas de retroceso y optimización de la estrategia RSI

El autor:¿ Qué pasa?, fecha: 2023-11-10 11:59:40
Las etiquetas:

img

Resumen general

Esta estrategia se basa en el indicador RSI (Índice de Fuerza Relativa) para determinar las condiciones de sobrecompra y sobreventa. Toma posiciones de tendencia contraria cuando el RSI alcanza niveles de sobrecompra o sobreventa para comprar bajo y vender alto. La estrategia es simple y efectiva, beneficiándose de escenarios de sobrecompra y sobreventa a corto plazo en el mercado.

Estrategia lógica

La estrategia utiliza el indicador RSI únicamente como señal de entrada. Se hace largo cuando el RSI cruza por debajo del punto bajo (default 20), y se hace corto cuando el RSI cruza por encima del punto alto (default 80). Se negocia una cantidad fija cada vez (default $100) y tiene como objetivo obtener un beneficio del 1% independientemente de las condiciones del mercado. Si la pérdida alcanza el 3%, se detiene. Para controlar la frecuencia del comercio, la estrategia deja de operar durante 24 barras después de una operación perdedora.

La lógica central es:

  1. Utilice el RSI para determinar la sobrecompra/sobreventa
  2. Ir largo cuando el RSI cruza por debajo de 20
  3. Ir corto cuando el RSI cruza por encima de 80
  4. El intercambio fija $ 100 cada vez
  5. Tome ganancias o detenga pérdidas para cerrar
  6. En caso de pérdida, pausar la negociación durante 24 barras

Como podemos ver, la estrategia es muy simple y mecánica. Apenas hay espacio para la optimización de parámetros. Simplemente explota las propiedades matemáticas del RSI para tomar posiciones contra tendencia alrededor de regiones sobrecompradas / sobrevendidas.

Análisis de ventajas

La mayor ventaja de esta estrategia es la simplicidad y la eficiencia.

  1. Utiliza un solo indicador RSI, sin análisis técnico complejo necesario.
  2. Sistema totalmente mecánico, libre de interferencias emocionales.
  3. Ganancias por desviación a corto plazo sin predecir la dirección del mercado.
  4. El riesgo se gestiona con el stop loss/take profit.

También implementa relaciones stop loss / take profit para bloquear las ganancias y controlar los riesgos, así como la suspensión de operaciones para reducir la frecuencia.

Análisis de riesgos

Los principales riesgos de esta estrategia provienen de:

  1. Incapaz de obtener ganancias en un mercado con tendencias fuertes.

  2. La pérdida de parada demasiado amplia puede conducir a una pérdida excesiva.

  3. La alta frecuencia de las operaciones puede conducir a un exceso de operaciones después de las ganancias.

  4. Concentración de riesgos de tamaño fijo de $100.

Direcciones de optimización

Sobre la base del análisis, la estrategia puede mejorarse de las siguientes maneras:

  1. Añadir un filtro de tendencia como MA para pausar la negociación cuando la tendencia no está clara.

  2. Optimice las relaciones stop loss/take profit, reduzca la stop loss al 1-2% y utilice el take profit dinámico.

  3. Limitar la frecuencia de operaciones, por ejemplo, hasta 2 operaciones por período.

  4. El tamaño de las operaciones se basa en el porcentaje de capital en lugar de los 100 dólares fijos.

  5. Optimice los parámetros del RSI como el período, los niveles de sobrecompra/venta.

  6. Añadir dimensionamiento de la posición para no aumentar el tamaño cuando aumenta el capital.

Con estas optimizaciones, se pueden reducir los riesgos y mejorar significativamente la estabilidad.

Conclusión

En resumen, esta es una estrategia simple y directa que utiliza el RSI para negociar condiciones de sobrecompra / sobreventa para la reversión media a corto plazo. Los pros son la simplicidad, la eficiencia, no se necesita predicción, lógica clara, fácil de probar. Los contras son la incapacidad de obtener ganancias en tendencias fuertes y pérdidas potenciales.


/*backtest
start: 2023-11-02 00:00:00
end: 2023-11-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash)
open_pos = input.int(50000, title = "每次开单资金(usdt)")
rsi_period = input.int(14, title = "rsi周期")
rsi_line      = input.float(20.0,      title='RSI触发线',      step=0.05)
stop_rsi_top_line = input.float(70, title = "顶部rsi止损线")
stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线")
stop_loss_perc = input.float(0.03, title = "止损线")
stop_profit = input.float(0.01, title = "止盈")
loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易")


rsiParam = ta.rsi(close, rsi_period)

var int failedTimes = 0
var bool stopTrade = false

// plot(rsiParam)

if stopTrade
    failedTimes += 1
    if failedTimes == loss_stop_trade_k
        failedTimes := 0
        stopTrade := false



// 获取当前持仓方向
checkCurrentPosition() =>
    strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0

curPosition = checkCurrentPosition()

// 当前持仓成本价
position_avg_price = strategy.position_avg_price


// 当前持单, 触达反向的rsi线,清仓
if curPosition > 0 and rsiParam >= stop_rsi_top_line
    strategy.close_all(comment = "closebuy")

if curPosition < 0 and rsiParam <= stop_rsi_bottom_line
    strategy.close_all(comment = "closesell")


// 止盈止损清仓
if curPosition > 0
    // if (position_avg_price - close) / close >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closebuy")
    //     stopTrade := true
    if (close - position_avg_price) / position_avg_price >= stop_profit
        // 止盈
        strategy.close_all(comment = "closebuy")



if curPosition < 0
    // if (close - position_avg_price) / position_avg_price >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closesell")
    //     stopTrade := true

    if (position_avg_price - close) / close >= stop_profit
        // 止盈
        strategy.close_all(comment = "closesell")


a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)

if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0
    stopTrade := true

var float openPrice = 0.0



if rsiParam <= rsi_line and stopTrade == false
	strategy.entry("long", strategy.long, open_pos / close, comment = "long")
    if curPosition == 0
        openPrice := close
    strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy")

if rsiParam >= 100 - rsi_line and stopTrade == false
    strategy.entry("short", strategy.short, open_pos / close, comment = "short")
    if curPosition == 0
        openPrice := close
    strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell")




plot(failedTimes)

Más.