Adaptive Strategie für den Durchbruch des gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 2023-11-02 15:05:56
Tags:

img

Übersicht

Die Adaptive Moving Average Channel Breakout Strategie ist eine Trend-nachfolgende Breakout-Strategie, die auf dem Adaptive Moving Average (AMA) und einem adaptiven Kanalbereich zur Erzeugung von Handelssignalen basiert.

Strategieprinzip

Der Kernindikator dieser Strategie ist der Adaptive Moving Average (AMA), der zur Erfassung der Kursentwicklung verwendet wird.

Das ist der Wert, der für die Berechnung der Vermögenswerte verwendet wird, wenn die Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte.

wobei P (t) der aktuelle Preis und α (t) die Glättungskonstante zwischen 0 und 1 ist. α (t) wird dynamisch nach bestimmten Regeln angepasst, um die Empfindlichkeit des AMA für Preisänderungen zu kontrollieren.

SNRT = (P(t) - AMA(t-1)) / AMA(t-1)

Wenn also die Preisschwankungen zunehmen, wird sich α ((t) erhöhen, um die AMA reagierender zu machen; wenn die Schwankungen abnehmen, wird sich α ((t) verringern, um die AMA glatter zu machen.

Auf der Grundlage der AMA erstellt die Strategie einen anpassungsfähigen Kanalbereich zur Erkennung von Preisbruchsignalen.

Oberste: H (t) = (1 + β*H (t-1)) * AMA (t)

Unterer: L (t) = (1 - β*L (t-1)) * AMA (t)

Hierbei ist β ein einstellbarer Parameter, der die Kanalbreite steuert.

  • Gehen Sie lang ein, wenn der Preis über die obere Ebene bricht.

  • Gehen Sie kurz ein, wenn der Preis unter den unteren Wert fällt.

  • Ansonsten bleiben Sie flach.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Der AMA ist im Vergleich zu einfachen gleitenden Durchschnitten, insbesondere in volatilen Märkten, flexibler bei der Erfassung von Kursentwicklungen.

  2. Der adaptive Kanal kann seine Breite dynamisch anpassen, erweitert sich, wenn der Trend unklar ist, und verengt sich, wenn ein Trend auftritt.

  3. Preis-Breakout-Signale können den Trend rechtzeitig erfassen, beginnt mit höheren Gewinnraten.

  4. Die Logik ist einfach und klar, leicht verständlich und automatisiert für den quantitativen Handel.

Risikoanalyse

Zu den Risiken dieser Strategie gehören:

  1. Bei falschen AMA-Parametern können Kursentwicklungen verfehlt oder falsche Signale erzeugt werden.

  2. Die Adaptivkanalparameter wie β müssen sorgfältig abgestimmt werden, da sonst zu viele Whipsaws oder verpasste Trends auftreten können.

  3. Preisschwellen sind anfällig für falsche Breaks und erfordern mehr Filter.

  4. Die Strategie beinhaltet weder Risikomanagement noch Stop-Loss-Mechanismen.

Optimierungsrichtlinien

Die Strategie kann optimiert werden, indem:

  1. Verbesserung der α-Berechnung, um die AMA reaktionsschneller zu machen.

  2. Nach dem ersten Ausbruch wird eine weitere Bestätigung hinzugefügt, um falsche Signale zu vermeiden.

  3. Die Anwendung von Filtern wie Volumen oder Volatilität zur Validierung der Breakout-Gültigkeit.

  4. Einbeziehung von Trailing Stop Loss, um Gewinne zu erzielen und Risiken zu kontrollieren.

  5. Optimierung der Positionsgröße für verschiedene Anlageklassen.

Schlussfolgerung

Zusammenfassend ist die Adaptive Moving Average Channel Breakout Strategie eine einfache und praktische Trend-folgende Breakout-Strategie. Sie verwendet die flexible AMA, um Preistrends zu verfolgen, und einen adaptiven Kanal, um Breakout-Signale zu erkennen. Die Strategie hat einige Vorteile, aber auch potenzielle Risiken. Mit Optimierungen wie Parameter-Tuning, Hinzufügen von Filtern und Verbesserung von Stops kann sie robuster werden. Insgesamt bietet sie ein solides Baseline-Modell für den quantitativen Handel.


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

Mehr