Tipps für das Trainieren eines Neuronalen Netzes?
Hallo zusammen,
ich möchte versuchen, ob ich einem neuronalen Netz beibringen kann, Aktien-Kurse vorherzusagen.
Bzw. einfacher gesagt Aktien in Kaufenswert und Nicht-Kaufenswert zu Clustern.
Ich hab schon verschiedene Aktivierungsfunktionen getestet, ich habe schon verschiedene Lernraten getestet. Und ich habe schon verschieden viele Schichten mit verschieden vielen Neuronen getestet.
Allerdings sieht das Ergebnis nie so wirklich gut aus. Jetzt weiß ich nicht, ob ich was falsch mache oder ob meine Daten Müll sind.
Hätte hier jemand Tipps für mich?
So sieht mein Code aus:
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt
# Daten einlesen
data = pd.read_csv("data1.csv")
# Input und Output Daten extrahieren
X = data.iloc[:, -7:].values
y = data.iloc[:, 3].values.reshape(-1, 1)
# Input Daten skalieren
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
# Median der Output Daten berechnen
median = np.median(y)
# Output Daten in gute und schlechte Werte einteilen
y = np.where(y > median, 1, 0)
# Neuronales Netz definieren und trainieren
model = keras.Sequential([
keras.layers.Dense(2048, input_dim=7, activation='relu'),
keras.layers.Dense(512, activation='relu'),
keras.layers.Dense(512, activation='relu'),
keras.layers.Dense(2, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
learning_rate = 0.001
optimizer = keras.optimizers.Adam(lr=learning_rate)
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
early_stopping = EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(X, y, epochs=1000, batch_size=10, validation_split=0.2, callbacks=[early_stopping])
# Vorhersagen treffen und Genauigkeit auswerten
y_pred = np.round(model.predict(X))
accuracy = np.mean(y_pred == y)
false_positives = np.sum((y_pred == 1) & (y == 0))
false_negatives = np.sum((y_pred == 0) & (y == 1))
true_positives = np.sum((y_pred == 1) & (y == 1))
true_negatives = np.sum((y_pred == 0) & (y == 0))
# Ergebnisse ausgeben
print("Genauigkeit:", accuracy)
print("Falsch-Positiv:", false_positives)
print("Falsch-Negativ:", false_negatives)
print("Wahr-Positiv:", true_positives)
print("Wahr-Negativ:", true_negatives)
print("Wahr: ", true_positives + true_negatives)
print("Falsch: ", false_positives + false_negatives)
# Verlauf der Genauigkeit und des Fehlers während des Trainings darstellen
fig, ax = plt.subplots()
ax.plot(history.history['loss'], label='Trainingsfehler')
ax.plot(history.history['val_loss'], label='Validierungsfehler')
ax.set_xlabel('Epochen')
ax.set_ylabel('Fehler')
ax.legend()
fig.savefig('error.png')
2 Antworten
Hallo hi1its1me.
Zunächst einmal: Wenn es so einfach wäre, würde sich ja jeder die Aktienkurse von morgen vorhersagen lassen und steinreich werden. 😉
Darüber hinaus arbeiten alle neuralen Netzwerke nach einem mathematischen Schema. Bei Aktienkursen wird z. B. oft eine Regressionsgrade definiert, also eine Gerade, die versucht den Abstand zu jeden einzelnen Kurs so gering wie möglich zu halten.
Je extremer die Schwankungen, desto ungenauer die Gerade. Und alleine deshalb sind solche Modelle höchstens für den langfristigen Blick zu gebrauchen, also für 1-2 Jahre, aber ganz sicher nicht für kurzfristige Vorhersagen.
Und dort liegt dann eben auch das Problem: Wer weiß schon, was geopolitisch in den nächsten 1-2 Jahren passiert?
Ich denke, dein Vorhaben so ist nicht rentabel. Du könntest natürlich noch andere Modelle testen, bei kurzfristigem Blick würde sich vermutlich eher ein Chaos-Ansatz lohnen, aber auch der wird dir kein genaues Ergebnis liefern.
Denn du musst immer eins bedenken: Aktienkurse ergeben sich zwar simple gesehen aus Angebot und Nachfrage, aber es gibt eben auch extrem viele "Unbekannte", die sich auf den Kurs bemerkbar machen, aber als solches nicht angezeigt werden.
Zum Beispiel, waren Quartalszahlen besser als gedacht und der Kurs springt schlagartig nach oben. Die KI berücksichtigt dabei aber nicht, dass es nur ein kurzer extremer Schlenker war, der auf dieser Nachricht beruhte und das danach dann zwangsläufig irgendwann eine Konsolidierungsphase beginnt.
Auch weiß die KI nicht, dass die EZB bald die Zinsen weiter anhebt, wodurch feste Anlegen interessanter als ungewisses dividendenfischen wird für die Anleger und der Markt darauf vermutlich reagieren wird. Du müsstest also quasi noch den Nachrichtenverlauf nebenbei analysieren und mit einfließen lassen.
Und damit kommen wir zum letztlichen Problem: Es gibt entsprechende Softwares bei großen Hedgefonds und Banken, dessen Erstellung viele hunderte Millionen gekostet hat und obwohl dort extrem viele Parameter berücksichtigt werden, sind die Vorhersagen trotzdem nicht so gut, als dass sie jedes Jahr Milliarden einfahren würden.
Der Markt lässt sich eben nur bedingt vorhersehen, da viele Dinge unvorhergesehen eintreten, die Einfluss nehmen! Zu versuchen den Aktienkurs nur mit den historischen Kursverlauf vorherzusagen ist in etwa so, als würdest du versuchen die Regenwahrscheinlichkeit von morgen vorherzusagen, in dem du eine KI mit den Temperaturdaten der letzten 10-20 Jahre fütterst.
Moment: Mit was für Daten hast du mein Programm denn getestet?
yfinance dax daily chart. Also statt
data = pd.read_csv("data1.csv")
habe ich mir Kursdaten über
!pip install yfinance
import yfinance as yf
stock = yf.Ticker("^GDAXI")
data = stock.history(period="max")
abgerufen. Wobei ich jetzt nicht geguckt habe, wie die Daten organisiert wurden. Bin davon ausgegangen, dass die bei allen Anbietern im Grunde gleich sind. 😉
ein Kollege meinte mal, dass ein Kurs nach 4 „grünen Kerzen“ (was immer das auch sein mag) zu 60% um 2·a raufgeht, bevor er um a unter den Kaufpreis gefallen ist... iwas mit Stop-Loss noch... und FDAX... weiß nich, ob dir das weiterhilft... ich weiß auch nicht, wie man an den Kurs von diesem FDAX kommt...
Da ist meine Frage dazu... Da sind ein paar entmutigende Antworten dabei... Aber mein Kollege findet es seit Wochen super... Angeblich hat man mehrmals täglich so eine Gelegenheit...
4 „grünen Kerzen“ (was immer das auch sein mag)
Guckst du einfach mal hier vorbei, für eine recht einfache Erklärung: Kerzenchart
Ansonsten bleibt die Frage, was genau mit a gemeint ist.
Also
um 2·a raufgeht, bevor er um a unter den Kaufpreis gefallen ist...
Was genau soll a hierbei sein?
er sagt, dass „a“ meistens zwischen 10 und 20 ist... kommt auf das „tick volume“ an... keine Ahnung, was er meint... er hat das iwie „im Gefühl“...
er sagt, dass „a“ meistens zwischen 10 und 20 ist
10 bis 20 was? Welche Einheit? Pips? Euro? 😉
Aber wenn du schon von Tick Volume redest, wird er vermutlich mit einem Chart im Minutenbereich arbeiten.
Euro, glaub ich... kann ihn grad nicht fragen... er redete jedenfalls immer von Euro, wenn es um Gewinne ging...
und ja: Minuten... da war immer viel Bewegung auf seinem Tablet....
Guckst du einfach mal hier vorbei, für eine recht einfache Erklärung: Kerzenchart
ja genau... so hat er es mir auch mal erklärt... ich hab es nur wieder vergessen...
kann man das mal simulieren, ob er wirklich deswegen noch Gewinn macht? oder behauptet er das nur?
Man kann es höchstens für die Vergangenheit simulieren, schließlich kennen wir die Charts für morgen nicht. Trotzdem sind die Informationen zu vage, die du mir gegeben hast, um es sinnvoll simulieren zu können.
wo kriegt man die FDAX Kurse der letzten Wochen? Und auch dieses „tick Volumen“... Hab eh grad nix zu tun...
Habe gerade auch mal dein Programm getestet und auf den Dax angewendet, sieht doch in Ordnung aus.
98% Genauigkeit. So fern die Aktienkurse also einem Muster folgen, dürfte dein Modell mit 98%iger Wahrscheinlichkeit richtig vorhersagen, ob der Kurs steigt oder sinkt.
Wenn das in der Praxis nicht funktioniert, liegt es nicht am Modell, sondern schlicht daran, dass der zukünftige Kursverlauf keinem Muster oder Gesetzmäßigkeit folgt, sondern eine Eigendynamik hat, womit wir wieder bei meiner Antwort wären.😉