Zeitreihenprognose für den DAX-Index

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

Das Problem ist, dass Du die Normalisierungseinstellungen offensichtlich nur an den Trainingsdaten ausgerichtet hast, nicht aber an den Validierungsdaten, diese liegen an vielen Stellen außerhalb der Normalisierungsgrenzen, und zwar sowohl für den Output als auch für die Inputs.

Also: Alle Neuronen markieren, ENTER drücken (oder auf eines der markierten Doppelklicken) und dann z.B. 2000 bis 9000 einstellen.

Alternativ: Trainingslesson und Validierungslesson zusammenführen (LessonEditor->Lesson Files->Append Lesson) und damit in den Normalisierungswizard gehen.

Viele Grüße,
Thomas
Thomas Jetter
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Re: Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Hallo Thomas,

so geht's wieder. Interessant ist, dass ich eben genau das vergeblich versucht habe: Normalisierung auf beiden Datensätzen.
Also: Alle Neuronen markieren, ENTER drücken (oder auf eines der markierten Doppelklicken) und dann z.B. 2000 bis 9000 einstellen.
Dein Tipp ist eine gute Faustregel, natürlich mit Vorsicht zu genießen weil das Netz vermutlich sonst zu lange bräuchte nehme ich an.

Vielen Dank und Grüße!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

Tranquil wrote:Interessant ist, dass ich eben genau das vergeblich versucht habe: Normalisierung auf beiden Datensätzen.
MemBrain kann Normalisierung immer nur auf dem momentan aktiven Datensatz (d.h., der Lesson) im Lesson Editor durchführen. Diese Lesson muss also die Extremwerte enthalten, die während dem gesamten geplanten Einsatz des Netzes auftreten werden.

Wenn man sinnvolle Grenzen kennt, dann ist die manuelle Normalisierung meist die unkompliziertere Lösung.
Tranquil wrote:Dein Tipp ist eine gute Faustregel, natürlich mit Vorsicht zu genießen weil das Netz vermutlich sonst zu lange bräuchte nehme ich an.
Die Normalisierung hat nichts mit Geschwindigkeit zu zun, sie gibt lediglich die zulässigen Wertebereiche für die Eingangs- und Ausgangsneuronen an. Damit legt sie fest, wie Benutzerdatenbereiche auf die intern verwendeten Intervalle (z.B. -1 .. 1) umgerechnet werden. Man sollte die Normalisierung deshalb sinnvoll wählen, damit man mit dem Benutzerdatenbereich die Kennlinie der Neuronen (z.B. Logistic) gut abdeckt. Ein zu groß gewählter Normalisierungsbereich beschränkt zusätzlich die real verwendete Auflösung bei internen Berechnungen.
Man sollte aber ruhig etwas Luft nach oben und unten lassen, das schadet nichts.

Viele Grüße
Thomas Jetter
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Re: Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Hallo Thomas,

wie immer vielen Dank für Deine schnellen und ausführlichen Antworten!

Ich schreibe Dir am besten wie ich vorgegangen bin, mit der Bitte um Korrektur falls erforderlich.

Ich habe zu Testzwecken einfach das Netz "MackeyGlassTimeVariant1.mbn" genommen, welches ja als Example inkl. Tutorial bereits erhältlich ist. Dann habe ich noch zwei weitere Input-Neuronen hinzugefügt (insgesamt drei für: Open; High; Low). Der Datenimport und die Trennung von Trainings- und Validierungsdaten im Lesson Editor ist ja sehr gut in der Hilfedatei beschrieben, sodass ich darauf verzichte.

Nach einigem herumexperimentierem mit den unterschiedlichen Aktivierungsfunktionen und Teacher-Methoden, habe ich nach kurzer Zeit das Training einfach gestoppt, als eine einigermaßen akzeptable Näherung an den Original-Datensatz erkennbar wurde.

Dann habe ich noch einen, bereits zuvor abgetrennten aber zeitlich fließend übergehenden Datensatz, in den Lesson-Editor eingefügt welcher sich zeitlich nach der Validierungszeit fortsetzt (in chronologischer Reihenfolge: Trainingsdatensatz, Validierungsdatensatz, Testdatensatz).

