English
preview
Automatisierte Parameter-Optimierung für Handelsstrategien mit Python und MQL5

Automatisierte Parameter-Optimierung für Handelsstrategien mit Python und MQL5

MetaTrader 5Beispiele | 2 August 2024, 10:28
39 0
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Warum Auto-Optimierung unerlässlich ist

Stellen Sie sich vor, Sie haben mit viel Mühe einen Handelsroboter entwickelt. Sie sind gespannt darauf, es in Aktion zu sehen, starten aber ohne richtige Optimierung. Anfänglich positive Ergebnisse können den Eindruck erwecken, alles sei in Ordnung, doch schon bald treten Unstimmigkeiten und Verluste auf.

Einem nicht optimierten Bot fehlt es an Konsistenz und er kann auf irrelevante Daten reagieren, was zu unvorhersehbaren Gewinnen und Verlusten führt. Er könnte Entscheidungen auf der Grundlage falscher Signale treffen, sich nicht an Marktveränderungen anpassen und unvorhergesehene Risiken eingehen, was zu erheblichen Verlusten führen könnte. Die Optimierung sorgt für bessere Leistung und Zuverlässigkeit.

Die Leser werden die Bedeutung der Auto-Optimierung und die verschiedenen verwendeten Algorithmen verstehen und praktische Beispiele in Python und Expert Advisor (EA)-Skripten sehen. Sie lernen, wie sie die automatische Optimierung einrichten, Ergebnisse vergleichen und die Parameteroptimierung richtig konfigurieren, um die Effizienz ihrer Handelsstrategie zu steigern.

Zu den Selbstoptimierungsalgorithmen für Handelsstrategien gehören Parameteroptimierung, evolutionäre Algorithmen, heuristische Methoden, gradientenbasierte Techniken, maschinelles Lernen und simulationsbasierte Optimierung. Jede hat ihre eigenen Vor- und Nachteile, die auf die unterschiedlichen Handelsanforderungen und Marktbedingungen zugeschnitten sind.


Parameter-Optimierungstechniken

  1. Brute-Force-Optimierung: Testet alle Parameterkombinationen für präzise Ergebnisse, ist aber ressourcenintensiv.
  2. Rastersuche: Bewertet Kombinationen in einem Raster auf ausgewogene Gründlichkeit und Effizienz.
  3. Zufällige Suche: Testet Kombinationen nach dem Zufallsprinzip, um schnellere Ergebnisse zu erzielen, wobei eine gewisse Präzision geopfert wird.

Jede Technik hat ihre Stärken, sodass die Wahl von den verfügbaren Ressourcen, der Zeit und der gewünschten Präzision abhängt.


Warum und wann sollten wir Python verwenden?

Python-Programme sind ein hervorragendes Werkzeug, um Ideen auszuprobieren, Grafiken schnell zu erstellen und theoretische Aussagen mit historischen Handelsdaten zu bestätigen. Mit Python können die Nutzer Modelle flexibel entwickeln und anpassen, was das Experimentieren mit verschiedenen Strategien und Parametern erleichtert. Die Fähigkeit, detaillierte Charts und Visualisierungen zu erstellen, hilft, die Ergebnisse intuitiver zu interpretieren. Darüber hinaus kann durch die Möglichkeit der Integration historischer Daten überprüft werden, wie die Strategien in vergangenen Szenarien funktioniert hätten, wodurch die aufgestellten Theorien in der Praxis bestätigt werden können. Diese Kombination aus Geschwindigkeit, Flexibilität und Analysekapazität macht Python zu einem unschätzbaren Werkzeug für jeden Händler, der seine Strategien optimieren und die Finanzmärkte besser verstehen möchte.


Welche Strategie werden wir für diesen Artikel und seinen Indikator verwenden?

Die Strategie Mobile Sox Crossing (MAs Crossing) ist eine Handelstechnik, die auf dem Schnittpunkt zweier gleitender Durchschnitte basiert, um Kauf- und Verkaufssignale zu erzeugen. Sie verwendet zwei gleitende Durchschnitte mit unterschiedlichen Periodenlängen, einen kurzen und einen langen, um Veränderungen im Preistrend zu erkennen. Wenn der kurze MA über den langen MA kreuzt, wird ein Kaufsignal generiert, das auf einen möglichen Aufwärtstrend hinweist. Im Gegenteil, wenn der kurze MA unter den langen kreuzt, wird ein Verkaufssignal generiert, was auf einen möglichen Abwärtstrend hindeutet. Diese Strategie ist aufgrund ihrer Einfachheit und Wirksamkeit auf Märkten mit klaren Trends beliebt.

