Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 78

 
Mihail Marchukajtes:
Nein, Leute, das System ist weg, es macht nicht einmal Sinn, es zu zeigen.

Könnte es daran liegen, dass ich vergessen habe zu warnen, dass der ternäre Klassifikator seine Logik geändert hat?

Binär hat die gleiche Logik: Wenn der Ausgangswert kleiner als Null ist, ist das wie eine 0 in der Probe. Wenn es mehr ist, ist es 1 in der Stichprobe.

Und ternär, wenn die Ausgabe lautet: 1 als 1 in der Stichprobe, 0 als 0 in der Stichprobe, -1 als "-" in jPrediction.

 


einen Ausschuss von 8 Modellen gebildet und zur Validierung eine Folge von 4000 Geschäften (5,5 Jahre Handel) simuliert. Hierbei handelt es sich um eine Monte-Carlo-Simulation, um eine Vorstellung vom möglichen Umfang des Einlagenwachstums zu erhalten, ohne dass die anfänglichen Handelspunkte angepasst werden (was einen Lauf im Strategietester ergibt). Hier beträgt der MO bei Validierung 0,00026 Pips. Das untere Quantil liegt offensichtlich über Null, und das ist es, was ich erreichen wollte.

Als nächstes werden wir die Verteilung des Erholungsfaktors für diese Reihen analysieren.

Dies ist die Verteilung des Rückgewinnungsfaktors. Der Median von 3,7 ist sozusagen der Zielwert (Plan). Das untere Quantil ist auch nicht schlecht...

Wir müssen noch einen Trainingslauf mit 80 weiteren Proben abwarten und einen größeren Ausschuss bilden.

 
Yury Reshetov:

Könnte es daran liegen, dass ich vergessen habe zu warnen, dass der ternäre Klassifikator seine Logik geändert hat?

Binär hat die gleiche Logik: Wenn der Ausgangswert kleiner als Null ist, ist das wie eine 0 in der Probe. Ist sie größer, so ist sie in der Stichprobe 1.

Und ternär, wenn die Ausgabe lautet: 1 als 1 in der Stichprobe, 0 als 0 in der Stichprobe, -1 als "-" in jPrediction.

ҮNein, ich verstehe schon, das ist schon in Ordnung.... Da ist noch etwas anderes. Der Punkt ist, dass der Optimierer sehr gut darin ist, Daten zu finden, die Ausgabeinformationen enthalten. Sobald die Daten mit einer Generalisierung von über 80 % gefunden werden. Diese Daten können erfolgreich in jeder anderen Netztopologie verwendet werden, und das Trainingsergebnis wird perfekt sein, ohne erneutes Training usw. Diese Funktion ist für diejenigen gedacht, die den Optimierer nicht direkt für den Handel verwenden möchten. In meinem Fall stellte sich heraus, dass die Daten, die für die Klassifizierung des Outputs verwendet wurden, nicht ganz erfolgreich waren, so dass die Handelsergebnisse am Freitag nicht so waren, wie ich es mir gewünscht hätte. Ich habe mich jedoch nicht entmutigen lassen und eine andere Reihe von Prädikaten gefunden, die bei wiederholtem Aufbau nicht zu einem Zustand des Mülls bei Ein- und Ausstieg führen....... Hier sind einige Empfehlungen für die Verwendung des Klassifikators als intelligenter Signalfilter für Ihren TS (nicht die Vorhersage)

1. Trennen Sie Kauf- und Verkaufssignale getrennt voneinander. Wenn Sie Daten früherer Werte verwenden und eine solche Trennung die Reihenfolge der Daten durcheinander bringt, dann sollte eines der Prädikate unbedingt das Vorzeichen des Signals sein. Kauf=1, Verkauf=-1, d.h. eines der Prädikate ist die Richtung des Signals.

