Прогнозирование временных рядов LSTM
Есть код рекуррентной нейронной сети, который прогнозирует временной ряд стоимости акций в указанный период. Используются 5 минутные данные с yfinance. Проблема в том, что в качестве периода нейросеть использует один день. Как сделать так, чтобы прогноз строился с 5 минутным периодом?
from datetime import datetime
import yfinance as yf
import pandas as pd
import numpy as np
import keras
import tensorflow as tf
from keras.preprocessing.sequence import TimeseriesGenerator
dat = "2021-06-03 10:15:00"
START = datetime.strptime("2021-04-10 00:00:00", "%Y-%m-%d %H:%M:%S" )
TODAY = datetime.strptime(dat, "%Y-%m-%d %H:%M:%S")
selected_stock = "AAPL"
def load_data(ticker):
df = yf.download(ticker, START, TODAY, interval="5M")
df.reset_index(inplace=True)
df['Datetime'] = df['Datetime'].dt.tz_localize(None)
return df
df = load_data(selected_stock)
df['Datetime'] = pd.to_datetime(df['Datetime'])
df.set_axis(df['Datetime'], inplace=True)
df.drop(columns=['Open', 'High', 'Low', 'Volume'], inplace=True)
print(df)
import plotly
import plotly.graph_objects as go
print("Plotly Version: ",plotly.__version__)
trace = go.Scatter(
x = df['Datetime'],
y = df['Close'],
mode = 'lines',
name = 'Data'
)
layout = go.Layout(
title = "",
xaxis = {'title' : "Date"},
yaxis = {'title' : "Close (Dollars)"}
)
fig = go.Figure(data=[trace], layout=layout)
fig.show()
close_data = df['Close'].values
close_data = close_data.reshape((-1,1))
split_percent = 0.80
split = int(split_percent*len(close_data))
close_train = close_data[:split]
close_test = close_data[split:]
date_train = df['Datetime'][:split]
date_test = df['Datetime'][split:]
print(len(close_train))
print(len(close_test))
look_back = 1
train_generator = TimeseriesGenerator(close_train, close_train, length=look_back, batch_size=5)
test_generator = TimeseriesGenerator(close_test, close_test, length=look_back, batch_size=1)
from keras.models import Sequential
from keras.layers import LSTM, Dense
model = Sequential()
model.add(
LSTM(10,
activation='relu',
input_shape=(look_back,1))
)
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
num_epochs = 25
model.fit_generator(train_generator, epochs=num_epochs, verbose=1)
prediction = model.predict_generator(test_generator)
close_train = close_train.reshape((-1))
close_test = close_test.reshape((-1))
prediction = prediction.reshape((-1))
trace1 = go.Scatter(
x = date_train,
y = close_train,
mode = 'lines',
name = 'Data'
)
trace2 = go.Scatter(
x = date_test,
y = prediction,
mode = 'lines',
name = 'Prediction'
)
trace3 = go.Scatter(
x = date_test,
y = close_test,
mode='lines',
name = 'Ground Truth'
)
layout = go.Layout(
title = "Google Stock",
xaxis = {'title' : "Date"},
yaxis = {'title' : "Close"}
)
fig = go.Figure(data=[trace1, trace2, trace3], layout=layout)
fig.show()
close_data = close_data.reshape((-1))
def predict(num_prediction, model):
prediction_list = close_data[-look_back:]
for _ in range(num_prediction):
x = prediction_list[-look_back:]
x = x.reshape((1, look_back, 1))
out = model.predict(x)[0][0]
prediction_list = np.append(prediction_list, out)
prediction_list = prediction_list[look_back - 1:]
return prediction_list
def predict_dates(num_prediction):
last_date = df['Datetime'].values[-1]
prediction_dates = pd.date_range(last_date, periods=num_prediction + 1).tolist()
return prediction_dates
num_prediction = 1
forecast = predict(num_prediction, model)
forecast_dates = predict_dates(num_prediction)
trace1 = go.Scatter(
x = df['Datetime'].tolist(),
y = close_data,
mode = 'lines',
name = 'Data'
)
trace2 = go.Scatter(
x = forecast_dates,
y = forecast,
mode = 'lines',
name = 'Prediction'
)
layout = go.Layout(
title = "Google Stock",
xaxis = {'title' : "Date"},
yaxis = {'title' : "Close"}
)
fig = go.Figure(data=[trace1, trace2], layout=layout)
fig.show()