Estratégia de média de reversão do envelope de média móvel

Autora:ChaoZhang, Data: 2023-12-04 16:12:39
Tags:

img

Resumo

A estratégia de média de reversão é uma estratégia de negociação de reversão baseada em médias móveis. Ela usa a média móvel exponencial dupla (DEMA) como cálculo base e adiciona vários envelopes acima e abaixo dela. Quando o preço toca as bandas de envelope, abre posições longas ou curtas com base na direção. Quando o preço regressar à média móvel, fecha todas as posições.

Estratégia lógica

A estratégia usa a média móvel exponencial dupla (DEMA) como indicador de base, que é uma média móvel mais sensível às mudanças recentes de preços. Acima e abaixo da DEMA, várias faixas de preços são adicionadas para formar uma zona de envelope.

Quando o preço sobe e se aproxima da faixa superior do envelope, a estratégia abre uma posição curta. Quando o preço cai e atinge a faixa inferior do envelope, abre uma posição longa. Adiciona uma nova posição a cada vez que uma nova faixa de preços é tocada. Quando o preço regredir perto da média móvel, todas as posições são fechadas.

Através da captura de flutuações excessivas de preços com as bandas de envelope e lucrando com reversões, a estratégia visa comprar baixo e vender alto.

Vantagens

  • Utiliza a média móvel exponencial dupla, que é sensível às mudanças de preço a curto prazo para capturar inversões de tendência.
  • As bandas de envelope em torno da média móvel podem capturar com precisão as inversões de preços.
  • Abre posições em lotes, utilizando plenamente a eficiência do capital.
  • Mudar rapidamente de direcção após o lucro para se adaptar às mudanças do mercado.
  • Os parâmetros podem ser livremente otimizados.

Riscos

  • Incapaz de lucrar com mercados em forte evolução.
  • Parâmetros inadequados podem causar excesso de negociação.
  • Precisa de mercados relativamente estáveis, não adequados a ambientes altamente voláteis.
  • Os envelopes demasiado estreitos podem impedir a entrada em posições.

Os riscos podem ser reduzidos através da expansão adequada do intervalo de envelope para aumentar a sensibilidade e do ajustamento do comprimento da média móvel para se adequar aos diferentes ciclos de mercado.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Teste diferentes algoritmos de média móvel.

  2. Ajustar o parâmetro de comprimento médio móvel para melhor adaptação às flutuações de curto prazo.

  3. Otimizar os parâmetros do envelope testando diferentes definições de percentagem.

  4. Adicione métodos de stop loss como trailing stop loss para limitar a perda de uma única negociação.

  5. Adicionar condições de filtragem com outros indicadores para evitar entradas inválidas em mercados irracionais.

Conclusão

A estratégia de média móvel de envelope de reversão média capta efetivamente oportunidades de reversão média construindo um canal de preço em torno da média móvel. Pode ser flexivelmente adaptada a diferentes ambientes de mercado através de ajustes de parâmetros. Com custos de transação relativamente baixos e altos retornos, esta é uma estratégia de negociação quantitativa recomendada.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


Mais.