Estratégia de negociação quantitativa baseada no indicador RSI e na média móvel

Autora:ChaoZhang, Data: 2023-12-25 11:40:36
Tags:

img

Resumo

A estratégia é chamada Quantitative Trading Strategy Based on RSI Indicator and Moving Average. Utiliza o indicador RSI e as médias móveis como sinais de negociação para implementar uma estratégia de negociação quantitativa que faz operações de reversão sob o fundo da tendência. Sua ideia central é abrir posições quando ocorrem sinais de reversão de preço e tirar lucro quando comprado demais ou vendido demais.

Princípio da estratégia

A estratégia usa principalmente o indicador RSI e médias móveis rápidas/lentas para determinar tendências de preços e tempo de reversão. Especificamente, primeiro calcula a média móvel rápida (SMA) e a média móvel lenta. Quando a SMA rápida cruza a SMA lenta, um sinal de compra é gerado. Quando a SMA rápida cruza abaixo da SMA lenta, um sinal de venda é gerado. Isso indica que a tendência do preço está mudando.

Ao mesmo tempo, essa estratégia calcula o indicador RSI para determinar se o preço está em um estado de sobrecompra ou sobrevenda. Antes de abrir posições, ele julgará se o indicador RSI é normal. Se o RSI exceder o limite definido, ele suspenderá as posições de abertura e esperará que o RSI recue antes de abrir posições. Isso pode evitar estabelecer posições em momentos desfavoráveis de sobrecompra e sobrevenda. Por outro lado, depois de tomar posições, se o RSI exceder o limite definido de lucro, ele fechará posições para obter lucros. Isso pode bloquear ganhos comerciais.

Ao colaborar com as médias móveis, as posições podem ser abertas quando ocorrem sinais de reversão de preços e, ao tirar lucro quando comprado demais ou vendido demais, uma estratégia de negociação quantitativa que faz operações de reversão para lucros sob o fundo da tendência de preços pode ser implementada.

Vantagens

A estratégia apresenta as seguintes vantagens:

  1. Usando a média móvel cruz de ouro como sinal de compra e cruz de morte como sinal de venda pode capturar com precisão as oportunidades de reversão da tendência de preços.

  2. Ao julgar as condições de sobrecompra e sobrevenda através do indicador RSI, ele pode efetivamente evitar o estabelecimento de posições quando o preço flutua excessivamente no curto prazo, evitando perdas flutuantes desnecessárias.

  3. Os riscos podem ser bem controlados. O RSI take profit pode manter as posições dentro de uma faixa de lucro razoável e controlar efetivamente os riscos comerciais.

  4. Fácil de otimizar os parâmetros. Os períodos SMA, parâmetros RSI etc. podem ser ajustados de forma flexível para se adaptarem aos diferentes ambientes de mercado.

  5. Eficiência elevada da utilização do capital: é possível realizar negociações frequentes durante as fases de consolidação da tendência e de choque, fazendo um uso eficiente do capital.

Análise de riscos

A estratégia apresenta igualmente os seguintes riscos:

  1. Risco de erro de acompanhamento: as médias móveis como indicadores de avaliação de tendências apresentam certos atrasos, o que pode conduzir a um calendário impreciso de abertura de posições.

  2. Risco de negociação frequente: em mercados oscilantes, pode conduzir a aberturas e encerramentos excessivamente frequentes de posições.

  3. Risco de ajuste de parâmetros. Os períodos SMA e os parâmetros RSI precisam de testes e ajustes repetidos para se adaptarem aos mercados.

  4. Risco de lucro: configurações incorretas de RSI de lucro também podem levar à saída prematura de posições ou ao aumento contínuo após a saída de lucro.

Orientações de otimização

As direcções de otimização são as seguintes:

  1. Tente usar o MACD, as Bandas de Bollinger e outros indicadores combinados com o RSI para tornar os sinais mais precisos e confiáveis.

  2. Aumentar os algoritmos de aprendizagem de máquina para ajustar automaticamente os parâmetros com base em dados históricos, reduzindo os riscos de ajuste de parâmetros.

  3. Aumentar os mecanismos de otimização das estratégias de lucro para tornar o lucro mais inteligente e adaptável às mudanças do mercado.

  4. Otimizar as estratégias de gestão de posições através do ajustamento dinâmico dos tamanhos das posições para reduzir os riscos das operações individuais.

  5. Combinar dados de alta frequência e utilizar dados em tempo real de nível de tick para negociação de alta frequência para melhorar a frequência da estratégia.

Conclusão

Em resumo, esta estratégia usa sinais de negociação gerados pelo indicador RSI e médias móveis para implementar uma estratégia quantitativa que faz operações de reversão durante corridas de tendência. Em comparação com o uso de médias móveis sozinhas, adicionando julgamentos de indicadores RSI, esta estratégia pode efetivamente prevenir posições de abertura desfavoráveis e controlar os riscos de negociação através do RSI. Até certo ponto, melhora a estabilidade da estratégia. Claro, ainda há espaço para melhorias para esta estratégia. No futuro, pode ser otimizada em aspectos como mais combinações de indicadores, otimização automática de parâmetros, gerenciamento de posição, etc. para tornar a estratégia de desempenho ainda melhor.


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

