Adaptive quantitative Strategie des gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 2023-11-17 17:14:36
Tags:

Übersicht

Diese Strategie basiert auf gleitenden Durchschnitten, kann die Parameter automatisch anpassen und eignet sich für Wellenmärkte in hohen Zeitrahmen.

Strategie Logik

Diese Strategie verwendet einen adaptiven gleitenden Durchschnitt als Handelssignal. Zuerst berechnet sie den einfachen gleitenden Durchschnitt (CMA) des angegebenen Zeitraums (Start). Dann testet sie die CMA-Parameter um den Zeitraum herum und beurteilt, welche Kombination den geringsten Schlag durch Kerzenkörper und Wickel hat. Schließlich verwendet sie den CMA mit den geringsten Schlägen als Signallinie.

Insbesondere wird die CMA mit Periode plus 1 (CMA_P1) und minus 1 (CMA_M1) getestet, die Anzahl der Berührungen nach Körper und Wick gezählt. Wenn CMA weniger Berührungen hat als CMA_P1 und CMA_M1, dann die aktuelle Periode behalten; wenn CMA_P1 weniger Berührungen hat, dann die Periode um 1 erhöhen; wenn CMA_M1 weniger Berührungen hat, dann die Periode um 1 verringern.

Wenn der Preis durch den CMA nach oben bricht, wird ein Kaufsignal generiert; wenn der Preis durch den CMA nach unten bricht, wird ein Verkaufssignal generiert.

Analyse der Vorteile

Diese adaptive gleitende Durchschnittsstrategie hat folgende Vorteile:

  1. Es ist nicht notwendig, die gleitende Durchschnittsperiode manuell auszuwählen, die Strategie wird verschiedene Perioden testen und das Optimum finden.

  2. Verringern Sie falsche Signale: Im Vergleich zu einem festen Zeitraum kann der adaptive MA mehr Lärm filtern und viele falsche Signale reduzieren.

  3. Wenn der Markt von Range-bound zu Trending wechselt, wird die MA-Periode automatisch erhöht, um Signale zu generieren; wenn der Markt von Trend zu Range-bound wechselt, wird die MA-Periode automatisch abnehmen.

  4. Diese adaptive Methode kann das gesamte Handelssystem ohne manuelle Parameteroptimierung vereinfachen.

  5. Das Konzept kann auf andere Indikatoren wie adaptive Bollinger Bands, adaptive KD usw. angewendet werden.

Risikoanalyse

Für diese Strategie sind auch einige Risiken zu beachten:

  1. Wenn der Markt ein Call-Option-Muster hat, kann es sein, dass der Kerzenkörper die MA-Linie nicht durchbricht, was zu falschen Signalen führt.

  2. Ausfallrisiko. MA-Ausbruch kann nicht immer fortgesetzt werden, einige ausfallende Ausbrüche können auftreten. Ausbruchvalidierung ist erforderlich, um eine hohe Erfolgsrate zu gewährleisten.

  3. Trendumkehrrisiko. Trendumkehr nach Eintritt in den Trend muss rechtzeitig umgestellt werden, sonst kann dies zu Verlusten führen. Stop-Loss sollte so eingestellt werden, dass der Verlust kontrolliert wird.

  4. Das Risiko der Optimierung von Parametern. Adaptive angepasste Parameter können in die lokale Optimierung fallen, was zu überflüssigen MAs führt. Modellbewertungsmethoden müssen eingeführt werden, um dieses Problem zu vermeiden.

  5. Überanpassung Risiko. Übermäßige Parameter-Tuning kann zu Überanpassung führen und die Modellverallgemeinerungsfähigkeit verlieren. Verlängerte Verifizierung in verschiedenen Marktumgebungen ist erforderlich, nicht nur auf Backtest-Ergebnisse angewiesen.

Verbesserungsrichtlinien

Einige Richtungen zur Verbesserung dieser adaptiven MA-Strategie:

  1. Hinzufügen von Trend-Breakout-Validierung über aufeinanderfolgende Breakouts, um falsche Breakouts zu filtern.

  2. Steigern Sie die Stop-Loss-Strategie, stoppen Sie den Stop-Loss, wenn sich der Preis wieder auf die andere Seite des MA bewegt.

  3. Fügen Sie einen Optionsfilter hinzu, um falsche Signale zu vermeiden, wenn die Anrufoption angezeigt wird.

  4. Einführung von Evaluierungsmetriken wie IC, LIC, SIC usw., um Parameter-Tuning zu begrenzen und Überanpassung zu verhindern.

  5. Erweitern Sie Ihre Angabe auf andere Indikatoren wie Adaptive Golden Cross Strategie, Adaptive Bollinger Bands usw.

  6. Optimieren Sie die MA-Berechnung, indem Sie gewichtete MA, exponentielle MA usw. verwenden, um eine glattere MA zu erhalten.

Zusammenfassung

Diese Strategie erzeugt Handelssignale, indem sie die MA-Periode anpassungsfähig anpasst, um optimale Parameter zu finden. Im Vergleich zu festen Parametern kann sie viele falsche Signale reduzieren und sich an Marktveränderungen anpassen. Aber wir müssen auch auf potenzielle Risiken achten und Überprüfung und Vorwärtsoptimierung durchführen, bevor wir sie im Live-Handel für stetige Gewinne anwenden.

[/trans]


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)


Mehr