Ich habe mich gestern mit diesem Thema beschäftigt: https://dev.to/nitdgplug/stonksmaster-p ... on-ml-3hmc Also mit Vorhersagen von Börsenkursen. Also eigentlich das "Vorhersagen".
Ich bin noch Anfänger was ML/DL angeht. Der Code von der Seite funktioniert soweit auch (bis auf ein paar kleine Fehler). Ich verstehe den Code auch teilweise. Was ich aber nicht hinkriege ist das Vorhersagen der nächsten X Perioden.
In dem Beispiel (von der Seite) werden ja Tageskurse von Apple eingelesen. Diese werden dann aufgeteilt in Testdaten und Validierungsdaten(15% / 85%). Aber, soweit ich das verstehe, werden nur "Vorhersagen" für den vorhandenen Zeitraum getroffen.
Nun gibt es in Step 5 die Future Prediction. Dazu soll man Datumsangaben in das X Array hinzufügen. Nachdem ich das dann hinbekommen habe (der Code von der Webseite lief so nicht), kommt kein Ergebnis. Das Model füllt die letzten Werte mit dem immer gleichen Wert auf (der letzte vorhergesagte Wert). Das Ergibt im Chart eine tolle horizontale Linie... hat aber mit Vorhersage nichts zu tun.
Kann mir hier jemand helfen? Wie bekomme ich die vorhersage für die nächsten X Tage hin?
Viele Grüße
PS: Hier unten noch mein Code. Ist teilweise etwas anders. Die CSV mit den Teslakursen habe ich von Yahoo heruntergeladen.
Code: Alles auswählen
import pandas as pd
import numpy as np
from datetime import datetime, date
import dash
import dash_core_components as dcc
import dash_html_components as html
from plotly.tools import FigureFactory as FF
import plotly.graph_objs as go
import plotly.express as px
import plotly
import time
# start date should be within 5 years of current date according to iex API we have used
# The more data we have, the better results we get!
df = pd.read_csv('TSLA.csv')
df = df.set_index('date')
df['date2'] = df.index.str.replace("-","")
print(df)
from sklearn.model_selection import train_test_split
prices = df[['close', 'date2']].copy()
prices["timestamp"] = prices['date2'].values.astype(int)
prices = prices.drop(['date2'], axis=1)
dataset = prices.values
X = dataset[:,1].reshape(-1,1)
Y = dataset[:,0:1]
validation_size = 0.15
seed = 7
X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, test_size=validation_size, random_state=seed)
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
# Test options and evaluation metric
num_folds = 10
seed = 7
scoring = "r2"
# Spot-Check Algorithms
models = []
models.append((' LR ', LinearRegression()))
models.append((' LASSO ', Lasso()))
models.append((' EN ', ElasticNet()))
models.append((' KNN ', KNeighborsRegressor()))
models.append((' CART ', DecisionTreeRegressor()))
models.append((' SVR ', SVR()))
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# evaluate each model in turn
results = []
names = []
for name, model in models:
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
# print(cv_results)
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
print(msg)
# Future prediction, add dates here for which you want to predict
dates = ["2021-04-10", "2021-04-11", "2021-04-12", "2021-04-13", "2021-04-14", "2021-04-15", "2021-04-16", "2021-04-17"]
#convert to time stamp
for dt in dates:
timestamp = int(dt.replace("-", ""))
#print(timestamp)
# to array X
X = np.concatenate((X, np.array([[timestamp]])))
#Y = np.concatenate((Y, np.array([[0]])))
row = pd.Series({'date2': int(timestamp), 'close': 0, 'open': 0}, name=dt)
df = df.append(row)
from matplotlib import pyplot as plt
from sklearn.metrics import mean_squared_error
# Define model
model = DecisionTreeRegressor()
# Fit to model
model.fit(X_train, Y_train)
# predict
predictions = model.predict(X)
#print(mean_squared_error(Y, predictions))
# %matplotlib inline
# fig= plt.figure(figsize=(24,12))
# plt.plot(X,Y)
# plt.plot(X,predictions)
# plt.show()
# plt.savefig("test2.svg", format = 'svg', dpi=300)
#Plot the predicted and the expected values
#print(X)
#print(Y)
print(predictions)
print(df.index)
app = dash.Dash(__name__)
app.layout = html.Div()
# First instance
trace1 = {
'x': df.index,
'open': df.open,
'close': df.close,
'high': df.high,
'low': df.low,
'type': 'candlestick',
'name': 'Stock',
'showlegend': True
}
# Second instance - avg_30
trace2 = {
'x': df.index,
'y': predictions,
'type': 'scatter',
'mode': 'lines',
'line': {
'width': 1,
'color': 'green'
},
'name': 'Min Max'
}
figdata = [trace1, trace2]
fig = go.Figure(data=figdata)
# Bar trace for volumes on 2nd row without legend
#fig.add_trace(go.Bar(x=dfo.time, y=dfo.volume, showlegend=False), row=2, col=1)
fig['layout'] = dict()
fig['layout']['plot_bgcolor'] = 'rgb(200, 200, 200)'
fig['layout']['paper_bgcolor'] = 'rgb(200, 200, 200)'
fig['layout']['xaxis'] = dict(type='date')
fig['layout']['legend'] = dict(orientation='h', y=0.9, x=0.3, yanchor='bottom')
fig['layout']['margin'] = dict(t=40, b=40, r=40, l=40)
fig['layout']['height'] = 600
fig['layout']["hovermode"] = 'closest'
fig['layout']["yaxis"] = dict(fixedrange=False, autorange=True, showspikes=True, spikemode='toaxis+across+marker',
spikethickness=1)
app.layout = html.Div(children=[
html.Div(className='row', # Define the row element
children=[
html.Div(className='nine columns div-for-charts bg-grey',
children=[
dcc.Graph(id="graph", figure=fig)
]
) # Define the right element
])
])
if __name__ == "__main__":
app.secret_key = "hereisbob129856"
app.run_server(host='0.0.0.0', port=80, debug=True)