In der Hoffnung im Pattern Error Viewer das Ergebnis einer erfolgreichen Generalisierung auf dem Testdatensatz sehen zu können, habe ich den "Think on Lesson"-Button im Lesson Editor angeklickt.

Bin ich richtig vorgegangen, wenn ich das Ergebnis der Generalisierungsfähigkeit des trainierten Netzes ermitteln wollte welches darin bestand den Close des nächsten Tages zu prognostizieren?

Vielen Dank und Grüße!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

Hallo,

- Wenn man ein zeitabhängiges Netz benutzt, dann darf man eine Lesson nicht mit der 'Split' Funktion des Lesson-Editors aufspalten, da diese nach einer Zufallsauswahl vorgeht.
Ein zeitabhängiges Netz benötigt aber streng geordnete Pattern, da es sein Lern- und Berechnungsergebnis ja von der Reihenfolge der Musterpräsentation abhängig macht.

- Zur Behandlung von Zeitreihen benötigt man nicht unbedingt ein zeitabhängiges Netz, es gibt einen Trick: Man kann ein Netz bauen, dass zusätzlich zu den Inputs eines Zeitpunkts noch weitere Inputs aus den Vorgängerzeitpunkten als weitere Inputneuronen erhält. In Deinem Fall also Neuronen für die Werte einiger Vortage.
Ein solches Netz kann natürlich nur so viele Tage der Vergangenheit in seine Prognose einbeziehen, wie es Input-Neuronensätze hat. Dafür ist es sehr viel leichter zu handhaben. Deshalb sollte man es (gerade als NN-Anfänger) erst einmal mit einem solchen Ansatz versuchen.
Allerdings bedeutet ein solcher Ansatz etwas mehr Arbeit bei der Datenaufbereitung: Für jedes Pattern muss man die Werte des aktuellen Tages und der einbezogenen Vortage in der richtigen Reihenfolge als Datensatz zusammenstellen. Allerdings ist dann jeder Datensatz für sich gültig und nicht von seinem Reihenfolgenkontext abhängig. Das erleichtert das Handling eben ungemein.

- In Deinem Falle würde ich auch den 'Close' des Vortages als Input mit aufnehmen. Also mindestens Open(t), High(t), Low(t), Close(t-1).
Wenn Du den zeitinvarianten Ansatz wie oben beschrieben wählst kommen dann noch weitere Inputsätze hinzu, also z.B:
Open(t), High(t), Low(t), Close(t-1), Open(t-1), High(t-1), Low(t-1), Close(t-2), Open(t-2), High(t-2), Low(t-2), Close(t-3)
Wie viele Zeitpunkte der Vergangenheit man einbeziehen sollte, kann ich nicht beurteilen, ich kenne die Domäne nicht.

Viele Grüße
Thomas Jetter
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

Ein grundsätzliches Problem bei Deinem Projekt ist allerdings auch, dass Dein Zieloutput wertemäßig immer extrem nah an den Inputs liegt. So ist es sehr schwer zu beurteilen, ob Deine Netze wirklich gute Vorhersagen machen oder aber nur einen der Eingangswerte ungefähr am Ausgang widerspiegeln. Das sieht dann in Deinem Fall nach einer guten Vorhersage aus, ist aber wertlos. Man sollte darüber nachdenken, das Netz darauf zu trainieren, das Vorzeichen und die Höhe der Abweichung vom Vortag an zwei getrennten Outputs zu berechnen. Diesen Output könnte man wesentlich leichter auf seine wirkliche Qualität hin untersuchen. Was meinst Du dazu?

Viele Grüße
Thomas Jetter
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Re: Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Hallo Thomas,
- Wenn man ein zeitabhängiges Netz benutzt, dann darf man eine Lesson nicht mit der 'Split' Funktion des Lesson-Editors aufspalten, da diese nach einer Zufallsauswahl vorgeht.Ein zeitabhängiges Netz benötigt aber streng geordnete Pattern, da es sein Lern- und Berechnungsergebnis ja von der Reihenfolge der Musterpräsentation abhängig macht.
Ja, ich hatte es Testweise versucht. Der Pattern Error Viewer präsentierte dann wie von Dir erwähnt das "Zufallskonstrukt". Der angesprochene Split erfolgte daher extern.
- Zur Behandlung von Zeitreihen benötigt man nicht unbedingt ein zeitabhängiges Netz, es gibt einen Trick: (...)
Das sieht nach einer interessanten Alternative aus. Vielen Dank für die gute Erläuterung der Inputs, ich will mal versuchen den Datensatz enstprechend zu verändern.
Ein grundsätzliches Problem bei Deinem Projekt ist allerdings auch, dass Dein Zieloutput wertemäßig immer extrem nah an den Inputs liegt. So ist es sehr schwer zu beurteilen, ob Deine Netze wirklich gute Vorhersagen machen oder aber nur einen der Eingangswerte ungefähr am Ausgang widerspiegeln. Das sieht dann in Deinem Fall nach einer guten Vorhersage aus, ist aber wertlos.