2. Die Prädikate müssen in irgendeiner Weise mit dem Vorhersagesystem verbunden sein. Ich habe es als Zscore des Signals, Kelli des Signals, Reihenfolge des Signals (das System ist nicht umkehrbar, also kann es mehrere aufeinanderfolgende Signale in einer Richtung geben). Im Grunde die Informationen, die in irgendeiner Weise mit dem System zusammenhängen. Sie können sogar die Momentum, separat in der Optimierer MT4 Ich wählte einen Parameter, der Gewinn auf einen Testzeitraum gibt, beim Handel durch das System Signale. D.h. Momentum ist für die Systemsignale auf dem Übungsplatz optimiert, etc.

3. Ausstieg. Dies ist der wichtigste Teil, denn ich hatte Ausgang 100 Pips Gewinn gab 50% der Verallgemeinerung, und änderte es auf 10 Pips und die Verallgemeinerung wuchs auf 65%. Im TS von Demark ist das ziemlich schwierig. Ich muss es mir oft manuell ansehen, weil die Formalisierung des Ansatzes in diesem Fall nicht passt........ Im Trainingsbereich ist es besser, Fehler in den Signalen zu machen, aber trotzdem ein Modell mit einem hohen Grad an Generalisierung zu erhalten. Nehmen wir an, das Signal hat im Training 100 Pips eingebracht und wir haben es trotzdem als 0 markiert, weil der Markt anfällig für die umgekehrte Seite des Signals war. D.h. wir lassen den TS absichtlich verlieren, um den Grad der Verallgemeinerung zu erhöhen und damit den TS in Zukunft besser funktionieren zu lassen. Schließlich ist unsere Leistung ideal, ein bisschen nicht ideal, aber richtig....

4) Verwenden Sie die Handelsvolumina der CME für die Vorhersagen. Dies funktioniert wirklich und erhöht den Grad der Verallgemeinerung des Modells erheblich...... Ich nehme vom Delta-Cluster, also so.....

 
Alexey Burnakov:

Hierbei handelt es sich um eine Monte-Carlo-Simulation, um eine Vorstellung vom möglichen Umfang des Einlagenwachstums zu erhalten, ohne dass die anfänglichen Handelspunkte angepasst werden (was einen Lauf im Strategietester ergibt).

Ich hoffe, dass unabhängig davon, wie Sie die Ausgangspunkte der Berufe verschieben, sie alle nach der Ausbildungszeit liegen. Wenn Sie beispielsweise das Modell mit Daten von Januar und März 2015 trainiert haben (und dabei die Daten vom Februar entfernt haben), sollten Sie die endgültige Validierung nicht im Februar durchführen, obwohl diese Daten nicht in der Trainingsstichprobe enthalten waren, aber solche Ergebnisse sind nicht zuverlässig. Die Validierung zeigt nur dann angemessene Ergebnisse, die im realen Handel zu erwarten sind, wenn Sie sie im April 2015 beginnen, also nach allen Daten, die das Modell beim Training oder bei Kreuzvalidierungen zur Anpassung der Modellparameter hätte nutzen können.

Mein zweiter Versuch (Regression gerundet auf [0;0,5;1]) mit Ihren Daten war nicht erfolgreich. Das Modell und die Genetik wählten erneut die Option "kein Handel" für die konstante Klasse.
Offensichtlich muss das Neuron für die Vorhersage von drei Klassen notwendigerweise drei Ausgänge haben, da es sonst nicht drei Klassen in einen Ausgang mit Stufen einpassen kann. Oder ich musste die Klasse "Nicht handeln" entfernen und zwei Klassen übrig lassen und mit ihnen arbeiten.

