In [2]:
import pandas as pd
import numpy as np
import os

In [3]:
with pd.HDFStore(os.path.join('/', 'root', 'fin_lstm', 'observations.h5')) as store:
    observations = store['o']

In [4]:
# Cols to drop:
ctd = ['Open', 'High', 'Low', 'Close', # stock price. Leave volume
       'o_id', # id
       'COMLND'] # commercial lending index - many NaNs       
observations = observations.drop(ctd, axis=1).dropna()

# Normalize Volume
v = observations['Volume']
mi = v.min(); di = v.max() - mi
observations['Volume'] = v.apply(lambda t: (t - mi) / di)

# Separate labels
labels = observations['sig^2'] = observations['sig^2']*100
observations['lag_sig^2'] *= 100

# Drop labels from observations
# observations.drop('sig^2', axis=1, inplace=True)

In [5]:
# Split into train and validate
mark = int(len(observations)*.7)
tX = observations[:mark]
tY = labels[:mark]
vX = observations[mark:]
vY = labels[mark:]

In [6]:
timesteps = 10

In [51]:
create_dataset(observations.values, labels.values, 2)


Out[51]:
(array([[[ 1.25,  1.04,  0.99, ...,  0.  ,  0.  ,  1.  ],
         [ 1.27,  1.05,  0.98, ...,  0.  ,  0.  ,  1.  ]],
 
        [[ 1.27,  1.05,  0.98, ...,  0.  ,  0.  ,  1.  ],
         [ 1.31,  1.05,  0.96, ...,  0.  ,  0.  ,  1.  ]],
 
        [[ 1.31,  1.05,  0.96, ...,  0.  ,  0.  ,  1.  ],
         [ 1.3 ,  1.03,  0.94, ...,  0.  ,  0.  ,  1.  ]],
 
        ..., 
        [[ 0.75,  0.67,  0.82, ...,  0.  ,  0.  ,  0.  ],
         [ 0.75,  0.67,  0.81, ...,  0.  ,  0.  ,  0.  ]],
 
        [[ 0.75,  0.67,  0.81, ...,  0.  ,  0.  ,  0.  ],
         [ 0.75,  0.68,  0.81, ...,  0.  ,  0.  ,  0.  ]],
 
        [[ 0.75,  0.68,  0.81, ...,  0.  ,  0.  ,  0.  ],
         [ 0.74,  0.69,  0.81, ...,  0.  ,  0.  ,  0.  ]]]),
 array([ 0.02968029,  0.05076174,  0.01673453, ...,  0.04495117,
         0.02677589,  0.07744982]))

In [11]:
def create_dataset(dataset, Y, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), :]
        dataX.append(a)
        dataY.append(Y[i + look_back])
    return np.array(dataX), np.array(dataY)

In [8]:
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.optimizers import RMSprop, SGD, Nadam
from keras.callbacks import TensorBoard


Using TensorFlow backend.

In [9]:
# expected input data shape: (batch_size, timesteps, data_dim)
data_dim = tX.values.shape[1]

model = Sequential()
model.add(LSTM(40, return_sequences=True,
               input_shape=(timesteps, data_dim)
              ))
model.add(LSTM(40, return_sequences=False))
model.add(Dense(1))

model.compile(loss='msle', optimizer=RMSprop(), metrics=['accuracy'])

# TB callback
TB = TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False)

In [ ]:
model.fit(*create_dataset(observations.values, labels.values, timesteps),
          batch_size=50, nb_epoch=500, verbose=2,
          validation_split=.2,
          shuffle=True,
          callbacks=[TB])