Ja, da stimme ich Dir zu. Das ist mir bei näherer Betrachtung auf dem Pattern Error Viewer der Validierungsdatei auch aufgefallen. Momentan unterscheidet sich das Netz eben nicht deutlich genug von einer einfachen Prognose mit dem Ziel nicht allzuhäufig daneben zu liegen, als dass es den Mehraufwand rechtfertigen würde.
Man sollte darüber nachdenken, das Netz darauf zu trainieren, das Vorzeichen und die Höhe der Abweichung vom Vortag an zwei getrennten Outputs zu berechnen. Diesen Output könnte man wesentlich leichter auf seine wirkliche Qualität hin untersuchen. Was meinst Du dazu?
Ja, das ist eine gute Idee. Qualitätsunterschiede in der Prognose ließen sich dann für den zweiten Output ermitteln, wenn der erste Output überhaupt häufig genug richtig war. Aber wie gestalte ich den Input-Datensatz so, dass der Output1 eine Klassifizierung vornimmt und der Output2 einen Differenzbetrag ausgibt?

Kurzer Nachtrag: OK, für Output1 könnte ich mir eine Änderung der Aktivierungsfunktion vorstellen falls das überhaupt Sinn ergibt. Das ist nur ad-hoc-Einfall den ich gleich niederschreiben wollte, ohne Gelegenheit gehabt zu haben das auszuprobieren.

Wenn ich mir das so recht überlege, sollte eine punktgenaue Prognose nicht logischerweise auch "qualitativ" ähnliche Ergebnisse liefern wie die einer wie beschrieben, einfachen Richtungsprognose mit einem Abweichungsbetrag (wenn ich dann diese punktgenaue Prognose auch nur nach Richtung und ggf. Betrag beurteile)?

Übrigens, bin ich überhaupt richtig vorgegangen als ich "Think on Lesson" gewählt habe? Unabhängig von der besprochenen Aussagekraft.

Vielen Dank und Grüße!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

In der Hoffnung im Pattern Error Viewer das Ergebnis einer erfolgreichen Generalisierung auf dem Testdatensatz sehen zu können, habe ich den "Think on Lesson"-Button im Lesson Editor angeklickt.
Übrigens, bin ich überhaupt richtig vorgegangen als ich "Think on Lesson" gewählt habe? Unabhängig von der besprochenen Aussagekraft.
Nein, da musst Du den Menüpunkt 'Teach' - 'Evaluate Net Error' wählen und die betreffende Lesson muss im Lesson Editor als 'Net Error Lesson' (oben rechts) ausgewählt sein.
Tranquil wrote:Wenn ich mir das so recht überlege, sollte eine punktgenaue Prognose nicht logischerweise auch "qualitativ" ähnliche Ergebnisse liefern wie die einer wie beschrieben, einfachen Richtungsprognose mit einem Abweichungsbetrag (wenn ich dann diese punktgenaue Prognose auch nur nach Richtung und ggf. Betrag beurteile)?
Das stimmt natürlich, aber es ist auf den ersten Blick wesentlich schwerer grafisch abzulesen, als wenn man sich die Vorhersage des Vorzeichens anschaut. Wenn das Vorzeichen schon mal gut aussieht, dann kann man sich ja auf den Betrag bzw. direkt auf den 'Close' stürzen...

