sklearn - Prediction

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

Hallo zusammen.

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)
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Zunächst: "Vorhersagen" sind keine Statistik, sondern Stochastik.
Und eine lineare Regression ist da die falsche Regressionsart.Besser wäre eine lokale Regression (Kurzform: Loess)
Ein Beispiel(nicht in Python) https://drive.google.com/file/d/1-IlVrP ... 3Fw5d/view

Die lokale Regression gibt es m.W. in dem von dir verwendeten scikitlearn aber nicht.Aber du kannst es einmal damit versuchen.

https://www.statsmodels.org/devel/examp ... orecasting
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hi,

ich habe den Artikel nur überflogen. Man möchte also anhand eines Datums den opening Wert eines Stocks berechnen? Das ist ja ein irres Beispiel.

Test/Validation andersherum. 80/20.

Debug deinen code mal bitte.

Code: Alles auswählen

print(X)
predictions = model.predict(X)
print(predictions)
Wenn du einen Array X mit timestamps reinwirfst, dann solltest du ein jeweiliges Label dafür in predictions finden.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
HeAdLeSs
User
Beiträge: 22
Registriert: Dienstag 8. März 2016, 09:22

@tonikae

Danke für deine Antwort. Die Frage ist dann aber warum dieses Tutorial, wenn es doch eigentlich quatsch ist. Ich schaue mal was ich zur lokalen Regression in Python finde.

@naheliegend
Eher den close Wert der nächsten Tage.
Ah ok, thanks.

Wie gesagt, der Wert (für die eingefügten Timestamps) wird belegt. Aber halt nicht berechnet, sondern halt einfach ein alter Wert reingeschrieben. (Siehe unten)

Code: Alles auswählen


[[20200413.]
 [20200414.]
 [20200415.]
 [20200416.]
 [20200417.]
 [20200420.]
 [20200421.]

...

 [20210406.]
 [20210407.]
 [20210408.]
 [20210409.]
 [20210410.]
 [20210411.]
 [20210412.]
 [20210413.]
 [20210414.]
 [20210415.]
 [20210416.]
 [20210417.]]
[130.190002   141.977997   150.778      150.778      150.778
 143.3079985  143.3079985  143.3079985  143.078003   143.078003
 159.9260025  159.9260025  159.9260025  156.376007   140.264008
 152.9400025  152.9400025  156.516006   159.9459995  159.9459995
 162.07       162.07       162.07       160.666      160.666
 162.725998   163.41133633 163.41133633 163.41133633 163.376007
 163.774002   164.069336   164.069336   164.069336   179.619995
 176.311996   175.53333533 175.53333533 175.53333533 189.0589985
 189.0589985  205.009995   190.8119965  190.8119965  197.65466333
 197.65466333 197.65466333 200.792007   200.179993   198.863998

...

 804.820007   813.889984   813.889984   798.150024   798.150024
 787.380005   781.299988   781.299988   720.4300235  720.4300235
 720.4300235  675.5        718.429993   686.440002   624.19667533
 624.19667533 624.19667533 618.2900085  618.2900085  668.059998
 699.599976   699.599976   695.543335   695.543335   695.543335
 653.159973   654.869995   654.869995   644.273336   644.273336
 644.273336   618.710022   611.289978   635.619995   667.929993
 661.75       691.049988   691.619995   677.26332633 677.26332633
 677.26332633 677.26332633 677.26332633 677.26332633 677.26332633
 677.26332633 677.26332633 677.26332633 677.26332633]

Antworten