Python scikitlearn model zu MQL5 importieren - Seite 2

 

Bayne wenn du das Beispiel von Roffild zum laufen hast müsstet du in der Ausgabe sowas sehen.

Die erste Zeile ist von mir , Geschwindigkeitstest für eval Befehl

WoW 252 microseconds....der Matlab-Interpreter brauchte immer ca 20ms um eine Antwort zu geben.


Und du kannst Daten Hin und Her senden....wie du wünschtest.

Tester muss noch ausprobiert werden .

LQ      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   Microseconds for one phyton eval= 251 
MH      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   Version: 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]
HD      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   b'Version_info: \x00' sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)
MO      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   sys.path:
NG      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   C:\Users\f12\AppData\Local\Programs\Python\Python37/python37.zip
HR      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   C:\Users\f12\AppData\Local\Programs\Python\Python37/lib
NQ      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   C:\Users\f12\AppData\Local\Programs\Python\Python37/lib/site-packages
HS      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   C:\Users\f12\AppData\Local\Programs\Python\Python37/DLLs
HO      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   C:
HR      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   Error in Python:
JH      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   Traceback (most recent call last):
JD      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)     File "<string>", line 37, in getString
JQ      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   Exception: This is not a bug! This is a feature :D
OQ      0       17:55:47.117    PythonDLL_Example (EURUSD,H1)   

Gruß

 
Chris70:

Hallo Bayne,


Ich weiß, ich habe hier etwas weiter ausgeholt, doch ich vermute, dass für den Threadersteller irgendein praktischer Nutzen dabei sein wird (das war an Christian und Carl ;-) damit ich nicht wieder einen drüber kriege und mein Beitrag ausgelagert wird ;-) )

also ich würde mal durchzählen ..maximal 850 Zeichen pro Beitrag :-)

 
Chris70:

Hallo Bayne,

Ich stand mal vor genau dem gleichen Problem und kann Dir daher vielleicht etwas helfen. Ich hatte mich auch mal in Python eingearbeitet spezifisch mit dem Ziel, Machine-Learning-Komponenten (neuronale Netze, Zeitreihenanalyse mit LSTM-Zellen, Regression...) in Python umzusetzen und die Resultate aus MT5 abzufragen. Die Kommunikation hatte ich über .csv-Dateien gelöst. Ergebnis nach vielen Experimenten: es ist alles hickhack. Letztlich habe ich den Python-Exkurs wieder verlassen und die genannten Machine-Learning-Module direkt in MQL5 umgesetzt. Es handelt sich hier um die Kernkomponenten meiner EAs, daher tue ich mich etwas schwer, den Code hier für lau zu verschenken (darf man zickig von mir finden ;-) ), ich kann mir aber vorstellen, dass ich trotzdem ein paar hilfreiche Tipps geben kann:

Falls Du einigermaßen Englisch sprichst: es gibt von der Uni Stanford einen gratis-Kurs (verfügbar über coursera.com) von Prof. Andrew Ng (ja.. der Nachname ist wirklich so kurz und hat keine Vokale). Dieser Kurs ist didaktisch absolut genial und damit sollte es nicht schwer fallen, den nötigen Code für wichtige Elemente aus dem Bereich des machine learnings selbst zu schreiben.

Du hast spezifisch nach Regressions-Modellen gefragt. Da gibt es ja einmal die lineare Regression und dann die polynome Regression als Sonderfall der linearen Regression (andererseits ist lineare Regression nichts anderes als polynome Regression erster Ordnung). Ich gebe Dir daher den Tipp, von vorneherein nur Code für polynome Regression zu schreiben. Will man dann mal ein lineares Modell verwenden, setzt man dann halt die Potenz auf 1. Warum ich das empfehle: ganz einfach weil ich im Backtesting mit verschiedenen Potenzen rumprobiert habe und immer wieder festgestellt habe, dass man mit höheren Potenzen zu besseren (=rentableren) Modellen kommt. Ich verwende meist die Potenz 5, was kein relevantes Performance-Problem darstellt.

Bei der linearen und polynomen Regression gibt es ja verschiedene Methoden zur Lösung, einmal das "normale" Verfahren als Matrixoperation und dann die iterative Methode.

