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.