Estratégia quantitativa de média móvel adaptativa

Autora:ChaoZhang, Data: 2023-11-17
Tags:

Resumo

Esta estratégia é baseada na média móvel, pode ajustar automaticamente os parâmetros e é adequada para mercados ondulados em prazos altos.

Estratégia lógica

Esta estratégia usa uma média móvel adaptativa como sinal de negociação. Primeiro, calcula a média móvel simples (CMA) do período especificado (inicio). Em seguida, testa os parâmetros do CMA ao redor do período, julgando qual combinação tem o menor número de toques pelo corpo do candelabro e da mecha. Finalmente, usa o CMA com o menor número de toques como linha de sinal.

Especificamente, a estratégia testa o CMA com período mais 1 (CMA_P1) e menos 1 (CMA_M1), conta o número de toques por corpo e mecha. Se o CMA tiver menos toques do que o CMA_P1 e o CMA_M1, então mantenha o período atual; se o CMA_P1 tiver menos toques, então aumente o período em 1; se o CMA_M1 tiver menos toques, então diminua o período em 1.

Quando o preço atravessa a CMA para cima, um sinal de compra é gerado; quando o preço atravessa a CMA para baixo, um sinal de venda é gerado.

Análise das vantagens

Esta estratégia de média móvel adaptativa tem as seguintes vantagens:

  1. Não é necessário selecionar manualmente o período da média móvel, a estratégia testará diferentes períodos e encontrará o ideal.

  2. Em comparação com a MA de período fixo, a MA adaptativa pode filtrar mais ruído e reduzir muitos sinais falsos.

  3. Adaptar-se às mudanças do mercado. Quando o mercado muda de intervalo para tendência, o período de MA aumentará automaticamente para gerar sinais; quando o mercado muda de tendência para intervalo, o período de MA diminuirá automaticamente. Assim, a estratégia pode se adaptar dinamicamente às mudanças do mercado.

  4. Este método adaptativo pode simplificar todo o sistema de negociação sem otimização manual de parâmetros.

  5. O conceito pode ser aplicado a outros indicadores como as bandas de Bollinger adaptativas, KD adaptativas, etc.

Análise de riscos

Há também alguns riscos a considerar para esta estratégia:

  1. Risco de opção de compra. Quando o mercado tem um padrão de opção de compra, o corpo da vela pode não conseguir quebrar a linha MA, resultando em sinais errados.

  2. Risco de fuga fracassada. A fuga MA nem sempre continua, algumas fuga fracassadas podem ocorrer. A validação da fuga é necessária para garantir uma alta taxa de sucesso.

  3. Risco de reversão da tendência. A reversão da tendência após a entrada na tendência precisa ser mudada em tempo hábil, caso contrário pode causar perdas. O stop loss deve ser definido para controlar a perda.

  4. Risco de otimização de parâmetros. Parâmetros ajustados adaptativos podem cair na otimização local, resultando em MA redundantes. Métodos de avaliação de modelos precisam ser introduzidos para evitar esse problema.

  5. Risco de sobreajuste. Ajuste excessivo de parâmetros pode levar ao sobreajuste e perder a capacidade de generalização do modelo. Verificação prolongada em diferentes ambientes de mercado é necessária, não apenas confiar nos resultados dos backtests.

Orientações para melhorias

Algumas orientações para melhorar esta estratégia de MA adaptativa:

  1. Adicionar a validação de rupturas de tendência através de rupturas consecutivas para filtrar rupturas falsas.

  2. Aumentar a estratégia stop loss, stop loss quando o preço se move de volta para o outro lado da MA.

  3. Adicione o filtro de opções para evitar sinais errados quando a opção de chamada aparecer.

  4. Introduzir métricas de avaliação como IC, LIC, SIC, etc. para restringir o ajuste de parâmetros e evitar o sobreajuste.

  5. Expandir para outros indicadores como estratégia de cruz de ouro adaptativa, bandas de Bollinger adaptativas, etc.

  6. Otimizar o cálculo da MA utilizando a MA ponderada, a MA exponencial, etc., para obter uma MA mais suave.

Resumo

Esta estratégia gera sinais de negociação ajustando adaptativamente o período de MA para encontrar parâmetros ideais. Em comparação com parâmetros fixos, ela pode reduzir muitos sinais falsos e se adaptar às mudanças do mercado. Mas também precisamos estar atentos aos riscos potenciais e fazer verificação e otimização do walk-forward antes de aplicá-la na negociação ao vivo para lucros constantes.

[/trans]


/*backtest
start: 2022-11-10 00:00:00
end: 2023-11-16 00:00:00
period: 1d
basePeriod: 1h
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/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)


Mais.