Um irgendwie etwas auf Fronttest zu überprüfen, habe ich eine Liste von Prädiktoren genommen, die von der Genetik ausgewählt wurden, und ein Neuron auf sie trainiert (alles ist korrekt, mit drei Ausgängen und mit Faktor am Eingang) durch Caret mit Kreuzvalidierungen (Methode = "repeatedcv"). Die Ergebnisse sind mäßig, die Genauigkeit beträgt selbst bei Trainingsdaten nur 40 %.
Ich habe gerade bemerkt, dass die Validierungsdatei echte Zahlen und keine Klassen ausgibt. Ich habe sie einfach durch +1 für alles Positive und -1 für alles Negative ersetzt.
Außerdem wurden zwei Genauigkeiten für den Fronttest ermittelt:
1) Da das Modell bei einer Vorhersage von 0 nicht handeln sollte, spielt das korrekte Ergebnis keine Rolle, da der Handel nicht eröffnet wird und die endgültige Statistik nicht beeinflusst. In diesem Fall sind die Vorhersagen -1 und 1 in 51 % der Fälle richtig (alle Beispiele, bei denen die Vorhersage=0 ist, werden nicht berücksichtigt).
2) Nimm alle Vorhersagen und vergleiche sie mit allen richtigen Ergebnissen. In diesem Fall ist die Genauigkeit = 14 %, also noch schlechter als der Zufall.

Ich frage mich, was das Ergebnis des Handelsmodells in Ihrem Handelsemulator sein wird. Könnten Sie bitte ein Diagramm wie oben erstellen, aber mit dem Modell handeln, das ich beigefügt habe?
Die RData-Datei war zu groß und das Forum hat sie nicht sofort akzeptiert. Ich habe zwei vinrar-Archive erstellt und sie separat in zip-Archive gepackt. Sie müssen die beiden gezippten Archive entpacken, dann das erste Archiv öffnen und die Daten extrahieren. Das zweite Archiv verbindet sich von selbst, und vor allem müssen sie sich im selben Ordner befinden.
Oder Sie können das beigefügte r-Skript ausführen, das eine Liste ausgewählter Prädiktoren enthält und ein Modell mit diesen Prädiktoren erstellt. Sie sollten die ursprüngliche csv-Datei haben, die Sie gepostet haben, sie wird verwendet.
Dasselbe Skript kann auch nach dem Öffnen von RData aus dem Anhang ausgeführt werden, wobei das Skript das fertige Modell übernimmt, anstatt ein neues zu erstellen. Ein Beispiel für Vorhersage und Genauigkeitsschätzung ist im Code enthalten. Die RData-Datei, die Sie vorhin gepostet haben, wird für den Fronttest benötigt.

In Anbetracht der Fehler der Vergangenheit starte ich meinen dritten Versuch.

 
Dr. Trader:

1) In Anbetracht der Tatsache, dass das Modell bei Vorhersage=0 nicht handeln sollte, spielt das korrekte Ergebnis keine Rolle, da der Handel nicht eröffnet wird und keinen Einfluss auf die endgültige Statistik hat. In diesem Fall sind die Vorhersagen -1 und 1 in 51 % der Fälle richtig (alle Beispiele, bei denen die Vorhersage=0 ist, werden nicht berücksichtigt).

Für eine falsche Antwort würde ich -2 Punkte geben, für keine Antwort -1, für eine richtige Antwort 1. Der Anteil der Punkte, die für die Antworten vergeben werden, kann in die eine oder andere Richtung geändert werden, aber es ist wichtig, dass das Netzwerk nicht unnötig ins Stocken gerät, daher sollte die Enthaltung bestraft werden.

Der Ausschuss von zwei Netzwerken gab jeweils 1 Signal, -1 (oder 0) kein Signal, bei widersprüchlichen Signalen war das endgültige Signal 0. Die Signale der Netzwerke wurden also zu einem Gesamtsignal von [-1, 0, 1] kombiniert.

 

Dr. Trader:

Ich hoffe, dass unabhängig davon, wie Sie die Ausgangspunkte der Berufe verschieben, sie alle nach der Ausbildungszeit liegen. Wenn Sie das Modell beispielsweise mit Daten von Januar und März 2015 trainiert haben (und dabei die Februar-Daten entfernt haben), sollten Sie die abschließende Validierung nicht im Februar durchführen, obwohl diese Daten nicht in der Trainingsstichprobe enthalten waren, aber solche Ergebnisse sind nicht zuverlässig. Die Validierung zeigt nur dann angemessene Ergebnisse, die im realen Handel zu erwarten sind, wenn Sie sie im April 2015 beginnen, also nach allen Daten, die das Modell beim Training oder bei Kreuzvalidierungen zur Anpassung der Modellparameter hätte nutzen können.


