In [1]:
import numpy as np
import matplotlib
%matplotlib inline
import seaborn as sns; sns.set()
np.random.seed(1234)
In [2]:
def mkts(length=4001, y0=1.0):
X = [[0, 1]] # card was printed
y = [y0]
t_since_reprint = 0
for i in range(length-1):
reprint = 0
rdev = np.random.rand()
if rdev > 0.995 and t_since_reprint > 300:
t_since_reprint = 0
reprint = 1
else:
t_since_reprint += 1
trend = 0.005
if t_since_reprint > 0: # price doesn't instantly respond to reprints
if t_since_reprint < 20:
trend = -0.007
elif t_since_reprint < 200:
trend = -0.002
X.append([y[-1], reprint])
y.append(y[-1] + trend + np.random.randn()*0.00001)
return np.array(X), np.array(y)
In [3]:
X, y = mkts()
In [4]:
fig = sns.plt.figure(figsize=(8, 4))
sns.plt.plot(y)
sns.plt.plot(X[:, 1])
Out[4]:
In [5]:
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import LSTM
from keras.layers.noise import *
from sklearn.preprocessing import MinMaxScaler, StandardScaler
In [6]:
# subtract the overall trend
gradient = (y[-1] - y[0])/4001
print 'gradient:',gradient
y = y - gradient * np.arange(len(y))
fig = sns.plt.figure(figsize=(8, 4))
sns.plt.plot(y)
sns.plt.plot(X[:, 1])
Out[6]:
In [7]:
ydiff = np.diff(y)
mm = StandardScaler()
ydiff = mm.fit_transform(ydiff)
X[1:, 0] = ydiff
print ydiff.shape
Xrnn = np.reshape(X, (X.shape[0], 1, X.shape[1]))[0:len(ydiff)]
print Xrnn.shape
for i in np.arange(5, 0, -1):
print 'Features:',Xrnn[len(Xrnn)-i, 0], '/ Label:', ydiff[len(ydiff)-i]
In [8]:
sns.plt.plot(ydiff)
sns.plt.plot(Xrnn[:,:,1])
Out[8]:
In [9]:
# zoom in
sns.plt.plot(ydiff[300:400])
sns.plt.plot(Xrnn[300:400][:,:,1])
Out[9]:
In [17]:
from keras.callbacks import History
history = History()
# create and fit the LSTM network
model = Sequential()
#model.add(GaussianNoise(batch_input_shape=(100, 1, 2), sigma=0.9))
#model.add(Dense(12, input_dim=2, activation='relu'))
model.add(LSTM(12, batch_input_shape=(100, 1, 2), stateful=True, return_sequences=False))
#model.add(LSTM(12, stateful=True))
model.add(Dropout(0.25))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
X = X[0:len(ydiff)]
print Xrnn.shape
logloss = []
nb_epochs = 100
for i in range(nb_epochs):
model.fit(Xrnn[:-1000], ydiff[:-1000],
#model.fit(X[:-1000], ydiff[:-1000],
nb_epoch=1, batch_size=100,
verbose=2, shuffle=False,
callbacks=[history])
logloss.append(history.history['loss'][0])
model.reset_states()
In [11]:
fig = sns.plt.figure(figsize=(8, 2))
sns.plt.plot(logloss)
sns.plt.xlabel('Epoch')
sns.plt.ylabel('Training loss (mse)')
Out[11]:
In [12]:
#bootstrap = model.predict(Xrnn[:-1000], batch_size=100)
#bootstrap = model.predict(X[:-1000], batch_size=20)
preds = model.predict(Xrnn[-1000:], batch_size=100)
#preds = model.predict(X[-1000:], batch_size=20)
print preds.shape
In [13]:
sns.plt.plot(preds.flatten(), label='predicted')
sns.plt.plot(X[-1000:, 1], label='reprint')
sns.plt.legend()
Out[13]:
In [14]:
unscaled_preds = mm.inverse_transform(preds.flatten())
shift = y[-1000]
sns.plt.plot(np.cumsum(unscaled_preds)+shift, label='prediction')
sns.plt.plot(X[-1000:, 1])
sns.plt.plot(y[-1000:], label='Truth')
sns.plt.legend()
Out[14]:
In [15]:
sns.plt.plot(np.cumsum(unscaled_preds[50:100])+shift, label='prediction')
sns.plt.plot(X[-950:-900, 1])
sns.plt.plot(y[-950:-900], label='Truth')
sns.plt.legend()
Out[15]:
In [16]:
fig, ax = sns.plt.subplots(1, 2, figsize=(12, 4))
x_range = range(3000, 4000)
ax[0].plot(x_range, np.cumsum(unscaled_preds)+shift, label='prediction')
ax[0].plot(x_range, X[-1000:, 1])
ax[0].plot(x_range, y[-1000:], label='Truth')
ax[0].legend()
x_range2 = range(3070, 3100)
ax[1].plot(x_range2, np.cumsum(unscaled_preds[70:100])+shift, label='prediction')
ax[1].plot(x_range2, X[-930:-900, 1])
ax[1].plot(x_range2, y[-930:-900], label='Truth')
ax[1].legend()
Out[16]: