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.
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Hallo zusammen,

ich möchte gerne eine Zeitreihenprognose für den DAX-Index mit MemBrain erstellen. Ich bin schon soweit, dass ich ein Netz trainiert habe und einigermaßen passable Ergebnisse zwischen Trainingsdaten und Validierungsdaten erreichen konnte.

Nun gleich zu meinem Problem nach einer kurzen Einleitung meines Vorhabens.

Ich lade historische Tagesschlusskurse des DAX-Index von Yahoo herunter http://de.finance.yahoo.com/q/hp?s=^GDAXI. Diese Daten verarbeite ich dann in ein lesbares CSV-Format für MemBrain mit folgenden 4 Inputs: Open;High;Low;Close und 1 Output: Close;

Sprich, ich möchte eine Prognose für den nächsten Tagesschlusskurs haben wenn ich dem Netz als Input die tagesaktuellen Schlusskursdaten liefere.

Dafür erstelle ich im Lesson Editor, nachdem ich die entsprechende Lesson geladen habe, ein "New Pattern" und füge manuell die aktuellen Tagesschlusskurdaten ein und ergänze somit die Input-Validierungsdatei um eine weitere Datenreihe bestehend aus Open;High;Low;Close.

Da ich den "Close", also den Tagesschlusskurs des folgenden Tages anhand der eingegebenen Inputs (Open;High;Low;Close) des aktuellen Tages erhalten möchte, wähle ich den "Output" ab. Im Pattern Error Viewer lässt sich die blaue und rote Kurve der Validierungs-Datei betrachten... und eine horizontale Target-Linie die nach Eingabe der Inputs gen Null tendiert.

Wie gehe ich also vor, wenn ich ein Netz für den o.a. Zweck trainiert habe und es dann auch regelmäßig nutzen möchte?

Ich habe jedoch die heimliche Vermutung, dass dies nicht unbedingt der eleganteste Weg in MemBrain ist, wenn überhaupt korrekt.

Ich möchte hinzufügen, dass dies nicht mein einziges Problem ist und ich es vorziehe eins nach dem anderen zu lösen, statt parallel was mich und vermutlich auch andere Leser nur verwirren könnte. Abschließend hoffe ich, dass sich so ein FAQ der Zeitreihenprognose bildet, sodass jeder Anfänger von MemBrain gleich mit einem "Real-life Example" starten kann und sich somit eine gute Basis für weitere Entwicklungen aneignen kann.

Vielen Dank!
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 und herzlich WIllkommen im Forum!
Tranquil wrote:Wie gehe ich also vor, wenn ich ein Netz für den o.a. Zweck trainiert habe und es dann auch regelmäßig nutzen möchte?
Da gibt es zwei grundsätzliche Ansätze:

1.) Eine eigene Anwendung schreiben (z.B. in C/C++, C#, Java ...) und die MemBrain DLL einbinden, die Dein Netz laden, inputs anlegen und den Output berechnen kann. Im einfachsten Fall kann das auch ein Excel-Sheet sein, dass über ein bisschen VBA Code die DLL nutzt und einen Button 'Prognose' besitzt.
Wie die Daten in Dein Programm kommen, musst Du Dir natürlich überlegen. Eine Möglichkeit ist immer ein CSV Import.

2.) Ein kleines MemBrain Skript schreiben, dass das Netz lädt, die Benutzereingaben entgegennimmt (entweder über Eingabedialoge oder über CSV Import), die Ausgabe berechnet und dem Benutzer ausgibt.
Als Start ist hier das universelle Trainings- und Validierungsskript bestimmt sehr sinnvoll:
viewtopic.php?f=13&t=232
Dieses Skript exportiert übrigens am Ende auch alle in Reaktion auf die Validierungsinputs berechneten Outputs in eine CSV-Datei. Wenn man will könnte man durch Erweitern des Skripts zum Beispiel die exportierte CSV-Datei anschließend auch automatisch durch das Skript in Excel öffnen lassen, so dass die Ergebnisse direkt präsentiert werden.