Ja, natürlich, Sie können eisern sein. Das ist genau die richtige Validierung. Es ist nur so, dass die Sequenzen der Transaktionen zufällig aus einer großen Menge von Beobachtungen gezogen werden. Monte Carlo ist erforderlich, um zu verstehen, wo die Handelskurve liegen könnte. Jede Verschiebung des Handels um ein paar Minuten in die eine oder andere Richtung erzeugt eigene Kurven. Im MT-Tester sehe ich eine Kurve - eine Umsetzung. Wenn ich bei jedem Handel eine Bedingung mit einem Zufallszahlengenerator einbaue und mit einer Zufallszahl eröffne, kann ich den Strategietester 500 Mal laufen lassen und erhalte die gleichen Kurven. Aber in MT würde es sehr lange dauern. Und ich brauche es in 30 Sekunden.

Dann, wenn ich die EA auf den Ausschuss zu machen, werde ich die Validierung in der Strategie-Tester laufen. Die Kurve sollte in einen Fächer passen, und ich werde einen eindeutigen Wert für den Erholungsfaktor und die mathematische Erwartung erhalten. Aber man kann nicht nur aus einem Lauf Schlüsse ziehen. Nicht erwünscht.

 
Dr.Trader:


Ich frage mich, was wird das Ergebnis des Handels das Modell in Ihrem Handel Emulator, könnten Sie bitte ein Diagramm wie oben, aber den Handel mit dem Modell, das ich beigefügt habe?
Die RData-Datei ist zu groß und das Forum hat sie nicht sofort akzeptiert. Ich habe zwei vinrar-Archive erstellt und sie separat in zip-Archive gepackt. Sie müssen die beiden gezippten Archive entpacken, dann das erste Archiv öffnen und die Daten extrahieren. Das zweite Archiv wird sich selbständig einhängen, und vor allem müssen sie sich im selben Ordner befinden.
Oder Sie können das beigefügte r-Skript ausführen, das eine Liste ausgewählter Prädiktoren enthält und ein Modell mit diesen Prädiktoren erstellt. Sie sollten die ursprüngliche csv-Datei haben, die Sie gepostet haben, sie wird verwendet.
Das gleiche Skript kann auch nach dem Öffnen von RData aus dem Anhang ausgeführt werden, wobei das Skript das fertige Modell übernimmt, anstatt ein neues zu erstellen; der Code enthält ein Beispiel für die Vorhersage und die Schätzung der Genauigkeit. Die RData-Datei, die Sie vorhin gepostet haben, wird für den Fronttest benötigt.

In Anbetracht der Fehler der Vergangenheit werde ich einen dritten Versuch starten.

Welches Modell lernen Sie, das Neuronale Netz?

Lassen Sie mich das später versuchen. Ich habe ein Modell, das rund um die Uhr auf allen Kernen lernt.

Ich dachte eigentlich, Sie würden das beurteilen. Ersetzen Sie einfach die Modellvorhersagen in der Validierungsdatei, die ich unter dem Link angegeben habe. Dies sollten Richtungen der Form +1 / -1 / 0 sein. Es wird eine neue Vorhersagespalte geben. Multiplizieren Sie die Vorhersagespalte mit der Zielspalte. Ziehen Sie 0,0001 der Streuung ab. Löschen Sie die Einträge, bei denen die Modellausgabe 0 ist. Nehmen Sie die Funktion cumsum:

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

Dabei wird der Handel über alle Beobachtungen hinweg grafisch dargestellt und die MO berechnet. Das ist ganz einfach.

 
Alexey Burnakov:

Und welches Modell lernen Sie, das Neuronale Netz?

...

Multiplizieren Sie die Vorhersagespalte mit der Zielspalte.

