Jump to content
Tom Next - Daytrading Community
  • entries
    19
  • comments
    44
  • views
    36,612

Neuronale Netze: alles nicht so einfach.


Mythos

2,723 views

Wird Zeit für ein neues Update:

 

Auf meinem Rechner läuft jetzt seit ca. 1 Woche ständig irgendein Trainingsdurchlauf. MT nutzt zwar leider nur 1 Kern (ja man könnte es mit mehreren Installationen parallelisieren) aber da ich ja eigentlich selber beim "lernen" bzw. Erfahrung sammeln bin, und unter der Woche nicht gerade viel freie Zeit hab, passt das ganz gut.

 

Wie gehe ich derzeit vor

Ich habe einerseits eine mqh, die mir die Vorbereitung der Inputs (Erstellung des Inputvektors inkl. Normierung) und die gewünschten Outputs erzeugt, sowieso ein paar weitere Kapselungen für den Einsatz in einem EA liefert. zB getSignalFromNN() oder updateNN().

Sprich diese mqh enthält die Erweiterung des "allgemeinen NN" auf das "projektspezifische NN". Auch mit einer Funktion trainNN(int offsetBars, int barsInTraining), getCurrentNNError(int offsetBars, int barsInTest) etc.

 

Was es derzeit "lernt"

Zuerst habe ich die Outputs so gewählt das ein "positiver Move" vorhanden war wenn der Kurs mindestens x rauf und maximal y runter gegangen ist.

Das ganze gleich mal mit einem 5 schichtigen Netz trainiert auf 1000 Bars. Nunja, das Netz/der Backprop ist so "intelligent" das er einfach den Input ignoriert und immer das rät was am häufigsten vorkommt (rauf/runter oder seitwärts). Also nicht wirklich brauchbar.

 

Dann hab ich versucht die Kategorien aufzuweichen und rein auf die Differenz Close-Open des nächsten Bars zu gehen. Also "positiver Move" wenn Close-Open > x.

Bei mehrschichtigem Netz der gleiche "Erfolg".

 

Dann hab ich das Netz mal deutlich zurückgefahren und trainiere mal mit nur 1 inneren Schicht. Hier werden die Inputs zumindest nicht mehr ignoriert. Bei 1000 Trainingsbars lernt er jedoch scheinbar recht bald die Trainingsdaten auswendig, denn der Trainingserror geht runter (gestoppt bei 30% Fehler) wobei der Testfehler bei 60% blieb... möglicherweise wird der Testfehler mit der Zeit besser.

 

Derzeit läuft jetzt ein Training auf 5000 Bars, mal sehen ob er da weniger auswendig lernt.

 

Mögliche Gründe

Warum er mit mehr als 1 inneren Schicht die Inputs ignoriert ist mir nicht ganz klar. Hier werd ich noch mehrere Test machen müssen.

Warum er jedoch nicht so gut lernt bzw. wenn dann auswendig lernt könnte aus meiner Sicht folgenden Grund haben:

Ich gebe ihm alle Bars und "hoffe" das er von alleine eine Struktur dahinter erkennt und diese lernt. Das ist natürlich etwas optimistisch. Es gänge vermutlich deutlich besser wenn man das NN zB auf ein konkretes Pattern trainieren lässt und ihm zum lernen eine Reihe klassischer Beispiele dieses Patterns gibt. Hiefür muss man aber zuerst ein Pattern finden das wirklich Aussagekraft hat.

Das finden solcher Patterns ist aber bereits Thema des Evolution-Teil dieses Projektes, weswegen ich hier nicht auf diese Taktik wechseln werde, sondern weiter versuche eine Möglichkeit zu finden das NN auf den rohen Daten zu lernen.

 

UPDATE

Habe jetzt ein Netz mit 2 inneren Schichten "antrainiert". Mit 30 Bars als Input macht es ein schönes Overfitting: 2% Fehler am Training, 72% am Test.

Die 500Bars Back auf 5000 Bars trainiert tümpeln noch immer bei 60% training und test error herum.

14 Comments


Recommended Comments

kurzes Update: wenn man ihn langsam antrainiert (zuerst mit wenig trainingbars) akzeptiert er auch mit 2 inneren Schichten die Inputs.

Aber es bleibt dabei, entweder er lernt die Trainingsmenge auswendig oder er bleibt auf ~60% Fehler. Also Test ist immer ~60% Fehlerquote

Link to comment

NNs sind recht "pingelig" was die Repräsentation der Daten angeht. Man kann die Eigenarten von NNs aber gut für sich nutzen:

Dazu muß das Netz allerdings nicht vollständig verbunden sein, d.h. ein Inputneuron leitet nicht auf alle Zwischenneuronen der folgenden Schicht weiter.