Der SMA-Indikator (Simple Moving Average) ist ein Instrument, das den Durchschnittspreis eines Vermögenswerts für einen bestimmten Zeitraum berechnet. Zur Berechnung eines SMA werden die Schlusskurse eines Vermögenswerts während des gewählten Zeitraums addiert und dann durch die Anzahl der Perioden geteilt. Der SMA glättet Kursschwankungen und hilft, die allgemeine Trendrichtung zu erkennen. Dieser Indikator ist nützlich, um das Marktrauschen zu eliminieren und einen klareren Blick auf den zugrunde liegenden Trend zu erhalten. In Python lassen sich SMA mit Hilfe von Bibliotheken wie pandas, die Funktionen zur effizienten und präzisen Berechnung gleitender Durchschnitte bieten, leicht berechnen.


Parameteroptimierungen mit Python. Fallstudie

Wir haben ein Skript für jede Technik in Python. Wir haben bereits die Unterschiede zwischen den einzelnen Ansätzen gesehen.

Die Strategie ist in allen drei Skripten die gleiche. Wenn Sie eine andere Strategie verwenden möchten, sollten Sie dies ändern:

    data = data.copy()  # Create a copy of the original DataFrame
    data['Short_MA'] = data['Close'].rolling(window=short_window).mean()
    data['Long_MA'] = data['Close'].rolling(window=long_window).mean()
    data['Signal'] = 0
    data.loc[data.index[short_window:], 'Signal'] = np.where(
        data['Short_MA'][short_window:] > data['Long_MA'][short_window:], 1, 0)
    data['Position'] = data['Signal'].diff()

Python ist sehr einfach, daher werde ich den Code nicht erklären.

Die drei Skripte sind dem Artikel beigefügt (b forec.py, grid search v2.py und random search v2.py).

Bevor Sie diese Skripte verwenden, müssen Sie die Bibliotheken installieren. Dazu können Sie pip verwenden:

pip install numpy pandas matplotlib itertools MetaTrader5 random 

Die Ergebnisse für jedes Skript werden mit diesen Eingaben in etwa so aussehen:

symbol = "EURUSD"
timeframe = mt5.TIMEFRAME_D1
start = pd.Timestamp("2020-01-01")
end = pd.Timestamp("2021-01-01")

Brute Force

Brute Force links

Brute Force rechts

Best parameters: Short = 14.0, Long = 43.0
Best performance: 10014.176, Risk: 3.7431030827241524e-05

Rastersuche

Rastersuche links

Rastersuche rechts

Best parameters: Short = 14.0, Long = 43.0
Best performance: 10014.176, Risk: 3.7431030827241524e-05

Zufällige Suche

Zufallssuche links

Zufallssuche rechts

Best parameters: Short = 14.0, Long = 44.0
Best performance: 10013.697, Risk: 3.725494046576829e-05

Diese Skripte optimieren sich nicht automatisch, sodass Sie jeden zu untersuchenden Zeitraum auswählen müssen.

Die Ergebnisse sind in allen Fällen gut und gleich, aber wir müssen berücksichtigen, dass die Strategie einfach war, während andere Strategien mehr Parameter und größere Bereiche haben können.


Wie oft sollte ich eine Strategie optimieren?

Die Optimierung einer Handelsstrategie ist entscheidend für die Aufrechterhaltung ihrer Wirksamkeit im Laufe der Zeit. Häufigkeit und Rückblick für die Optimierung hängen von mehreren Faktoren ab, insbesondere von der Marktvolatilität.

Stellen Sie sich vor, Sie entwickeln eine Handelsstrategie, die mit einem 1-Tages-Zeitraum arbeitet, d.h. jedes Signal basiert auf täglichen Marktdaten. Die Volatilität spielt hier eine wichtige Rolle: Wenn der Markt volatiler ist, sind die Kursbewegungen größer und schneller, was die Wirksamkeit Ihrer Strategie beeinträchtigen kann, wenn sie nicht richtig passt.

Um festzustellen, wann Sie optimieren und welchen Lookback Sie verwenden sollten, müssen Sie die Marktvolatilität beobachten. Eine gute Möglichkeit, dies zu tun, ist die Beobachtung der täglichen Preisspanne (HOCH - TIEF) oder der tatsächlichen durchschnittlichen Spanne der Handelsinstrumente, die Sie handeln. Nachstehend finden Sie einen ungefähren Richtwert auf der Grundlage der Volatilität.

Geringe Volatilität: Wenn der Markt ruhig ist und die täglichen Schwankungen gering sind, müssen die Strategien in der Regel seltener angepasst werden. Sie können sich vorstellen, alle 1-3 Monate mit einem längeren Rückblick zu optimieren, um stabilere Trends zu erfassen. Ein Rückblick von 50-100 Tagen könnte angemessen sein.

