LSTM's In the Market

By: Adam Lieberman

Let us create a Long Short Term Memory (LSTM) model to predict whether a stock will go up or down:

Disclaimer: This is not financial advice. I am not responsible for any use, modification, or any attempts based off of this article or code. This is simply a demonstration of how deep learning could be applied in finance.


Here our are imports:

In [54]:
import numpy as np

import keras.backend as K
from keras.models import Sequential
from keras.layers import Dense, Activation, Reshape
from keras.layers import LSTM

from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score

import pandas_datareader.data as web

Let us obtain some stock data from Yahoo. We will obtain training data from 1999-01-01 to 2017-01-01:

In [5]:
stock = "AAPL"
start = '1999-01-01'
end = '2017-01-01'
df_AAPL = web.DataReader(stock,"yahoo",start,end)
print(df_AAPL)
                  Open        High         Low       Close     Volume  \
Date                                                                    
1999-01-04   42.125000   42.249999   40.000001   41.250000  238221200   
1999-01-05   41.937499   43.937501   41.499999   43.312500  352528400   
1999-01-06   44.124999   44.124999   41.000000   41.750001  337142400   
1999-01-07   42.249999   45.062500   42.125000   44.999999  357254800   
1999-01-08   46.562501   46.875001   43.999999   44.999999  169708000   
1999-01-11   45.749999   46.062500   44.874999   45.874999  140243600   
1999-01-12   46.312499   46.624999   44.124999   46.125001  205184000   
1999-01-13   42.875000   47.312501   42.249999   46.500000  261954000   
1999-01-14   45.500000   46.000001   41.062499   41.374999  430964800   
1999-01-15   41.812499   42.125000   40.000001   41.312501  251501600   
1999-01-19   41.937499   42.312500   40.375000   40.875001  133722400   
1999-01-20   41.062499   42.000000   40.499999   40.562500  194530000   
1999-01-21   40.437501   40.562500   37.500000   38.812500  150122000   
1999-01-22   37.687501   39.500000   37.062500   38.749999   86441600   
1999-01-25   39.250000   39.562501   38.812500   39.375000   96334000   
1999-01-26   39.937500   40.875001   39.624999   40.499999  140011200   
1999-01-27   41.000000   41.374999   39.937500   40.125000   91238000   
1999-01-28   40.875001   41.250000   40.312501   40.875001   84070000   
1999-01-29   41.187501   41.562500   40.000001   41.187501   60678800   
1999-02-01   41.687500   41.937499   40.312501   40.937499   69728400   
1999-02-02   40.375000   40.750001   39.000001   39.187499   76790000   
1999-02-03   39.000001   40.562500   38.749999   40.187499   84686000   
1999-02-04   40.187499   40.250000   37.750000   37.874999  115945200   
1999-02-05   38.250001   38.375000   35.500001   36.312500  194300400   
1999-02-08   36.687499   37.937500   36.249999   37.750000  117056800   
1999-02-09   37.937500   39.062500   37.062500   37.187500  175288400   
1999-02-10   36.875000   38.687501   36.000000   38.312499  140907200   
1999-02-11   38.749999   39.749999   38.562501   39.624999  141299200   
1999-02-12   39.125001   39.125001   36.999999   37.687501  107226000   
1999-02-16   38.874999   38.874999   37.874999   38.312499   75056800   
...                ...         ...         ...         ...        ...   
2016-11-17  109.809998  110.349998  108.830002  109.949997   27632000   
2016-11-18  109.720001  110.540001  109.660004  110.059998   28428900   
2016-11-21  110.120003  111.989998  110.010002  111.730003   29264600   
2016-11-22  111.949997  112.419998  111.400002  111.800003   25965500   
2016-11-23  111.360001  111.510002  110.330002  111.230003   27426400   
2016-11-25  111.129997  111.870003  110.949997  111.790001   11475900   
2016-11-28  111.430000  112.470001  111.389999  111.570000   27194000   
2016-11-29  110.779999  112.029999  110.070000  111.459999   28528800   
2016-11-30  111.599998  112.199997  110.269997  110.519997   36162300   
2016-12-01  110.370003  110.940002  109.029999  109.489998   37086900   
2016-12-02  109.169998  110.089996  108.849998  109.900002   26528000   
2016-12-05  110.000000  110.029999  108.250000  109.110001   34324500   
2016-12-06  109.500000  110.360001  109.190002  109.949997   26195500   
2016-12-07  109.260002  111.190002  109.160004  111.029999   29998700   
2016-12-08  110.860001  112.430000  110.599998  112.120003   27068300   
2016-12-09  112.309998  114.699997  112.309998  113.949997   34402600   
2016-12-12  113.290001  115.000000  112.489998  113.300003   26374400   
2016-12-13  113.839996  115.919998  113.750000  115.190002   43733800   
2016-12-14  115.040001  116.199997  114.980003  115.190002   34031800   
2016-12-15  115.379997  116.730003  115.230003  115.820000   46524500   
2016-12-16  116.470001  116.500000  115.650002  115.970001   44351100   
2016-12-19  115.800003  117.379997  115.750000  116.639999   27779400   
2016-12-20  116.739998  117.500000  116.680000  116.949997   21425000   
2016-12-21  116.800003  117.400002  116.779999  117.059998   23783200   
2016-12-22  116.349998  116.510002  115.639999  116.290001   26085900   
2016-12-23  115.589996  116.519997  115.589996  116.519997   14181200   
2016-12-27  116.519997  117.800003  116.489998  117.260002   18296900   
2016-12-28  117.519997  118.019997  116.199997  116.760002   20905900   
2016-12-29  116.449997  117.110001  116.400002  116.730003   15039500   
2016-12-30  116.650002  117.199997  115.430000  115.820000   30586300   

             Adj Close  