Dadurch kannst du eine Gewichtung im Input simulieren mit der man "Nähe" im Inputraum darstellen kannst. Die klassische Anwendung davon ist Bilderkennung, wobei jedes Pixel durch ein Neuron abgebildet wird. In der Verbindungsschicht werden somit automatisch begrenzte Nachbarschaften von Pixeln verarbeitet, statt das gesamte Bild.

 

Achja: 5 Schichten sind extrem viel. Mich wundert nicht dass das NN sofort overfittet. In dem Bilderkennungsbeispiel wurden mit nur zwei Schichten 98% der Fälle korrekt klassifiziert.

Link to comment

Geclusterte Inputregionen sind keine blöde Idee. Aber ich hab immer mehr das Gefühl, dass das Netz nicht wirklich von den reinen Daten lernen kann.

 

bzgl. Overfitting: Mit 5 Schichten hat es eben nicht gefittet sondern die Inputs schlicht ignoriert. Die ersten Schichten bekamen Gewichte um 0 und dann wurde mit dem Bias ein konstanter Output erzeugt.

Das 5 Schichten extrem viel sind ist mir klar, ich wollts nur mal testen und war eben überrascht das es nicht fittet.

Link to comment

Ok, wenn er lieber die Inputs ignoriert und rät, dann sollte man sich um das Encoding des Inputs Gedanken machen ;)

Wenn man mal die Bilderkennungssache aufgreift würde mir direkt folgender Ansatz einfallen:

Man legt ein Rechteck um den letzten Kursverlauf (sagen wir HI/LO der letzten 10 Bars als Eckpunkte). Dann Verrastert man das Rechteck in kleine Bereiche (die "Pixel") und setzt jeden Bereich auf 1 oder 0, je nachdem ob der Kurs diesen Bereich geschnitten hat oder nicht.

Damit hat man für das NN ein grobes "Bild" vom Kurs geschaffen, das sollte dann besser lernbar sein, erfordert allerdings eine wesentlich größere Inputschicht (quadratisch viel mehr Neuronen).

Evtl. sollte man auch das Seitenverhältnis des Rechtecks als gesonderten Input einführen, da dies ja die Gesamtaussage des Rasters beeinflußt.

Link to comment

Naja bleibt die Frage was er dann lernen soll.

 

Bei Bilderkennung ist es einfach. Da gibt es die Muster im Bild die erkannt werden und aus.

 

Bei Kursverläufen ist es schwieriger weil zweischichtig:

1. Schicht/Frage: Welche Kursmuster haben danach einen statistisch signifikant prognostizierbaren Verlauf? Sprich nach welchen Patterns geht es rauf/runter?

2. Schicht/Frage: Möglichst fehlerfreie Erkennung dieser Muster.

 

Ist Frage 1 geklärt hat man nur mehr ein klassisches Problem aus der Mustererkennung und ein NN läuft ohne Probleme. Aber genau Frage 1 ist ja der schwierige Teil.

Ich befürchte das einerseits Frage 1 aber vor allem die Kombination zu "schwer" für ein NN ist. Man muss die Fragen also vermutlich doch getrennt behandeln.

 

Bzgl. Encoding der Inputs: Ja das ist ein großes Problem, aber hier gehts auch wieder um Frage 1: Was ist sinnvoller: Repräsentation relativ zur ATR, in absoluten Pips, in % etc?

Link to comment
1. Schicht/Frage: Welche Kursmuster haben danach einen statistisch signifikant prognostizierbaren Verlauf? Sprich nach welchen Patterns geht es rauf/runter?

2. Schicht/Frage: Möglichst fehlerfreie Erkennung dieser Muster.

Das ist doch beides die Sache des NN (sprich: die unbekannten Muster lernen) und nicht dein Bier. Das Modell muß doch nacher nicht interpertierbar sein, oder willst du mit dem NN für dich Muster finden?

 

Sofern du das System nach dieser Ansatz anlernen willst, kannst du ja einfach eine 1 anlegen wenn sich der Kurs nach der Rasterbox um X% von der Box entfernt, 0 andernfalls. Das wäre zumindest ein Indiz ob eine Vorhersage über eine Bewegung ohne Richtungsinformation überhaupt möglich wäre.

Link to comment

Genau das mache ich ja derzeit. Aber die bisherigen Ergebnisse lassen vermuten das es eben zu schwer zu sein scheint.

 

An sich wäre es genau der Plan das Netz alles selber lernen zu lassen. Aber das Problem sind glaub ich die verrauschten Daten. Es gibt kein Pattern das immer stimmt.

 

Vor allem weil die "nicht Aussagekräftigen Patterns" es glaub ich ziemlich vermasseln.

Nehmen wir mal an es gibt ein Superpattern, wos mit 100% danach rauf geht. Selbst wenn das Netz dieses Pattern erkennt und zu 100% richtig prognostiziert, wenn das Pattern zB nur in 10% der Fälle auftritt (was schon viel wäre). Was prognostiziert das Netz in den restlichen 90%?

