A estratégia de ímpeto relativo

Autora:ChaoZhang, Data: 2024-01-29 08:38:04
Tags:

img

Resumo

A estratégia de impulso relativo compara o impulso de ações individuais e índices para julgar a força relativa das ações para o mercado mais amplo.

Princípios

A lógica central desta estratégia consiste em julgar a força relativa das ações individuais em relação ao mercado, nomeadamente:

  1. Calcular o retorno ao longo de um período de tempo como o ímpeto do estoque
  2. Calcular o retorno do índice durante o mesmo período que o momento do índice
  3. Usar a média móvel para suavizar o impulso da ação e do índice
  4. Quando a média móvel do momentum da ação cruza acima do do índice, o momentum da ação é considerado mais forte do que o mercado em geral - isto é, o sinal de compra
  5. Quando a média móvel do momento do estoque cruza abaixo da média móvel do momento do índice, o momento do estoque é considerado mais fraco, desencadeando o sinal de venda

Através desta lógica, podemos comprar ações quando o seu crescimento está prosperando e vender quando o impulso de crescimento desaparece, bloqueando retornos excessivos durante o período de pico de crescimento das ações.

Análise das vantagens

As principais vantagens da estratégia de ímpeto relativo:

  1. Pode capturar dinamicamente o pico de crescimento das ações sem se preocupar com condições específicas do mercado - basta comprar quando o crescimento das ações ultrapassa o mercado global
  2. A suavização com médias móveis filtra flutuações de curto prazo e melhora a confiabilidade do sinal
  3. Condições de compra e venda diretas simples, fáceis de compreender e operar
  4. Flexibilidade para configurar o período de tempo para o cálculo do momento relativo e otimizar

Análise de riscos

Há também alguns riscos com a estratégia de ímpeto relativo:

  1. As existências podem diminuir após o fim do pico de crescimento, o que representa um risco de lucro insuficiente
  2. Os sinais de momento relativo podem ser falsos, identificando um pico falso em vez de real
  3. Precisa definir stop loss para controlar perda máxima

Estes riscos podem ser geridos através de lucros razoáveis, stop loss, ajuste de parâmetros, etc.

Orientações de otimização

A estratégia relativa de impulso pode ser otimizada principalmente a partir dos seguintes aspectos:

  1. Teste diferentes períodos de tempo para o impulso de computação para encontrar o ideal
  2. Tente diferentes tipos e comprimentos de médias móveis para melhores parâmetros
  3. Adicionar um filtro de volume para evitar falhas devido à falta de impulso
  4. Incorporar outros indicadores para confirmar o melhor momento de entrada

Conclusão

A estratégia de impulso relativo capta as fases de crescimento excessivo de ações individuais em relação ao mercado global para gerar alfa. Com sua lógica de compra / venda simples e clara e facilidade de operação, e quando combinada com otimização de parâmetros e controle de risco, essa estratégia pode funcionar muito bem.


/*backtest
start: 2024-01-21 00:00:00
end: 2024-01-28 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Relative Returns Strategy", overlay=false, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

index_ticker=input("BTC_USDT:swap")
Loopback = input(40, step=20)
useStopAndIndexReturns = input(true)
useStopAndIndexReturnsMa = input(true)

useDifference = not useStopAndIndexReturns

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
MALength = input(10, minval=10,step=10)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

index = f_secureSecurity(index_ticker, '1D', close, 0)
stock_return = (close - close[Loopback])*100/close
index_return = (index - index[Loopback])*100/index

stock_return_ma = f_getMovingAverage(stock_return, MAType, MALength)
index_return_ma = f_getMovingAverage(index_return, MAType, MALength)
relativeReturns = stock_return - index_return
relativeReturns_ma = f_getMovingAverage(relativeReturns, MAType, MALength)

plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma : stock_return : na, title="StockReturn", color=color.green, linewidth=1)
plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? index_return_ma : index_return : na, title="IndexReturn", color=color.red, linewidth=1)

plot(useDifference?relativeReturns:na, title="Relative-Returns", color=color.blue, linewidth=1)
plot(useDifference?relativeReturns_ma:na, title="MA", color=color.red, linewidth=1)

buyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma > index_return_ma : stock_return > index_return : relativeReturns > relativeReturns_ma)
closeBuyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma < index_return_ma : stock_return < index_return : relativeReturns < relativeReturns_ma)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when=closeBuyCondition)

Mais.