English Русский 日本語
preview
Robustheitstests für Expert Advisors

Robustheitstests für Expert Advisors

MetaTrader 5Beispiele |
145 6
Zhuo Kai Chen
Zhuo Kai Chen

Einführung

Bei der Entwicklung von Strategien sind viele komplizierte Details zu berücksichtigen, von denen viele für Anfänger nicht besonders interessant sind. Infolgedessen mussten viele Händler, mich eingeschlossen, diese Lektionen auf die harte Tour lernen. Dieser Artikel basiert auf meinen Beobachtungen von häufigen Fallstricken, die den meisten Anfängern bei der Entwicklung von Strategien auf MQL5 begegnen. Es wird eine Reihe von Tipps, Tricks und Beispielen bieten, die dabei helfen, die Untauglichkeit eines EA zu erkennen und die Robustheit unserer eigenen EAs auf einfache Weise zu testen. Ziel ist es, die Leser aufzuklären und ihnen zu helfen, zukünftige Betrügereien beim Kauf von EAs zu vermeiden und Fehler bei der eigenen Strategieentwicklung zu verhindern.


Rote Fahnen auf dem EA-Markt

Ein kurzer Blick auf den MQL5-Markt zeigt, dass er von Anbietern dominiert wird, die KI-Handelssysteme mit beliebten großen Sprachmodellen wie ChatGPT oder Gemini AI bewerben. Ich bin der festen Überzeugung, dass keine dieser Behauptungen wahr ist, und zwar aus einem einfachen Grund: Es ist unmöglich, kommerzielle LLMs für das Backtesting zu verwenden, ohne eine Verzerrung in der Vorausschau zu verursachen. Darüber hinaus wird bei der Integration gängiger LLMs in MQL5 die Web-Anfragefunktion verwendet. Wenn ein Verkäufer also nicht angibt, dass für den EA Internet oder eine Eingabeaufforderung erforderlich ist, ist es unwahrscheinlich, dass er legitim ist. Ein robusterer Ansatz zur Einbeziehung von LLMs in den Handel würde Live-Tests oder den Aufbau auf primitiven Modellen wie BERT beinhalten. Der Artikel ist ein Beispiel für diesen Ansatz.

Allerdings gibt es hier etwas zu klären. KI bedeutet nicht nur große Sprachmodelle, auch wenn die meisten Menschen dies annehmen. Die meisten der fortgeschrittenen maschinellen Lerntechniken, einschließlich des unüberwachten Lernens, des überwachten Lernens und des Verstärkungslernens, können als KI für ihre EAs eingestuft werden. Es ist also kein falsches Marketing, wenn ein Verkäufer behauptet, einen KI-EA zu verkaufen, obwohl er Modelle eines neuronalen Netzes verwendet. Leider verwenden die meisten KI-EAs nicht einmal grundlegende neuronale Netzwerkmodelle, obwohl sie dies vorgeben. Eine Möglichkeit, dies zu überprüfen, besteht darin, zu prüfen, ob sie eine zusätzliche ONNX-Datei bereitstellen. Wenn das Produkt nur aus einer ausführbaren Datei besteht, müssen sie alle Modellparameter fest in den EA einprogrammiert haben, was in der Regel zu einer Dateigröße von über einem Megabyte führt.

Einige andere rote Fahnen auf dem EA-Markt sind:

  • Sehr große Stop-Losses im Vergleich zu Gewinnmitnahmen. Oft werden Indikatoren verwendet, um Verlustgeschäfte im Backtest herauszufiltern, sodass Verluste selten sind und die Illusion einer hohen Gewinnquote entsteht. In Wirklichkeit kann ein einziger Verlust zahlreiche profitable Handelsgeschäfte zunichte machen.
  • Verkäufer investiert nur einen kleinen Betrag in sein Signal, z.B. $10-$100, während er den EA für $1.000 oder mehr verkauft. Dies deutet darauf hin, dass sie davon ausgehen, dass das Konto irgendwann explodieren wird, und versuchen, aus den hohen prozentualen Gewinnen eines kleinen Kontos Kapital zu schlagen.
  • Das Konto ist neu, mit nur ein paar Handelsgeschäfte, die eine 100% Gewinnrate des Signals aufweisen.
  • Verwendung von Martingale-, Hedging-, Dollar-Cost-Averaging- oder Grid-Systemen. Diese Strategien erhöhen das Risiko, indem sie die Positionen nach einem Verlust vervielfachen oder während eines Drawdowns weitere Handelsgeschäfte in derselben Richtung hinzufügen. Diese klassischen Ansätze stammen aus dem 20. Jahrhundert und sind wahrscheinlich nicht die „versteckten heiligen Grale“, da ihre erwarteten Erträge kleiner oder gleich Null sind.

Hier ist ein kurzer mathematischer Beweis:

Mathe-Beweis

Wenn ihre Backbone-Strategien nicht bereits einen klaren Vorteil haben (p deutlich größer als 0,5), ist die Renditeerwartung kleiner oder gleich Null, was bedeutet, dass Sie auf lange Sicht verlieren werden und der Verlust einfach noch nicht realisiert wurde. Selbst wenn ein Martingal- oder Grid-System auf einem profitablen Einstieg aufbaut, riskieren Sie bei jedem Handel letztlich immer noch Ihr gesamtes Portfolioguthaben und nicht nur einen Bruchteil wie bei den meisten Risikomanagementansätzen. Wenn Sie sich nicht sicher sind, ob Sie weiterhin Geld einzahlen können, wenn das Konto bereits stark eingebrochen ist, rate ich Ihnen davon ab.

Eine Sache, die klargestellt werden muss, ist, dass dieser Abschnitt darauf abzielt, das Bewusstsein für gängige falsche Marketingtechniken zu schärfen, die auf dem heutigen MQL5-Markt vorherrschen, und ist kein Protest gegen den Verkauf oder Kauf von EAs auf MQL5. In der Tat ermutige ich mehr Leute, EAs auf MQL5 zu verkaufen, basierend auf vertrauenswürdigem Marketing und wirklich robusten EAs, um dazu beizutragen, dass es eine glaubwürdigere Umgebung wird.


Überanpassung

Ein häufiges Problem bei Handelsmodellen ist die Überanpassung, d. h., dass eine Strategie zwar bei historischen Daten gut funktioniert, sich aber nicht auf neue, noch nicht gesehene Daten verallgemeinern lässt. In diesem Experiment werden wir anhand eines Python-Codes demonstrieren, wie es bei der Auswahl von Parametern in einem Handelsmodell zu einer Überanpassung kommen kann. Insbesondere werden wir zufällige Handelsszenarien mit mehreren Merkmalen generieren, die Auswirkungen der selektiven Filterung visualisieren und beobachten, wie die Leistung variiert, wenn die Parameter für eine bestimmte Teilmenge der Daten übermäßig optimiert werden.

Wir beginnen mit der Simulation eines Datensatzes von 1000 zufälligen Handelsproben, wobei jede Probe einer Handelsentscheidung mit drei Merkmalen entspricht:

  • Merkmal 1: Dies könnte für verschiedene Marktbedingungen stehen, z. B. „a“, „b“ oder „c“.
  • Merkmal 2: Steht für einen anderen Faktor wie „d“, „e“ oder „f“, z. B. die Volatilität von Vermögenswerten oder die Stimmung.
  • Merkmal 3: Dies kann andere Handelsindikatoren mit Werten wie „g“, „h“ oder „i“ darstellen.
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Step 1: Generate random samples
np.random.seed(42)  # For reproducibility

# Possible feature values
feature_1_values = ['a', 'b', 'c']
feature_2_values = ['d', 'e', 'f']
feature_3_values = ['g', 'h', 'i']

# Generate random data
n_samples = 1000
feature_1 = np.random.choice(feature_1_values, n_samples)
feature_2 = np.random.choice(feature_2_values, n_samples)
feature_3 = np.random.choice(feature_3_values, n_samples)
outcome = np.random.choice([0, 1], n_samples)  # Random binary outcome

# Create a DataFrame
df = pd.DataFrame({
    'feature_1': feature_1,
    'feature_2': feature_2,
    'feature_3': feature_3,
    'outcome': outcome
})

Jeder dieser Proben wird ein Ergebnis zugeordnet (entweder ein Gewinn oder ein Verlust), das nach dem Zufallsprinzip entweder 0 oder 1 ist. Diese Ergebnisse stellen das Ergebnis eines hypothetischen Handels auf der Grundlage der gegebenen Merkmale dar, die verschiedene Parameterwerte bezeichnen.

Im realen Handel ist die Auswahl der richtigen Parameter (z. B. Marktindikatoren, Handelszeitfenster oder Schwellenwerte für Kauf-/Verkaufssignale) entscheidend für die Leistung des Modells. Eine Überanpassung tritt jedoch auf, wenn das Modell zu sehr auf bestimmte Muster in historischen Daten abgestimmt ist, die sich nicht gut auf neue Daten übertragen lassen.

Um dies zu demonstrieren, betrachten wir zunächst nur Stichproben, bei denen Merkmal 1 = „b“, Merkmal 2 = „d“ und Merkmal 3 = „g“.

def plot_filtered_distribution(df, feature_filters):
    # Filter the DataFrame based on the specified feature values
    filtered_df = df
    for feature, value in feature_filters.items():
        filtered_df = filtered_df[filtered_df[feature] == value]
    
    # Check if filtered dataframe is empty
    if filtered_df.empty:
        print("No data available for the selected feature combination.")
        return

    # Plot the distribution of outcomes based on the filtered data
    sns.countplot(x='outcome', data=filtered_df, palette='Set2')
    plt.title(f'Distribution of Outcomes (filtered by {", ".join([f"{key}={value}" for key, value in feature_filters.items()])})')
    plt.show()

# Example usage: Visualize the distribution of outcomes when filtering by feature_1 = 'a', feature_2 = 'd', feature_3 = 'g'
plot_filtered_distribution(df, {'feature_1': 'b', 'feature_2': 'd', 'feature_3': 'g'})

Überanpassung, Beispiel 1

Anschließend wird die Ergebnisverteilung für die Stichproben mit Merkmal 1 = „c“, Merkmal 2 = „f“ und Merkmal 3 = „h“ dargestellt.

Überanpassung, Beispiel 2

Wir können deutlich sehen, dass wir durch die Änderung von nur drei Parametern in diesen zufällig generierten Daten in der Lage sind, einen Satz herauszufiltern, der hauptsächlich von Verlusten oder Gewinnen dominiert wird. Dies zeigt, wie mächtig die Überanpassung ist. Indem wir uns auf eine bestimmte Untergruppe von Merkmalen konzentrieren, zwingen wir das Modell, sich an einen engen Ausschnitt der Daten anzupassen, was zu irreführenden Schlussfolgerungen führen kann. Je selektiver wir die Daten auf der Grundlage der Merkmale filtern, desto wahrscheinlicher ist es, dass wir eine künstlich hohe Leistung (in Bezug auf die Ergebnisse) beobachten, was ein Kennzeichen der Überanpassung ist. Jede beliebige Strategie mit genügend Parametern für eine Überanpassung wird unweigerlich zu gewinnbringenden Ergebnissen führen.

Dies ist eine kritische Warnung für Händler, die sich auf fein abgestimmte Strategien verlassen, die auf spezifischen Parametersätzen basieren, da diese möglicherweise nicht gut auf zukünftige Marktbedingungen übertragbar sind. Die wichtigste Erkenntnis ist, dass die Robustheit des Modells - d. h. eine konsistente Leistung über einen breiten Datenbereich hinweg - weitaus wertvoller ist als die Optimierung für enge Parameterbereiche.