Mit beiden Möglichkeiten lässt sich das Netz auch nachtrainieren, falls das gewünscht ist.

Den Haken 'Output Data' im Lesson-Editor kannst Du übrigens auch getrost gesetzt lassen. Er ist nur bei einer Lesson von Bedeutung, mit der trainiert wird (also der Trainingslesson) und ihn wegzulassen macht auch nur Sinn, wenn man mehrere Netze über TCP/IP vernetzt und trainiert. Das hat stark experimentellen Charakter und hat für den Anwendungsfall hier keine Bedeutung.

Allerdings habe ich noch grundsätzliche Bedenken, ob Du den Close des Folgetages lediglich auf Basis der genannten Inputs des Vortages wirst bestimmen können. Ich denke, Du solltest zumindest noch die Inputs von einigen vorgelagerten Tagen mit als weitere Eingangsneuronen zum Netz dazunehmen. Eine Alternative wäre ein zeitvariantes Netz aufzubauen, da wird die Sache aber sehr schnell kompliziert, ich würde erst einmal nicht dazu raten.

Viel Spaß und Erfolg!
Thomas Jetter
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Re: Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Hallo Thomas,

vielen Dank für die nette Begrüßung und die ausführlichen Lösungsvorschläge.
Admin wrote: 1.) Eine eigene Anwendung schreiben (z.B. in C/C++, C#, Java ...) und die MemBrain DLL einbinden, die Dein Netz laden, inputs anlegen und den Output berechnen kann. Im einfachsten Fall kann das auch ein Excel-Sheet sein, dass über ein bisschen VBA Code die DLL nutzt und einen Button 'Prognose' besitzt. Wie die Daten in Dein Programm kommen, musst Du Dir natürlich überlegen. Eine Möglichkeit ist immer ein CSV Import.
Ich habe zwar den o.a. Lösungsweg verstanden und kann mir auch so ungefähr vorstellen wie das Handhabungstechnisch funktionieren könnte, wenn ich doch nur die entsprechenden Programmierkenntnisse hätte...
Admin wrote: 2.) Ein kleines MemBrain Skript schreiben, dass das Netz lädt, die Benutzereingaben entgegennimmt (entweder über Eingabedialoge oder über CSV Import), die Ausgabe berechnet und dem Benutzer ausgibt. Als Start ist hier das universelle Trainings- und Validierungsskript bestimmt sehr sinnvoll: viewtopic.php?f=13&t=232

Dieses Skript exportiert übrigens am Ende auch alle in Reaktion auf die Validierungsinputs berechneten Outputs in eine CSV-Datei. Wenn man will könnte man durch Erweitern des Skripts zum Beispiel die exportierte CSV-Datei anschließend auch automatisch durch das Skript in Excel öffnen lassen, so dass die Ergebnisse direkt präsentiert werden.

Mit beiden Möglichkeiten lässt sich das Netz auch nachtrainieren, falls das gewünscht ist.
Die Variante 2.) gefällt mir dennoch besser. Dafür habe ich auch Deinen Beitrag: viewtopic.php?f=11&t=111 gelesen, bin aber trotzdem nicht in der Lage das fehlerfrei umzusetzen.
Admin wrote: Den Haken 'Output Data' im Lesson-Editor kannst Du übrigens auch getrost gesetzt lassen. Er ist nur bei einer Lesson von Bedeutung, mit der trainiert wird (also der Trainingslesson) und ihn wegzulassen macht auch nur Sinn, wenn man mehrere Netze über TCP/IP vernetzt und trainiert. Das hat stark experimentellen Charakter und hat für den Anwendungsfall hier keine Bedeutung.
O.K.
Admin wrote: Allerdings habe ich noch grundsätzliche Bedenken, ob Du den Close des Folgetages lediglich auf Basis der genannten Inputs des Vortages wirst bestimmen können. Ich denke, Du solltest zumindest noch die Inputs von einigen vorgelagerten Tagen mit als weitere Eingangsneuronen zum Netz dazunehmen. Eine Alternative wäre ein zeitvariantes Netz aufzubauen, da wird die Sache aber sehr schnell kompliziert, ich würde erst einmal nicht dazu raten.
Da stimme ich Dir natürlich zu, dies (Inputs von einigen vorgelagerten Tagen) sollte dann hoffentlich auch machbar sein, wenn die zuvor angesprochenen Hindernisse aus dem Weg geräumt sind.

