Optimierung des Handelsroboters: ein genetischer Algorithmus



    In einem früheren Artikel begann ich durch die Parameteroptimierungsmethoden zu vergleichen, dh die Auswahl der Parameter, Roboterhandels Rentabilität in den nachfolgenden Auswertung bektesta . Es stellte sich heraus, dass die banale Monte-Carlo-Methode - die Erzeugung zufälliger unkorrelierter Kombinationen von Roboterparametern - recht gut funktioniert. Nun möchte ich einen beliebten Algorithmus testen, auch in der Community der Programmierhändler: den genetischen Optimierungsalgorithmus .

    Genetischer Algorithmus zur Optimierung der Handelsstrategie


    Wir betrachten diesen Algorithmus am Beispiel der Optimierung von 2 Parametern. Optimierte Parameter unseres Roboters - die Periode des gleitenden Durchschnitts und TakeProfit . Um mehr in die "Genetik" einzutauchen, nennen wir die Periode das für "Wachstum" verantwortliche gleitende Durchschnittsgen und TakeProfit - das "Augenfarben" -Gen.

    Im Bereich der zulässigen Werte der Parameter beschreibt jeder Punkt, jedes Koordinatenpaar - "Höhe / Augenfarbe", theoretisch ein "Individuum". Angenommen, wir haben zufällig 10 Personen erstellt. Dies war der erste Schritt des genetischen Optimierungsalgorithmus - um die erste Generation zu schaffen:



    Im Koordinatenraum M - T werden Punkte zufällig ausgewählt. Zum Beispiel sind zwei Punkte, die mit einem roten Rahmen markiert sind, "Individuen" mit geschlechtsneutralen Namen (dies ist ein wichtiger Punkt!) Zhenya und Sasha. Sashas "Wachstum" (in der ursprünglichen Formulierung des Problems ist der Zeitraum des gleitenden Durchschnitts) beträgt 11 Einheiten, die "Augenfarbe" beträgt 0,6 (grün-blaue Augen). Zhenya hat etwas andere Parameter. Dieselben Merkmale beschreiben die 8 verbleibenden Individuen.

    Der zweite Schritt ist die Reproduktion


    Von der gesamten ersten Generation identifizieren wir einige der "erfolgreichsten" Individuen. Das Kriterium ist offensichtlich der Wert des ZF . Diese Individuen züchten und bilden zufällig Paare (aus diesem Grund erhielten sie geschlechtsneutrale Namen). Im Allgemeinen können Sie eine Reihe von Regeln für die Auswahl von Paaren festlegen. Um beispielsweise Individuen auszuwählen, die sich in Merkmalen (dh buchstäblich die engsten im Koordinatenraum) befinden, sind Inzucht. Sie können im Gegenteil nach Gegensätzen (Outzucht) suchen. Ich konnte keine Argumente für eine dieser Optionen finden - in meiner Realisierung werden die Paare nur zufällig gebildet ... Zum Beispiel haben Zhenya und Sasha die Qualifikation bestanden und beschlossen, einen Nachkommen zu gründen. Was bedeutet das in unserem Zusammenhang:



    Von zwei "Eltern" erhalten wir ein drittes Individuum, das einen Teil der Eigenschaften eines Elternteils und einen Teil des anderen Elternteils erbt. Zum Beispiel hatten Zhenya und Sasha eine Nikita-Person (Nikita, Nikita?):

    • Nikita erbte das Zeichen "Augenfarbe" (Parameter TakeProfit des Roboters) von einem der Eltern - "Eugene",
    • "Wachstum" (die Periode des Roboters mit gleitendem Durchschnitt) Nikita erbte von "Sasha" ... aber leicht korrigiert in Richtung des anderen Elternteils, Eugene.

    Tatsache ist, dass je kleiner die Dimension des Optimierungsraums ist (in unserem Fall ist er gleich 2), desto "näher" ist er an den Nachkommen. Der genetische Optimierungsalgorithmus bestimmt nicht streng die Regeln der "Vererbung" von Genen für das Tochterindividuum. Zufällig lieh Nikita sich die Farbe seiner Augen ohne Veränderungen, aber er befand sich auf halbem Weg zwischen den beiden Eltern, näher an einem von ihnen. Mit dem gleichen Erfolg konnte Nikita in meiner Implementierung die ursprünglichen Parameter von beiden Elternteilen ausleihen.

    Der dritte Schritt ist die Auswahl.


    Die treibende Kraft hinter dem Evolutionsprozess ist die natürliche Auslese. 4 von 10 besten Individuen gaben 10 weitere Nachkommen. Jetzt haben wir 20 Personen. Der genetische Optimierungsalgorithmus beinhaltet die Aufrechterhaltung einer konstanten Populationsgröße. 10 Personen müssen sterben. Bei dieser Implementierung „stirbt“ die Mehrheit der Menschen der ersten Generation von 80% bis 100%.
    Dementsprechend besteht die neue Generation in unserem Beispiel aus 0 ... 2 Elternteilen und 8 - 10 Nachkommen. Mit anderen Worten, wenn Sie die Texte weglassen, werden die neuen Vektoren der Parameter des Handelsroboters aus den im vorherigen Schritt erhaltenen Vektoren berechnet, der „Wiedergabe“ (Kombination) der 4 besten Tests. Die meisten "Alten" in der neuen Iteration werden nicht an der Auswahl teilnehmen (andere Varianten der Implementierung der Auswahl sind möglich).

    Vervollständigung des Algorithmus


    Wiedergabe und Auswahl werden N-mal wiederholt. Speziell in unserem Beispiel werden zum Vergleich mit den drei zuvor getesteten Algorithmen 4 Generationen von 10 Individuen für insgesamt 40 Tests getestet.
    Es kann jedoch vorkommen, dass eine andere Bevölkerung zusammenbricht. Mit anderen Worten, alle Tests befinden sich in der Nähe mehrerer Punkte. Um diese Situation zu vermeiden, werden verschiedene Mechanismen verwendet, insbesondere:

    • Infusion in die "Frischblut" Bevölkerung. Zu den Nachkommen der gegenwärtigen Bevölkerung werden mehrere neue Individuen hinzugefügt, die zufällig auf dieselbe Weise wie die ursprüngliche Bevölkerung gebildet wurden.
    • Mutationsmechanismus: Ein untergeordnetes Individuum kann einige der Merkmale (Koordinaten) aufweisen, die sich leicht von den Merkmalen seiner eigenen Eltern unterscheiden:



    in diesem Beispiel

    • Die Nachkommenseigenschaften von Jane und Joss - "Höhe" und "Augenfarbe" werden von jedem der Eltern übernommen.
    • Die Merkmale des Nachkommen Sam und Siri unterscheiden sich etwas von den entsprechenden Merkmalen beider Eltern.

    In meiner Implementierung musste die Bevölkerung trotz der Mutationen und „frischen Individuen“ periodisch vollständig aktualisiert werden, um eine vorzeitige Konvergenz und Lokalisierung der gesamten Bevölkerung in einem begrenzten Raum zu vermeiden.

    Wenn wir auf die ursprünglichen Daten zurückgreifen, bei denen wir die Monte-Carlo-Algorithmen, den Gradientenabstieg und den Algorithmus mit dem Arbeitsnamen „Seeschlacht“ getestet haben, kann der Optimierungsprozess mit der folgenden Animation veranschaulicht werden:



    Wie Sie der Animation entnehmen können, ist der Ort der Punkte zunächst chaotisch, aber bei nachfolgenden Generationen Trend zu Gebieten mit höheren ZF-Werten.

    Vergleichen Sie nun die Algorithmen auf derselben Oberfläche: P = f ( M , T ):



    Monte CarloGradientenabstieg"Seeschlacht"genetischer Algorithmus
    95,7%92,1%97,0%96,8%

    Der Durchschnittswert des gefundenen Extremums der TF als Prozentsatz des globalen Werts.

    Natürlich ist es früh, nach einem Satz von Eingangsdaten zu urteilen, aber bis jetzt ist der GA, der auf unseren Handelsroboter angewandt wird, dem Algorithmus "Seeschlacht" unterlegen:

    • ganz unbedeutend - durch den Durchschnitt des gefundenen quasi-optimalen Wertes der CF,
    • gibt die schlechteste Schätzung der parametrischen Stabilität des Handelsalgorithmus an, da er die Nachbarschaften der gefundenen quasi-optimalen Tupel von Parametern nicht ausreichend detailliert untersucht.

    Abschließender Test von 4 Optimierungsalgorithmen


    Der letzte Test wurde an 4 Eingabedatensätzen durchgeführt - den Ergebnissen des Backtests einer Handelsstrategie zu 4 verschiedenen Preissegmenten ( EURUSD : 2016, EURUSD: 2017, XAUUSD : 2016, XAUUSD: 2017).



    (Beispiele für FCs als Funktion von zwei Parametern für 4 Zeitreihen von Preisen)

    Diese Zeitoptimierung wurde gemäß 3 Parametern durchgeführt:

    1. "Schnelle" gleitende Durchschnittsperiode
    2. die Periode des "langsamen" gleitenden Durchschnitts
    3. TakeProfit (Gewinn der Transaktion in Prozent, zu dem die Transaktion abgeschlossen wurde).

    Jeder der Parameter hatte 20 verschiedene Werte. Summe, um die Tabelle
    P = F (Mf, Ms, T) zu erstellen ,
    wobei P Gewinn ist, Mf die Periode des sich schnell bewegenden Durchschnitts ist, Ms die Periode des sich langsam bewegenden Durchschnitts ist, T ist TakeProfit,
    20 * 20 * 20 = 8.000 Testdurchläufe.

    Die Optimierung wurde mit einem Limit von 160, 400 und 800 Tests durchgeführt (Berechnungen der CF in den ausgewählten Koordinaten). Jedes Mal wurden die Ergebnisse für 1.000 Optimierungsdurchläufe gemittelt. Der Durchschnittswert der CF für den gefundenen quasi-optimalen Vektor der Parameter war:
    Monte CarloGradientenabstieg"Seeschlacht"genetischer Algorithmus
    84,1%83,9%77,0%92,6%

    Unabhängig davon ist es erwähnenswert, dass GAs auch bei einem geringen Prozentsatz der Tests ein gutes Ergebnis aus der insgesamt möglichen Anzahl von Optionen zeigen:
    TestsMonte CarloGradientenabstieg"Seeschlacht"genetischer Algorithmus
    160 von 8.00079,1%76,7%73,1%87,7%
    400 von 8 00084,7%85,0%77,4%93,7%
    800 von 8 00088,6%90,1%80,4%96,3%

    Anstelle des Schlusses


    Das Ergebnis, das den genetischen Optimierungsalgorithmus zeigte, hat mich etwas überrascht. Ich glaube nicht, dass es das "genetische Paradigma" der Methode ist, das ihm den ersten Platz auf der Liste verschafft hat. In gewissem Sinne ähnelte er nach der Logik der Wahl der Koordinaten den Methoden der Dichotomie / des Goldenen Schnitts. Es lohnt sich wahrscheinlich, einen dieser Algorithmen auszuprobieren und die GA damit zu vergleichen.

    Zurück zum Handelsroboter ist es bemerkenswert, wie sich die "Entlastung" der Oberfläche, die durch den CF (Gewinn) gebildet wird, von Jahr zu Jahr ändert. Das heißt, den Roboter auf die Historie von 2017 „optimiert“ haben, macht es keinen Sinn, diese Einstellungen im Jahr 2018 (erstes Quartal, Monat, Woche, 2018) anzuwenden .

    Künstliche, dogmatische und hilflose Handelsstrategien wie unsere (Kaufen am Schnittpunkt des gleitenden Durchschnitts) werden wahrscheinlich nicht bald aus der Mode kommen. Andere Strategien konnte ich leider nicht treffen. Dementsprechend ist der Gewinn oder Verlust von Handelsrobotern eher dem Glück als den Vor- und Nachteilen des Algorithmus zuzuschreiben. Daher ist die Aufgabe der parametrischen Optimierung eines Handelsroboters für mich persönlich rein akademisches Interesse.

    Jetzt auch beliebt: