Machine Learning: Börsenkurse vorhersagen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
earloop
User
Beiträge: 38
Registriert: Sonntag 11. Oktober 2020, 13:54

Hi,

ich beschäftige mich mit Machine Learning und bin dabei auf das hier (Step-by-Step Guide — Building a Prediction Model in Python) gestoßen:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
rcParams['figure.figsize']=20,10
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler


"""
Read Data
"""
df = pd.read_csv('aapl_stock_1yr.csv')
df = df[['Date', 'Close/Last']]
df = df.replace({'\$':''}, regex = True)

df = df.astype({"Close/Last": float})
df["Date"] = pd.to_datetime(df.Date, format="%m/%d/%Y")

df.index = df['Date']

plt.plot(df["Close/Last"],label='Close Price history')


"""
Data Preparation
"""
df = df.sort_index(ascending=True,axis=0)
data = pd.DataFrame(index=range(0,len(df)),columns=['Date','Close/Last'])
for i in range(0,len(data)):
    data["Date"][i]=df['Date'][i]
    data["Close/Last"][i]=df["Close/Last"][i]

"""
Min-Max Scaler
"""
scaler=MinMaxScaler(feature_range=(0,1))
data.index=data.Date
data.drop("Date",axis=1,inplace=True)
final_data = data.values
train_data=final_data[0:200,:]
valid_data=final_data[200:,:]
scaler=MinMaxScaler(feature_range=(0,1))
scaled_data=scaler.fit_transform(final_data)
x_train_data,y_train_data=[],[]
for i in range(60,len(train_data)):
    x_train_data.append(scaled_data[i-60:i,0])
    y_train_data.append(scaled_data[i,0])
x_train_data = np.asarray(x_train_data)
y_train_data = np.asarray(y_train_data)    

"""
LSTM Model
"""
lstm_model=Sequential()
lstm_model.add(LSTM(units=50,return_sequences=True,input_shape=(np.shape(x_train_data)[1],1)))
lstm_model.add(LSTM(units=50))
lstm_model.add(Dense(1))

model_data=data[len(data)-len(valid_data)-60:].values
model_data=model_data.reshape(-1,1)
model_data=scaler.transform(model_data)

"""
Train and Test Data
"""
lstm_model.compile(loss='mean_squared_error',optimizer='adam')
lstm_model.fit(x_train_data,y_train_data,epochs=1,batch_size=1,verbose=2)

X_test=[]
for i in range(60,model_data.shape[0]):
    X_test.append(model_data[i-60:i,0])
X_test=np.array(X_test)
X_test=np.reshape(X_test,(X_test.shape[0],X_test.shape[1],1))


"""
Prediction Function
"""
predicted_stock_price=lstm_model.predict(X_test)
predicted_stock_price=scaler.inverse_transform(predicted_stock_price)


"""
Prediction Result
"""
train_data=data[:200]
valid_data=data[200:]
valid_data['Predictions']=predicted_stock_price
plt.plot(train_data["Close/Last"])
plt.plot(valid_data[['Close/Last',"Predictions"]])
In dem Tutorial werden die Börsendaten von einem Jahr (16.09.2019 - 15.09.2020) betrachtet. Ca. 80 % der Daten (16.09.2019 - 30.06.2020) werden zum trainieren und der Rest (01.07.2020 - 15.09.2020) zum testen benutzt. Wie kann das angepasst werden, um das ganze Jahr als Trainingsdaten zu verwenden und Vorhersagen über den 15.09.2020 hinaus zu machen?

Die Aufteilung in train_data und valid_data in den Zeilen 45 und 46 ist dann nicht mehr nötig. Aber wie wirkt sich das auf den restlichen Code aus? In Zeile 64 würde dann so aussehen model_data=data[len(data)-60:].values. Das wiederum führt zu einer For-Schleife ohne einen einzigen Durchgang in Zeile 75, weil der Zähler i dann von 60 bis 60 geht.
Antworten