Wenn es "flat" prognostiziert, ist das falsch, weil wir (da wir nicht wissen an welchen Bars der Output wichtig ist) für jeden Bar die Klassifizierung "rauf", "runter" oder "flat" machen. Wenn der Kurs also in 30% rauf, in 30% runter und 30% flat geht (also die 90% aufgeteilt), wird das Netz (da es die 90% nicht prognostizieren kann) immer mind. 60% fehlerquote haben.

 

Und das obwohl es ein superpattern gelernt hat mit dem man reich werden würde. Wenn man wüsste wann es das Pattern erkannt hat, und wann es raten muss weil es "halt irgendwas sagen muss".

 

Bei der Bilderkennung ist es leichter. Da gibt es eben nur "richtiges Bild" oder "falsches Bild".

 

Falls dir eine Variante einfällt wie man ein solches Superpattern per NN lernen kann ohne 60% Fehlerquote zu erhalten: ich freu mich über Ideen ;)

Link to comment

Ich kenne deine Outputcodierung nicht, aber die Klarheit einer NN-Entscheidung kann man an der Eindeutigkeit der Belegung der Outputneuronen ablesen. Platt gesagt: Wenn sich 70% der Aussagegewichtung auf einem Neuron finden, dann ist sich das NN zu 30% nicht sicher.

Das kann man jetzt noch verfeinern mit Belegungen die sich nicht krass widersprechen (long vs flat) gegen Widersprüche (long vs short).

 

Das ist wie bei allen anderen Lernen ähnlich. Die lineare Regression z.B. wird mir auch immer "A" oder "B" sagen wenn das Sample über oder unter der Trennebene liegt. Die Distanz des Punktes zu dieser Ebene drückt aber die Qualität/Sicherheit dieser Entscheidung aus.

 

Ob dein System gerade nur herum rät, kann man nur an diesen Belegungen feststellen.

Link to comment

Nachtrag: Versuch mal deine Outputklassen logisch eindeutiger zu trennen. Ne direkte gute Klassifikation mit 3 Klassen mit nur einem Modell ist schon viel verlangt. Zum Anfang wäre "Hoch" vs "NichtHoch" vielleicht besser.

 

Ergänzend dazu wäre dieser Ansatz vielleicht hilfreich, allerdings ne Menge arbeit wenn man es händisch machen will:

http://en.wikipedia.org/wiki/Bootstrap_aggregating

http://en.wikipedia.org/wiki/Boosting_(meta-algorithm)

Link to comment

Wie die Outputs zu interpretieren sind ist mir halbwegs klar. Die Frage die bleibt: Auf was trainiere ich?

Wenn ich trainingsdaten habe, die zu 60% "falsch" sind (weil sie sagen das NN sollte "rauf" signalisieren obwohl es hier gar nichts lernen kann), wie soll es dann sinnvoll lernen?

 

Die Links schau ich mir dann am Abend an, muss jetzt ins Büro.

Link to comment

Wenn es so einfach wäre ala "Kurs in NN reinstecken" -> profitables System, wären wir alle schon reich :)

Ich denke über das Problem nochmal ne Runde nach, ich bin mir aber immer noch sicher dass es ein Repräsentationsproblem der Daten ist.

Link to comment

Wie gesagt, es kann sehr leicht sein das es ein Repräsentationsproblem ist. Bzw. ist die Frage "Wie ist die richtige Repräsentation für ein NN?" noch weit weg von beantwortet.

 

Bin für Vorschläge jederzeit offen.

Link to comment

Einen Vorschlag habe ich ja schon gemacht. Generell sollte es natürlich so sein, dass jede Instanz des "Superpatterns" im Input möglichst gleich aussieht. Das spricht natürlich total gegen absolute Kurswerte, ebenso gegen Indikatorwerte die nicht normiert sind, bzw. oszillieren.

Was definiert für dich also ein Pattern? Oder besser: Was ist das Merkmal an dem du Patterns festmachen willst?

Die relative Größe der Kurswerte zueinander? Markante Hochs und Tiefs? Die zeitliche Ausdehnung? Varianzveränderung?

Erst danach sollte man sich eine Übersetzung für das NN überlegen.

 

Fixe Idee 2:

Man nehme den ZigZag-Indikator und setze die relative Position (also Preis und Zeit) der letzten X Moves als Input. Man legt ne 1 ans Netz an wenn der dann folgende Move mind. Y Pips macht, sonst 0.

Link to comment

Naja, bei dem Experiment gehts in erster Linie um den Versuch eben nicht vorzugeben "was" das NN lernen soll. Sprich ich will ihm nicht vorgeben woran ich ein Pattern festmache etc.

 

Die Einschränkung auf Rauf/Nichtrauf trainiert derzeit. Bis jetzt mit gleich geringem Erfolg.

 

Derzeit sind die Inputs alle relativ, genauso wie die wenigen verwendeten Indikatorwerte.

Link to comment
×
×
  • Create New...