Optimierung auf dem MetaTrader 5 Terminal

Wenn wir versuchen, die optimalen Werte für die Leistung eines bestimmten EA in einem bestimmten Zeitraum auszuwählen, führen wir eine Optimierung durch. Wie im vorangegangenen Abschnitt gezeigt wurde, ist es einfach, eine kleine Stichprobe von Zufallsdaten durch kleine Anpassungen einiger weniger Parameter zu überarbeiten. Das wirft die Frage auf: Wie können wir diesen Fehler bei der Optimierung vermeiden und unsere Backtest-Ergebnisse glaubwürdiger machen? In diesem Abschnitt werden verschiedene Möglichkeiten zur Minimierung des Risikos einer Überanpassung und zur Sicherstellung robusterer Ergebnisse bei der Durchführung von Optimierungen auf dem MetaTrader 5-Terminal untersucht.

1. Mehr Stichproben über einen längeren Zeitraum

Unter der Annahme, dass die Renditen Ihrer Strategie einer bestimmten Verteilung folgen, wird sich die mittlere Rendite Ihrer Stichproben mit zunehmender Anzahl der Stichproben dem Mittelwert dieser Verteilung annähern (Gesetz der großen Zahlen). Für Strategien, die nicht so hochfrequent sind wie Daytrading oder Scalping, empfiehlt es sich, sie mit Daten zu testen, die mindestens 10 Jahre umfassen und Tausende von Handelsgeschäften beinhalten. Wenn Ihre Strategie empfindlich auf makroökonomische Veränderungen reagiert, ist es akzeptabel, nur die letzten Jahre zu testen. Letztendlich benötigen Sie jedoch genügend Stichproben, um die Strategie zu validieren, da es keine allgemeingültige Regel dafür gibt, wie viele Stichproben ausreichend sind. Ziel ist es zu zeigen, dass es ein historisches, sich wiederholendes Muster gibt, das auf den Finanzmärkten ausgenutzt werden kann. 

Wenn Ihr EA in einem größeren Zeitrahmen arbeitet, können Sie ihn mit mehreren Vermögenswerten testen, um mehr Stichproben zu sammeln und ihn möglicherweise in eine Multi-Asset-Strategie umzuwandeln. Dieser Ansatz verringert die Wahrscheinlichkeit einer Überanpassung erheblich, da die Leistung der Strategie über ein breiteres Spektrum von Marktbedingungen und Verhaltensweisen der Vermögenswerte hinweg getestet wird. Durch die Diversifizierung der getesteten Vermögenswerte erhöhen Sie die Robustheit Ihrer Strategie und verbessern ihre Fähigkeit, sich an unterschiedliche Marktumgebungen anzupassen.

2. Weniger abstimmbare Parameter

Wie im vorangegangenen Experiment gezeigt, kann der Optimierungsprozess umso mehr Gruppen von Gewinnern herausfiltern, je mehr Parameter Sie haben. Ein zu Beginn zufällig generierter Parameter kann leicht in eine Gruppe erfolgreicher Ergebnisse gefiltert werden, was aber nicht unbedingt die Gültigkeit der gesamten Stichprobe beweist. David Aronson untersuchte in Evidence-Based Technical Analysis den Einsatz von Data-Mining-Techniken und kam zu dem Schluss, dass eine Strategie mit nur einem abstimmbaren Parameter wahrscheinlich nicht existiert, obwohl sie weniger anfällig für eine Überanpassung wäre. Es wird empfohlen, die Anzahl der einstellbaren Parameter auf weniger als fünf zu beschränken. Parameter, die keinen Einfluss auf die Ergebnisse haben, wie z. B. magische Zahlen, sollten nicht als abstimmbar betrachtet werden. Parameter wie der Rückblickzeitraum von Indikatoren können auf allgemein akzeptierte Werte festgelegt werden, und in solchen Fällen sollten sie während der Optimierung nicht zu den abstimmbaren Parametern gezählt werden.

3. Berücksichtigen Sie Provisionen, Spreads und Swaps bei Ihren Backtests und Optimierungen

Wenn Sie den Strategietester verwenden, sollten Sie unbedingt auf das Währungszeichen klicken und prüfen, ob Provisionen, Spreads und Swaps so eingestellt sind, dass sie den Bedingungen Ihrer Live-Handelsumgebung entsprechen. 

Optimierungseinstellungen

Spread

Viele Händler glauben fälschlicherweise, dass sie das Gegenteil von dem tun, was eine Gewinnstrategie tun würde, wenn ihre Strategie ständig verliert. Sie denken vielleicht, dass sie durch eine einfache Umkehrung der Handelsrichtung durchweg gewinnen werden. Dies ist jedoch weit von der Wahrheit entfernt. Für Kleinhändler ist der Handel ein Negativsummenspiel. Bei einem Händler, der ständig verliert, ist es wahrscheinlicher, dass er eine Strategie verwendet, die keinen Vorteil mehr bietet, und seine Ergebnisse folgen einer zufälligen Verteilung von Gewinnen und Verlusten. In solchen Fällen sind die Verluste häufig auf die bei jedem Handel gezahlten Spreads, Provisionen und Swap-Gebühren zurückzuführen.

Es ist sehr viel unwahrscheinlicher, dass Sie eine Strategie entwickeln können, die durchweg die gegenteiligen Signale einer profitablen Strategie erzeugt, als dass Sie selbst eine profitable Strategie entwickeln. Im letzteren Fall arbeiten Sie aktiv daran, die Strategie zum Erfolg zu führen, im ersteren hingegen nicht.

Aus diesem Grund empfehle ich Anfängern nicht, Scalping-Strategien auszuprobieren - der relative statistische Nachteil ist einfach zu groß. Betrachten wir ein Beispiel: Wenn Sie mit EUR/USD handeln, sind die typischen Bedingungen für einen B-Book-Broker keine Kommissionen, aber ein 1-Pip-Spread, und für einen ECN-A-Book-Broker sind die Bedingungen eine 7-Dollar-Kommission pro Lot mit einem 0,1-Pip-Spread. Wenn Sie versuchen, nur einen Take-Profit von 10 Pips zu erzielen, zahlen Sie in beiden Fällen effektiv eine Provision von etwa 10 % für jedes Handelsgeschäft, unabhängig davon, ob Sie gewinnen oder verlieren. Dies ist besonders für Hochfrequenzhändler problematisch, da diese Kosten die Gewinne im Laufe der Zeit aufzehren werden.

Nehmen wir nun an, Sie haben eine solide Strategie mit einer Gewinnquote von 55 % und einem Risiko-Ertrags-Verhältnis von 1:1. Ohne Berücksichtigung von Spreads oder Provisionen würde Ihre Aktienkurve selbst nach professionellen Maßstäben ziemlich gut aussehen:

Ohne Provisionen

Wenn Sie jedoch die 10 % Kosten für Provisionen, Spreads und Swaps berücksichtigen, die durch Ihren Versuch entstehen, kleine Handelsgeschäfte zu scalpen, und somit die relativen Kosten jedes Handelsgeschäft erhöhen, wird Ihre Aktienkurve kaum noch profitabel, wie unten dargestellt:

Mit Provisionen

Simulation Python-Code:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Parameters
n_trades = 1000  # Number of trades
win_rate = 0.55  # 55% win rate
commission_rate = 0.1  # 10% commission per trade
initial_balance = 10000  # Starting balance
trade_amount = 100  # Amount per trade

# Simulate the trades
np.random.seed(42)  # For reproducibility

# Generate random outcomes (1 for win, 0 for loss)
outcomes = np.random.choice([1, 0], size=n_trades, p=[win_rate, 1 - win_rate])

# Initialize balance and equity curve
balance = initial_balance
equity_curve = [balance]

# Simulate each trade
for outcome in outcomes:
    # Calculate the result of the trade
    if outcome == 1:
        # Win: add profit (trade_amount) and subtract commission
        balance += trade_amount - (trade_amount * commission_rate)
    else:
        # Loss: subtract loss (trade_amount) and subtract commission
        balance -= trade_amount + (trade_amount * commission_rate)
    
    # Append the updated balance to the equity curve
    equity_curve.append(balance)

# Plot the equity curve
plt.figure(figsize=(7, 4))
plt.plot(equity_curve)
plt.title('Equity Curve with 10% Commission on Each Trade')
plt.xlabel('Number of Trades')
plt.ylabel('Balance')
plt.grid(True)
plt.show()