"Normal" wäre in dem Fall nach der Formel:     Theta (=coefficient vector) at cost function minimum = (X_transp*X)^-1 * X_transp * Y.   Dabei ergibt sich allerdings ein Problem: die Matrix-Transposition ist keine Kunst, der nötige Schritt einer Matrix-Inversion ist allerdings recht kompliziert umzusetzen und ich wüsste auch nicht, dass jemand eine solche Funktion schon mal online für MQL5 verfügbar gemacht hat (sonst bin ich interessiert). Hier hat Python einen Vorteil, denn dort gibt es die Matrix-Inversion bereits als fertige Funktion und das Ganze ist sehr flott.

Die iterative Methode ist andererseits nicht allzu schwer umzusetzen. Meine Erfahrung zeigt, dass mehr als ~30 Iterationen Quatsch sind und zu keinen wirklich anderen Kurven führen. Die Lernrate alpha setze ich dabei meist auf 0.5. Dies ist im Vergleich zu anderen Gradient-Descent-Verfahren wie z.B. Mulitlayer-Perceptron-Modellen ein krass hoher Wert, jedoch bei der polynomen Regression kein Problem. Man kommt ohne große Rechenleistung zu perfekten Kurven, ohne dass in der Praxis ein "exploding gradient"-Problem auftritt.

Ich führe die Regressions-Berechnungen mit jeder neuen Kerze durch (also nicht mit jedem Tick) und habe so keinerlei Performance-Probleme. Das war in der Kombination MQL5+Python WESENTLICH schlechter (=untauglich).

Es sind nur wenige zusätzliche Code-Zeilen, zugleich auch immer Varianz, Standardabweichung und r_squared mitzuberechnen. Aus +/- Vielfachen der Standardabweichung lassen sich dann Regressions-"Kanäle" zeichnen. Übrigens ist ein Bollinger-Band ja auch irgendwie nur ein Spezielfall eines solchen Kanals, denn polynome Regression nullter Ordnung ist nichts anderes als das arithmetische Mittel (und ganz viele arithmetische Mittel bilden einen Moving Average, +/- n StdDev = Bollinger). Jeder erfahrene Trader weiß, dass Bollinger-Bänder zwar eine nette Idee sind, aber allein nicht profitabel. Mit polynomen Regressionskanälen sind hingegen recht gute Handelssysteme möglich (funktioniert bei mir v.a. im EURUSD und USDJPY). Ich verwende den Ausbruch aus diesen Kanälen als Handelssignal und definiere dann SL, break-even-Schwelle und TP als Vielfache der Standardabweichung.

Wie gesagt, ich will mein System nicht einfach verschenken, ein wenig Arbeit muss man sich selber machen, doch ich kann Dich nur ermutigen, weiter mit Regressions-Modellen zu arbeiten und habe hier EINEN Weg beschrieben, wie es definitiv funktioniert.

Ich weiß, ich habe hier etwas weiter ausgeholt, doch ich vermute, dass für den Threadersteller irgendein praktischer Nutzen dabei sein wird (das war an Christian und Carl ;-) damit ich nicht wieder einen drüber kriege und mein Beitrag ausgelagert wird ;-) )

Wie sieht es mit der Training-Dauer aus? Mit Python vergleichbar oder muss ein Server her (bzw. Mql cloud)
 
Bayne:
Wie sieht es mit der Training-Dauer aus? Mit Python vergleichbar oder muss ein Server her (bzw. Mql cloud)

Die Frage ist zu allgemein - das hängt ja vom konkreten Modell ab und der Größe des Trainingsdatensatzes. Unterm Strich ist es aber kein Faktor, der einem irgendwie Gedanken machen muss. Man kann das ja auch nicht mit z.B. dem Optimizer vergleichen, wo der Code ein paar Tausend Male über historische Daten läuft. Du musst für die Modelle die Trainigsdaten + out-of-sample-Daten bis auf Spezialfälle ja nur EINMAL durchgehen (und dann in eine Datei speichern; man kann dann z.B. bei den input-Daten des Experten festlegen, ob gerade Training- oder Trading-Modus laufen soll). Das gilt zumindest für den Klassiker neuronale Netze, bei dem die Gewichte EINMAL ermittelt werden. Natürlich kann man auch bei Reinkommen neuer live-Daten (neuer Tick, neue Kerze...) jeweils EINE Iteration der Backpropagation ergänzen (das geht ruckzuck).

