Backtesting e otimização da estratégia RSI

Autora:ChaoZhang, Data: 2023-11-10 11:59:40
Tags:

img

Resumo

Esta estratégia é baseada no indicador RSI (Relative Strength Index) para determinar condições de sobrecompra e sobrevenda. Ele assume posições de contra-tendência quando o RSI atinge níveis de sobrecompra ou sobrevenda para comprar baixo e vender alto. A estratégia é simples e eficaz, lucrando com cenários de sobrecompra e sobrevenda no mercado.

Estratégia lógica

A estratégia usa o indicador RSI somente como sinal de entrada. Ela fica longa quando o RSI cruza abaixo do ponto baixo (default 20), e fica curta quando o RSI cruza acima do ponto alto (default 80). Ela negocia quantidade fixa a cada vez (default $100) e visa um lucro de 1% independentemente da condição do mercado. Se a perda atingir 3%, ela para. Para controlar a frequência do comércio, a estratégia para de negociar por 24 barras após uma negociação perdedora.

A lógica central é:

  1. Utilize o RSI para determinar a sobrecompra/supervenda
  2. Faça long quando o RSI cruzar abaixo de 20
  3. Faça curto quando o RSI cruzar acima de 80
  4. Negociação fixa de $100 cada vez
  5. Obtenção de lucro ou stop loss para fechar
  6. Em caso de perda, pausar a negociação por 24 barras

Como podemos ver, a estratégia é muito simples e mecânica. Há quase nenhum espaço para otimização de parâmetros. Ele explora puramente as propriedades matemáticas do RSI para tomar posições de contra-tendência em torno de regiões de sobrecompra / sobrevenda.

Análise das vantagens

A maior vantagem desta estratégia é a sua simplicidade e eficiência.

  1. Utiliza um único indicador RSI, sem análise técnica complexa necessária.
  2. Sistema totalmente mecânico, livre de interferências emocionais.
  3. Lucros decorrentes de desvios de curto prazo sem prever a direcção do mercado.
  4. Risco gerido com stop loss/take profit.

Ele também implementa índices de stop loss / take profit para bloquear lucros e controlar riscos, bem como suspensão de negociação para reduzir a frequência.

Análise de riscos

Os principais riscos desta estratégia são:

  1. Incapaz de lucrar em um mercado de forte tendência. O RSI pode permanecer na zona de sobrecompra/supervenda por um período prolongado quando a tendência persiste.

  2. A perda de parada demasiado larga pode conduzir a uma perda excessiva.

  3. A alta frequência de negociação pode levar ao excesso de negociação após as vitórias.

  4. Concentração de riscos de $100, deve ser otimizada para % do capital.

Orientações de otimização

Com base na análise, a estratégia pode ser melhorada das seguintes formas:

  1. Adicione um filtro de tendência como MA para pausar a negociação quando a tendência não estiver clara.

  2. Otimizar as taxas de stop loss/take profit, reduzir a stop loss para 1-2% e utilizar a take profit dinâmica.

  3. Limitar a frequência das transações, tais como, no máximo, 2 transações por período de tempo.

  4. Taxa de transacções baseada em % do capital em vez de 100 dólares fixos.

  5. Otimizar os parâmetros do RSI como período, níveis de sobrecompra/venda.

  6. Adicionar o dimensionamento das posições para não aumentar o tamanho quando o capital aumenta.

Com estas optimizações, os riscos podem ser reduzidos e a estabilidade melhorada significativamente.

Conclusão

Em resumo, esta é uma estratégia simples e direta que usa o RSI para negociar condições de sobrecompra / sobrevenda para a reversão média de curto prazo. Os prós são simplicidade, eficiência, nenhuma previsão necessária, lógica clara, fácil de testar. As desvantagens são a incapacidade de lucrar em tendências fortes e perdas potenciais. Com adições como filtro de tendência, parâmetros otimizados, dimensionamento de posição, etc., ele pode ser melhorado para estabilidade e lucratividade. A lógica é inovadora e valiosa para a negociação prática se aplicada corretamente.


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

Mais.