4. Größere Schritte im Optimierungsprozess und Beachtung der Parameterempfindlichkeit

    Im MetaTrader 5 Optimierungsterminal können Sie die Schrittgröße für jeden Parameterversuch einstellen. Es wird empfohlen, größere Schritte im Vergleich zum üblichen Wert des Parameters zu verwenden. Die Konzentration auf sehr spezifische Werte kann leicht zu einer Überanpassung und zu einer Empfindlichkeit gegenüber Regimewechseln führen. Im letzten Jahr hätte eine Mean-Reversion-Strategie beispielsweise am besten mit einem RSI-Rückblick von 11 funktioniert, aber in diesem Jahr könnte es 13 sein. Wenn wir uns auf kleine, inkrementelle Werte konzentrieren, können wir die breiteren Leistungsmuster in Bezug auf die Parameter übersehen und Zeit mit ineffizienter Optimierung verschwenden.

    Optimierungsschritt

    Ich persönlich ziehe es vor, den Gewinnfaktor als Kennzahl für die Performance zu verwenden, da es sich um ein Verhältnis und nicht um eine absolute Zahl wie die Gesamtrendite handelt.

    Gewinnfaktor = Bruttogewinn / Bruttoverlust.

    Auch die Sensibilität der Parameter ist entscheidend. Wir wollen sicherstellen, dass unsere Versuche ein breites Spektrum an möglichen Werten für jeden Parameter abdecken. Im Idealfall sollte der Bereich um den besten Wert eine konkave Verteilung aufweisen, bei der die Leistung allmählich und mit gleichmäßiger Geschwindigkeit abnimmt, wenn der Parameterwert von der optimalen Einstellung abweicht. Dadurch wird sichergestellt, dass die Strategie trotz der Variationen der Parameterwerte ihre Vorteile beibehält und dass die besten Leistungsparameter die optimale Einstellung für die Strategie darstellen.

    Optimierungsergebnis


    Tests außerhalb der Stichprobe

    Unabhängig davon, ob Sie die Parameter optimieren oder den EA auf verschiedenen Zeitrahmen und Symbolen testen, ist es am besten, aktuelle Daten von Ihren Tests auszuschließen. Diese Datenpunkte sollten außerhalb Ihres Wissensbereichs liegen, bevor Sie Änderungen an Ihrem ursprünglichen EA vornehmen. Dieser Ansatz ist als In-Sample/Out-of-Sample-Test bekannt.

    Das Ziel dieser Testmethode ist es, eine Verzerrung durch Vorausschau zu vermeiden, bei der Änderungen an Ihrem EA auf bekannten Merkmalen des jüngsten Marktverhaltens basieren. Dadurch wird auch das Risiko einer Überanpassung während der Optimierung verringert.

    Legen Sie dazu zunächst den Gesamtumfang der Stichprobe fest, die Sie testen möchten. Auf der Grundlage der Anzahl der Stichprobenprüfungen können Sie ein Verhältnis von In-Sample zu Out-of-Sample wählen, z. B. 7:3, 8:2 oder 9:1. Anschließend nehmen Sie alle Beobachtungen, Annahmen und Änderungen an Parameterwerten und Signalregeln anhand der Daten der Stichprobe vor. Wenden Sie anschließend den endgültigen EA für einen Backtest auf die Out-of-Sample-Daten an, um zu prüfen, ob Ihre Annahmen konsistent sind. Wenn ein EA, der so optimiert wurde, dass er im In-Sample-Test exzellente Ergebnisse erzielt, im Out-of-Sample-Test kaum profitabel ist oder sogar verliert, könnte dies entweder auf eine Kantenerosion aufgrund der jüngsten Regimewechsel oder auf eine Überanpassung während der In-Sample-Optimierung hindeuten.

    Bei der Bewertung, ob die Konsistenz eines EA durch In-Sample- und Out-of-Sample-Tests gewährleistet ist, sind mehrere Schlüsselkennzahlen zu berücksichtigen.

    Erstens sollten Sie eine Version Ihres EAs ohne den Leverage-Compounding-Effekt erstellen, da dies die Ergebnisse verzerren und dem Ende der Stichprobe übermäßige Bedeutung beimessen könnte.

    Hier sind die wichtigsten Kennzahlen, auf die Sie achten sollten:

    1. Gewinn-Faktor: Der Gewinnfaktor sollte größer als 1 sein, wobei die Spanne zwischen 1,2 und 1,5 liegen sollte. Ein Gewinnfaktor von weniger als 1,2 kann darauf hindeuten, dass die Strategie nicht profitabel genug ist, während ein Wert von mehr als 1,5 darauf hindeuten könnte, dass die Stichprobengröße zu klein ist oder dass die Handelskosten nicht berücksichtigt wurden. Dies bedeutet zwar nicht unbedingt, dass Ihre Strategie betrügerisch ist, aber Sie sollten vorsichtig sein, wenn die Ergebnisse unrealistisch erscheinen.

    2. Maximale Inanspruchnahme des Kapitals: Konzentrieren Sie sich auf den maximalen Kapital-Drawdown und nicht auf den absoluten Drawdown, da dieser das potenzielle Risiko widerspiegelt und nicht das bereits eingetretene Risiko. Der maximale Kapital-Drawdown sollte mindestens 10 % niedriger sein als Ihre persönliche maximale Drawdown-Toleranz. Wenn er zu niedrig ist, können Sie in Erwägung ziehen, das Risiko Ihres EAs zu erhöhen, und wenn er zu hoch ist, müssen Sie das Risikoprofil Ihrer Strategie möglicherweise neu bewerten.

    3. LR-Korrelation: Die lineare Regressionskorrelation (LR) misst die Konsistenz Ihrer Aktienkurve. Eine Korrelation von mehr als 0,9 bedeutet, dass die Renditen während des gesamten Testzeitraums relativ konstant waren. Dies trägt dazu bei, dass die Strategie keine großen Schwankungen aufweist und die Leistung konstant ist.

    4. Gewinnrate und Handelsvolumen für Kauf- und Verkaufs-Positionen: Wenn Ihr EA sowohl mit Kauf- als auch mit Verkaufs-Positionen handelt, stellen Sie sicher, dass ihre Gewinnraten und Handelsvolumina einigermaßen ähnlich sind. Eine erhebliche Diskrepanz zwischen den beiden Werten könnte ein Zeichen für ein Ungleichgewicht in der Strategie sein, das möglicherweise behoben werden muss.

    Auch wenn andere Messgrößen ebenfalls wichtig sind, sind diese drei die wichtigsten Faktoren, die bei der Bewertung der Zuverlässigkeit Ihres EA während der In-Sample- und Out-of-Sample-Tests zu beachten sind.

    Beispiel Backtest

    Einige traditionelle Händler bevorzugen die Walk-Forward-Analyse, bei der der In-Sample/Out-of-Sample-Test Stück für Stück bis zum aktuellen Zeitpunkt „vorwärts“ durchgeführt wird. Ich glaube jedoch, dass dies oft unnötig ist, vor allem, wenn wir bereits sichergestellt haben, dass unsere Parameter nur wenige sind und nicht zu sehr an bestimmte Werte angepasst wurden. In solchen Fällen ist es sehr wahrscheinlich, dass diese optimalen Parameterwerte im Laufe der Zeit konstant bleiben. Außerdem haben wir bereits betont, dass der Schlüssel zum Vorteil einer Strategie in ihren Signalregeln und nicht in ihren Parameterwerten liegt. Daher reicht in der Regel ein einziger In-Sample/Out-of-Sample-Test aus, um die Ergebnisse zu validieren.

    Bei Strategien, die auf maschinellem Lernen basieren, ist die Situation jedoch anders. Der Vorteil dieser Strategien liegt häufig in den Parametern des zugrunde liegenden maschinellen Lernmodells, die je nach Zeitraum der Trainingsdaten erheblich variieren können. In diesem Fall ist eine Walk-Forward-Analyse erforderlich, um zu berücksichtigen, wie sich die Modellleistung bei unterschiedlichen Datensätzen im Laufe der Zeit ändern könnte. Ich habe in diesem Artikel ausführlich erklärt, wie man eine Walk-Forward-Analyse durchführt. Letztendlich ist die wichtigste Erkenntnis, dass der EA in letzter Zeit einigermaßen profitabel bleiben muss, um seine weitere Lebensfähigkeit zu bestätigen.


    Ausreißer-Tests

    Das Testen von Ausreißern stellt sicher, dass Ihre Gewinne nicht von einigen wenigen Ausreißer-Geschäften bestimmt werden, die den Großteil der Gewinne ausmachen, sondern dass sie aus gleichmäßigen, ausgeglichenen Gewinnen und Verlusten stammen. Dies ist wichtig, denn wenn Gewinne in erster Linie auf einige wenige Ausreißer zurückzuführen sind, untergräbt dies den Wert einer größeren Anzahl von Stichproben zur Annäherung an die mittlere Rendite. Um dies zu überprüfen, untersuchen Sie einfach Ihre Backtest-Aktienkurve und vergewissern Sie sich, dass ihre Aufwärtsbewegung nicht durch ein paar große Ausschläge, sondern durch ein stetiges, konsistentes Wachstum verursacht wird. Außerdem können Sie dies bestätigen, indem Sie den größten Gewinn mit dem durchschnittlichen Gewinn im Backtest-Bericht vergleichen.

    Wir wollen auch sicherstellen, dass sich die Gewinne nicht hauptsächlich auf einen kurzen Zeitraum konzentrieren, da dies auf eine vorübergehende Verzerrung des Systems hindeuten könnte. Um dies zu überprüfen, untersuchen wir die Verteilung der monatlichen Renditen, um die Konsistenz sicherzustellen. Rufen Sie zunächst den Backtest-Bericht auf, indem Sie mit der rechten Maustaste auf den Bericht klicken und ihn speichern. 

    Speichern als Excel-Bericht

    Öffnen Sie dann die Datei und notieren Sie die Zeilennummer der Zeile „Deals“ (in diesem Beispiel ist es 9342).

    Zeile finden

    Zum Schluss können Sie das Jupyter Notebook von Python verwenden, um den folgenden Code auszuführen und eine Tabelle der monatlichen Renditen in Prozent auszugeben.
    import pandas as pd
    import matplotlib.pyplot as plt
    # Replace 'your_file.xlsx' with the path to your file
    input_file = 'your_backtest.xlsx'
    # Load the Excel file and skip the first {skiprows} rows, skiprows = the row of "DEAL"
    data = pd.read_excel(input_file, skiprows=9342)
    # Select the 'profit' column (assumed to be 'Unnamed: 10') and filter rows as per your instructions
    profit_data = data[['Time','Symbol','Profit','Balance']][1:-1] 
    profit_data = profit_data[profit_data.index % 2 == 0]  # Filter for rows with odd indices
    profit_data = profit_data.reset_index(drop=True)  # Reset index
    # Convert to float, then apply the condition to set values to 1 if > 0, otherwise to 0
    profit_data[['Profit','Balance']] = profit_data[['Profit','Balance']].apply(pd.to_numeric, errors='coerce').fillna(0)  # Convert to float, replacing NaN with 0
    
    # Load the data
    data = profit_data
    
    # Calculate percentage gain compared to the previous balance
    data['percentage_gain'] = data['Profit'] / data['Balance'].shift(1) * 100
    
    # Drop the first row because it doesn't have a previous balance to compare
    data = data.dropna()
    
    # Ensure 'time' is in datetime format
    data['Time'] = pd.to_datetime(data['Time'])
    
    # Extract the year and month from the 'time' column
    data['year'] = data['Time'].dt.year
    data['month'] = data['Time'].dt.month_name()
    
    # Ensure months are ordered correctly (January to December)
    month_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
    data['month'] = pd.Categorical(data['month'], categories=month_order, ordered=True)
    
    # Calculate the total return for each year-month combination
    monthly_return = data.groupby(['year', 'month'])['percentage_gain'].sum().unstack(fill_value=0)
    
    # Function to apply color formatting based on return value
    def colorize(val):
        color = 'green' if val > 0 else 'red'
        return f'background-color: {color}'
    
    # Display the table with color coding
    styled_table = monthly_return.style.applymap(colorize, subset=pd.IndexSlice[:, :])
    
    # Show the table
    styled_table

    Beispiel für eine monatliche Rendite

    Drawdown-Monate sind bei langfristigen Backtests fast unvermeidlich, aber hier müssen wir uns auf den prozentualen Ertrag konzentrieren und bestätigen, dass keiner der Drawdowns signifikant größer ist als der mittlere Ertrag der gesamten Stichprobe.

    Wenn Ihr EA mit mehreren Vermögenswerten handelt, müssen wir sicherstellen, dass kein einzelner Vermögenswert für den Großteil der Gewinne verantwortlich ist, während andere nur wenig dazu beitragen. Zu diesem Zweck können wir unseren ursprünglichen Python-Code erweitern, indem wir Zeilen hinzufügen, um ein Tortendiagramm zu erstellen, das die Renditeverteilung auf die verschiedenen Vermögenswerte zeigt.

    import seaborn as sns
    # Group by symbol and calculate the total profit/loss for each symbol
    symbol_return = data.groupby('Symbol')['percentage_gain'].sum()
    
    # Plot the pie chart
    plt.figure(figsize=(7, 3))
    plt.pie(symbol_return, labels=symbol_return.index, autopct='%1.1f%%', startangle=90, colors=sns.color_palette("Set2", len(symbol_return)))
    
    # Title and display
    plt.title('Total Return by Symbol')
    plt.show()

    Tortendiagramm

    Wir müssen lediglich sicherstellen, dass kein einzelner Vermögenswert das Tortendiagramm dominiert.


    Erweiterte Vorschläge

    Hier führe ich vier fortgeschrittenere Robustheitstests auf, die möglicherweise mehr Fachwissen und Zeit erfordern.

    1. Live-Handelstest: 

    Implementieren Sie die Strategie in einer realen oder papierbasierten Handelsumgebung mit kleinen Positionsgrößen und beobachten Sie die Performance im Laufe der Zeit unter realen Marktbedingungen. Der Live-Handel testet die Fähigkeit der Strategie, mit der realen Marktdynamik umzugehen, einschließlich Slippage, Spreads und Ausführungsverzögerungen.

    Sie hilft zu beurteilen, ob die Strategie unter realen Handelsbedingungen und unter emotionalem Druck die erwartete Leistung erbringen kann, was über Backtesting oder Simulationen hinausgeht.

    2. Monte-Carlo-Simulation: 

    Führen Sie eine Monte-Carlo-Simulation durch, indem Sie die Reihenfolge der Handelsergebnisse (Gewinne und Verluste) zufällig mischen und eine große Anzahl möglicher Kapitalkurven erzeugen. Dies kann auch zufällige Anpassungen von Parametern wie Einstiegspunkte oder Stop-Loss umfassen.

    Monte-Carlo-Simulationen helfen dabei, die Robustheit einer Strategie gegenüber zufälligen Marktbedingungen zu bewerten. Sie bieten einen Einblick in potenzielle Worst-Case-Szenarien und stellen sicher, dass die Strategie nicht zu sehr auf vergangene Daten optimiert ist.

    3. Analyse des Drawdowns und des Risikos des Ruins: 

    Analysieren Sie den maximalen Drawdown der Strategie, d. h. den größten Peak-to-Valley-Verlust des Eigenkapitals, und berechnen Sie das Risiko eines Ruins bzw. die Wahrscheinlichkeit, dass der Kontostand angesichts des aktuellen Risiko-/Ertragsprofils auf Null sinkt.

    Diese Kennzahlen ermöglichen ein besseres Verständnis des Risikoprofils der Strategie und helfen bei der Beurteilung, ob der maximale Drawdown akzeptabel ist und wie hoch die Wahrscheinlichkeit ist, dass das Konto unter bestimmten Marktbedingungen erschöpft wird. Diese Analyse ist für die langfristige Überlebensfähigkeit von entscheidender Bedeutung.

    4. Schlupf und Ausführungssimulation:

    Simulieren Sie den Schlupf oder Slippage und reale Ausführungsverzögerungen, indem Sie zufällige Abweichungen zwischen den erwarteten Einstiegs- und Ausstiegspunkten und der tatsächlichen Marktausführung einführen. Sie können Slippage auf der Grundlage von Faktoren wie Marktvolatilität, Handelsgröße und Liquidität modellieren. MetaTrader 5 Strategie Tester haben Stresstest, die mit diesem hilfreich sein würde.

    Die Ausführung ist ein Schlüsselfaktor für die Rentabilität in der Praxis. Dieser Test hilft zu beurteilen, wie empfindlich die Strategie auf Ausrutscher reagiert und ob sie auch unter weniger idealen Ausführungsbedingungen profitabel bleibt. Slippage ist vor allem bei Strategien von Bedeutung, die nur in Zeiten hoher Volatilität gehandelt werden, z. B. bei Strategien für Nachrichtenereignisse. Abgesehen davon schlage ich vor, dass die meisten Einzelhändler sich nicht damit befassen müssen, da Slippage in beide Richtungen geht. In den meisten Fällen heben sich positive und negative Slippage gegenseitig auf, sodass die Auswirkungen im Vergleich zu anderen Handelskosten relativ gering sind.


    Schlussfolgerung

    In diesem Artikel habe ich gezeigt, wie Sie die Robustheit Ihres Expertenberaters oder eines an Sie verkauften Expertenberaters rigoros testen können. Zunächst habe ich das Bewusstsein für potenzielle Marketingtaktiken geschärft, die Verkäufer zur betrügerischen Manipulation von Daten auf dem MQL5-Marktplatz einsetzen könnten, und erklärt, warum diese Taktiken unwirksam sind. Als Nächstes habe ich das Konzept der Überanpassung anhand eines Experiments in Python vorgestellt. Anschließend habe ich die wichtigsten Überlegungen zum Backtest und zur Optimierung in MetaTrader 5 dargelegt und die Beweggründe für jeden Tipp erläutert. Anschließend ging ich auf Out-of-Sample-Tests ein und erläuterte, wie man verschiedene Berichtsmetriken auswertet. Ich habe auch drei Arten von Ausreißertests behandelt - Handels-, Zeit- und Symbolausreißer - und klare Anweisungen gegeben, wie man auf jeden dieser Ausreißer testen kann. Schließlich habe ich den Artikel mit weiteren Vorschlägen für fortgeschrittene Robustheitstests abgeschlossen.

    Übersetzt aus dem Englischen von MetaQuotes Ltd.
    Originalartikel: https://www.mql5.com/en/articles/16957

    Beigefügte Dateien |
    Letzte Kommentare | Zur Diskussion im Händlerforum (6)
    Zhuo Kai Chen
    Zhuo Kai Chen | 21 Feb. 2025 in 06:55
    Omega J Msigwa #:
    Toller Artikel, zhuo.

    Danke!

    Daniel Opoku
    Daniel Opoku | 10 März 2025 in 16:37

    Gute Arbeit, Zhuo, und ein lesenswerter Artikel. Unter Punkt 4 heißt es:

    4.Gewinnrate und Handelsvolumen für Long- und Short-Positionen: Wenn Ihr EA sowohl mit Long- als auch mit Short-Positionen handelt, stellen Sie sicher, dass ihre Gewinnraten und Handelsvolumina einigermaßen ähnlich sind.

    Eine erhebliche Diskrepanz zwischen den beiden könnte auf ein Ungleichgewicht in der Strategie hindeuten, das möglicherweise behoben werden muss.

    Gilt dies für eine einseitige Trendrichtung (der Kauftrend dominiert über einen längeren Zeitraum als der Verkaufstrend. Sollte der EA dennoch ähnliche Gewinnraten und Handelsvolumina aufweisen?

    Zhuo Kai Chen
    Zhuo Kai Chen | 11 März 2025 in 02:38
    Daniel Opoku Handelsvolumen für Long- und Short-Positionen: Wenn Ihr EA sowohl mit Long- als auch mit Short-Positionen handelt, stellen Sie sicher, dass ihre Gewinnquoten und Handelsvolumina einigermaßen ähnlich sind.

    Eine erhebliche Diskrepanz zwischen den beiden könnte auf ein Ungleichgewicht in der Strategie hindeuten, das möglicherweise behoben werden muss.

    Gilt dies für eine einseitige Trendrichtung (der Kauftrend dominiert über einen längeren Zeitraum als der Verkaufstrend. Sollte der EA dennoch ähnliche Gewinnraten und Handelsvolumina aufweisen?

    Vielen Dank für die Kommentare.

    Es hängt davon ab, wie viel Beta in der Strategie enthalten ist. Wenn eine Single-Asset-Strategie mit einem höheren Zeitrahmen und einer längeren Haltedauer gehandelt wird, ist es wahrscheinlich, dass das Ergebnis der Strategie eine gewisse Verzerrung aufweist, die dem Makrotrend folgt. Deshalb habe ich den Leuten geraten, mit Strategien zu handeln, die große Mengen (Volumen) handeln, indem sie mit höherer Frequenz handeln oder eine Strategie auf mehrere unkorrelierte Vermögenswerte diversifizieren. Wenn eine Strategie keine Annahmen über die Trendverzerrung enthält und symmetrische Regeln für Kauf und Verkauf hat, dann sollte man erwarten können, dass sie über einen großen Stichprobenumfang hinweg ähnliche Handelsmengen und Gewinnquoten aufweist.

    Natürlich können Strategien mit Trendannahmen verbunden sein, wie einige Long-Only-Strategien für Indizes. Bei dieser Art von Strategie sollten die Händler nur mit einer Seite handeln, da sie bereits davon ausgehen, dass die andere Richtung nicht so gut funktioniert wie diese. Stellen Sie einfach sicher, dass Sie nicht zu viele einseitige Annahmen verwenden, und es sollte alles in Ordnung sein.

    linfo2
    linfo2 | 26 März 2025 in 03:10
    Vielen Dank Zhuo für die Zeit mit diesem, öffnete meine Augen zu Python verwenden, um die Ergebnisse zu analysieren, ist die größte Herausforderung für mich war es die ea oder der Trend verantwortlich für die Ergebnisse :) Wahrscheinlich sollte ich eine Wahrscheinlichkeitsmetrik einfügen.
    Zhuo Kai Chen
    Zhuo Kai Chen | 26 März 2025 in 06:29
    linfo2 #:
    Vielen Dank Zhuo für die Zeit mit diesem, öffnete meine Augen zu Python verwenden, um die Ergebnisse zu analysieren, ist die größte Herausforderung für mich war es die ea oder der Trend verantwortlich für die Ergebnisse :) Wahrscheinlich sollte man eine Wahrscheinlichkeitsmetrik einbeziehen.

    Ziehen Sie in Erwägung, eine monatliche Renditekorrelationsprüfung zwischen dem gehandelten Markt und Ihrem Backtest-Ergebnis durchzuführen. Wenn die Korrelation hoch ist wie über 0,2, dann kann es vorschlagen, der Markttrend ist verantwortlich für einen großen Teil Ihrer Backtest-Ergebnis, das ist nicht erwünscht.

    Erstellen eines Handelsadministrator-Panels in MQL5 (Teil IX): Code Organisation (I) Erstellen eines Handelsadministrator-Panels in MQL5 (Teil IX): Code Organisation (I)
    Diese Diskussion befasst sich mit den Herausforderungen, die bei der Arbeit mit großen Codebasen auftreten. Wir werden die besten Praktiken für die Codeorganisation in MQL5 untersuchen und einen praktischen Ansatz zur Verbesserung der Lesbarkeit und Skalierbarkeit des Quellcodes unseres Trading Administrator Panels implementieren. Darüber hinaus wollen wir wiederverwendbare Code-Komponenten entwickeln, von denen andere Entwickler bei der Entwicklung ihrer Algorithmen profitieren können. Lesen Sie weiter und beteiligen Sie sich an der Diskussion.
    Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 13): RSI-Sentinel-Tool Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 13): RSI-Sentinel-Tool
    Die Kursentwicklung kann durch die Identifizierung von Divergenzen effektiv analysiert werden, wobei technische Indikatoren wie der RSI wichtige Bestätigungssignale liefern. Im folgenden Artikel erläutern wir, wie eine automatisierte RSI-Divergenzanalyse Trendfortsetzungen und -umkehrungen erkennen kann und damit wertvolle Einblicke in die Marktstimmung bietet.
    Einführung in MQL5 (Teil 12): Ein Anfängerleitfaden für das Erstellen nutzerdefinierter Indikatoren Einführung in MQL5 (Teil 12): Ein Anfängerleitfaden für das Erstellen nutzerdefinierter Indikatoren
    Erfahren Sie, wie Sie einen nutzerdefinierten Indikator in MQL5 erstellen können. Mit einem projektbezogenen Ansatz. Dieser einsteigerfreundliche Leitfaden behandelt Indikatorpuffer, Eigenschaften und Trendvisualisierung und ermöglicht es Ihnen, Schritt für Schritt zu lernen.
    MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 54): Verstärkungslernen mit hybriden SAC und Tensoren MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 54): Verstärkungslernen mit hybriden SAC und Tensoren
    Soft Actor Critic ist ein Reinforcement Learning-Algorithmus, den wir bereits in einem früheren Artikel vorgestellt haben, in dem wir auch Python und ONNX als effiziente Ansätze für das Training von Netzwerken vorgestellt haben. Wir überarbeiten den Algorithmus mit dem Ziel, Tensoren, Berechnungsgraphen, die häufig in Python verwendet werden, zu nutzen.