Ich habe den Eindruck, Du willst ganz allgemein "machine learning im Trading". Ich verstehe das, denn an dem Punkt war ich auch mal und habe dann mit allen erdenklichen Modellen rumprobiert. Aber wesentlich einfacher wird es doch, wenn Du weißt, was Deine Strategie sein soll, welche "Frage" Dein Modell beantworten soll, also was sind die Ein- und Ausgabedaten des Modells, dann ergibt sich der Rest von allein und dann sind natürlich auch so Fragen wie "wie ist die Trainingsdauer" viel konkreter zu beantworten. Wenn man's mal mit einem wissenschaftlichen Artikel vergleicht: das wäre dann die Teile "Hypothese" und  "Material und Methoden" - die kommen beide immer vor dem Experiment. Du möchtest aber das Experiment zuerst. Richtig? ;-) ;-)

Kann es sein, dass Dich machine learning allgmein fasziniert, aber Du noch gar nicht genau weißt, was Du damit im Trading anstellen wirst? Verstehe ich! Macht ja auch Spaß! Aber letztlich ist das Ziel doch, damit Geld zu verdienen und ich denke, dafür muss die Anforderung, die man an das machine learning stellt, zuerst konkreter (so konkret wie möglich!) definiert werden, dann ergibt sich der Rest von allein.

 
Chris70:

Die Frage ist zu allgemein - das hängt ja vom konkreten Modell ab und der Größe des Trainingsdatensatzes. Unterm Strich ist es aber kein Faktor, der einem irgendwie Gedanken machen muss. Man kann das ja auch nicht mit z.B. dem Optimizer vergleichen, wo der Code ein paar Tausend Male über historische Daten läuft. Du musst für die Modelle die Trainigsdaten + out-of-sample-Daten bis auf Spezialfälle ja nur EINMAL durchgehen (und dann in eine Datei speichern; man kann dann z.B. bei den input-Daten des Experten festlegen, ob gerade Training- oder Trading-Modus laufen soll). Das gilt zumindest für den Klassiker neuronale Netze, bei dem die Gewichte EINMAL ermittelt werden. Natürlich kann man auch bei Reinkommen neuer live-Daten (neuer Tick, neue Kerze...) jeweils EINE Iteration der Backpropagation ergänzen (das geht ruckzuck).

Ich habe den Eindruck, Du willst ganz allgemein "machine learning im Trading". Ich verstehe das, denn an dem Punkt war ich auch mal und habe dann mit allen erdenklichen Modellen rumprobiert. Aber wesentlich einfacher wird es doch, wenn Du weißt, was Deine Strategie sein soll, welche "Frage" Dein Modell beantworten soll, also was sind die Ein- und Ausgabedaten des Modells, dann ergibt sich der Rest von allein und dann sind natürlich auch so Fragen wie "wie ist die Trainingsdauer" viel konkreter zu beantworten. Wenn man's mal mit einem wissenschaftlichen Artikel vergleicht: das wäre dann die Teile "Hypothese" und  "Material und Methoden" - die kommen beide immer vor dem Experiment. Du möchtest aber das Experiment zuerst. Richtig? ;-) ;-)

Kann es sein, dass Dich machine learning allgmein fasziniert, aber Du noch gar nicht genau weißt, was Du damit im Trading anstellen wirst? Verstehe ich! Macht ja auch Spaß! Aber letztlich ist das Ziel doch, damit Geld zu verdienen und ich denke, dafür muss die Anforderung, die man an das machine learning stellt, zuerst konkreter (so konkret wie möglich!) definiert werden, dann ergibt sich der Rest von allein.

Ein bisschen von beidem bzw eine Mischung aus Begeisterung mit dollarzeichen in den Augen :) würdest du erfahrungsgemäß die effektivität von Netzen über die von DecisionTrees/Forrests oder Regressoren stellen? Bzw was kannst du erfahrungsgemäß am ehesten als ersten "Angriffspunkt" empfehlen (kenne die funktionen bereits, beziehe mich hierbei mehr auf eine Vertiefung und ausformulierung in MQL Code) ? Ich meine klar hattest mir privat gesagt, dass es nicht ganz auf das Werkzeug selbst ankommt, aber für einen stubser in eine zufriedenstellende (& möglichst unkomplexe) richtung wäre ich dir sehr dankbar

grundlegend hatte ich erstmal einen buy/hold/sell classifier im sinne (Abweichungen bei Regressoren sind mir vorerst zu tricky) auf den ich am ende einen Trailingstop klatschen kann. Das wie ist je nach Entscheidung auch ungefähr klar.

 