Date                    
1999-01-04    1.336083  
1999-01-05    1.402887  
1999-01-06    1.352278  
1999-01-07    1.457545  
1999-01-08    1.457545  
1999-01-11    1.485886  
1999-01-12    1.493984  
1999-01-13    1.506130  
1999-01-14    1.340132  
1999-01-15    1.338107  
1999-01-19    1.323937  
1999-01-20    1.313815  
1999-01-21    1.257133  
1999-01-22    1.255108  
1999-01-25    1.275352  
1999-01-26    1.311790  
1999-01-27    1.299644  
1999-01-28    1.323937  
1999-01-29    1.334059  
1999-02-01    1.325961  
1999-02-02    1.269279  
1999-02-03    1.301669  
1999-02-04    1.226767  
1999-02-05    1.176158  
1999-02-08    1.222718  
1999-02-09    1.204499  
1999-02-10    1.240938  
1999-02-11    1.283449  
1999-02-12    1.220694  
1999-02-16    1.240938  
...                ...  
2016-11-17  109.475358  
2016-11-18  109.584883  
2016-11-21  111.247680  
2016-11-22  111.317377  
2016-11-23  110.749838  
2016-11-25  111.307418  
2016-11-28  111.088367  
2016-11-29  110.978841  
2016-11-30  110.042897  
2016-12-01  109.017344  
2016-12-02  109.425578  
2016-12-05  108.638987  
2016-12-06  109.475358  
2016-12-07  110.550697  
2016-12-08  111.635996  
2016-12-09  113.458090  
2016-12-12  112.810902  
2016-12-13  114.692743  
2016-12-14  114.692743  
2016-12-15  115.320020  
2016-12-16  115.469374  
2016-12-19  116.136480  
2016-12-20  116.445139  
2016-12-21  116.554665  
2016-12-22  115.787993  
2016-12-23  116.016995  
2016-12-27  116.753806  
2016-12-28  116.255965  
2016-12-29  116.226096  
2016-12-30  115.320020  

[4529 rows x 6 columns]

We will let our 6 simple features be Open, High, Low, Close, Volume, and Adj Close. Let us now generate some labels for our data. We will look at the adjusted close column and examine the next day's adjusted close price. If the next day's price is higher we will mark a 1, if the next day's price is lower we will mark a 0. For instance

In [6]:
print(df_AAPL["Adj Close"][0:4])
Date
1999-01-04    1.336083
1999-01-05    1.402887
1999-01-06    1.352278
1999-01-07    1.457545
Name: Adj Close, dtype: float64

On 01-05 we see that the price is higher than on 01-04 so that means it would have been goot to buy the stock on 01-04. Thus, we will let the label for 1999-01-04 be a 1. On 01-06 the price was lower than on 01-05 so we will let the 1999-01-05 label be a 0. We create our lables as follows:

