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:
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:
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
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:
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:
#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:
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:
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:
#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:
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:
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:
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:
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:
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:
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.