Ach "Bayne"... Du stellst weiter Fragen nach geeigneten Methoden ohne davor den ersten Schritt zu tun und festzulegen, was überhaupt die Ein- und Ausgabedaten des Modells sein sollen. Und egal wie super das Modell dann ist, bleibt das beim machine-learning häufige Problem namens "garbage in - garbage out": die Vorhersagequalität kann nun mal nicht besser sein, als die Daten, die der Markt zur Verfügung stellt. Ich habe diese Experimente gemacht: ein neuronales Netz für Forex mit zig (zuvor normalisierten) Daten gefüttert über Preis, Tickvolumen, RSI, Preis relativ zu zig verschiedenen MA's, CCI, parabolic SAR, aktuelle Kurse von Gold- und Ölpreis... um so eine scheinbare Überlegenheit der "Maschine" zu erlangen, nämlich möglichst viele Marktaspekte simultan zu erfassen. Als Ausgabe sollte "1" herauskommen wenn anschl. ein Kurs von plus x Pips früher touchiert wurde als ein Preis von minus x Pips; Ausgabe "0" im umgekehrten Fall. Und was passierte nach ausreichend langem Training des Modells? Das Ergebnis lag fast immer recht verlässlich bei 0.5. Nur aus sehr hohen Zeitebenen gab es einigermaßen brauchbare Ausschläge zu 1 oder 0. Was hatte ich also erreicht? Jedenfalls keine magische Forex-Kristallkugel, sondern eine Art mathematischen Beweis der nahezu nicht vorhandenen Autokorrelation von Forex-Kursen relativ zu vergangenen Daten.

Wenn man daraus nun schließt, dass die Random-Walk-Theorie zu 100% stimmt, wäre Forex Glücksspiel bzw. Würfeln und wir könnten an dieser Stelle aufhören. Natürlich ist es nicht so - immer wieder sieht man ja schnelle starke Bewegungen, sei es aufgrund fundamentaler Ereignisse oder kleinerer und größerer Erdrutsche von Stop-Auslösungen. Diese Ereignisse sind allein durch Zufall nicht erklärbar. DASS(!) diese Ereignisse ständig vorkommen, ist also nicht die Frage, sondern WANN. Und die zur Vorhersage nötige Autokorrelation ist nunmal nahezu nicht vorhanden. Egal wie toll das Modell ist, die Vorhersage liegt meistens innerhalb der Grenzen, die auch mit White Noise erklärbar wären. Deshalb sage ich (subjektive Philosophie!): "handle nicht die Erwartung, sondern die Überraschung". Mache eine Vorhersage (mit welchem Modell auch immer) und handle dann, wenn eine signifikante Abweichung von der Vorhersage entsteht, also genau die Situationen, die den Random-Walk falsifizieren. Und "signifikant" kann man praktikabel durch Vielfache der Standardabweichung der Verteilung der realen Werte relativ zum Vorhersagewert definieren (Normalverteilung hier modellhaft unterstellt).

Classifier bieten bei schlechten Eingabedaten eine Scheingenauigkeit, regressive Modelle zeigen hingegen u.U. nur, dass keine klare Tendenz vorliegt. Methoden der Zeitreihenanalyse wie ARIMA, rekurrente Netze und polynome Regression liefern zwar eine ganz nette Projektion in die Zukunft, was aber nicht heißt, dass diese auch richtig ist und sich rentabel handeln lässt. Vielleicht verstehst Du so meinen "Pessimismus" und warum ich das Modell für zweitrangig halte. Ich verwende AI zwar weiterhin selbst, jedoch nur um festzustellen, wo etwas Unerwartetes passiert. Wenn ein Modell beispielsweise sagt: "die nächste Kerze schließt 20 Pips höher", dann ist das für mich kein Kaufsignal, sondern ich steige dann ein, wenn eine deutliche Abweichung von der Vorhersage eintritt.

Einen weiteren sinnvollen Nutzen sehe ich bei der Parameter-Optimierung. Hier kann man mit Reinforcement-learning ständige Selbstanpassungen des EA umsetzen, die die statische Parameterauswahl anhand von Backtesting-Ergebnissen teilweise ersetzt.

(alles was ich hier schreibe ist meine persönliche Meinung, wenn jemand andere Erfahrungen mit Machine Learning im Trading hat ... her damit ;-) )

 
Chris70:

