Diskussion zum Artikel "Gradient Boosting (CatBoost) für die Entwicklung von Handelssystemen. Ein naiver Zugang"

 

Neuer Artikel Gradient Boosting (CatBoost) für die Entwicklung von Handelssystemen. Ein naiver Zugang :

Trainieren des Klassifikators CatBoost in Python und Exportieren des Modells nach mql5, sowie Parsen der Modellparameter und eines nutzerdefinierten Strategietesters. Die Python-Sprache und die MetaTrader 5-Bibliothek werden zur Vorbereitung der Daten und zum Training des Modells verwendet.

Der kompilierte Bot kann mit dem standardmäßigen Strategietester des MetaTrader 5 getestet werden. Wählen Sie einen geeigneten Zeitrahmen (der mit dem im Modelltraining verwendeten übereinstimmen muss) und Eingaben look_back und MA_period, die auch mit den Parametern aus dem Python-Programm übereinstimmen sollten. Überprüfen wir das Modell in der Trainingsphase (Trainings- + Validierungsteilstichproben):

Modellleistung (Trainings- + Validierungsteilstichproben)

Wenn wir das Ergebnis mit dem im nutzerdefinierten Tester erzielten Ergebnis vergleichen, sind diese Ergebnisse bis auf einige Abweichungen beim Spread gleich. Testen wir nun das Modell mit absolut neuen Daten vom Jahresanfang:

Leistung des Modells mit neuen Daten

Das Modell schnitt bei neuen Daten signifikant schlechter ab. Ein solch schlechtes Ergebnis hängt mit objektiven Gründen zusammen, die ich versuchen werde, näher zu beschreiben.

Autor: Maxim Dmitrievsky

 

Es gibt keinen Grund, hier etwas durcheinander zu bringen

train_X, test_X, train_y, test_y = train_test_split(X, y, train_size = 0.5, test_size = 0.5, shuffle=True)

Laut der Hilfe auf https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

shuffle bool, Voreinstellung=True

Ob die Daten vor der Aufteilung gemischt werden sollen oder nicht. Wenn shuffle=False, muss stratify None sein.

Die Daten werden vor der Aufteilung gemischt, d.h. einige Beispiele aus dem Test werden in den Zug aufgenommen.

Im Allgemeinen hat mir der Artikel gefallen, er zeigt, dass es recht einfach ist, KI im Handel zu implementieren und einzusetzen.

sklearn.model_selection.train_test_split — scikit-learn 0.23.2 documentation
  • scikit-learn.org
*arrays , **options ¶ Quick utility that wraps input validation and and application to input data into a single call for splitting (and optionally subsampling) data in a oneliner. Parameters *arrays Allowed inputs are lists, numpy arrays, scipy-sparse matrices or pandas dataframes. test_size If float, should be between 0.0 and 1.0 and represent...
 
Können Sie das letzte Diagramm aus dem Artikel erstellen, aber ohne Mischen?
Ich vermute, die Validierung würde sich verschlechtern und der Test mit unbekannten Daten könnte sich verbessern.
[Gelöscht]  
elibrarius:

Hier gibt es keinen Grund zur Aufregung

Laut der Hilfe https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Die Daten werden vor der Aufteilung gemischt, d.h. einige Beispiele aus dem Test werden in den Zug aufgenommen.

Im Allgemeinen hat mir der Artikel gefallen, er zeigt, dass es recht einfach ist, KI im Handel zu implementieren und einzusetzen.

Ich mache das absichtlich, um die Stichproben ein wenig auszugleichen. Ohne das Mischen fällt der Test schlechter aus, aber es hat fast keine Auswirkungen auf die neuen Daten. Ich werde später Beispiele zeigen.

 

Das ist es, was ich nicht verstehe:

if dataset['close'][i] >= (dataset['close'][i + rand]):
            labels.append(1.0)
        elif dataset['close'][i] <= (dataset['close'][i + rand]):
            labels.append(0.0)              
        else:
            labels.append(0.0)

Bedingungen, die niemals funktionieren werden, sind rot markiert.

