Die Ressourcen sind geladen. Beförderung...

SMA Crossover Long-Short-Strategie mit Peak-Drawdown-Kontrolle und automatischer Beendigung

Schriftsteller:ChaoZhang, Datum: 2024-07-29 14:16:58
Tags:SMA

img

Übersicht

Diese Strategie ist ein Long-Short-Handelssystem, das Crossover-Signale des einfachen gleitenden Durchschnitts (SMA) mit Spitzenrückzugskontrolle kombiniert. Es verwendet den Crossover von 14-Perioden- und 28-Perioden-SMAs, um lange und kurze Handelssignale zu generieren und gleichzeitig den Spitzenrückgang der Strategie zu überwachen. Wenn der Rückzug einen vorgegebenen Schwellenwert überschreitet, stoppt die Strategie automatisch den Handel. Darüber hinaus enthält die Strategie eine detaillierte Spitzen-zu-Trop-Zyklusanalyse, um den Händlern zu helfen, die Risikokarakteristiken der Strategie besser zu verstehen.

Strategieprinzip

  1. Erzeugung von Handelssignalen:

    • Ein langes Signal wird erzeugt, wenn die 14-Perioden-SMA über die 28-Perioden-SMA geht.
    • Ein kurzes Signal wird erzeugt, wenn die 14-Perioden-SMA unter die 28-Perioden-SMA fällt.
  2. Spitzenentzugskontrolle:

    • Echtzeitverfolgung der Aktienkurve der Strategie, wobei historische Höchststände (Hochstände) erfasst werden.
    • Wenn das laufende Eigenkapital unter den Höchststand fällt, tritt es in einen Abzugszustand ein und verzeichnet den Tiefpunkt.
    • Die Berechnung des Zugriffsprozentsatzes erfolgt wie folgt: (Peak - Trough) / Peak * 100%.
    • Überschreitet der Zugriffsprozentsatz die vorgegebene Höchstzugriffsschwelle, wird die Strategie nicht mehr eröffnet.
  3. Analyse des Zyklus von der Spitze bis zum Durchlauf:

    • Für die Festlegung gültiger Peak-to-Trop-Zyklen ist ein Mindestzugsanteil festzulegen.
    • Für jeden abgeschlossenen gültigen Zyklus ist die Zyklennummer, der vorherige Auflaufanteil, der Abzuganteil und die Endzeit zu vermerken.
    • Die Anzeigeanalyse erzeugt ein Tabellenformat, das eine einfache Überprüfung der historischen Leistung der Strategie ermöglicht.

Strategische Vorteile

  1. Kombination von Trendverfolgung und Risikokontrolle: Die SMA-Crossover-Strategie ist eine klassische Trend-Folge-Methode, während die Peak-Drawdown-Kontrolle eine zusätzliche Schicht des Risikomanagements bietet.

  2. Hohe Anpassungsfähigkeit: Durch die Parametrierung der Höchst- und Mindestzinsschwellen kann die Strategie flexibel an unterschiedliche Marktbedingungen und persönliche Risikopräferenzen angepasst werden.

  3. Transparente Risikoindikatoren: Die Spitzen-Trop-Zyklanalyse liefert detaillierte historische Auslastungsinformationen, die es Händlern ermöglichen, die Risikokarakteristiken der Strategie intuitiv zu verstehen und somit fundierte Handelsentscheidungen zu treffen.

  4. Automatisierte Risikokontrolle: Wenn die Auslastung die vorgegebene Schwelle überschreitet, stoppt die Strategie automatisch den Handel.

  5. Umfassende Leistungsanalyse: Zusätzlich zu den herkömmlichen Backtesting-Metriken enthält die Strategie detaillierte Daten über den Zyklus von Spitze bis Tief, einschließlich der Prozentsätze der Vorlaufzeit, der Abzugsprozentsätze und der Zeitinformationen, die eine eingehende Analyse der Strategieleistung erleichtern.

Strategische Risiken

  1. Übermäßige Abhängigkeit von historischen Daten: Die SMA-Crossover-Strategie basiert auf historischen Preisdaten und kann in schnell wechselnden Märkten langsam reagieren und zu falschen Signalen führen.

  2. Häufiger Handel: In schwingen Märkten können sich die SMAs häufig kreuzen, was zu einem übermäßigen Handel und hohen Transaktionskosten führt.

  3. Potenzial für große Abzüge: Trotz einer maximalen Zugriffskontrolle kann ein einziger großer Rückgang bei starker Marktvolatilität immer noch zu erheblichen Verlusten führen.

  4. Parameterempfindlichkeit: Die Strategieleistung hängt stark von der Wahl der SMA-Perioden und der Auslastungsschwellen ab.

  5. Verpasste Chancen, umzukehren: Wenn der Handel nach Erreichen der maximalen Abzugsschwelle eingestellt wird, kann die Strategie Chancen verpassen, die durch Marktumkehrungen entstehen.

Strategieoptimierungsrichtlinien

  1. Einführung dynamischer Parameteranpassung: Es sollte in Erwägung gezogen werden, die SMA-Perioden und die Anziehungsschwellen auf der Grundlage der Marktvolatilität dynamisch anzupassen, um sich an unterschiedliche Marktumgebungen anzupassen.

  2. Zusätzliche Marktfilter: Einbeziehen Sie andere technische Indikatoren oder grundlegende Faktoren, wie RSI oder Volumen, um potenzielle falsche Signale zu filtern.

  3. Implementieren von Eingang und Ausgang in Phasen: Anstelle von Alles-oder-Nichts-Operationen sollten die Positionsbildung und -schließung schrittweise durchgeführt werden, um das Risiko einzelner Entscheidungen zu verringern.

  4. Hinzufügen von Profit-Mechanismus: Zusätzlich zur Abzugskontrolle fügen Sie eine dynamische Gewinnfunktion hinzu, um Gewinne zu erzielen und die Gesamtrendite zu verbessern.

  5. Geldmanagement optimieren: Einführung einer dynamischen Positionsgröße basierend auf Kontogröße und Marktvolatilität zur besseren Risikokontrolle.

  6. Einführung von Machine Learning Algorithmen: Verwenden von Techniken des maschinellen Lernens zur Optimierung der Parameterwahl- und Signalgenerierungsprozesse und zur Verbesserung der Anpassungsfähigkeit und Genauigkeit der Strategie.

Schlussfolgerung

Die SMA-Crossover-Lang-Short-Strategie in Kombination mit Peak-Drawdown-Kontrolle und Automatisierung ist ein quantitatives Handelssystem, das Trendverfolgung und Risikomanagement ausgleicht. Es erfasst Markttrends durch einfache gleitende Durchschnitts-Crossovers und verwaltet gleichzeitig das Abwärtsrisiko mithilfe der Peak-Drawdown-Kontrolle. Das einzigartige Merkmal der Strategie liegt in ihrer detaillierten Peak-to-Trop-Zyklusanalyse, die den Händlern ein Werkzeug bietet, um die Risikokarakteristiken der Strategie zu verstehen.

Während die Strategie einige inhärente Risiken birgt, wie z. B. eine übermäßige Abhängigkeit von historischen Daten und Parameterempfindlichkeit, kann sie durch angemessene Optimierungen und Verbesserungen ihre Robustheit und Rentabilität erheblich verbessern.

Insgesamt bietet diese Strategie den Händlern einen guten Ausgangspunkt, der weiter angepasst und optimiert werden kann, um individuelle Handelsziele und Risikopräferenzen zu erfüllen.


/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

capital = 10000

//@version=5
strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100)

// The code below is from Tradingwhale LLC
/// ==============================================================================
//  Peak-Trough Cycles with Date and Prev. RunUp
// Initialize variables
showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?")
min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.")
maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.")

var float equityPeak = na
var float equityTrough = na
var int cycleCount = 0
var bool inDrawdown = false
var float initialCapital = capital
var float prevTrough = initialCapital
var float prevRunUp = na
var bool useLighterGray = true
var int lastYear = na

// Variable to indicate whether the strategy should end
var bool end_strategy = false

// Table to display data
var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1)

// Function to convert float to percentage string
f_to_percent(value) =>
    str.tostring(value, "#.##") + "%"

// Function to get month/year string without commas
get_month_year_string() =>
    str.tostring(year) + "/" + str.tostring(month)

// Update the table headers
if (bar_index == 0 and showTable)
    table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal)

// Track peaks and troughs in equity
if (na(equityPeak) or strategy.equity > equityPeak)
    if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle
        drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
        if drawdownPercentage > min_trough
            cycleCount += 1
            prevRunUp := (equityPeak - prevTrough) / prevTrough * 100
            if cycleCount <= 20 and showTable
                currentYear = year
                if na(lastYear) or currentYear != lastYear
                    useLighterGray := not useLighterGray
                    lastYear := currentYear
                rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50)
                table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal)
            prevTrough := equityTrough
    equityPeak := strategy.equity
    equityTrough := na
    inDrawdown := false
else if (strategy.equity < equityPeak)
    equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity)
    inDrawdown := true

// Calculate if the strategy should end
if not na(equityPeak) and not na(equityTrough)
    drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
    if drawdownPercentage >= maxdraw
        end_strategy := true


// This code below is from Tradingview, but with additions where commented (see below)

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Short Entry Id", strategy.short)



Verwandt

Mehr