Estratégia de negociação quantitativa de média móvel exponencial de atraso zero adaptativa

Autora:ChaoZhang, Data: 2024-02-19 15:38:02
Tags:

img

Resumo

A estratégia de negociação quantitativa de média móvel exponencial de atraso zero adaptativa é uma estratégia de negociação quantitativa desenvolvida com base na ideia de John Ehlers de média móvel exponencial de atraso zero (ZLEMA). Esta estratégia usa a média móvel exponencial como indicador de base e incorpora um método adaptativo de medição de frequência instantânea (IFM) para otimizar dinamicamente o parâmetro de período da média móvel exponencial.

Estratégia lógica

A ideia central desta estratégia se origina da teoria de filtros de atraso zero de John Ehlers. Embora a média móvel exponencial seja um indicador técnico amplamente conhecido, ela tem inerentemente o problema do atraso. Ehlers introduz um fator de correção de erro na fórmula de cálculo da média móvel exponencial para eliminar efetivamente o fenômeno do atraso, tornando a EMA de atraso zero mais sensível no rastreamento de mudanças de preço.

Na estratégia Adaptive Zero Lag EMA, utilizamos os métodos de medição de frequência instantânea para otimizar de forma adaptativa o parâmetro de período do ZLEMA. O IFM consiste em duas técnicas - o método Cosine e o método Inphase-Quadrature, que podem medir o ciclo dominante da oscilação de preços. Ao rastrear em tempo real os períodos ideais calculados por essas duas medições, definimos dinamicamente o parâmetro de período do ZLEMA para se adequar melhor à condição atual do mercado.

Quando a EMA rápida (ZLEMA) cruza a EMA lenta de baixo, um sinal longo é gerado. Quando a EMA rápida cruza abaixo da EMA lenta, um sinal curto é acionado. Isso forma uma estratégia de negociação semelhante ao sistema de cruzamento da média móvel.

Vantagens

A estratégia Adaptive Zero Lag EMA combina o filtro de atraso zero e a otimização do período adaptativo, com as seguintes vantagens:

  1. Elimina o atraso e faz sinais mais sensíveis
  2. Parâmetro de período de adaptação para uma ampla gama de mercados
  3. Menos parâmetros fáceis de testar e otimizar
  4. SL/TP fixa configurável para melhor controlo dos riscos

Riscos

Esta estratégia apresenta também alguns riscos:

  1. O período adaptativo otimizado pode falhar em determinados ambientes de mercado
  2. As definições de SL/TP fixas incorretas podem conduzir a perdas excessivas ou perdas de lucro
  3. Testes de otimização de parâmetros insuficientes podem levar a um desempenho em tempo real deficiente

Para controlar esses riscos, precisamos testar completamente os parâmetros em diferentes condições de mercado, ajustar o SL/TP adequadamente e simular o ambiente de negociação ao vivo em backtests.

Orientações de otimização

Ainda há muito espaço para otimizar ainda mais esta estratégia:

  1. Métodos alternativos de medição do período adaptativo, por exemplo, MA ajustada à volatilidade
  2. Condições adicionais do filtro, como volume, acoplamentos MA, etc.
  3. Técnicas SL/TP aprimoradas, por exemplo, paradas de trail ou saída do candelabro
  4. Dimensão dinâmica das posições associada à gestão do risco
  5. Confirmação de vários prazos para melhorar a qualidade do sinal

Através destes meios de otimização, há potencial para melhorar ainda mais a taxa de vitória, rentabilidade, métricas ajustadas ao risco da estratégia.

Conclusão

A estratégia Adaptive Zero Lag EMA combina com sucesso o filtro de atraso zero e a otimização de período dinâmico. Com menos parâmetros e fácil de operar, é especialmente adequada para mercados de tendência. Juntamente com o stop loss adequado, o dimensionamento da posição e outras técnicas de gerenciamento de risco, sua estabilidade e lucratividade podem ser ainda melhoradas.


/*backtest
start: 2024-01-19 00:00:00
end: 2024-02-18 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Adaptive Zero Lag EMA v2", shorttitle="AZLEMA", overlay = true)

src = input(title="Source",  defval=close)
Period = input(title="Period",  defval = 20)
adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Off")
GainLimit = input(title="Gain Limit",  defval = 10)
Threshold = input(title="Threshold", type = float, defval=0.05, step=0.01)
fixedSL = input(title="SL Points", defval=70)
fixedTP = input(title="TP Points", defval=5)
risk = input(title='Risk', defval=0.01, step=0.01)

//##############################################################################
//I-Q IFM
//#############################################################################
range = input(title="Max Period",  defval=60, minval=8, maxval=100)

PI = 3.14159265359
imult = 0.635
qmult = 0.338
inphase = 0.0
quadrature = 0.0
re = 0.0
im = 0.0
deltaIQ = 0.0
instIQ = 0.0
lenIQ = 0.0
V = 0.0

P = src - src[7]
inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3])
quadrature := P[2] - qmult*P + qmult*nz(quadrature[2])
re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1])
im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1])
if (re!= 0.0)
    deltaIQ := atan(im/re)
for i=0 to range
    V := V + deltaIQ[i]
    if (V > 2*PI and instIQ == 0.0)
        instIQ := i
if (instIQ == 0.0)
    instIQ := nz(instIQ[1])
lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1])

//##############################################################################
//COSINE IFM
//#############################################################################
s2 = 0.0
s3 = 0.0
deltaC = 0.0
instC = 0.0
lenC = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0

v1 := src - src[7]
s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
if (s2 != 0)
    v2 := sqrt(s3/s2)
if (s3 != 0)
    deltaC := 2*atan(v2)
for i = 0 to range
    v4 := v4 + deltaC[i]
    if (v4 > 2*PI and instC == 0.0)
        instC := i - 1
if (instC == 0.0)
    instC := instC[1]
lenC := 0.25*instC + 0.75*nz(lenC[1])

if (adaptive == "Cos IFM")
    Period := round(lenC)
if (adaptive == "I-Q IFM")
    Period := round(lenIQ)
if (adaptive == "Average")
    Period := round((lenC + lenIQ)/2)

//##############################################################################
//ZERO LAG EXPONENTIAL MOVING AVERAGE
//##############################################################################
LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0

alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])

for i = -GainLimit to GainLimit
    Gain := i/10
    EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
    Error := src - EC
    if(abs(Error)<LeastError)
        LeastError := abs(Error)
        BestGain := Gain

EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])

plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)

buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold
strategy.initial_capital = 50000
if (time>timestamp(2016, 1, 1 , 0, 0))
    //LONG
    balance = strategy.initial_capital + strategy.netprofit
    lots = ((risk * balance)/fixedSL)*1
    strategy.entry("BUY", strategy.long, qty=lots, oca_name="BUY",  when=buy)
    strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)
    //SHORT
    strategy.entry("SELL", strategy.short, qty=lots, oca_name="SELL", when=sell)
    strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)


Mais.