Mäßige Volatilität: Unter normalen Marktbedingungen mit regelmäßigeren, aber nicht extrem großen Kursbewegungen sollten Sie eine Optimierung alle 1-2 Monate in Betracht ziehen. Ein Rückblick von 20-50 Tagen könnte ausreichen, um signifikante Trendänderungen zu erfassen.

Hohe Volatilität: In Zeiten hoher Volatilität, wie in Krisenzeiten oder bei wichtigen wirtschaftlichen Ereignissen, sind die Kursbewegungen groß und schnell. Hier ist es von entscheidender Bedeutung, häufiger zu optimieren, möglicherweise alle 2 bis 4 Wochen, und einen kürzeren Rückblick, z. B. 10 bis 20 Tage, zu verwenden, um sich schnell an veränderte Marktbedingungen anzupassen.


MQL5 Beispiel für die Selbst-Optimierung

Dieser Code in MQL5 ist ein Handelsroboter, der eine Strategie zum Kreuzen gleitender Durchschnitte (MA) implementiert. Es arbeitet auf der Plattform MetaTrader 5 und ist für den automatischen Betrieb auf dem Finanzmarkt konzipiert. Der Bot verwendet zwei einfache MAs (SMAs) mit einstellbaren Perioden, um Kauf- und Verkaufssignale zu erzeugen, wenn sie sich kreuzen.

Das Hauptziel des Bots besteht darin, die MA-Perioden automatisch zu optimieren, um den Nettoertrag zu maximieren, den Drawdown zu minimieren oder den Sharpe Ratio zu maximieren, je nach der vom Nutzer gewählten Konfiguration. Dies wird durch einen Optimierungsprozess erreicht, der verschiedene Kombinationen von MA-Perioden in einem bestimmten Zeitraum historischer Daten testet.

Der Bot ist in mehrere Hauptabschnitte unterteilt:

1.  Initialisierung und Konfiguration: Legen Sie die Anfangsparameter fest, wie z. B. MA-Periode, Losgröße, magische Zahl zur Identifizierung der Aufträge usw.

2.  Optimierung: Verwenden Sie einen erschöpfenden Suchalgorithmus, um alle möglichen Kombinationen von MA-Perioden innerhalb bestimmter Bereiche zu testen. Die Optimierung erfolgt auf der Grundlage der ausgewählten Kriterien: Nettogewinn oder Mindest-Drawdpwn.

3.  Durchführung der Maßnahmen: Beobachten Sie den Markt kontinuierlich und eröffnen Sie Kauf- oder Verkaufspositionen, wenn sich die MAs kreuzen gemäß der festgelegten Strategie. Es werden auch offene Positionen verwaltet, indem es Verluste und Gewinne auf der Grundlage der ATR (Average True Range) angewendet werden.

4.  Automatische Re-Optimierung: In bestimmten (konfigurierbaren) Zeitabständen optimiert der Bot die Parameter der MAs neu, um sich an die veränderten Marktbedingungen anzupassen.

5.  Trailing Stopp: Implementieren Sie verschiedene Arten von Trailing (nachgezogene) Stops (Simple und Moral Expectation), um Gewinne zu sichern und sich vor Verlusten zu schützen.

6.  Trainingspläne: Es kann so konfiguriert werden, dass es an bestimmten Wochentagen oder zu bestimmten Zeiten nicht funktioniert.

7.  Fertigstellung und Säuberung: Der Roboter führt ordnungsgemäße Bereinigungs- und Schließvorgänge aller beim Anhalten offenen Vorgänge durch.

Zusammenfassend lässt sich sagen, dass es sich bei diesem Handelsroboter um eine komplexe Implementierung handelt, die die technische Analyse (Kreuzen von MAs) mit Risikomanagementstrategien (Stops und Trailing Stops) und automatischer Parameteroptimierung kombiniert. Es ist für den autonomen Betrieb konzipiert und wurde optimiert, um die risikoadjustierte Performance in einer automatisierten Handelsumgebung zu maximieren.

Die in dem Artikel und dem Code verwendeten Endanschläge sind dem Artikel entnommen: Trailing Stop im Handel von Aleksej Poljakov.

 


Der Code

