Stratégie de trading quantitatif adaptatif à décalage nul et à moyenne mobile exponentielle


Date de création: 2024-02-19 15:38:02 Dernière modification: 2024-02-19 15:38:02
Copier: 0 Nombre de clics: 841
1
Suivre
1617
Abonnés

Stratégie de trading quantitatif adaptatif à décalage nul et à moyenne mobile exponentielle

Aperçu

La stratégie de trading quantitative Adaptive Zero Lag Exponential Moving Average est une stratégie de trading quantitative développée à partir de l’idée de la Zéro Lag Exponential Moving Average d’Ehlers. La stratégie utilise la moyenne mobile indicielle comme indicateur de base et ajoute la méthode d’adaptation Instantaneous Frequency Measurement pour optimiser dynamiquement la périodicité de la moyenne mobile indicielle.

Principe de stratégie

L’idée centrale de cette stratégie est tirée de la théorie des filtres à zéro retard de John Ehlers. L’indice des moyennes mobiles, bien qu’étant un indicateur technique bien connu, est intrinsèquement sujet à des problèmes de retard. Ehlers a pu éliminer efficacement le retard en ajoutant un facteur de correction d’erreur dans la formule de calcul de l’indice des moyennes mobiles, permettant ainsi à l’indice des moyennes mobiles à zéro retard de suivre les variations de prix avec plus de sensibilité.

Dans la stratégie EMA à zéro retard adaptatif, nous utilisons la méthode de mesure de la fréquence en temps réel pour optimiser les paramètres cycliques des moyennes mobiles de l’indice à zéro retard. La mesure de la fréquence en temps réel est divisée en deux types, la méthode de la corde arrière et la méthode de la symétrie positive, qui permettent de mesurer les cycles dominants de la variation de la séquence de prix. Nous suivons en temps réel les meilleurs cycles calculés par ces deux méthodes de mesure et définissons dynamiquement les paramètres cycliques de l’indice à zéro retard, ce qui les rend plus adaptés à l’environnement actuel du marché.

Lorsque la ligne rapide (la moyenne mobile de l’indice zéro retardé) traverse la ligne lente (la moyenne mobile de l’indice ordinaire), faites plus et faites moins lorsque vous traversez, ce qui forme un signal de stratégie de négociation similaire à la croisée des moyennes mobiles.

Avantages stratégiques

La stratégie EMA auto-adaptative à zéro décalage combine un filtre à zéro décalage et une approche d’optimisation du cycle auto-adaptatif, avec les avantages suivants:

  1. Éliminer le retard, rendre le signal plus sensible et plus fiable
  2. Paramètres cycliques d’adaptation, adaptation à un environnement de marché plus large
  3. Moins de paramètres stratégiques, plus facile à tester et à optimiser
  4. Des points d’arrêt de perte fixes configurables, des risques faciles à contrôler

Risque stratégique

Les stratégies d’adaptation à l’EMA à zéro retard présentent également des risques, principalement:

  1. Les paramètres cycliques d’optimisation adaptative peuvent ne pas fonctionner dans certaines conditions de marché
  2. Une mauvaise configuration du stop loss fixe peut entraîner des pertes ou des pertes excessives.
  3. Un test d’optimisation de paramètres insuffisant peut entraîner une mauvaise performance du disque dur

Pour maîtriser ces risques, il est nécessaire de bien tester les paramètres de réglage dans différents environnements de marché, d’ajuster les points d’arrêt et de stop-loss de manière appropriée, et de bien vérifier les environnements physiques simulés dans la rétroanalyse.

Orientation de l’optimisation de la stratégie

La stratégie EMA pour l’adaptation au retard zéro a une large marge d’optimisation, les principales directions étant les suivantes:

  1. Essayez différentes méthodes de mesure du cycle d’adaptation, telles que le taux d’oscillation adapté MA
  2. Ajout de conditions de filtrage supplémentaires, telles que le volume de transactions, les paires de moyennes mobiles, etc.
  3. Optimiser les stratégies de stop-loss, telles que les arrêts de trailing, les sorties de Chandelier
  4. Adaptation dynamique de la taille des positions, en conjonction avec la gestion des risques
  5. Confirmation de plusieurs périodes de temps, amélioration de la qualité du signal

Grâce à ces outils d’optimisation, il est possible d’améliorer encore le taux de réussite, le taux de gain, les indicateurs d’ajustement au risque, etc. de la stratégie.

Résumer

La stratégie EMA auto-adaptative à zéro décalage, combinant avec succès les filtres à zéro décalage et l’idée d’optimisation du cycle dynamique, est une stratégie de trading quantitatif à moins de paramètres, facile à utiliser et à optimiser. Elle présente des caractéristiques de sensibilité à la réponse, d’adaptabilité et de bonne performance dans les marchés tendanciels.

Code source de la stratégie
/*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)