Python Source Code for Machine Learning Stock Prediction with LSTM and Keras – Python Source Code with LSTM and Keras Below is the code for machine learning stock prediction with LSTM neural network.
# -*- coding: utf-8 -*- import numpy as np import pandas as pd from sklearn import preprocessing import matplotlib.pyplot as plt fname="C:\\Users\\stock_data.csv" data_csv = pd.read_csv (fname) #how many data we will use # (should not be more than dataset length ) data_to_use= 100 # number of training data # should be less than data_to_use train_end =70 total_data=len(data_csv) #most recent data is in the end #so need offset start=total_data - data_to_use #currently doing prediction only for 1 step ahead steps_to_predict =1 yt = data_csv.iloc [start:total_data ,4] #Close price yt1 = data_csv.iloc [start:total_data ,1] #Open yt2 = data_csv.iloc [start:total_data ,2] #High yt3 = data_csv.iloc [start:total_data ,3] #Low vt = data_csv.iloc [start:total_data ,6] # volume print ("yt head :") print (yt.head()) yt_ = yt.shift (-1) data = pd.concat ([yt, yt_, vt, yt1, yt2, yt3], axis =1) data. columns = ['yt', 'yt_', 'vt', 'yt1', 'yt2', 'yt3'] data = data.dropna() print (data) # target variable - closed price # after shifting y = data ['yt_'] # closed, volume, open, high, low cols =['yt', 'vt', 'yt1', 'yt2', 'yt3'] x = data [cols] scaler_x = preprocessing.MinMaxScaler ( feature_range =( -1, 1)) x = np. array (x).reshape ((len( x) ,len(cols))) x = scaler_x.fit_transform (x) scaler_y = preprocessing. MinMaxScaler ( feature_range =( -1, 1)) y = np.array (y).reshape ((len( y), 1)) y = scaler_y.fit_transform (y) x_train = x [0: train_end,] x_test = x[ train_end +1:len(x),] y_train = y [0: train_end] y_test = y[ train_end +1:len(y)] x_train = x_train.reshape (x_train. shape + (1,)) x_test = x_test.reshape (x_test. shape + (1,)) from keras.models import Sequential from keras.layers.core import Dense from keras.layers.recurrent import LSTM from keras.layers import Dropout seed =2016 np.random.seed (seed) fit1 = Sequential () fit1.add (LSTM ( 1000 , activation = 'tanh', inner_activation = 'hard_sigmoid' , input_shape =(len(cols), 1) )) fit1.add(Dropout(0.2)) fit1.add (Dense (output_dim =1, activation = 'linear')) fit1.compile (loss ="mean_squared_error" , optimizer = "adam") fit1.fit (x_train, y_train, batch_size =16, nb_epoch =25, shuffle = False) print (fit1.summary()) score_train = fit1.evaluate (x_train, y_train, batch_size =1) score_test = fit1.evaluate (x_test, y_test, batch_size =1) print (" in train MSE = ", round( score_train ,4)) print (" in test MSE = ", score_test ) pred1 = fit1.predict (x_test) pred1 = scaler_y.inverse_transform (np. array (pred1). reshape ((len( pred1), 1))) prediction_data = pred1[-1] fit1.summary() print ("Inputs: {}".format(fit1.input_shape)) print ("Outputs: {}".format(fit1.output_shape)) print ("Actual input: {}".format(x_test.shape)) print ("Actual output: {}".format(y_test.shape)) print ("prediction data:") print (prediction_data) print ("actual data") x_test = scaler_x.inverse_transform (np. array (x_test). reshape ((len( x_test), len(cols)))) print (x_test) plt.plot(pred1, label="predictions") y_test = scaler_y.inverse_transform (np. array (y_test). reshape ((len( y_test), 1))) plt.plot( [row[0] for row in y_test], label="actual") plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), fancybox=True, shadow=True, ncol=2) import matplotlib.ticker as mtick fmt = '$%.0f' tick = mtick.FormatStrFormatter(fmt) ax = plt.axes() ax.yaxis.set_major_formatter(tick) plt.show()
References
1. Machine Learning Stock Prediction with LSTM and Keras – Python Source Code with LSTM and Keras
Hello.
Can I get the “stock_data.csv” file that is used in this prediction?
Hi Lukasz,
here is the link to stock_data.csv
http://intelligentonlinetools.com/blog/stock-data-file/
After copy / paste do text to columns in case data will be in one column.
Let me know if any issues.
Thanks.
Thank you for the fast reponse.
You are very welcome
Hi owygs156,
Thanks for writing this, it was very helpful. One quick question, shouldn’t we be plotting pred1 in relation to y_test, not x_test[:, 0]? pred1[0] contains the prediction corresponding to y_test[0], which is the close price from x_test[1, 0].
Thanks!
Hi Alan,
glad that you find it helpful. You are correct, it should be in relation to y_test. I updated code and graphs. Thanks for pointing out on this.
Very impressive! I see that you have used 1 LSTM layer for each model and it had good results. Is there a way to make these predictions for the future? rather than comparing them to actual past data?
Can you please kindly share full code after fixing the issue outlined in above comment?
pred1 in relation to y_test, not x_test[:, 0]?
Thanks,
Maruthi
Hi Maruthi,
the code on this page is already updated per this issue – so should be fine.
Best regards.