Viele Grüße
Thomas Jetter
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Re: Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Hallo Thomas,
-Wenn Du den zeitinvarianten Ansatz wie oben beschrieben wählst kommen dann noch weitere Inputsätze hinzu, also z.B:
Open(t), High(t), Low(t), Close(t-1), Open(t-1), High(t-1), Low(t-1), Close(t-2), Open(t-2), High(t-2), Low(t-2), Close(t-3)
Etwas aufwendiger, aber es lohnt sich. Während die einfache Variante nach einer Kurzen "Einpendelzeit" keine deutlich erkennbare Anpassung erwarten lässt, sodass man geneigt sein könnte an der Topologie herumzuexperimentieren, sieht es bei der aufwendigeren Variante auf Anhieb deutlich besser aus.
Wie viele Zeitpunkte der Vergangenheit man einbeziehen sollte, kann ich nicht beurteilen, ich kenne die Domäne nicht.
Dafür gibt es meines Wissens auch keine eindeutige Aussage, weshalb ich testweise erst einmal nicht soweit gegangen bin.

Nun würde ich gerne den nächsten Schritt wagen und mit zwei Outputs arbeiten wie bereits zuvor schon von Dir vorgeschlagen. Könntest Du mir da etwas behilflich sein, wenn es Dir nicht allzu viel Mühe bereitet? Ich weiß momentan nämlich überhaupt nicht wie ich die Daten aufbereiten könnte und auch nicht wie ich den einen Netz-Output so einstelle dass er nur +- ausgibt.

Vielen Dank und Grüße!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

Hallo,

aus Deinem Datensatz 'Dax_Net1Lesson1.mbl' habe ich mal mit einem kleinen Excel-Sheet die Inputs und Outputs aufbereitet.
Ebenso habe ich ein kleines dazu passendes zeitinvariantes Netz erstellt. Es werden neben den Inputs des aktuellen Tages auch die Inputs der vier letzten Tage an das Netz gegeben.

Da das Netz zeitinvariant ist, habe ich im Lesson-Editor per Zufallsauswahl eine Trainings- und eine Validation Lesson abgespaltet. Ein kleines Skript (das es auch in genau dieser Form hier im Forum bereits gibt, nämlich hier: viewtopic.php?f=13&t=232), übernimmt Training und Validierung und zeigt außerdem während des Trainings immer abwechselnd die Graphen für alle Inputs der Trainings- und der Validierungslesson. Das Script habe ich Dir im angehängten zip-File dazu gepackt, Du musst es also nicht getrennt herunterladen.

Oben im Skript kann man an ein paar Konstanten drehen, damit kann man beeinflussen, wie lange trainiert wird und in welchem Rhytmus die Ansicht wechselt.

Alle Dateien sind im angehängten zip-File enthalten. Das zip erstellt ein eigenes Verzeichnis. Das darin befindliche script 'TrainValidate.as' einfach von MemBrain aus ausführen über den Menüpunkt 'Scripting'-'Execute Script...'

Im Excel-Sheet befinden sich auf der ersten Seite Deine Roh-Daten. Das zweite Tabellenblatt stellt die Input- und Outputspalten zusammen. Das dritte Tabellenblatt dient dazu, ein CSV zu erzeugen. Wenn Du Änderungen an den Daten vornimmst, dann also einfach das Blatt 'Export' als csv abspeichern.

Hilft Dir das erst einmal weiter?

PS: Lass Dich nicht davon verwirren, dass Du in den Validierungsdaten keine Zeitreihe mehr erkennen kannst. Jedes Pattern ist für sich unabhängig gültig (es beinhaltet ja die 4 letzten Zeitpunkte aus der Vergangenheit), wurde aber zufällig aus der Gesamtlesson harausgegriffen. Wahrscheinlich sollte man noch mehr Zeitpunkte aus der Vergangenheit hinzunehmen. Wenn Du Dir das Excel-Sheet ansiehst, dann kannst Du das bestimmt leicht selbst erweitern. Wenn Du weitere Inputs im Netz und in der Lesson hinzufügst, dann kannst Du den Neuronen mit dem Button 'Names To Net' aus dem Lesson-Editor leicht die neuen Namen aus der Lesson zuweisen und so die erweiterte Lesson wieder mit dem neuen Netz synchronisieren.

Viele Grüße
Attachments
TrainValidate_TJ_20120224.zip
Zip file mit Trainings-/Validationscript, Netz, Train Lesson, Validate Lesson, Excelsheet zur Datenaufbereitung
(1.28 MiB) Downloaded 661 times
Thomas Jetter
Post Reply