Stratégie de négociation quantitative de moyenne mobile exponentielle adaptative avec décalage zéro

Auteur:ChaoZhang est là., Date: le 19 février 2024 15:38:02
Les étiquettes:

img

Résumé

La stratégie de trading quantitative de la moyenne mobile exponentielle à décalage zéro adaptative est une stratégie de trading quantitative développée sur la base de l'idée de John Ehlers de la moyenne mobile exponentielle à décalage zéro (ZLEMA). Cette stratégie utilise la moyenne mobile exponentielle comme indicateur de base et intègre une méthode adaptative de mesure instantanée de fréquence (IFM) pour optimiser dynamiquement le paramètre de la moyenne mobile exponentielle.

La logique de la stratégie

L'idée de base de cette stratégie provient de la théorie de John Ehlers des filtres à décalage zéro. Bien que la moyenne mobile exponentielle soit un indicateur technique largement connu, elle présente intrinsèquement le problème du décalage. Ehlers introduit un facteur de correction d'erreur dans la formule de calcul de la moyenne mobile exponentielle pour éliminer efficacement le phénomène de décalage, ce qui rend l'EMA à décalage zéro plus sensible au suivi des changements de prix.

Dans la stratégie Adaptive Zero Lag EMA, nous utilisons les méthodes de mesure de fréquence instantanée pour optimiser adaptivement le paramètre de la période du ZLEMA. Le MIF se compose de deux techniques - la méthode Cosine et la méthode Inphase-Quadrature, qui peuvent mesurer le cycle dominant de l'oscillation des prix. En suivant en temps réel les périodes optimales calculées par ces deux mesures, nous définissons dynamiquement le paramètre de la période du ZLEMA pour mieux s'adapter à l'état actuel du marché.

Lorsque l'EMA rapide (ZLEMA) traverse l'EMA lente depuis le bas, un signal long est généré. Lorsque l'EMA rapide traverse en dessous de l'EMA lente, un signal court est déclenché. Cela forme une stratégie de trading similaire au système de croisement de la moyenne mobile.

Les avantages

La stratégie EMA Adaptive Zero Lag combine le filtre à zéro retard et l'optimisation de la période d'adaptation, avec les avantages suivants:

  1. Élimine les retards et rend les signaux plus sensibles
  2. Paramètre de période d'adaptation pour un large éventail de marchés
  3. Moins de paramètres faciles à tester et à optimiser
  4. SL/TP fixe configurable pour un meilleur contrôle des risques

Les risques

Cette stratégie comporte également certains risques:

  1. La période d'adaptation optimisée peut échouer dans certains environnements de marché
  2. Les paramètres de SL/TP fixes incorrects pourraient entraîner une perte excessive ou une perte de profit
  3. Des tests d'optimisation de paramètres insuffisants peuvent entraîner de mauvaises performances en direct

Pour contrôler ces risques, nous devons tester complètement les paramètres dans différentes conditions de marché, ajuster correctement le SL/TP et simuler l'environnement de négociation en direct dans les backtests.

Directions d'optimisation

Il y a encore beaucoup de place pour optimiser cette stratégie:

  1. Les méthodes de mesure alternatives de la période d'adaptation, par exemple la MA ajustée à la volatilité
  2. Conditions de filtre supplémentaires telles que le volume, les couplages MA, etc.
  3. Les techniques SL/TP améliorées, par exemple les arrêts de trail ou la sortie du lustre
  4. La taille dynamique des positions couplée à la gestion des risques
  5. Confirmation à plusieurs délais pour améliorer la qualité du signal

Grâce à ces moyens d'optimisation, il est possible d'améliorer encore le taux de réussite, la rentabilité et les indicateurs ajustés au risque de la stratégie.

Conclusion

La stratégie Adaptive Zero Lag EMA combine avec succès le filtre à zéro décalage et l'optimisation de la période dynamique. Avec moins de paramètres et facile à utiliser, elle est particulièrement adaptée aux marchés tendance.


/*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)


Plus de