Ja, ich lerne ein neuronales Netzwerk, das nnet-Paket. In diesem Fall trainiere ich das Modell mit caret, das eine Reihe von Modellparametern aufnimmt.

Ich habe mir die Ergebnisspalte in Ihrer RData-Datei noch einmal angeschaut und sehe jetzt sofort, dass es sich um Kursgewinne handelt. Das letzte Mal dachte ich, es handele sich um eine Art Wahrscheinlichkeitsrechnung.
Mir hat gefallen, wie Sie die Preiserhöhung in der Zielvariablen speichern. Bei Bedarf können Sie sie leicht in Klassen für die Ausbildung umwandeln oder den Gewinn berechnen. Das werde ich auch tun.

Ich habe alles verstanden, danke für die Aufklärung, habe den Gewinn gezählt, den Spread einkalkuliert und das Diagramm gezeichnet. Schade, MO = -2,052423e-05, langsamer aber sicherer Verlust.

Was den Spread betrifft, so muss er nur in 4 Fällen berücksichtigt werden:
1, 2) Prognose für den letzten Balken = 0; Prognose für den neuen Balken = -1 oder 1. Eröffnung einer neuen Position.
3) Vorhersage für letzten Balken = -1; Vorhersage für neuen Balken = 1. Umgekehrt, alte Position wird geschlossen, neue Position wird geöffnet.
4) Vorhersage für den vorherigen Balken = 1; Vorhersage für den neuen Balken = -1. Umgekehrt wird die alte Position geschlossen und die neue Position geöffnet.
In allen anderen Fällen bleibt entweder die alte Position vom letzten Balken erhalten oder die alte Position wird geschlossen, oder es wird überhaupt keine Position geschlossen. Für all dies ist kein Aufstrich erforderlich.

(Genauer gesagt werden Kaufgeschäfte zum Geldkurs+Spread eröffnet und zum Geldkurs geschlossen. Verkaufsgeschäfte werden gegenläufig zu Geld + Spanne eröffnet und zu Geld + Spanne geschlossen. Bid ist der Preis, der normalerweise im Terminal angezeigt wird. Der Einfachheit halber reicht es jedoch aus, bei einem konstanten Spread diesen nur einmal bei der Eröffnung einer neuen Position zu berücksichtigen - so ist es einfacher).

Dies alles muss in einem EA berücksichtigt werden, damit er eine Position, die bei einem neuen Balken sofort wieder in dieselbe Richtung geöffnet wird, nicht schließt. Ich habe einmal einen solchen Fehler begangen, als ich dachte, ich würde von meinem Broker Rabatte bekommen. Aber in einem solchen Fall zahlt sich die Transaktionshäufigkeit für Rabatte nicht aus, alles wird schlechter.

 
Dr.Trader:

Ja, ich lerne ein neuronales Netzwerk, das nnet-Paket. In diesem Fall trainiere ich das Modell mit caret, das eine Reihe von Modellparametern aufnimmt.

Ich habe mir die Ergebnisspalte in Ihrer RData-Datei noch einmal angesehen, und jetzt sehe ich sofort, dass es sich um Kursgewinne handelt. Das letzte Mal dachte ich, es handele sich um eine Art Wahrscheinlichkeitsrechnung.
Mir hat gefallen, wie Sie die Preiserhöhung in der Zielvariablen speichern. Bei Bedarf können Sie sie leicht in Klassen für die Ausbildung umwandeln oder den Gewinn berechnen. Das werde ich auch tun.

Ich habe alles verstanden, danke für die Aufklärung, habe den Gewinn gezählt, den Spread einkalkuliert und das Diagramm gezeichnet. Schade, MO = -2,052423e-05, langsamer aber sicherer Verlust.