Ich konnte in der Zwischenzeit einen kleinen Einblick in diverse andere KNN-Softwarepakete gewinnen und muss sagen dass ich teilweise entnervende Erfahrungen mit der Bedienung machen durfte. Gerade weil ich kein Programmierer bin, muss ich viel Wert auf eine intuitive Benutzeroberfläche legen. Und obwohl es dort teilweise Prognose-Buttons u.ä. gibt, erschien es mir dennoch nicht wert auf die enorme Flexibilität zu verzichten die MemBrain bietet.

Da ich nun der Ansicht bin, dass es für "die anderen" erheblich komplizierter werden dürfte in Sachen Flexibilität mit MemBrain gleichzuziehen, als es Dir und/oder einem anderen programmierversierten Mitglied möglich wäre, eine ähnlich geartete "Prognose-Funktion" in MemBrain einzubinden, erlaube ich mir anzufragen ob es einen Versuch wert wäre? Alternativ zum Beispiel auch so, dass neue Daten manuell oder per Import-Funktion eingegeben werden können, welche dann durch das bereits trainierte Netz laufen und einen entsprechend Output generieren. Alle Graphen etc. sollten dann prinzipiell das gleiche aussehen haben, ausgenommen halt die Tatsache, dass es sich nicht um ein soeben erst trainiertes Netz handelt.

In diesem Zusammenhang verstehe ich deshalb immer noch nicht, welchen Nutzen die Abbildung eines Modells anhand einen neuronalen Netzes haben soll, wenn es nicht "ohne weiteres" auch möglich ist neue Daten "oben" einzugeben, durch die Schichten hindurch laufen zu lassen um "unten" einen entsprechend dem Netz gewichteten Prognose-Output auszugeben?

Vielen Dank!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Zeitreihenprognose für den DAX-Index

Post by Admin »

Admin wrote:erlaube ich mir anzufragen ob es einen Versuch wert wäre? Alternativ zum Beispiel auch so, dass neue Daten manuell oder per Import-Funktion eingegeben werden können, welche dann durch das bereits trainierte Netz laufen und einen entsprechend Output generieren. Alle Graphen etc. sollten dann prinzipiell das gleiche aussehen haben, ausgenommen halt die Tatsache, dass es sich nicht um ein soeben erst trainiertes Netz handelt.
Poste doch bitte einmal einen repräsentativen Datensatz hier und beschreibe, wie genau Du am liebsten mit dem Netz umgehen würdest. Wie Du also Daten eingeben willst, wie Du den Output präsentiert haben willst, wie oft Du nachtrainisren willst etc.