Um eine andere Optimierungsmethode zu verwenden, sollten Sie diesen Teil des Codes ändern:

   for(int fastPeriod = FastMAPeriodStart; fastPeriod <= FastMAPeriodStop; fastPeriod += FastMAPeriodStep)
     {
      for(int slowPeriod = SlowMAPeriodStart; slowPeriod <= SlowMAPeriodStop; slowPeriod += SlowMAPeriodStep)
        {
         double criterionValue = PerformBacktest(fastPeriod, slowPeriod, startBar);

         if(IsNewOptimal(criterionValue, bestCriterionValue, OptimizationCriterion))
           {
            bestCriterionValue = criterionValue;
            bestFastPeriod = fastPeriod;
            bestSlowPeriod = slowPeriod;
           }
        }
     }

Um eine andere Strategie zu verwenden, sollten Sie diesen Teil des Codes (und seine Eingaben) ändern:

double fastMA_curr[];
   double slowMA_curr[];
   double fastMA_prev[];
   double slowMA_prev[];

   ArraySetAsSeries(fastMA_curr, true);
   ArraySetAsSeries(slowMA_curr, true);
   ArraySetAsSeries(fastMA_prev, true);
   ArraySetAsSeries(slowMA_prev, true);

   int fastMA_current = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
   int fastMA_previous = iMA(_Symbol, 0, FastMAPeriod, 1, MODE_SMA, PRICE_CLOSE);

   int slowMA_current = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
   int slowMA_previous = iMA(_Symbol, 0, SlowMAPeriod, 1, MODE_SMA, PRICE_CLOSE);


   CopyBuffer(fastMA_current, 0, 0, 2, fastMA_curr);
   CopyBuffer(slowMA_current, 0, 0, 2, slowMA_curr);
   CopyBuffer(fastMA_previous, 0, 0, 2, fastMA_prev);
   CopyBuffer(slowMA_previous, 0, 0, 2, slowMA_prev);

   double fastMA_previousFF = fastMA_prev[0];
   double slowMA_previousSS = slowMA_prev[0];
   double fastMA_currentFF = fastMA_curr[0];
   double slowMA_currentSS = slowMA_curr[0];

// Check for buy signal (fast MA crosses above slow MA)
   if(fastMA_previousFF < slowMA_previousSS && fastMA_currentFF > slowMA_currentSS)
     {
      // Close any existing sell positions
      if(PositionsTotal() > 0)
        {
         for(int i = PositionsTotal() - 1; i >= 0; i--)
           {
            if(PositionSelectByTicket(i))
              {
               if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                 {
                  Print("Closing sell position: Ticket ", PositionGetInteger(POSITION_TICKET));
                  ClosePosition(PositionGetInteger(POSITION_TICKET));
                 }
              }
           }
        }

      // Open a buy position
      double openPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double atrMultiplier = ATRmultiplier;
      OpenPosition(ORDER_TYPE_BUY, openPrice, atrMultiplier);
     }

// Check for sell signal (fast MA crosses below slow MA)
   else
      if(fastMA_previousFF > slowMA_previousSS && fastMA_currentFF < slowMA_currentSS)
        {
         // Close any existing buy positions
         if(PositionsTotal() > 0)
           {
            for(int i = PositionsTotal() - 1; i >= 0; i--)
              {
               if(PositionSelectByTicket(i))
                 {
                  if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                    {
                     Print("Closing buy position: Ticket ", PositionGetInteger(POSITION_TICKET));
                     ClosePosition(PositionGetInteger(POSITION_TICKET));
                    }
                 }
              }
           }

         // Open a sell position
         double openPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
         double atrMultiplier = ATRmultiplier;
         OpenPosition(ORDER_TYPE_SELL, openPrice, atrMultiplier);

        }
   IndicatorRelease(fastMA_current);
   IndicatorRelease(slowMA_current);
   IndicatorRelease(fastMA_previous);
   IndicatorRelease(slowMA_previous);
  }

Es ist wichtig zu beachten, dass das Chartfenster mit Indikatoren gefüllt wird, wenn Sie diese nicht freigeben.


Unterschied mit und ohne Auto-Optimierung

Wir verwenden den gleichen Zeitraum (vom 20.4.2024 bis zum 20.5.2024) für EURUSD und den Tages-Zeitrahmen (Daily).

Einstellungen mit Optimierung

Mit Optimierung

Eingaben mit Optimierung

Backtest mit Optimierung

Graph mit Optimierung

Ohne Auto-Optimierung

Eingänge ohne Auto-Optimierung

Backtest ohne Autoparametrisierung

Chart ohne Auto-Optimierung

Es ist eindeutig eine bessere Lösung, die automatische Optimierung durchzuführen. Ohne Auto-Optimierung wurde kein Geschäft abgeschlossen. Die erste wurde zu Beginn automatisch optimiert, und dann hatte sie 40 Tage Zeit, sich erneut zu optimieren (außerhalb des Zeitraums).


