import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.layers import LSTM
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping
import tensorflow_hub as hub
def make_dataset(input, batch_length=10):
dataX, dataY = [], []
for i in range(len(input)-batch_length-1):
xset = []
for j in range(input.shape[1]):
a = input[i:(i+batch_length), j]
xset.append(a)
dataY.append(input[i + batch_length, 0])
dataX.append(xset)
return np.array(dataX), np.array(dataY)
if __name__ == '__main__':
df = pd.read_csv("abcnews-date-text.csv")
df = df.set_index('publish_date')
unique = df.loc["20150101":"20201231"].index.unique().values
headline = []
for day in unique:
headline.append(df.at[day, 'headline_text'][0])
module_url = "https://tfhub.dev/google/universal-sentence-encoder/4"
model = hub.load(module_url)
embeddings = model(headline)
batch_length = 10
#bitcoin(https://www.coindesk.com/price/bitcoin/)
df = pd.read_csv("BTC_USD_2015-01-01_2020-12-31-CoinDesk.csv")
closing_price = df["Closing Price (USD)"]
days =np.array(df["Date"].values)
f = closing_price.values
f /= f.max()
arr = np.concatenate([np.expand_dims(f, axis = 1), embeddings.numpy()], 1)
predict_length = 1
train, test = arr[0:len(arr)-predict_length, :], arr[len(f)-predict_length:len(arr), :]
g, h = make_dataset(train)
length_of_sequence = g.shape[1]
in_out_neurons = 1
n_hidden = 100
model = Sequential()
model.add(LSTM(n_hidden, input_shape=(513, batch_length), return_sequences=False))
model.add(Dense(in_out_neurons))
model.add(Activation("linear"))
optimizer = Adam(lr=0.001)
model.compile(loss="mean_squared_error", optimizer=optimizer)
early_stopping = EarlyStopping(monitor='val_loss', mode='auto', patience=20)
model.fit(g, h,
batch_size=300,
epochs=100,
validation_split=0.1,
callbacks=[early_stopping]
)
f_pred = model.predict(g)
future_test = g[-1]
time_length = future_test.shape[0]
future_result = np.empty(predict_length+1).astype(float)
future_result[0] = f_pred[-1][0]
for step in range(predict_length):
print(g[0])
test_data = np.reshape(future_test, (g.shape[1], batch_length))
print(test_data)
batch_predict = model.predict(np.expand_dims(test_data, axis=0))
print(step)
future_test = np.delete(future_test, 0)
future_test = np.append(future_test, batch_predict)
future_result[step+1] = batch_predict[0][0]
plt.plot(range(0, len(f)), f, color="b", label="Real Chart")
plt.plot(range(batch_length+1,1+len(f_pred)+batch_length),f_pred, color="r", label="Model Chart")
plt.plot(range(0+len(train)-1, len(future_result)+len(train)-1), future_result, color="g",label="Model Prediction Chart")
plt.legend()
plt.show()
コメント