Ich werde dann versuchen, ein kleines MemBrain Skript zu schreiben, was möglichst flexibel ist, so dass Du es Deinen Bedürfnissen nach 'feintunen' kannst, wie klingt das? Das würde bestimmt auch anderen Benutzern helfen...
In diesem Zusammenhang verstehe ich deshalb immer noch nicht, welchen Nutzen die Abbildung eines Modells anhand einen neuronalen Netzes haben soll, wenn es nicht "ohne weiteres" auch möglich ist neue Daten "oben" einzugeben, durch die Schichten hindurch laufen zu lassen um "unten" einen entsprechend dem Netz gewichteten Prognose-Output auszugeben?
Es ist durchaus möglich neue Daten 'oben einzugeben' und den Output des Netzes dazu berechnen zu lassen. Nichts anderes geschieht, wenn man im Lesson Editor die neuen Inputs eintippt (oder aus CSV importiert) und dann 'Think On Input' klickt. Wenn man dabei den Haken 'Record...' gesetzt hat und eine Lesson zum Aufzeichnen ausgewählt hat, dann bekommt man Inputs samt Outputs auch in einem neuen Muster abgelegt, das man jederzeit in CSV exportieren kann. Wenn einem das Geklicke zu viel ist, oder wenn man solche DInge häufiger macht, dann lohnt es sich allerdings, das in einem kleinen Script abzulegen.
Dazu feste Funktionen in MemBrain einzubauen macht wenig Sinn, weil eben doch jedes Problem ein bisschen anders aussieht und jeder Nutzer einen etwas anderen Anwendungsfall verfolgt.
Außerdem wirst Du bestimmt auch schnell an dem Punkt angelangen, wo Du Dein Script weiter ausbauen willst, damit es noch effizienter und auf Deine Bedürfnisse angepasster funktioniert. Z.B. könnte Dich das Script fragen, ob Dein neu eingegebener Wert als Trainingsmuster mit aufgenommen werden soll. Zu diesem Trainingsmuster könntest Du am Ende des Tages dann auch den tatsächlichen Close-Wert eintragen, der dann den prognostizierten ersetzt. Man könnte auch auf die Idee kommen, sukzessive aus einem Datensatz eine Trainingslesson aufzubauen und zu schauen, wie gut man den nächsten Wert vorhersagen kann. Dann könnte man den nächsten Wert mit seinem tatsächlichen Output in die Trainingslesson aufnehmen und zum wiederum nächsten fortschreiten usw. So ließe sich eine aussagekräftige Validierung des Netzes herbeiführen. Spätestens wenn solche Überlegungen ins Spiel kommen stößt jeder noch so ausgefeilte fest verdrahtete Ablauf in MemBrain an seine harten Grenzen.

Abschließend freut es mich natürlich sehr, dass Du nach weiterer Recherche trotzdem bei MemBrain bleiben willst, vielen Dank für das positive Feedback!

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,

vielen Dank für die sehr hilfreiche Antwort.
Poste doch bitte einmal einen repräsentativen Datensatz hier und beschreibe, wie genau Du am liebsten mit dem Netz umgehen würdest. Wie Du also Daten eingeben willst, wie Du den Output präsentiert haben willst, wie oft Du nachtrainisren willst etc. Ich werde dann versuchen, ein kleines MemBrain Skript zu schreiben, was möglichst flexibel ist, so dass Du es Deinen Bedürfnissen nach 'feintunen' kannst, wie klingt das? Das würde bestimmt auch anderen Benutzern helfen...
Das wäre einfach super!

Ich stelle sehr gerne einen entprechenden Datensatz zur Verfügung. Derzeit "experimetiere" ich jedoch noch zu sehr mit den Beispielnetzen, als dass ich eine konkrete Aussage darüber treffen könnte, was das Script genau machen soll. Dafür benötige ich noch etwas Zeit zum testen.

Deine Ideen im letzten Abschnitt sind eine sehr gute Basis und zeigen mal wieder wie adaptiv MemBrain durch ein Script wird. Ich stimme Dir voll zu, was feste Funktionen in MemBrain angeht und ein Script die bessere Variante ist. Als nichtprogrammierer ist es dennoch schwer, das ganze nachzuvollziehen, daher hoffe ich das dies besser wird, sobald ein konkretes Script vorliegt.
Es ist durchaus möglich neue Daten 'oben einzugeben' und den Output des Netzes dazu berechnen zu lassen. Nichts anderes geschieht, wenn man im Lesson Editor die neuen Inputs eintippt (oder aus CSV importiert) und dann 'Think On Input' klickt.
Wenn ich so vorgehe, dann erhalte ich tatsächlich einen Output. Klicke ich jedoch mehrfach erhalte ich auch weitere, unterschiedliche, wenn auch noch im Rahmen befindliche Outputs, bis es dann irgendwann beim letzten Output-Wert stoppt. Worin liegt das begründet? Vermutlich systembedingt, aber irgdenwie nicht auf Anhieb nachvollziehbar.