Train on 27801 samples, validate on 6951 samples
Epoch 1/500
14s - loss: 0.0080 - acc: 0.0028 - val_loss: 0.0071 - val_acc: 0.0056
Epoch 2/500
13s - loss: 0.0062 - acc: 0.0028 - val_loss: 0.0063 - val_acc: 0.0056
Epoch 3/500
13s - loss: 0.0059 - acc: 0.0028 - val_loss: 0.0108 - val_acc: 0.0056
Epoch 4/500
13s - loss: 0.0056 - acc: 0.0028 - val_loss: 0.0052 - val_acc: 0.0056
Epoch 5/500
12s - loss: 0.0055 - acc: 0.0028 - val_loss: 0.0047 - val_acc: 0.0056
Epoch 6/500
12s - loss: 0.0054 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 7/500
13s - loss: 0.0054 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 8/500
12s - loss: 0.0054 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 9/500
12s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0055 - val_acc: 0.0056
Epoch 10/500
13s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0061 - val_acc: 0.0056
Epoch 11/500
14s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 12/500
13s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 13/500
13s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0046 - val_acc: 0.0056
Epoch 14/500
12s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0046 - val_acc: 0.0056
Epoch 15/500
12s - loss: 0.0053 - acc: 0.0028 - val_loss: 0.0061 - val_acc: 0.0056
Epoch 16/500
12s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 17/500
12s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0047 - val_acc: 0.0056
Epoch 18/500
13s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 19/500
12s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 20/500
12s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0162 - val_acc: 0.0056
Epoch 21/500
12s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0047 - val_acc: 0.0056
Epoch 22/500
13s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 23/500
12s - loss: 0.0052 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 24/500
13s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0061 - val_acc: 0.0056
Epoch 25/500
14s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0062 - val_acc: 0.0056
Epoch 26/500
12s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 27/500
13s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 28/500
13s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 29/500
13s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 30/500
12s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0071 - val_acc: 0.0056
Epoch 31/500
12s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 32/500
12s - loss: 0.0051 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 33/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 34/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 35/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 36/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 37/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 38/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0063 - val_acc: 0.0056
Epoch 39/500
13s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0056 - val_acc: 0.0056
Epoch 40/500
13s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0077 - val_acc: 0.0056
Epoch 41/500
13s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 42/500
13s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 43/500
12s - loss: 0.0050 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 44/500
12s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0059 - val_acc: 0.0056
Epoch 45/500
12s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 46/500
12s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0065 - val_acc: 0.0056
Epoch 47/500
13s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 48/500
13s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0059 - val_acc: 0.0056
Epoch 49/500
12s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 50/500
12s - loss: 0.0049 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 51/500
14s - loss: 0.0048 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 52/500
17s - loss: 0.0048 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 53/500
1394s - loss: 0.0048 - acc: 0.0028 - val_loss: 0.0062 - val_acc: 0.0056
Epoch 54/500
13s - loss: 0.0048 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 55/500
14s - loss: 0.0048 - acc: 0.0028 - val_loss: 0.0052 - val_acc: 0.0056
Epoch 56/500
13s - loss: 0.0048 - acc: 0.0028 - val_loss: 0.0092 - val_acc: 0.0056
Epoch 57/500
303s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0052 - val_acc: 0.0056
Epoch 58/500
14s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0063 - val_acc: 0.0056
Epoch 59/500
12s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 60/500
13s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 61/500
13s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 62/500
196s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 63/500
13s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 64/500
13s - loss: 0.0047 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 65/500
12s - loss: 0.0046 - acc: 0.0028 - val_loss: 0.0063 - val_acc: 0.0056
Epoch 66/500
12s - loss: 0.0046 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 67/500
143s - loss: 0.0046 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 68/500
13s - loss: 0.0046 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 69/500
13s - loss: 0.0046 - acc: 0.0028 - val_loss: 0.0048 - val_acc: 0.0056
Epoch 70/500
12s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 71/500
13s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0060 - val_acc: 0.0056
Epoch 72/500
-433s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0059 - val_acc: 0.0056
Epoch 73/500
13s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0060 - val_acc: 0.0056
Epoch 74/500
13s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 75/500
13s - loss: 0.0044 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 76/500
12s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 77/500
14s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 78/500
12s - loss: 0.0045 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 79/500
13s - loss: 0.0044 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 80/500
13s - loss: 0.0044 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 81/500
12s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0069 - val_acc: 0.0056
Epoch 82/500
13s - loss: 0.0044 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 83/500
12s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 84/500
12s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0060 - val_acc: 0.0056
Epoch 85/500
13s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0055 - val_acc: 0.0056
Epoch 86/500
13s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0052 - val_acc: 0.0056
Epoch 87/500
12s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 88/500
13s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 89/500
13s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0049 - val_acc: 0.0056
Epoch 90/500
12s - loss: 0.0042 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 91/500
13s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 92/500
15s - loss: 0.0042 - acc: 0.0028 - val_loss: 0.0082 - val_acc: 0.0056
Epoch 93/500
13s - loss: 0.0043 - acc: 0.0028 - val_loss: 0.0062 - val_acc: 0.0056
Epoch 94/500
13s - loss: 0.0042 - acc: 0.0028 - val_loss: 0.0056 - val_acc: 0.0056
Epoch 95/500
13s - loss: 0.0042 - acc: 0.0028 - val_loss: 0.0075 - val_acc: 0.0056
Epoch 96/500
13s - loss: 0.0042 - acc: 0.0028 - val_loss: 0.0053 - val_acc: 0.0056
Epoch 97/500
14s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0062 - val_acc: 0.0056
Epoch 98/500
18s - loss: 0.0042 - acc: 0.0028 - val_loss: 0.0051 - val_acc: 0.0056
Epoch 99/500
12s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0050 - val_acc: 0.0056
Epoch 100/500
12s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0058 - val_acc: 0.0056
Epoch 101/500
15s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0059 - val_acc: 0.0056
Epoch 102/500
16s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 103/500
15s - loss: 0.0040 - acc: 0.0028 - val_loss: 0.0055 - val_acc: 0.0056
Epoch 104/500
14s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0067 - val_acc: 0.0056
Epoch 105/500
16s - loss: 0.0040 - acc: 0.0028 - val_loss: 0.0071 - val_acc: 0.0056
Epoch 106/500
14s - loss: 0.0041 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 107/500
15s - loss: 0.0040 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 108/500
14s - loss: 0.0040 - acc: 0.0028 - val_loss: 0.0065 - val_acc: 0.0056
Epoch 109/500
14s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 110/500
14s - loss: 0.0040 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 111/500
14s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 112/500
14s - loss: 0.0040 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 113/500
14s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0059 - val_acc: 0.0056
Epoch 114/500
14s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0056 - val_acc: 0.0056
Epoch 115/500
14s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 116/500
16s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0056 - val_acc: 0.0056
Epoch 117/500
13s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0055 - val_acc: 0.0056
Epoch 118/500
15s - loss: 0.0039 - acc: 0.0028 - val_loss: 0.0054 - val_acc: 0.0056
Epoch 119/500
13s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0055 - val_acc: 0.0056
Epoch 120/500
14s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0055 - val_acc: 0.0056
Epoch 121/500
14s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0084 - val_acc: 0.0056
Epoch 122/500
15s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0058 - val_acc: 0.0056
Epoch 123/500
16s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 124/500
14s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 125/500
14s - loss: 0.0038 - acc: 0.0028 - val_loss: 0.0058 - val_acc: 0.0056
Epoch 126/500
13s - loss: 0.0037 - acc: 0.0028 - val_loss: 0.0058 - val_acc: 0.0056
Epoch 127/500
15s - loss: 0.0037 - acc: 0.0028 - val_loss: 0.0076 - val_acc: 0.0056
Epoch 128/500
13s - loss: 0.0037 - acc: 0.0028 - val_loss: 0.0070 - val_acc: 0.0056
Epoch 129/500
13s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0103 - val_acc: 0.0056
Epoch 130/500
13s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0057 - val_acc: 0.0056
Epoch 131/500
15s - loss: 0.0037 - acc: 0.0028 - val_loss: 0.0065 - val_acc: 0.0056
Epoch 132/500
16s - loss: 0.0037 - acc: 0.0028 - val_loss: 0.0060 - val_acc: 0.0056
Epoch 133/500
15s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0079 - val_acc: 0.0056
Epoch 134/500
15s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0056 - val_acc: 0.0056
Epoch 135/500
15s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0069 - val_acc: 0.0056
Epoch 136/500
15s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0059 - val_acc: 0.0056
Epoch 137/500
14s - loss: 0.0036 - acc: 0.0028 - val_loss: 0.0069 - val_acc: 0.0056
Epoch 138/500

In [ ]:


In [ ]:
model.evaluate(*create_dataset(observations.values, labels.values, 1), batch_size=10, verbose=1)

In [ ]: