Stratégie de rupture du canal de moyenne mobile adaptative

Auteur:ChaoZhang est là., Date: 2023-11-02 15h05 et 56 min
Les étiquettes:

img

Résumé

La stratégie de rupture de canal de moyenne mobile adaptative est une stratégie de rupture de tendance basée sur la moyenne mobile adaptative (AMA) et une plage de canaux adaptatifs pour générer des signaux de trading.

Principe de stratégie

L'indicateur de base de cette stratégie est l'adaptive moving average (AMA), qui est utilisé pour capturer la tendance des prix.

L'analyse de l'efficacité de l'analyse est effectuée en fonction de l'efficacité de l'analyse de l'efficacité.

où P (t) est le prix actuel et α (t) est la constante de lissage entre 0 et 1. α (t) est réglée dynamiquement selon certaines règles pour contrôler la sensibilité de l'AMA aux variations de prix.

Le nombre d'épreuves est calculé en fonction de la fréquence de l'épreuve

Ainsi, à mesure que les fluctuations des prix augmentent, α ((t) augmentera pour rendre l'AMA plus réactif; lorsque les fluctuations diminuent, α ((t) diminuera pour rendre l'AMA plus lisse.

Basée sur l'AMA, la stratégie construit une plage de canaux adaptative pour détecter les signaux de rupture de prix.

La valeur de l'indice est la valeur de l'indice d'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice.

La partie inférieure: L (t) = (1 - β*L (t-1)) * AMA (t)

où β est un paramètre réglable contrôlant la largeur du canal. Enfin, la stratégie génère des transactions basées sur les écarts de prix des niveaux du canal:

  • Entrez long lorsque le prix dépasse le niveau supérieur.

  • Entrez en short lorsque le prix dépasse le niveau inférieur.

  • Sinon, restez à plat.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. L'AMA est plus flexible pour capturer les tendances des prix que les moyennes mobiles simples, en particulier sur les marchés volatils.

  2. Le canal adaptatif peut ajuster dynamiquement sa largeur, en s'élargissant lorsque la tendance n'est pas claire et en se rétrécissant lorsqu'une tendance émerge.

  3. Les signaux de rupture de prix peuvent capturer rapidement la tendance avec des taux de gain plus élevés.

  4. La logique est simple et claire, facile à comprendre et automatisée pour le trading quantitatif.

Analyse des risques

Les risques de cette stratégie comprennent:

  1. Les paramètres AMA incorrects peuvent manquer les tendances des prix ou générer de faux signaux.

  2. Les paramètres du canal adaptatif comme β doivent être soigneusement réglés, faute de quoi il peut y avoir trop d'écart ou de tendances manquées.

  3. Les ruptures de prix sont sujettes à de fausses ruptures, ce qui nécessite plus de filtres.

  4. La stratégie n'inclut ni la gestion des risques ni les mécanismes de stop loss.

Directions d'optimisation

La stratégie peut être optimisée par:

  1. Amélioration du calcul α pour rendre l'AMA plus réactif.

  2. Ajout d'une confirmation supplémentaire après les éruptions initiales pour éviter de faux signaux.

  3. Appliquer des filtres tels que le volume ou la volatilité pour valider la validité de la rupture.

  4. Incorporer un stop-loss de suivi pour sécuriser les bénéfices et contrôler les risques.

  5. Optimisation de la taille des positions pour les différentes classes d'actifs.

Conclusion

En résumé, la stratégie de rupture de canal de moyenne mobile adaptative est une stratégie de rupture simple et pratique qui suit les tendances. Elle utilise l'AMA flexible pour suivre les tendances des prix et un canal adaptatif pour détecter les signaux de rupture.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading 
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857

strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)

testPeriod() =>  true

price = input(title='Price Source:', type=input.source, defval=close)

ama = price
hb = price
lb = price

// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.

normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)

// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)

// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)

offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)

// pi/2
pi2 = 1.5707963267948966

// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
    fast = _period/2
    lambda = _period/fast
    alpha = lambda * (_period - 1)/(_period - lambda)
    average1 = wma(_src,_period)
    average2 = wma(average1,fast)
    nwma = (1+alpha)*average1 - alpha*average2

ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])

deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])

beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama

snr := if price > hb
    ((price - ama[1])/ama[1])/beta_lb
else
    if price < lb
        -((price - ama[1])/ama[1])/beta_hb
    else
        0

normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)

plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)

// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black

// Buy Condition
if(price > hb)
    bc := true
    d := color.green

// Sell Condition
if(price < lb)
    sc := true
    d := color.red

if(testPeriod())
    strategy.entry("Long", strategy.long, when = bc)
    strategy.entry("Short", strategy.short, when = sc)

alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')

plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price  * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)

Plus de