//1. 做多
//    a. RSI在超买区间时不开单,直到RSI回落一点再开单
//    b. 已经有多仓,如果RSI超买,则平多获利,当RSI回落一点之后,再次开多,直到有交叉信号反转做空

//2. 做空
//    a. RSI在超卖区间时不开单,直到RSI回落一点之后再开多单
//    b. 已经有空仓,如果RSI超卖,则平空获利,当RSI回落一点之后,再开空单,直到有交叉信号反转做多

//@version=4
strategy("策略_RSI+移动揉搓线_", overlay=true)

// 输入
fastLength = input(11, minval=1)
slowLength = input(82,minval=1)
length = input(title="长度", type=input.integer, defval=14, minval=1, maxval=100)
hight_rsi = input(title="rsi超过上轨平多获利", type=input.integer, defval=80, minval=1, maxval=100)
low_rsi = input(title="rsi超过下轨平空获利", type=input.integer, defval=20, minval=1, maxval=100)

open_long_rsi_threshold = input(title="rsi低于该阈值时才开多", type=input.integer, defval=75, minval=1, maxval=100)
open_short_rsi_threshold = input(title="rsi高于该阈值时才开空仓", type=input.integer, defval=25, minval=1, maxval=100)

// 均线
sma_fast = sma(close, fastLength)
sma_slow = sma(close, slowLength)
// RSI
rsi = rsi(close, length)

//**********变量*start*******//
var long_f = false // 标记是否是均线交叉多头
var short_f = false // 标记是否是均线交叉空头
var long_open_pending = false // 标记开仓时rsi是否处于超买状态
var short_open_pending = false // 标记开仓时rsi是否处于超卖
var long_rsi_over_buy = false // 标记 多仓时 是否发生超买平多获利
var short_rsi_over_sell = false // 标记 空仓时 是否发生超卖平空获利

//**********逻辑*start*******//

// 买入
longCondition = crossover(sma_fast, sma_slow)
if (longCondition)
    short_rsi_over_sell := false // 清空该标记,防止再次开空仓
    long_f := true
	short_f := false
	if (rsi < hight_rsi)
	    // 并且没有超买
	    strategy.entry("多", long=strategy.long)
    if (rsi > hight_rsi)
        // 开仓时发生超买,等待rsi小于hight_rsi
	    long_open_pending := true

// 卖出
shortCondition = crossunder(sma_fast, sma_slow)
if (shortCondition)
    long_rsi_over_buy := false //清空该标记,防止再次开多仓
    long_f := false
    short_f := true
    if (rsi > low_rsi)
        strategy.entry("空", long=strategy.short)
	if (rsi < low_rsi)
	    // 开仓时发生超卖,等待rsi大于low_rsi
	    short_open_pending := true
	    

// 等待RSI合理,买入开仓
if (long_f and long_open_pending and strategy.position_size == 0 and rsi < open_long_rsi_threshold)
    strategy.entry("多", long=strategy.long)
	long_open_pending := false
// 等待RSI合理,卖出开仓
if (short_f and short_open_pending and strategy.position_size == 0 and rsi > open_short_rsi_threshold)
    strategy.entry("空", long=strategy.short)
	short_open_pending := false


	
//RSI止盈(RSI超买平多)
if (strategy.position_size > 0 and long_f and rsi > hight_rsi)
	strategy.close_all()
	long_rsi_over_buy := true
//RSI止盈(RSI超卖平空)
if (strategy.position_size < 0 and short_f and rsi < low_rsi)
	strategy.close_all()
	short_rsi_over_sell := true
	
	
//RSI止盈之后,再次开多
if (long_f and long_rsi_over_buy and strategy.position_size == 0 and rsi < hight_rsi)
    long_rsi_over_buy := false
    strategy.entry("多", long=strategy.long)
//RSI止盈之后,再次开空
if (short_f and short_rsi_over_sell and strategy.position_size == 0 and rsi > low_rsi)
    short_rsi_over_sell := false
    strategy.entry("空", long=strategy.short)


//**********绘图*start*******//

p1 = plot(sma_fast, linewidth=2, color=color.green)
p2 = plot(sma_slow, linewidth=2, color=color.red)
fill(p1, p2, color=color.green)
plot(cross(sma_fast, sma_slow) ? sma_fast : na, style = plot.style_circles, linewidth = 4)

// 绘制rsi线
//plot(rsi, color=color.green, editable=true, style=plot.style_circles, linewidth=2)

// 绘制上下轨
//high_ = hline(80, title="上轨")
//low_ = hline(20, title="下轨")
//fill(high_, low_, transp=80, editable=true, title="背景")
    
    
    
    
    
    
    

Mais.