In [20]:
dollar_change = df_AAPL["Adj Close"] - df_AAPL["Adj Close"].shift(-1)
dollar_change = dollar_change.apply(lambda i: 0 if float(i) >= 0 else 1 )
labels = dollar_change.values
labels = labels[0:-1]
print(labels)
[1 0 1 ..., 0 0 0]

We now need to normalize our features and drop the last row of our df_AAPL dataframe:

In [10]:
#Normalize Features
df_AAPL_norm =(df_AAPL-df_AAPL.mean())/df_AAPL.std()

#Drop last row because of NaN
df_AAPL_norm = df_AAPL_norm[0:-1]

print(df_AAPL_norm)
                Open      High       Low     Close    Volume  Adj Close
Date                                                                   
1999-01-04 -0.715209 -0.719726 -0.722374 -0.720440  1.084597  -0.850798
1999-01-05 -0.716307 -0.709921 -0.713505 -0.708352  2.233389  -0.849038
1999-01-06 -0.703496 -0.708832 -0.716461 -0.717510  2.078759  -0.850371
1999-01-07 -0.714476 -0.703384 -0.709810 -0.698463  2.280890  -0.847598
1999-01-08 -0.689221 -0.692853 -0.698723 -0.698463  0.396037  -0.847598
1999-01-11 -0.693979 -0.697574 -0.693549 -0.693335  0.099919  -0.846852
1999-01-12 -0.690685 -0.694305 -0.697984 -0.691870  0.752572  -0.846639
1999-01-13 -0.710816 -0.690311 -0.709071 -0.689672  1.323113  -0.846319
1999-01-14 -0.695443 -0.697937 -0.716092 -0.719707  3.021678  -0.850691
1999-01-15 -0.717039 -0.720453 -0.722374 -0.720074  1.218066  -0.850745
1999-01-19 -0.716307 -0.719363 -0.720157 -0.722638  0.034380  -0.851118
1999-01-20 -0.721431 -0.721179 -0.719418 -0.724469  0.645499  -0.851384
1999-01-21 -0.725091 -0.729531 -0.737156 -0.734725  0.199197  -0.852877
1999-01-22 -0.741196 -0.735705 -0.739743 -0.735091 -0.440794  -0.852931
1999-01-25 -0.732046 -0.735342 -0.729396 -0.731428 -0.341375  -0.852398
1999-01-26 -0.728019 -0.727716 -0.724592 -0.724835  0.097583  -0.851438
1999-01-27 -0.721797 -0.724810 -0.722744 -0.727033 -0.392590  -0.851758
1999-01-28 -0.722529 -0.725537 -0.720527 -0.722638 -0.464628  -0.851118
1999-01-29 -0.720699 -0.723721 -0.722374 -0.720806 -0.699711  -0.850851
1999-02-01 -0.717771 -0.721542 -0.720527 -0.722271 -0.608762  -0.851064
1999-02-02 -0.725457 -0.728442 -0.728287 -0.732527 -0.537792  -0.852558
1999-02-03 -0.733510 -0.729531 -0.729765 -0.726667 -0.458437  -0.851704
1999-02-04 -0.726555 -0.731347 -0.735678 -0.740219 -0.144281  -0.853677
1999-02-05 -0.737902 -0.742242 -0.748982 -0.749376  0.643192  -0.855010
1999-02-08 -0.747053 -0.744784 -0.744547 -0.740952 -0.133110  -0.853784
1999-02-09 -0.739732 -0.738247 -0.739743 -0.744248  0.452120  -0.854264
1999-02-10 -0.745955 -0.740426 -0.746025 -0.737655  0.106588  -0.853304
1999-02-11 -0.734974 -0.734252 -0.730874 -0.729963  0.110528  -0.852184
1999-02-12 -0.732778 -0.737884 -0.740113 -0.741318 -0.231909  -0.853837
1999-02-16 -0.734242 -0.739337 -0.734939 -0.737655 -0.555211  -0.853304
...              ...       ...       ...       ...       ...        ...
2016-11-16 -0.337031 -0.324731 -0.328583 -0.317586 -0.718186   1.998727
2016-11-17 -0.318818 -0.324034 -0.315398 -0.317820 -1.031832   1.997678
2016-11-18 -0.319345 -0.322930 -0.310490 -0.317176 -1.023823   2.000563
2016-11-21 -0.317002 -0.314504 -0.308421 -0.307388 -1.015425   2.044363
2016-11-22 -0.306285 -0.312006 -0.300202 -0.306978 -1.048581   2.046199
2016-11-23 -0.309740 -0.317293 -0.306529 -0.310319 -1.033899   2.031249
2016-11-25 -0.311087 -0.315202 -0.302863 -0.307037 -1.194202   2.045936
2016-11-28 -0.309330 -0.311715 -0.300261 -0.308326 -1.036234   2.040166
2016-11-29 -0.313137 -0.314272 -0.308066 -0.308971 -1.022819   2.037281
2016-11-30 -0.308335 -0.313284 -0.306884 -0.314480 -0.946102   2.012628
2016-12-01 -0.315538 -0.320605 -0.314215 -0.320516 -0.936810   1.985614
2016-12-02 -0.322566 -0.325544 -0.315280 -0.318113 -1.042928   1.996367
2016-12-05 -0.317705 -0.325893 -0.318827 -0.322743 -0.964572   1.975648
2016-12-06 -0.320633 -0.323975 -0.313269 -0.317820 -1.046269   1.997678
2016-12-07 -0.322039 -0.319153 -0.313447 -0.311491 -1.008047   2.026004
2016-12-08 -0.312668 -0.311948 -0.304932 -0.305103 -1.037498   2.054591
2016-12-09 -0.304177 -0.298758 -0.294821 -0.294378 -0.963788   2.102587
2016-12-12 -0.298437 -0.297015 -0.293757 -0.298187 -1.044471   2.085539
2016-12-13 -0.295216 -0.291669 -0.286307 -0.287111 -0.870009   2.135108
2016-12-14 -0.288189 -0.290042 -0.279034 -0.287111 -0.967514   2.135108
2016-12-15 -0.286198 -0.286963 -0.277556 -0.283419 -0.841962   2.151631
2016-12-16 -0.279814 -0.288299 -0.275073 -0.282540 -0.863805   2.155566
2016-12-19 -0.283738 -0.283186 -0.274482 -0.278613 -1.030351   2.173138
2016-12-20 -0.278233 -0.282489 -0.268983 -0.276796 -1.094213   2.181268
2016-12-21 -0.277881 -0.283070 -0.268391 -0.276152 -1.070513   2.184153
2016-12-22 -0.280517 -0.288241 -0.275132 -0.280664 -1.047371   2.163958
2016-12-23 -0.284968 -0.288183 -0.275428 -0.279316 -1.167013   2.169990
2016-12-27 -0.279521 -0.280746 -0.270106 -0.274980 -1.125650   2.189399
2016-12-28 -0.273665 -0.279467 -0.271821 -0.277910 -1.099430   2.176285
2016-12-29 -0.279931 -0.284755 -0.270638 -0.278086 -1.158387   2.175498

[4528 rows x 6 columns]

We now obtain a numpy array from our df_AAPL_norm dataframe that we can use as training data:

In [12]:
x_features = df_AAPL_norm.values
print(x_features)
[[-0.71520852 -0.71972627 -0.72237425 -0.72043982  1.0845975  -0.85079785]
 [-0.7163066  -0.7099211  -0.7135051  -0.70835244  2.2333894  -0.84903818]
 [-0.70349571 -0.70883165 -0.71646148 -0.71750954  2.07875949 -0.85037126]
 ..., 
 [-0.27952126 -0.2807456  -0.27010609 -0.27497963 -1.12565046  2.18939852]
 [-0.27366486 -0.27946733 -0.27182081 -0.2779099  -1.0994299   2.17628498]
 [-0.27993121 -0.28475483 -0.27063822 -0.27808571 -1.15838746  2.17549821]]

We have a binary classification problem as we want to classify a stock as 0 or 1. Where 0 means the stock is going down the next day and 1 means the stock is going up the next day. To do so we will create a 1-hot encoded vecor:

In [23]:
x_labels = np.zeros((len(x_features),2))
c = 0
for i in labels:
    
    #This means buy: [0,1]
    if i == 1:
        x_labels[c][1] = 1
        
    #This means sell [1,0]
    else: 
        x_labels[c][0] = 1
    c = c +1 