Ach "Bayne"... Du stellst weiter Fragen nach geeigneten Methoden ohne davor den ersten Schritt zu tun und festzulegen, was überhaupt die Ein- und Ausgabedaten des Modells sein sollen. Und egal wie super das Modell dann ist, bleibt das beim machine-learning häufige Problem namens "garbage in - garbage out": die Vorhersagequalität kann nun mal nicht besser sein, als die Daten, die der Markt zur Verfügung stellt. Ich habe diese Experimente gemacht: ein neuronales Netz für Forex mit zig (zuvor normalisierten) Daten gefüttert über Preis, Tickvolumen, RSI, Preis relativ zu zig verschiedenen MA's, CCI, parabolic SAR, aktuelle Kurse von Gold- und Ölpreis... um so eine scheinbare Überlegenheit der "Maschine" zu erlangen, nämlich möglichst viele Marktaspekte simultan zu erfassen. Als Ausgabe sollte "1" herauskommen wenn anschl. ein Kurs von plus x Pips früher touchiert wurde als ein Preis von minus x Pips; Ausgabe "0" im umgekehrten Fall. Und was passierte nach ausreichend langem Training des Modells? Das Ergebnis lag fast immer recht verlässlich bei 0.5. Nur aus sehr hohen Zeitebenen gab es einigermaßen brauchbare Ausschläge zu 1 oder 0. Was hatte ich also erreicht? Jedenfalls keine magische Forex-Kristallkugel, sondern eine Art mathematischen Beweis der nahezu nicht vorhandenen Autokorrelation von Forex-Kursen relativ zu vergangenen Daten.

Wenn man daraus nun schließt, dass die Random-Walk-Theorie zu 100% stimmt, wäre Forex Glücksspiel bzw. Würfeln und wir könnten an dieser Stelle aufhören. Natürlich ist es nicht so - immer wieder sieht man ja schnelle starke Bewegungen, sei es aufgrund fundamentaler Ereignisse oder kleinerer und größerer Erdrutsche von Stop-Auslösungen. Diese Ereignisse sind allein durch Zufall nicht erklärbar. DASS(!) diese Ereignisse ständig vorkommen, ist also nicht die Frage, sondern WANN. Und die zur Vorhersage nötige Autokorrelation ist nunmal nahezu nicht vorhanden. Egal wie toll das Modell ist, die Vorhersage liegt meistens innerhalb der Grenzen, die auch mit White Noise erklärbar wären. Deshalb sage ich (subjektive Philosophie!): "handle nicht die Erwartung, sondern die Überraschung". Mache eine Vorhersage (mit welchem Modell auch immer) und handle dann, wenn eine signifikante Abweichung von der Vorhersage entsteht, also genau die Situationen, die den Random-Walk falsifizieren. Und "signifikant" kann man praktikabel durch Vielfache der Standardabweichung der Verteilung der realen Werte relativ zum Vorhersagewert definieren (Normalverteilung hier modellhaft unterstellt).

Classifier bieten bei schlechten Eingabedaten eine Scheingenauigkeit, regressive Modelle zeigen hingegen u.U. nur, dass keine klare Tendenz vorliegt. Methoden der Zeitreihenanalyse wie ARIMA, rekurrente Netze und polynome Regression liefern zwar eine ganz nette Projektion in die Zukunft, was aber nicht heißt, dass diese auch richtig ist und sich rentabel handeln lässt. Vielleicht verstehst Du so meinen "Pessimismus" und warum ich das Modell für zweitrangig halte. Ich verwende AI zwar weiterhin selbst, jedoch nur um festzustellen, wo etwas Unerwartetes passiert. Wenn ein Modell beispielsweise sagt: "die nächste Kerze schließt 20 Pips höher", dann ist das für mich kein Kaufsignal, sondern ich steige dann ein, wenn eine deutliche Abweichung von der Vorhersage eintritt.

Einen weiteren sinnvollen Nutzen sehe ich bei der Parameter-Optimierung. Hier kann man mit Reinforcement-learning ständige Selbstanpassungen des EA umsetzen, die die statische Parameterauswahl anhand von Backtesting-Ergebnissen teilweise ersetzt.

(alles was ich hier schreibe ist meine persönliche Meinung, wenn jemand andere Erfahrungen mit Machine Learning im Trading hat ... her damit ;-) )

Erster Schritt: 
so wie ich das verstehe verteufelt du jegliche Arten von Inputdaten seien es Preise, Zeitdaten, Indikatoren etc, was stattdessen?

Und bei Inputdaten ziehst du es vor nur auf die Abweichung zu Vorhersage zu handeln: (in diesem Fall signifikant im Sinne von Vielfache der Standardabweichung der Verteilung der realen Werte relativ zum Vorhersagewert)
-> ist machbar 


Grund der Beschwerde: