0
$\begingroup$

i have training data from 2015-2017 and testing data of 2018. i have multiple variables my data is multivariate time series data.i want to predict 2019 data by using test data of 2018.is it possible? i am confused about Long short term memory neural networks working what is actually it will do.does my problem come under multivariate multi step forecasting? or multivariate single step forecasting?

$\endgroup$
1
  • 2
    $\begingroup$ Hello, have you tried a simpler model first ? $\endgroup$ Commented Jan 5, 2020 at 0:09

2 Answers 2

1
$\begingroup$

You should post your code, or no one here can see what you have tried so far. Anyway, I'll throw this out there for you, and hopefully it will clarify things.

from pandas_datareader import data as wb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
from sklearn.preprocessing import MinMaxScaler

start = '2019-02-20'
end = '2020-02-20'

tickers = ['AAPL']

thelen = len(tickers)

price_data = []
for ticker in tickers:
    prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Open','Adj Close']]
    price_data.append(prices.assign(ticker=ticker)[['ticker', 'Open', 'Adj Close']])

#names = np.reshape(price_data, (len(price_data), 1))

df = pd.concat(price_data)
df.reset_index(inplace=True)

for col in df.columns: 
    print(col) 

#used for setting the output figure size
rcParams['figure.figsize'] = 20,10
#to normalize the given input data
scaler = MinMaxScaler(feature_range=(0, 1))
#to read input data set (place the file name inside  ' ') as shown below
df.head()

df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')
#df.index = names['Date']
plt.figure(figsize=(16,8))
plt.plot(df['Adj Close'], label='Closing Price')


ntrain = 80
df_train = df.head(int(len(df)*(ntrain/100)))
ntest = -80
df_test = df.tail(int(len(df)*(ntest/100)))


#importing the packages 
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM

#dataframe creation
seriesdata = df.sort_index(ascending=True, axis=0)
new_seriesdata = pd.DataFrame(index=range(0,len(df)),columns=['Date','Adj Close'])
length_of_data=len(seriesdata)
for i in range(0,length_of_data):
    new_seriesdata['Date'][i] = seriesdata['Date'][i]
    new_seriesdata['Adj Close'][i] = seriesdata['Adj Close'][i]
#setting the index again
new_seriesdata.index = new_seriesdata.Date
new_seriesdata.drop('Date', axis=1, inplace=True)
#creating train and test sets this comprises the entire data’s present in the dataset
myseriesdataset = new_seriesdata.values
totrain = myseriesdataset[0:255,:]
tovalid = myseriesdataset[255:,:]
#converting dataset into x_train and y_train
scalerdata = MinMaxScaler(feature_range=(0, 1))
scale_data = scalerdata.fit_transform(myseriesdataset)
x_totrain, y_totrain = [], []
length_of_totrain=len(totrain)
for i in range(60,length_of_totrain):
    x_totrain.append(scale_data[i-60:i,0])
    y_totrain.append(scale_data[i,0])
x_totrain, y_totrain = np.array(x_totrain), np.array(y_totrain)
x_totrain = np.reshape(x_totrain, (x_totrain.shape[0],x_totrain.shape[1],1))

#LSTM neural network
lstm_model = Sequential()
lstm_model.add(LSTM(units=50, return_sequences=True, input_shape=(x_totrain.shape[1],1)))
lstm_model.add(LSTM(units=50))
lstm_model.add(Dense(1))
lstm_model.compile(loss='mean_squared_error', optimizer='adadelta')
lstm_model.fit(x_totrain, y_totrain, epochs=3, batch_size=1, verbose=2)
#predicting next data stock price
myinputs = new_seriesdata[len(new_seriesdata) - (len(tovalid)+1) - 60:].values
myinputs = myinputs.reshape(-1,1)
myinputs  = scalerdata.transform(myinputs)
tostore_test_result = []
for i in range(60,myinputs.shape[0]):
    tostore_test_result.append(myinputs[i-60:i,0])
tostore_test_result = np.array(tostore_test_result)
tostore_test_result = np.reshape(tostore_test_result,(tostore_test_result.shape[0],tostore_test_result.shape[1],1))
myclosing_priceresult = lstm_model.predict(tostore_test_result)
myclosing_priceresult = scalerdata.inverse_transform(myclosing_priceresult)

Epoch 1/3
 - 7s - loss: 0.0163
Epoch 2/3
 - 6s - loss: 0.0058
Epoch 3/3
 - 6s - loss: 0.0047

totrain = df_train
tovalid = df_test

#predicting next data stock price
myinputs = new_seriesdata[len(new_seriesdata) - (len(tovalid)+1) - 60:].values

#  Printing the next day’s predicted stock price. 
print(len(tostore_test_result));
print(myclosing_priceresult);

# next day's predicted closing price
[[329.42258]]

enter image description here

So, on 2020-02-20, we are predicting what AAPL will close at, on 2020-02-21. The model said it would be 329.42 and the actual close was 313.05. Less than 5% difference. Not bad, but I would have expected a little better accuracy. Oh well, we illustrated the point, and that was the goal of this exercise.

See the link below for more info.

https://www.codespeedy.com/predicting-stock-price-using-lstm-python-ml/

$\endgroup$
1
  • $\begingroup$ LSTM only are a very poor choice for predicting stock data since the output graph usually lags behind the input by one time step. Some issues I see here is that the time series is not stationary. For predicting any time series, your dataset must be stationary and normalized. Also another problem with trying to predict stock data is that the data itself is stochastic. $\endgroup$
    – tehem
    Commented Aug 29, 2020 at 8:55
1
$\begingroup$

Iìll go through your questions one by one:


i have multiple variables my data is multivariate time series data ...

This means your task is a multivariate regression. You have more than one explanatory variable to explain your y.


i want to predict 2019 data by using test data of 2018.is it possible?

Yes it is. The quality of the prediction depends from your data and your model's architecture. What kind of RNN did you try to implement up to now?


i am confused about Long short term memory neural networks working what is actually it will do.does my problem come under multivariate multi step forecasting? or multivariate single step forecasting?

As you said above, it's a multivariate forecasting. Whether it's multistep or not depends on your choice: - Single step: you predict one step in the future; your model has one output node. - Multi step: you predict multiple steps in the future; your model has n output nodes, one for each step of the prediction.

This is completely up to your needs and your preferences. Could you provide more information about the kind of prediction you need to implement?

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.