【问题标题】:How to use the LSTM model for multi-step forecasting?如何使用 LSTM 模型进行多步预测?
【发布时间】:2021-12-15 12:47:32
【问题描述】:

我使用 LSTM 开发了一个时间序列模型。我不能用它来预测未来几天的股价。我想用它来预测明年的股价并绘制它。如何用它来预测未来(明年)的股价?

df=pd.read_csv('foolad.csv')
df=df.set_index(pd.DatetimeIndex(df['Date'].values))

data=df.filter(['Close'])
dataset=data.values

training_data_len=math.ceil(len(dataset)*0.8)
scaler=MinMaxScaler(feature_range=(0,1))
scaled_data=scaler.fit_transform(dataset)
scaled_data

training_data=scaled_data[0:training_data_len , :]

xtrain=[]
ytrain=[]
n = 60

for i in range(n,len(training_data)):
    xtrain.append(training_data[i-n:i , 0])
    ytrain.append(training_data[i,0])

xtrain , ytrain = np.array(xtrain) , np.array(ytrain)
xtrain=np.reshape(xtrain , (xtrain.shape[0],xtrain.shape[1],1))
xtrain.shape

model=Sequential()
model.add(LSTM(50,return_sequences=True,input_shape=(xtrain.shape[1],1)))
model.add(LSTM(50,return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))

model.compile(loss='mean_squared_error',optimizer='adam')

model.fit(xtrain,ytrain,epochs=1,batch_size=1)

test_data=scaled_data[training_data_len - n : , :]
xtest=[]
ytest=dataset[training_data_len : , :]
for i in range(n , len(test_data)):
    xtest.append(test_data[i-n : i , 0])

xtest=np.array(xtest)
xtest=np.reshape(xtest , (xtest.shape[0],xtest.shape[1],1))

prediction=model.predict(xtest)
prediction=scaler.inverse_transform(prediction)

#for future 360 days what can I do?....

【问题讨论】:

    标签: python tensorflow machine-learning keras lstm


    【解决方案1】:

    一种方法是将预测作为输入反馈给模型:在每个步骤中,您通过删除最旧的值并添加最新的预测作为最新值来更新输入序列。如下图所示,其中 n 是输入序列的长度,T 是时间序列的长度。

    下面的代码展示了如何为 LSTM 模型实现这种方法并绘制结果。

    import numpy as np
    import pandas as pd
    import yfinance as yf
    import tensorflow as tf
    from tensorflow.keras.layers import Dense, LSTM
    from tensorflow.keras.models import Sequential
    from sklearn.preprocessing import MinMaxScaler
    
    # download the data
    df = yf.download(tickers=['^IXIC'], period='5y')
    y = df['Close'].fillna(method='ffill').values.reshape(- 1, 1)
    
    # scale the data
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaler = scaler.fit(y)
    y = scaler.transform(y)
    
    # generate the training sequences
    n_forecast = 1 
    n_lookback = 60
    
    X = []
    Y = []
    
    for i in range(n_lookback, len(y) - n_forecast + 1):
        X.append(y[i - n_lookback: i])
        Y.append(y[i: i + n_forecast])
    
    X = np.array(X)
    Y = np.array(Y)
    
    # train the model
    tf.random.set_seed(0)
    
    model = Sequential()
    model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
    model.add(LSTM(50, return_sequences=False))
    model.add(Dense(25))
    model.add(Dense(1))
    
    model.compile(loss='mse', optimizer='adam')
    model.fit(X, Y, epochs=100, batch_size=128, validation_split=0.2, verbose=0)
    
    # generate the multi-step forecasts
    n_future = 365
    y_future = []
    
    x_pred = X[-1:, :, :]  # last observed input sequence
    y_pred = Y[-1]         # last observed target value
    
    for i in range(n_future):
    
        # feed the last forecast back to the model as an input
        x_pred = np.append(x_pred[:, 1:, :], y_pred.reshape(1, 1, 1), axis=1)
    
        # generate the next forecast
        y_pred = model.predict(x_pred)
    
        # save the forecast
        y_future.append(y_pred.flatten()[0])
    
    # transform the forecasts back to the original scale
    y_future = np.array(y_future).reshape(-1, 1)
    y_future = scaler.inverse_transform(y_future)
    
    # organize the results in a data frame
    df_past = df[['Close']].reset_index()
    df_past.rename(columns={'index': 'Date'}, inplace=True)
    df_past['Date'] = pd.to_datetime(df_past['Date'])
    df_past['Forecast'] = np.nan
    
    df_future = pd.DataFrame(columns=['Date', 'Close', 'Forecast'])
    df_future['Date'] = pd.date_range(start=df_past['Date'].iloc[-1] + pd.Timedelta(days=1), periods=n_future)
    df_future['Forecast'] = y_future.flatten()
    df_future['Close'] = np.nan
    
    results = df_past.append(df_future).set_index('Date')
    
    # plot the results
    results.plot(title='NASDAQ')
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2019-02-23
      • 2017-09-14
      • 1970-01-01
      • 2018-09-24
      • 2020-08-24
      • 2019-09-01
      相关资源
      最近更新 更多