Estratégia de Impulso

Autora:ChaoZhang, Data: 23 de janeiro de 2023
Tags:

Resumo

A estratégia de impulso é uma estratégia de negociação que segue a tendência de preço baseada no movimento de preço. Ela gera sinais de negociação calculando as mudanças de preço durante um determinado período. Quando a tendência de alta do preço é identificada, ela desencadeia um sinal de compra. Quando a tendência de queda do preço é identificada, ela desencadeia um sinal de venda. Esta estratégia usa um cruzamento duplo do indicador de impulso para gerar sinais de negociação.

Estratégia lógica

Esta estratégia calcula a dinâmica dos preços medindo a variação do preço de fechamento em comparação com o preço de fechamento N períodos atrás.

O primeiro indicador de momento MOM0 é calculado como:

MOM0 = CLOSE - CLOSE[N]

onde CLOSE é o preço de fechamento do período correntes e CLOSE[N] é o preço de fechamento N períodos atrás.

O segundo indicador de momento MOM1 é calculado da seguinte forma:

MOM1 = MOM0 - MOM0 [1]

Calcula a diferença entre o MOM0 actual e o MOM0 do período anterior.

O terceiro indicador de momento MOM2 é calculado como:

MOM2 = CLOSE - CLOSE [1]

Calcula a diferença entre o preço de fechamento actual e o preço de fechamento do período anterior.

Quando MOM0 > 0 e MOM1 > 0, indica que o ímpeto está a aumentar de forma constante e desencadeia um sinal de compra.

O código também inclui uma condição de tempo time_cond para gerar sinais apenas durante o intervalo de tempo de backtesting especificado.

Análise das vantagens

  • Captura as tendências de mudança de preços independentemente do nível de preços em si, evita perseguir altas e matar baixas
  • O cruzamento do indicador de impulso duplo filtra falhas e evita sinais errados
  • Verificação adicional do tempo e da condição para evitar transacções desnecessárias
  • Lógica simples e fácil de entender, fácil de implementar
  • Parâmetros flexíveis ajustáveis para diferentes ambientes de mercado

Análise de riscos

  • Indicadores de impulso têm atraso e podem perder pontos de virada
  • O cruzamento de dois indicadores aumenta a filtragem, mas também pode perder algumas oportunidades
  • Incapaz de determinar a força e a velocidade do preço para cima ou para baixo
  • Os parâmetros necessitam de uma selecção cuidadosa, configurações excessivamente sensíveis podem aumentar a frequência de negociação e o custo de deslizamento
  • O desempenho depende da otimização dos parâmetros, os parâmetros precisam de ajuste para diferentes períodos

Os riscos podem ser reduzidos através do encurtamento dos períodos de impulso, da adição da determinação da tendência ou da configuração de stop loss.

Orientações de otimização

  • Teste diferentes métodos de cálculo do momento, como ROC, RSI, etc.
  • Adicionar a determinação da tendência para evitar problemas em mercados variados
  • Empregar estratégias de stop loss para controlar perdas de negociação única
  • Combinar com indicadores de volume para garantir o suporte de volume
  • Introduzir algoritmos de aprendizagem de máquina para otimização de parâmetros dinâmicos
  • Estratégias multi-tempo para diferenciar tendências a curto e a longo prazo
  • Considerar estratégias de arbitragem entre mercados que utilizem relações de preços entre mercados

Resumo

A estratégia de impulso segue as tendências de mudança de preços em vez de níveis de preços, identificando efetivamente as direções de impulso do mercado para capturar movimentos de preços ascendentes e descendentes. No entanto, o impulso tem características de atraso e a seleção de parâmetros e a otimização de combinações são cruciais para o desempenho da estratégia. Esta estratégia usa o cruzamento duplo do indicador de impulso como base, filtrando algum ruído. O desempenho pode ser melhorado e os riscos controlados pela otimização contínua de parâmetros, integrando novos indicadores técnicos e alavancando técnicas de aprendizado de máquina.


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

//@version=4
strategy("Momentum Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  = true

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE")
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomSE", strategy.short, stop = low - syminfo.mintick, comment = "MomSE")
else
	strategy.cancel("MomSE")

plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")

Mais.