[Gelöscht]  
Stanislav Korotky:

Das ist es, was ich nicht verstehe:

Bedingungen, die niemals funktionieren werden, sind rot markiert.

Hier ist alles in Ordnung, ich habe die Bedingungen geändert und habe immer noch Artefakte.

 
Maxim, ich danke Ihnen tausendmal für das Teilen solcher Artikel...
Insbesondere für den Import des Python-Modells auf mql5.
Ich bin zwar kein ALGLIB-Experte, aber ich bin der Meinung, dass XGBoost, CATBoost und Pytorch bei weitem überlegen sind, wenn es um maschinelles und tiefes Lernen geht.
 
Sehr interessante Arbeit! Vielen Dank an den Autor.
 
Es gibt eine Frage im Zusammenhang mit dem Artikel nicht direkt, aber indirekt, durch die Abhängigkeit von CatBoost.

Kann jemand mit den Fingern erklären, wie in CatBoost (oder allgemeiner - im histogrammbasierten Gradient-Boosting-Entscheidungsbaum) die Trennung nach Merkmalen (Eingangsvariablen) auf der Grundlage des Histogramms erfolgt? Es ist klar, dass für jedes Bin (Histogrammbalken) eine Statistik berechnet wird: die Gesamtzahl der Treffer von Vektoren mit einem Wert im Bin-Bereich und ihre Aufteilung nach Zugehörigkeit zu Ausgabeklassen (in diesem Fall zwei). Wie kann man nun, nachdem man ein Histogramm mit diesen Statistiken erstellt hat, eine Unterteilung für die Erstellung des nächsten Level Tree wählen?

 
Stanislav Korotky:
Es gab eine Frage im Zusammenhang mit dem Artikel, nicht direkt, aber indirekt über die CatBoost-Abhängigkeit.

Kann jemand mit den Fingern erklären, wie in CatBoost (oder allgemeiner - im histogrammbasierten Gradient-Boosting-Entscheidungsbaum) die Trennung nach Merkmalen (Eingangsvariablen) auf der Grundlage des Histogramms erfolgt? Es ist klar, dass für jedes Bin (Histogrammbalken) eine Statistik berechnet wird: die Gesamtzahl der Treffer von Vektoren mit einem Wert im Bin-Bereich und ihre Aufteilung nach Zugehörigkeit zu Ausgabeklassen (in diesem Fall zwei). Wie kann man nun, nachdem man ein Histogramm mit diesen Statistiken erstellt hat, eine Unterteilung für die Erstellung des nächsten Level Tree wählen?

Die Bäume werden unabhängig voneinander aufgebaut, und dann wird in den Blättern gezählt (Aufzählung durch nicht quantifizierte Prädiktoren), so dass der Gradientenfehler reduziert wird.

Bei der Auswahl der Prädiktoren für die Baumkonstruktion und die Baumaufteilung werden Zufallskoeffizienten verwendet, was es theoretisch ermöglicht, die Vollständigkeit (Recall) zu erhöhen und Übertraining zu vermeiden.

[Gelöscht]  
Stanislav Korotky:
Es gab eine Frage im Zusammenhang mit dem Artikel, nicht direkt, aber indirekt über die CatBoost-Abhängigkeit.

Kann jemand mit den Fingern erklären, wie in CatBoost (oder allgemeiner - im histogrammbasierten Gradient-Boosting-Entscheidungsbaum) die Trennung nach Merkmalen (Eingangsvariablen) auf der Grundlage des Histogramms erfolgt? Es ist klar, dass für jedes Bin (Histogrammbalken) eine Statistik berechnet wird: die Gesamtzahl der Treffer von Vektoren mit einem Wert im Bin-Bereich und ihre Aufteilung nach Zugehörigkeit zu Ausgabeklassen (in diesem Fall zwei). Wie kann man nun, nachdem man ein Histogramm mit diesen Statistiken erstellt hat, eine Unterteilung für die Erstellung des nächsten Level Tree wählen?

Es ist besser, die Entwickler zu fragen