Shareholder R/2 Börsensoftware
Space shortcuts
Skip to end of metadata
Go to start of metadata

Warum H20?

Die nachfolgenden Beschreibungen sind für Hintergründe und manuelle Installationen relevant. Wenn das Kursprognose-Addon erworben wurde, kann allein über die ordnungsgemäße Installation des Addons mit H2o gearbeitet werden. Die Konfigurationen, das Setup und die notwendigen ausführbaren Programmmodule, werden dann automatisch verwaltet und installiert über Extras / Addons installieren.

Siehe hierzu auch unter: Einspielung von Addon's#HinweisezurNutzungdesH2o-Kursprognose-Addon's


H20 ist interessant, da es hochperformante Umsetzungen der relevantesten ML-Algorithmen erlaubt und dabei als Open-Source zur Verfügung steht. Von besonderem Interesse ist hier aber die qualitative und robuste Umsetzung für Deep-Learning-Ansätze (siehe auch https://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/deep-learning.html).


Dabei werden sowohl Grafikkarten zur beschleunigten Berechnung genutzt (GPU-Support / Siehe separater Abschnitt), als auch verteilte Cluster-Lösungen über mehrere Rechner unterstützt. Das System unterstützt sowohl R | Python | Java und API-Anbindungen, womit ja nach eigener Rolle und Umsetzungsvorlieben, hier die komplette Bandbreite der programmatischen Implementierungsansätze zur Verfügung stehen. Besonders interessant wird H20 aber durch die gute Dokumentation und der sogenannten H20-Flow-GUI, die es auch Nicht-Entwicklern erlaubt aus dem Blickwinkel eines Data-Scientist mit den Daten und Modellen zu arbeiten (bis zu einem bestimmten Punkt). In den Darstellungen werde ich mich vor allem auf die H20-Flow-Umgebung beziehen, da diese für Nicht-Entwickler gut nachvollziehbar und direkt nutzbar ist.

https://docs.h2o.ai/h2o/latest-stable/h2o-docs/flow.html

https://www.h2o.ai/h2o-old/why-h2o/

Basisinstallation

H20-Basis-Dokumentation

Die Installation von H2o kann entsprechend der offiziellen Anleitungen erfolgen. Minimale Schritte sind dabei:

  • Prüfen der Voraussetzungen:
    https://docs.h2o.ai/h2o/latest-stable/h2o-docs/welcome.html#requirements

    Wenn Sie zunächst keine eigenen Python/R-Skripte schreiben wollen, sondern die H2o-Flow-Oberfläche benutzten wollen, dann ist für Sie von Relevanz die Java 64 Bit-Installation. Diese kann immer relativ unproblematisch heruntergeladen und installiert werden unter nachfolgendem Link. Sollten Sie unsicher sein, was Sie benötigen, verwenden Sie die Java-JRE64-Bit-Version in der letzten verfügbaren 8er-Version!

    https://www.oracle.com/technetwork/java/javase/downloads/index.html

    (lightbulb) Nachfolgende Schritte entfallen, wenn das Machine-Learning-Kursprognose-Addon erworben wurde. Hier wird die Installation durch die SHAREholder-Installation mit abgedeckt inkl. Pflege der Versionsstände. Die vorherige Java 8-JRE-Installation sollte jedoch unabhängig auf dem System erfolgen, da sonst das H2o-System nicht gestartet werden kann!



  • Download und Entpacken der normalen H2o-Installation:
    https://www.h2o.ai/download/



    Wenn Sie hier unsicher sind, installieren Sie zunächst nur die Download-And-Run-Version d.h. Downloaden Sie die ZIP-Datei und entpacken diese in ein Verzeichnis Ihrer Wahl (sollte gut erreichbar sein).

H20-Programmstart

(lightbulb) Nachfolgende Schritte entfallen, da direkte automatische Starts bzw. manuell gestützte Starts aus der Oberfläche von SHAREholder heraus möglich sind, wenn das Machine-Learning-Addon genutzt wird. Bereits gestartete Instanzen von H2o werden von SHAREholder aber automatisch verwendet, solange die Instanz unter localhost:54321 erreichbar sind d.h. lokal laufen und unter dem Port 54321 (Default) laufen können.

Wird das System durch SHAREholder gestartet, wird automatisch das Datenverzeichnis auf das SHAREholder-Datenverzeichnis gelegt \Daten\NN\H2o. Ebenso das LOG-Verzeichnis.

Wechseln Sie in das entpackte Version und geben oben in der Adressleiste einfach "cmd" ein und starten so eine Windows-CMD-Shell im richtigen Verzeichnis. 

# Auf die CMD-Shell wechseln und folgendes Kommando nutzen:
java -Xmx<Speicherzuweisung in GB>g -jar h2o.jar -flow_dir <startverzeichnis> -log_dir <verzeichnis fuer logausgaben>

# z.B. java -Xmx8g -jar h2o.jar -flow_dir D:\h2o\data -log_dir D:\h2o\log

Die Java-Installation sollten Sie hier dann natürlich schon abgeschlossen haben. Rufen Sie dann wie im Screenshot beschrieben die URL auf. Sie haben damit einen Webdienst gestartet, der innerhalb Ihres Netzes von überall aufrufbar ist d.h. solange der Dienst/Server bei Ihnen läuft, haben Sie darauf Zugriff. In der Console wird Ihnen dann eine URL angezeigt, die Sie im Browser aufrufen.

Cluster-Betrieb

H20 kann in einem automatischen Cluster betrieben werden. Sofern die Rechner im selben Netz stehen, wird automatich über Multicast ein Clusterbetrieb gestartet. Auf der Console werden entsprechende "Cluster-Node" Informationen angezeigt. Daten-Imports müssen in diesem Modus allerdings so übergeben werden, dass jeder Rechner im Cluster darauf zugreifen kann. Lokale Verzeichnis-Imports funktionieren in diesem Modus daher nicht mehr!


Konkrete Verwendung von Daten aus ShareHolder

Nachfolgende Schritte entfallen, wenn das Machine-Learning-Kursprognose-Addon erworben wurde. Hier werden direkte Schnittstellen/Kommandos angeboten, um alle nachfoldenden Schritte vollständig zu automatisieren d.h. Datenaufbereitung, Datenübernahme, Konfigurierbares Training eines Modells mit DRF und GBM-Modellen. Sollten weitere Modelle sinnvoll werden, werden dies hier schrittweise ergänzt.

Datenaufbereitung

Um überhaupt Modelle trainieren und erstellen zu können, müssen zunächst Trainings-und Validierungsdaten geschrieben werden. Hierzu werden zunächst unter [Setup]Datenbasis die gewünschten Marktsegmente ausgewählt und die Datenvorbereitung gestartet. Im Datenverzeichnis werden die Daten nun für alle zugrundeliegenden Indikatoren und technische Basiswerte berechnet und final als eine Train-und Validierungsdaten-CSV geschrieben. Diese muss nun bei manueller Datenübernahme mit entsprechender Kennzeichnung der Datentypen in H2o übernommen werden. Es kann auch automatisiert mittels "Automatischer H2o-Import" übernommen werden.


Die Daten werden dabei immer dreiteilig nach der Datenaufbereitung abgelegt mit einer Inputtypes-Meta-Datei, die die Dateitypen explizit beschreibt und für H2o sauber übernehmen hilft. Die *Train und die *Validate.CSV, die für das Training der ML-Modelle in H2o benötigt werden. Inhaltlich sind dies normale CSV-Textdateien, die so auch in Excel geöffnet werden können.

Manuelle Schritte in H2o im H2o-Flow-Syntax und Oberfläche

Die Basisschritte sind hier sehr einfach:
Import und Übernahme der Daten aus den zuvor erstellten Datendateien (CSV oder ZIP-Dateien):

importFiles [ "D:\\Source\\ShareholderXE.DataDir\\Daten\\NN\\AI-Quote-Forecasts-Net[7]-Train.zip" ]



Anschließend werden die Importdaten inhaltllich beschrieben mit den Column-Names, Column-Types. Die Definition kann über H2o-Flow-Befehl wie nachfolgend oder über die Oberfläche manuell erfolgen. Natürlich ist die vollautomatische Datenübernahme aus ShareHolder auch hier empfohlen statt der manuellen Übernahme.

parseFiles
  source_frames: ["nfs:\\D:\\Source\\ShareholderXE.DataDir\\Daten\\NN\\AI-Quote-Forecasts-Net[7]-Train.zip"]
  destination_frame: "AI_Quote_Forecasts_Net_7__Train.hex"
  parse_type: "CSV"
  separator: 44
  number_columns: 72
  single_quotes: false
  column_names: ["StockPrices.MA[1d]","StockPrice","Open-Close-Range-Percent-4","Open-Close-Range-Percent-3","Open-Close-Range-Percent-2","Open-Close-Range-Percent-1","Open-Close-Range-Percent","Volumes-Normalized","High-Low-Range-Percent-4","High-Low-Range-Percent-3","High-Low-Range-Percent-2","High-Low-Range-Percent-1","High-Low-Range-Percent","High-Close-Range-Percent-4","High-Close-Range-Percent-3","High-Close-Range-Percent-2","High-Close-Range-Percent-1","High-Close-Range-Percent","Date","DayOfWeek","CalendarWeek","Close-Low-Range-Percent-4","Close-Low-Range-Percent-3","Close-Low-Range-Percent-2","Close-Low-Range-Percent-1","Close-Low-Range-Percent","Forecast[5d].MA[1d].ts","Forecast[5d].MA[1d].normalized[-1.00-1.00].ts","Forecast[5d].MA[1d].Rounded.ts","Forecast[5d].MA[1d].Binaer.ts","TRWinkel.signal-verkauf","TRWinkel.signal-kauf","TRWinkel.zone-3","TRWinkel.zone-2","TRWinkel.zone-1","TRWinkel.norm","Aroon.signal-verkauf","Aroon.signal-kauf","Aroon.zone-3","Aroon.zone-2","Aroon.zone-1","Aroon.norm","RWI.signal-verkauf","RWI.signal-kauf","RWI.zone-3","RWI.zone-2","RWI.zone-1","RWI.norm","RAVI.signal-verkauf","RAVI.signal-kauf","RAVI.zone-3","RAVI.zone-2","RAVI.zone-1","RAVI.norm","DMIADXADXR.signal-verkauf","DMIADXADXR.signal-kauf","DMIADXADXR.zone-3","DMIADXADXR.zone-2","DMIADXADXR.zone-1","DMIADXADXR.norm","Bollingerbands.signal-verkauf","Bollingerbands.signal-kauf","Bollingerbands.zone-3","Bollingerbands.zone-2","Bollingerbands.zone-1","Bollingerbands.norm","GleitenderDurchschnitt.signal-verkauf","GleitenderDurchschnitt.signal-kauf","GleitenderDurchschnitt.zone-3","GleitenderDurchschnitt.zone-2","GleitenderDurchschnitt.zone-1","GleitenderDurchschnitt.norm"]
  column_types: ["Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric"]
  delete_on_done: true
  check_header: 1
  chunk_size: 128315


Dies gleiche wiederholt sich hier für die Validierungsdaten:

importFiles [ "D:\\Source\\ShareholderXE.DataDir\\Daten\\NN\\AI-Quote-Forecasts-Net[7]-Validate.zip" ]
parseFiles
  source_frames: ["nfs:\\D:\\Source\\ShareholderXE.DataDir\\Daten\\NN\\AI-Quote-Forecasts-Net[7]-Validate.zip"]
  destination_frame: "AI_Quote_Forecasts_Net_7__Validate.hex"
  parse_type: "CSV"
  separator: 44
  number_columns: 72
  single_quotes: false
  column_names: ["StockPrices.MA[1d]","StockPrice","Open-Close-Range-Percent-4","Open-Close-Range-Percent-3","Open-Close-Range-Percent-2","Open-Close-Range-Percent-1","Open-Close-Range-Percent","Volumes-Normalized","High-Low-Range-Percent-4","High-Low-Range-Percent-3","High-Low-Range-Percent-2","High-Low-Range-Percent-1","High-Low-Range-Percent","High-Close-Range-Percent-4","High-Close-Range-Percent-3","High-Close-Range-Percent-2","High-Close-Range-Percent-1","High-Close-Range-Percent","Date","DayOfWeek","CalendarWeek","Close-Low-Range-Percent-4","Close-Low-Range-Percent-3","Close-Low-Range-Percent-2","Close-Low-Range-Percent-1","Close-Low-Range-Percent","Forecast[5d].MA[1d].ts","Forecast[5d].MA[1d].normalized[-1.00-1.00].ts","Forecast[5d].MA[1d].Rounded.ts","Forecast[5d].MA[1d].Binaer.ts","TRWinkel.signal-verkauf","TRWinkel.signal-kauf","TRWinkel.zone-3","TRWinkel.zone-2","TRWinkel.zone-1","TRWinkel.norm","Aroon.signal-verkauf","Aroon.signal-kauf","Aroon.zone-3","Aroon.zone-2","Aroon.zone-1","Aroon.norm","RWI.signal-verkauf","RWI.signal-kauf","RWI.zone-3","RWI.zone-2","RWI.zone-1","RWI.norm","RAVI.signal-verkauf","RAVI.signal-kauf","RAVI.zone-3","RAVI.zone-2","RAVI.zone-1","RAVI.norm","DMIADXADXR.signal-verkauf","DMIADXADXR.signal-kauf","DMIADXADXR.zone-3","DMIADXADXR.zone-2","DMIADXADXR.zone-1","DMIADXADXR.norm","Bollingerbands.signal-verkauf","Bollingerbands.signal-kauf","Bollingerbands.zone-3","Bollingerbands.zone-2","Bollingerbands.zone-1","Bollingerbands.norm","GleitenderDurchschnitt.signal-verkauf","GleitenderDurchschnitt.signal-kauf","GleitenderDurchschnitt.zone-3","GleitenderDurchschnitt.zone-2","GleitenderDurchschnitt.zone-1","GleitenderDurchschnitt.norm"]
  column_types: ["Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Enum","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum","Enum","Numeric"]
  delete_on_done: true
  check_header: 1
  chunk_size: 27107


Erst jetzt kann das eigentliche Modell erstellt werden. Die Parametisierung des gewünschten Modells wird dabei über die H2o-Oberfläche unterstützt.

buildModel "deeplearning"


Praktische Kursprognose (Prediction-Daten-Nutzung) in SHAREholder

(lightbulb) Die Prognose kann direkt in der Oberfläche erfolgen über den Kursprognose-Button in der Toolbar. Dabei stehen ALLE Modelle aus H2o zur Verfügung d.h. die aus SHAREholder heraus erzeugen, ebenso wie die in H2o selbst aufgebauten. Es wird hierzu das H2o-System nach den vorhandenen und nutzbaren Modellen gefragt. Es ist aber zu beachten, dass nur die Modelle unterstützt werden die eine Net-<Number>- im Namen tragen und kompatibel zu den bereitgestellten Trainingsdaten sind.

Es ist dabei zu beachten, dass das Namensschema für automatisch erzeugte Modelle immer folgendes beinhaltet:


Schema
BeispielGBM-Net-12-DAX.100ntrees.20depth.response[Forecast[10d].MA[1d].Rounded.Enum.ts]
Schema

<Modellart>-Net-<SHAREholder-Netz-ID>-<Selektierte-Märkte>.<Anzahl-nTrees>ntrees.<Tiefe des Entscheidungsbaums>depth.reponse[<Vorhersage-Typ>]

Modellart(hier GBM)

  • GBM : Gradient Boost Machine (Entscheidungsbaum)
  • DRF: Distributed Random Forest (Entscheidungsbaum)

SHAREholder-Netz-ID (hier ID=12)

  • Oben links in den Konfigurationsdialogen von SHAREholder


Selektierte Märkte (hier DAX)

  • Kurzbezeichnung hintereinander geschrieben der selektierten Märkte für die Datenaufbereitung. Dadurch kann schnell und einfach unterschieden werden, wenn die Daten für DowJones oder DAX geschrieben worden sind.

Vorhersage-Typ selbst mit einem eigenen Schema Forecast[<Anzahl der Vorhersage-Tage>].MA[<Datenglättung>].<Typ> (hier 5 Tage Vorhersage und Typ: Direktvorhersage in % als Floating-Wert)

  • Die Vorhersagewerte werden immer als % Wert zum Ausgangstag im Vergleich zum t+<Vorhersage-Tage> betrachtet d.h. bei Tage = 5 und einer Betrachtung von Heute (Freitag), würde die Kursentwicklung in % zum nächsten Freitag vorhersagt werden sollen (5 Handelstage)
  • Basierend auf der getroffenen Entscheidung für das Ziel-Training (Response-Column):
  • Binär: Aussagen mit 0 - Seitwärts, 1=Steigt, -1=Fällt basierend auf den gerundeten (Rounded) Vorhersagewerten
  • Normalized: Aussagen normiert auf den eingestellten Normierungs-Grenzen, umgerechnet auf Werte zwischen -1 und 1:
  • Rounded: Mathematische Rundung auf Ganzzahl-Werte der eigentlichen Kursveränderungen in % ohne Datengrenzen d.h. theoretisch -Unendlich ...Unendlich
  • Rounded-Enum: Verwendung der Rounded-Werte limitert durch die Datennormalisierungen d.h. >3% wird zu 3% und <-3% wird zu -3%.
  • .ts - Direktwert: Verwendung der exakten % Veränderung d.h. z.B. -3.444% oder +6.9898%.

    TS steht dabei nur für TimeShift und dient der internen Kontrolle der richtigen Berechnungslogik.



  • No labels