print(x_labels)
[[ 0.  1.]
 [ 1.  0.]
 [ 0.  1.]
 ..., 
 [ 1.  0.]
 [ 1.  0.]
 [ 1.  0.]]

We now need to reshape our features and labels for the LSTM:

In [26]:
#reshaping for LSTM 
num_samples = len(x_features)
num_classes = len(x_labels[0])
num_features = len(x_features[0])

#reshape labels
x_labels = x_labels.reshape(num_samples,1,num_classes)

#reshape features
x_features = x_features.reshape(num_samples,1,num_features)

Let us now set some parameters for our LSTM:

In [28]:
shape = x_features.shape[2]
print(shape)
num_classes = len(x_labels[0][0])
print(num_classes)
6
2

Let us now create a function to build our model:

In [29]:
def create_model(shape,num_classes):
    model = Sequential()
    model.add(LSTM(32, input_shape=(None,shape), return_sequences=True))
    model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
    model.compile(loss="binary_crossentropy", optimizer='adam', metrics=['mse'])
    return model

Let us now train our model:

In [31]:
model = create_model(shape,num_classes)
history = model.fit(x_features, x_labels,
              batch_size=100, epochs=200,
              verbose = 1)
Epoch 1/200
4528/4528 [==============================] - 1s - loss: 0.6934 - mean_squared_error: 0.2501      
Epoch 2/200
4528/4528 [==============================] - 0s - loss: 0.6929 - mean_squared_error: 0.2499     
Epoch 3/200
4528/4528 [==============================] - 0s - loss: 0.6928 - mean_squared_error: 0.2498     
Epoch 4/200
4528/4528 [==============================] - 0s - loss: 0.6927 - mean_squared_error: 0.2498     
Epoch 5/200
4528/4528 [==============================] - 0s - loss: 0.6926 - mean_squared_error: 0.2497     
Epoch 6/200
4528/4528 [==============================] - 0s - loss: 0.6926 - mean_squared_error: 0.2497     
Epoch 7/200
4528/4528 [==============================] - 0s - loss: 0.6926 - mean_squared_error: 0.2497     
Epoch 8/200
4528/4528 [==============================] - 0s - loss: 0.6925 - mean_squared_error: 0.2497     
Epoch 9/200
4528/4528 [==============================] - 0s - loss: 0.6925 - mean_squared_error: 0.2497     
Epoch 10/200
4528/4528 [==============================] - 0s - loss: 0.6924 - mean_squared_error: 0.2496     
Epoch 11/200
4528/4528 [==============================] - 0s - loss: 0.6923 - mean_squared_error: 0.2496     
Epoch 12/200
4528/4528 [==============================] - 0s - loss: 0.6923 - mean_squared_error: 0.2496     
Epoch 13/200
4528/4528 [==============================] - 0s - loss: 0.6922 - mean_squared_error: 0.2495     
Epoch 14/200
4528/4528 [==============================] - 0s - loss: 0.6922 - mean_squared_error: 0.2495     
Epoch 15/200
4528/4528 [==============================] - 0s - loss: 0.6922 - mean_squared_error: 0.2495     
Epoch 16/200
4528/4528 [==============================] - 0s - loss: 0.6921 - mean_squared_error: 0.2495     
Epoch 17/200
4528/4528 [==============================] - 0s - loss: 0.6920 - mean_squared_error: 0.2495     
Epoch 18/200
4528/4528 [==============================] - 0s - loss: 0.6919 - mean_squared_error: 0.2494     
Epoch 19/200
4528/4528 [==============================] - 0s - loss: 0.6920 - mean_squared_error: 0.2494     
Epoch 20/200
4528/4528 [==============================] - 0s - loss: 0.6919 - mean_squared_error: 0.2494     
Epoch 21/200
4528/4528 [==============================] - 0s - loss: 0.6919 - mean_squared_error: 0.2494     
Epoch 22/200
4528/4528 [==============================] - 0s - loss: 0.6919 - mean_squared_error: 0.2494     
Epoch 23/200
4528/4528 [==============================] - 0s - loss: 0.6919 - mean_squared_error: 0.2494     
Epoch 24/200
4528/4528 [==============================] - 0s - loss: 0.6920 - mean_squared_error: 0.2494     
Epoch 25/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 26/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 27/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 28/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 29/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 30/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 31/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 32/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 33/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 34/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 35/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 36/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 37/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 38/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 39/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 40/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 41/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 42/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 43/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 44/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 45/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 46/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 47/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 48/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 49/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 50/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 51/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 52/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 53/200
4528/4528 [==============================] - 0s - loss: 0.6918 - mean_squared_error: 0.2493     
Epoch 54/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 55/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 56/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 57/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 58/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 59/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 60/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 61/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 62/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 63/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 64/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 65/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 66/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 67/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 68/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 69/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 70/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 71/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 72/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 73/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 74/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 75/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 76/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 77/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 78/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 79/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 80/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 81/200
4528/4528 [==============================] - 0s - loss: 0.6916 - mean_squared_error: 0.2492     
Epoch 82/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 83/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 84/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 85/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 86/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 87/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 88/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 89/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 90/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 91/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 92/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 93/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 94/200
4528/4528 [==============================] - 0s - loss: 0.6917 - mean_squared_error: 0.2493     
Epoch 95/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 96/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 97/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 98/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 99/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 100/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 101/200
4528/4528 [==============================] - 0s - loss: 0.6915 - mean_squared_error: 0.2492     
Epoch 102/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 103/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 104/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 105/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 106/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 107/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 108/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 109/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 110/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 111/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 112/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 113/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 114/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 115/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 116/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 117/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 118/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 119/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 120/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 121/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 122/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 123/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 124/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 125/200
4528/4528 [==============================] - 0s - loss: 0.6914 - mean_squared_error: 0.2491     
Epoch 126/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 127/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 128/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 129/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2491     
Epoch 130/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 131/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 132/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 133/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 134/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 135/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 136/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 137/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 138/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 139/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 140/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 141/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 142/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2491     
Epoch 143/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 144/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 145/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 146/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 147/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 148/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 149/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 150/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 151/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 152/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 153/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 154/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 155/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 156/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 157/200
4528/4528 [==============================] - 0s - loss: 0.6913 - mean_squared_error: 0.2491     
Epoch 158/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 159/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 160/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 161/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 162/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 163/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 164/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 165/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2491     
Epoch 166/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 167/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 168/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 169/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 170/200
4528/4528 [==============================] - 0s - loss: 0.6912 - mean_squared_error: 0.2490     
Epoch 171/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 172/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 173/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 174/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 175/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 176/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2489     
Epoch 177/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 178/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 179/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 180/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 181/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 182/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 183/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 184/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 185/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2489     
Epoch 186/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2489     
Epoch 187/200
4528/4528 [==============================] - 0s - loss: 0.6911 - mean_squared_error: 0.2490     
Epoch 188/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 189/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 190/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 191/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 192/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 193/200
4528/4528 [==============================] - 0s - loss: 0.6909 - mean_squared_error: 0.2489     
Epoch 194/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 195/200
4528/4528 [==============================] - 0s - loss: 0.6907 - mean_squared_error: 0.2488     
Epoch 196/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 197/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     
Epoch 198/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 199/200
4528/4528 [==============================] - 0s - loss: 0.6910 - mean_squared_error: 0.2489     
Epoch 200/200
4528/4528 [==============================] - 0s - loss: 0.6908 - mean_squared_error: 0.2488     

Let us now create some test data, we will use the above training process with different dates to do so:

In [40]:
start = '2017-01-02'
end = '2017-04-25'
sample = web.DataReader('AAPL',"yahoo",start,end)

dollar_change = sample["Adj Close"] - sample["Adj Close"].shift(-1)
dollar_change = dollar_change.apply(lambda i: 0 if float(i) >= 0 else 1 )
labels = dollar_change.values
labels = labels[0:-1]

sample =(sample-sample.mean())/sample.std()
sample = sample.values
sample = sample.reshape(sample.shape[0],1,num_features)

sample =(sample-sample.mean())/sample.std()

sample = sample[0:-1]

We can now predict our samples on our model:

In [52]:
preds = model.predict_classes(sample)
preds = preds.flatten()
print("\n",preds)
32/75 [===========>..................] - ETA: 0s
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1
 1]

Let us now evaluate our accuracy:

In [53]:
acc = accuracy_score(labels,preds)
print(acc)
0.52

We see that our model was accurate 52% of the time. We note that we did not use intersting features or heavily tune our model. Doing so, we could obtain better accuracy.