Прогнозирование временных рядов 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()

Ответы (0 шт):