Schlussfolgerung

Die automatische Optimierung ist entscheidend für die konsistente und zuverlässige Leistung von Handelsrobotern auf den sich ständig verändernden Finanzmärkten. Durch diesen Artikel haben die Leser ein umfassendes Verständnis dafür gewonnen, warum Selbstoptimierung so wichtig ist, welche verschiedenen Arten von Algorithmen für die Optimierung von Handelsstrategien und -parametern zur Verfügung stehen und welche Vor- und Nachteile die verschiedenen Verfahren zur Parameteroptimierung haben. Die Bedeutung von Python als Werkzeug für ein schnelles und effizientes Backtesting von Strategien wurde ebenso hervorgehoben wie eine Fallstudie, die die Optimierung von Parametern anhand einer gleitenden Durchschnitts-Crossover-Strategie demonstrierte.

Der Artikel untersuchte ferner die Notwendigkeit einer regelmäßigen Optimierung auf der Grundlage der Marktvolatilität und betonte die Notwendigkeit häufiger Anpassungen, um die Wirksamkeit aufrechtzuerhalten. Ein Beispiel für die Selbstoptimierung mit MQL5 veranschaulicht die praktische Anwendung dieser Konzepte und zeigt die erheblichen Leistungsverbesserungen, die durch die automatische Optimierung erzielt werden können. Der Vergleich zwischen auto-optimierten und nicht-optimierten Bots unterstrich die klaren Vorteile der ersteren, wobei die optimierten Bots eine höhere Anpassungsfähigkeit und Effizienz aufwiesen.

Zusammenfassend lässt sich sagen, dass die Auto-Optimierung nicht nur die Leistung des Trading-Bots verbessert, sondern den Händlern auch mehr Vertrauen und Sicherheit gibt, da sie wissen, dass ihr Bot die Komplexität der Finanzmärkte effektiv bewältigen kann. Diese strategische Herangehensweise an die Entwicklung und Pflege von Trading-Bots ist für jeden unverzichtbar, der ernsthaft beständigen und nachhaltigen Erfolg im Handel erzielen möchte.


Bücher und Ausbildungs-Quellen

  • „Advances in Financial Machine Learning“ von Marcos López de Prado.
  • „Algorithmic Trading and DMA“ von Barry Johnson.
  • „Python for Data Analysis“ von Wes McKinney.
  • „Machine Learning for Asset Managers“ von Marcos López de Prado.
  • „Quantitative Trading: How To Build Your Own Algorithmic Trading Business“ von Ernest P.


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

Beigefügte Dateien |
b_forec.py (3.64 KB)
grid_search_v2.py (3.64 KB)
MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 24): Gleitende Durchschnitte MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 24): Gleitende Durchschnitte
Gleitende Durchschnitte sind ein sehr verbreiteter Indikator, der von den meisten Händlern verwendet und verstanden wird. Wir erforschen mögliche Anwendungsfälle, die in den mit dem MQL5-Assistenten zusammengestellten Expert Advisors vielleicht nicht so häufig vorkommen.
Beherrschung der Marktdynamik: Erstellen eines Expert Advisors (EA) mit Unterstützungs- und Widerstandsstrategie Beherrschung der Marktdynamik: Erstellen eines Expert Advisors (EA) mit Unterstützungs- und Widerstandsstrategie
Ein umfassender Leitfaden zur Entwicklung eines automatisierten Handelsalgorithmus auf der Grundlage einer Unterstützungs- und Widerstandsstrategie. Detaillierte Informationen zu allen Aspekten der Erstellung eines Expert Advisors in MQL5 und dem Testen in MetaTrader 5 - von der Analyse des Preisbereichsverhaltens bis zum Risikomanagement.
Eine alternative Log-datei mit der Verwendung der HTML und CSS Eine alternative Log-datei mit der Verwendung der HTML und CSS
In diesem Artikel werden wir eine sehr einfache, aber leistungsfähige Bibliothek zur Erstellung der HTML-Dateien schreiben, dabei lernen wir auch, wie man eine ihre Darstellung einstellen kann (nach seinem Geschmack) und sehen wir, wie man es leicht in seinem Expert Advisor oder Skript hinzufügen oder verwenden kann.
MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 23): CNNs MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 23): CNNs
Convolutional Neural Networks sind ein weiterer Algorithmus des maschinellen Lernens, der sich darauf spezialisiert hat, mehrdimensionale Datensätze in ihre wichtigsten Bestandteile zu zerlegen. Wir sehen uns an, wie dies typischerweise erreicht wird, und untersuchen eine mögliche Anwendung für Händler in einer anderen Signalklasse des MQL5-Assistenten.