In diesem Zusammenhang will ich auch meine ersten Fragen loswerden, die durch das "experimentieren" entstanden sind. Anbei 4 CSV-Dateien mit Daten des DAX-Index bezogen von Yahoo (siehe mein Beitrag zuvor). Die Daten müssen aber nach dem Download noch editiert werden. Dafür verwende ich einen CSV-Editor namens: CSVed ---> http://csved.sjfrancke.nl/#csve Kleiner Tipp, man sollte die Datei erst wie üblich öffnen und prüfen, welche Trenner verwendet werden (Semikolon, Komma, Tab etc.) dann CSVed öffnen und unten links den entsprechenden Trenner erst anklicken bevor dann die Datei über CSVed geöffnet wird.

Auf dem beigefügten Bild ist der PatternError Viewer der Validierungs-Datei zu erkennen, links und rechts ist eine relative Genralisierung erkennbar. In der Mitte jedoch, nix. Den entsprechenden Datensatz habe ich beigefügt. Die Traininigs-Datei hat diesen Fehler nicht, ein Reimport des Datensatzes löst das Problem nicht. Unterschiedliche Netzstrukturen (Beispielnetze) und Lernmethoden in diversen Varianten auch nicht.
Abschließend freut es mich natürlich sehr, dass Du nach weiterer Recherche trotzdem bei MemBrain bleiben willst, vielen Dank für das positive Feedback!
Natürlich und selbstverständlich bei so einem Support!

Mit freundlichen Grüßen,
Tranquil
Attachments
DAX_30trainInput.csv
Der Input Datensatz für das Training bestehend aus dem Eröffnungs-, Höchst- und Tiefstskurs.
(47.87 KiB) Downloaded 666 times
DAX_30trainOutput.csv
Der Output Datensatz für das Training bestehend aus dem Schlusskurs.
(17.24 KiB) Downloaded 700 times
Last edited by Tranquil on Thu 16. Feb 2012, 08:34, edited 9 times in total.
Tranquil
Posts: 13
Joined: Sun 5. Feb 2012, 12:03

Re: Zeitreihenprognose für den DAX-Index

Post by Tranquil »

Anlagen zum vorherigen Beitrag.
Attachments
DAX_30validateInput.csv
Der Input-Datensatz für die Validierung bestehend aus Eröffnungs-, Höchst-,und Tiefstkurs.
(14.52 KiB) Downloaded 678 times
PatternErrorValidate.png
Ein Snapshot des Pattern Error Viewers mit der Validierungsdatei.
(24.05 KiB) Not downloaded yet
DAX_30validateOutput.csv
Der Output-Datensatz für die Validierung bestehend aus dem Schlusskurs.
(5.23 KiB) Downloaded 667 times
Last edited by Tranquil on Thu 16. Feb 2012, 08:36, edited 1 time in total.
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:Wenn ich so vorgehe, dann erhalte ich tatsächlich einen Output. Klicke ich jedoch mehrfach erhalte ich auch weitere, unterschiedliche, wenn auch noch im Rahmen befindliche Outputs, bis es dann irgendwann beim letzten Output-Wert stoppt. Worin liegt das begründet? Vermutlich systembedingt, aber irgdenwie nicht auf Anhieb nachvollziehbar.
Da hast Du wohl versehentlich ein zeitvariantes Netzwerk gebaut. Ein solches Netz macht seinen Output nicht nur vom momentanen Input abhängig, sondern auch von der Historie seiner inneren Vorgängerzustände. Damit kann trotz gleich bleibender Inputs bei jedem Think Step etwas anderes am Output erzeugt werden.

