Generierung von eigenen Trainingsprojekten

Wieso?

Wie schon in der Hauptdokumentation erläutert müssen die vorliegende Rohdaten, ob Aktienkurse oder andere Werte, für die Verarbeitung durch das Neuronale Netz aufbereitet werden. Dazu zählt neben der Kodierung auch die zeitliche Ordnung der Daten.

Normale Kurs- oder Funktionswerte geben einem Neuronalen Netz noch keine Anhaltspunkte um zeitliche Zusammenhänge zu erkennen. Deshalb wird für die Zeitreihenanalyse das sogenannte 'Zeitfenster'-Prinzip verwendet. Dieses Zeitfenster besteht aus einer, für alle Datensätze einer konkreten Kurve, festen Anzahl von Datenwerten die zuvor vom Nutzer ausgewählt werden muss. In sämtlichen Beispielen in unserem Beleg sind wir von einem Zeitfenster von 5 Werten (d.h. 5 Tagen) ausgegangen. Damit ist dann natürlich auch die Anzahl der Eingangsneuronen des Netzes definiert. Dieses Zeitfenster wird dabei nun vom einem Datensatz zum nächsten verschoben, d.h. aus dem Wert des 1. Tages wird der des 2., aus dem 2. der des 3. Tages usw. und bildet damit ein neues Datenmuster. An die Stelle des 1. Tages tritt dafür ein neuer Wert aus der Datenbasis.

Ein Zeitfenster bildet im Zusammenhang mit einem Ausgangswert ein komplettes Datenmuster (Pattern) für das Neuronale Netz. Außerdem sind die vorliegenden Werte noch zu kodieren und zu normalisieren um sie an die Bedürfnisse des Lernvorgangs (Aktivierungsfunktion) anzupassen. Alle im folgenden vorgestellten Skripte arbeiten in diesem Prinzip die Rohdaten auf. Die Zeitverschiebung wird dabei fest mit einer Zeiteinheit. Auch für die Anzahl der Ausgangwerte (Ausgangsneuronen) der Datensätze sollten keine Wert größer als 1 angegeben werden. Sowohl die Skripte und das Netz können damit problemlos umgehen, allerdings ist die Anwendung bei der Auswertung (grafische Darstellung und tabellarische Ausgabe) nur auf eine Ausgangswert festgelegt. 

Womit?

Da alle Komponenten separate Entwicklungen darstellen, um auch zuallererst einzeln an anderen kleinen Aufgaben getestet wurden, war ein allgemeines Format, welches nicht auf Zeitreihen beschränkt ist, zur Darstellung von Datensätzen für das Netz nötig. Daher findet die Generierung eigenständig statt. Die Wahl fiel auf das UNIX-Tool AWK, das für Stringbearbeitung prädestiniert ist und für C- und Shell-Programmierer eine sehr angenehme Syntax hat. Es gibt auch andere Alternativen wie zum Beispiel Perl, da aber awk in fast allen Standardinstallationen von UNIX enthalten ist, entschieden wir uns dafür. Falls kein Zugang zu einem UNIX-System vorhanden ist, bietet sich für Windows Nutzer das frei zugängliche Paket Cygwin an. Cygwin stellt unter anderem neben den diversen UNIX-Shells auch die UNIX-Standardtools (wie awk) und auch Compiler bereit.

Woraus?

Die von uns genutzten historischen Aktienkurse bestehen aus 5 Werten pro Tag, die durch Semikolons getrennt sind. Der verwendete Schlusskurs der Aktie ist der 5. Wert in einer Zeile, d.h. aus allen Datenbeständen wird immer nur der 5. Wert betrachtet. Bei vorliegenden Fremdformaten die davon abweichen ist vorher eine Transformation in dieses Format leider unumgänglich. Für einfache Zahlenkolonnen mit nur einem Wert pro Zeile ist es ausreichend die entsprechende Anzahl von Semikolons vor den Zahlerwert zu setzen. Dafür steht auch schon ein awk-Skript 'foreign.awk' zur Verfügung. Ein typischer Aufruf sieht so aus:

awk -f foreign.awk aktienkurs.txt > ausgabedatei.txt

Bei stark abweichenden Formaten sind natürlich umfangreiche Änderungen nötig. Werden gar Kurse in Binärformaten verwendet, führt an einem separaten Programm zur Generierung kein Weg vorbei.

Im folgenden werden die Skripte und die erstellten Dateien noch genau betrachtet und ein Beispiel gezeigt.

Wie?

Für die Generierung arbeiten mehrere Shell- und Awk-Skripte zusammen. Das Shell-Skript 'generate_files.bash' 
verlangt als ersten Parameter ein Eingabeverzeichnis in dem die Ausgangsdateien vorliegen und als zweiten Parameter ein Ausgabeverzeichnis in welchem die erzeugten Projekte in separaten Verzeichnissen abgelegt werden. Beide Verzeichnisse müssen existieren. Für jede vorliegende Datei in dem Eingabeverzeichnis wird im Ausgabeverzeichnis ein eigenes Verzeichnis angelegt, worin dann die Projektdateien gespeichert werden. 
Die eigentliche Arbeit für jede Eingabedatei übernimmt das Shell-Skript 'generate_project.bash' das mit Hilfe der awk-Skripte 'aktie_limits.awk' und 'aktie.awk' die Werte kodiert in den einzelnen Dateien ablegt.

Die einzelnen Parameter wie die Anzahl der Eingans- und Ausgangsneuronen sowie das Verhältnis zwischen der Anzahl der Trainings- und Validierungsdatensätze sind in 'generate_project.bash' festgelegt.

Hier nun ein Beispiel für die Kommandozeile in einer UNIX-Shell (BASH) mit dem Verzeichnis ../aktien/ als Eingabeverzeichnis und ../projekte/ als Ausgabeverzeichnis

bash generate_files.bash ../aktien/ ../projekte/

Verweise

Skripte

Download von Cygwin:
http://sources.redhat.com/cygwin/

Einführungen zu awk (englisch):
http://www.canberra.edu.au/~sam/whp/awk-guide.html

http://www.cs.ruu.nl/docs/vakken/st/nawk/nawk_toc.html

Informationen zu Gnu-awk (erweitertes awk):
http://www.gnu.org/software/gawk/gawk.html