Was den Spread betrifft, so muss er nur in 4 Fällen berücksichtigt werden:
1, 2) Prognose für den letzten Balken = 0; Prognose für den neuen Balken = -1 oder 1. Eröffnung einer neuen Position.
3) Vorhersage für den letzten Balken = -1; Vorhersage für den neuen Balken = 1. Umgekehrt, alte Position wird geschlossen, neue Position wird geöffnet.
4) Vorhersage für den vorherigen Balken = 1; Vorhersage für den neuen Balken = -1. Umgekehrt wird die alte Position geschlossen und die neue Position geöffnet.
In allen anderen Fällen bleibt entweder die alte Position vom letzten Balken erhalten oder die alte Position wird geschlossen, oder es wird überhaupt keine Position geschlossen. Für all dies ist kein Aufstrich erforderlich.

(Genauer gesagt werden Kaufgeschäfte zum Geldkurs+Spread eröffnet und zum Geldkurs geschlossen. Verkaufsgeschäfte werden gegenläufig zu Geld + Spanne eröffnet und zu Geld + Spanne geschlossen. Bid ist der Preis, der normalerweise im Terminal angezeigt wird. Der Einfachheit halber reicht es jedoch aus, bei einem konstanten Spread diesen nur einmal bei der Eröffnung einer neuen Position zu berücksichtigen - so ist es einfacher).

Dies alles muss in einem EA berücksichtigt werden, damit er eine Position, die bei einem neuen Balken sofort wieder in dieselbe Richtung geöffnet wird, nicht schließt. Ich habe einmal einen solchen Fehler begangen, als ich dachte, ich würde von meinem Broker Rabatte bekommen. Aber die Häufigkeit der Transaktionen für Rabatte zahlt sich in diesem Fall nicht aus, es wird nur noch schlimmer.

Der Reihe nach.

MO IS 0,00002. Dies ist bereits mehr als -verbreitet. Das heißt, das Modell hat etwas aus dem Rauschen gelernt, aber die Stärke der Vorhersage ist nicht ausreichend.

Zweitens. Haben Sie irgendwie festgelegt, welcher Teil der Daten in eine bestimmte Falte rutschen soll? Wenn Sie nur CV (wiederholter CV) wählen, wird das Modell zufällig ausgewählte Beobachtungen für den Test verwenden. Im Falle von Zeitreihen ist dies nicht die beste Option.

Als nächstes folgt die Simulation des Handels. Ich habe ein einfaches Signal zum Öffnen und Schließen nach einer bestimmten Anzahl von Minuten. Und dann kann man es noch komplexer machen. Daher habe ich einen positiven MO, wenn ich den Spread für jeden Handel berücksichtige. Und das ist realistisch zu erreichen.

Arbeiten Sie mit Kreuzvalidierung. Es ist möglich, Gruppen von Indizes zu erstellen, um bestimmte Teile der Zeitreihen in die Furten aufzunehmen.

Und neben der Neuronik gibt es noch viele andere Methoden. Einer der besten ist heute entweder GBM oder XGBOOST. Ich habe mich bisher für die erste Variante entschieden. Das gefällt mir.

 

Ich habe die Methode "repeatedcv" in trainControl mit der Standardaufteilung verwendet. Kürzlich habe ich selbst Code für die Kreuzvalidierung geschrieben. Ich habe die Kreuzvalidierung sowohl mit zufällig entnommenen Balken als auch mit fortlaufend entnommenen Abschnitten ohne Lücken ausprobiert. Beim Fronttest konnte ich keinen Unterschied feststellen, das Ergebnis war in beiden Fällen gleich. Ich habe die Daten für Training/Kreuzvalidierung zu 50%/50% aufgeteilt, vielleicht spielt es bei diesem Verhältnis keine Rolle mehr.
Ich werde das in Ruhe ausprobieren...

Ich erinnere mich, dass in dem Artikel, den Sie vor einiger Zeit gepostet haben, der führende Vergleich mit der Platt-Methode (oder so ähnlich) aufgestockte Bäume waren. Alles, was ich bei Google über diese Methode gefunden habe, ist, dass man die Modellausgabe an Sigmoid übergeben und dessen Ergebnis übernehmen muss. Können gbm oder xgboost das leisten? Dieser Ansatz scheint besser zu sein als Forest, Neuronka und einige "Tütenbäume", die an zweiter Stelle stehen.