Ein solches Netzwerk ist wesentlich schwerer zu trainieren und einzusetzen als ein zeitinvariantes Netz.

Einfach mal in MemBrain den Menüpunkt <Net><Analyse Net> ausführen. Im dann erscheinenden Fenster steht dann unten ein Statement, z.B. 'The network is time variant'.

Du kannst gerne das Netz auch mal posten, dann kann ich genauer sagen, wo die Zeitabhängigkeit herkommt. Kandidaten dafür sind Rückkopplungslinks, Decay-Neuronen und Delay-Links.

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,

ich glaube verstanden zu haben weshalb beim Think-Prozess unterschiedliche Outputs generiert werden und auch weshalb es nach einer gewissen Zeit stoppt. Das zweitere hängt vermutlich mit der Anzahl an Delay/Decay-Neuronen zusammen. Aber sollte es in diesem speziellen Fall einer Zeitreihenanalyse nicht auch ein Zeitvariantes Netz sein?

Ich habe ein Screenshot beigefügt. Dort ist das Beispielnetz "net1" mit der angepassten Anzahl an IO's ohne Decay/Delay etc. Der abgebildete Pattern Error Viewer zeigt die Validierungsdatei (2), im Lesson editor sind die Trainingsdaten (1) zu sehen.

Die flache Linie in der Mitte erscheint auch wenn ich unterschiedliche Abschnitte der Zeitreihe importiere und unabhängig von der Netzstruktur also egal ob ich "net1" verwende oder eines aus dem MackeyGlass-Example. Die Linie erscheint nur bei der Validierung, wohingegen das Training recht schnell einen Fortschritt erkennen lässt. Es handelt sich hierbei zwar um nicht gerade wenig Pattern, aber auch eine erhebliche Reduzierung führt zum gleichen Bild sodass die Rechenzeit eigentlich nicht das Problem sein kann, zumal links und recht von der Linie eine Annäherung innerhalb weniger Sekunden stattfindet. Ferner half auch der Import einer anderen Zeitreihe nicht, sodass ich Datenfehler auschließen möchte, welche ja eigentlich bereits auf der "current"-Linie im Pattern Viewer erkannbar sein sollten.

Vielleicht hast Du ja eine Idee?

Vielen Dank und Grüße!
Attachments
PatternError_Validierung.png
Beispielnetz "net1" mit der angepassten Anzahl an IO's ohne Decay/Delay etc. Der abgebildete Pattern Error Viewer zeigt die Validierungsdatei (2), im Lesson editor sind die Trainingsdaten (1) zu sehen.
(98.23 KiB) Not downloaded yet
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,

nur ein ganz schneller Tipp 'aus der Hüfte heraus': Hast Du die Normalisierungsgrenzen des Output-Neurons mal geprüft? Läuft es vielleicht an seine untere Normalisierungsgrenze? In diesem Fall den Wertebereich entsprechend ausweiten... Poste doch bitte auch mal das Netz (als Datei).

Nie Normaliserungsgrenzen findest Du per Doppelklick auf das Neuron und dann über den Button 'Normalization'.

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,

vielen Dank für die schnelle Antwort.

Ich habe den "Normalization Wizard" sowie auch die "Normalization"-Funktion auf die min/max-Spanne eingestellt sowie auch die vorgeschlagenen Werte übernommen, doch leider ohne Erfolg. Bestimmt übersehe ich da etwas, was Dir hoffentlich auffällt.

Vielen Dank und Grüße!
Attachments
Dax_Net1Lesson2.mbl
(31.38 KiB) Downloaded 671 times
Dax_Net1Lesson1.mbl
(103.42 KiB) Downloaded 685 times
Dax_Net1.mbn
(1.65 KiB) Downloaded 681 times
Post Reply