Использование модели LSTM в нейронной сети для прогнозирования цены акций в следующем месяце вместо ежедневного прогноза - PullRequest
0 голосов
/ 26 апреля 2020

Я застрял в этой проблеме очень долгое время, и я попробовал много вещей, включая SVM и линейную регрессию, чтобы предсказать цену любых акций в следующем месяце. Итак, теперь я использую модель LSTM для прогнозирования любого запаса, но проблема, с которой я сталкиваюсь, состоит в том, что модель LSTM может давать вам только ежедневный прогноз, поскольку она использует много входных данных и генерирует один выходной результат, в результате чего модель может только предсказывать один день в будущем, но есть ли способ, которым мы можем изменить его так, чтобы он давал 30 выходных значений, что означало 30-дневный прогноз в будущем вместо ежедневных выходных. Вот блокнот Jupiter, над которым я сейчас работаю, и я не смог найти решение этой проблемы.

import math
import pandas_datareader as web
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense,LSTM
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import warnings
warnings.filterwarnings('ignore')


# In[4]:


df=web.DataReader('AAPL',data_source='yahoo',start='2017-01-01',end='2020-06-11')
df


# In[5]:


df.shape


# In[6]:


# closing price history Visualization
plt.figure(figsize=(18,10))
plt.title('Close Price History')
plt.plot(df['Close'])
plt.xlabel('Date',fontsize=18)
plt.ylabel('Close Price USD ($)',fontsize=18)
plt.show()


# In[7]:


data=df.filter(['Close'])
dataset=data.values
training_data_len= math.ceil(len(dataset)*.8)
training_data_len


# In[8]:


scaler=MinMaxScaler(feature_range=(0,1))
scaled_data=scaler.fit_transform(dataset)
scaled_data


# In[9]:


train_data=scaled_data[0:training_data_len, :]
x_train=[]
y_train=[]
for i in range(60,len(train_data)):
    x_train.append(train_data[i-60:i,0])
    y_train.append(train_data[i,0])
    if i<=61:
      print(x_train)
      print(y_train)
      print()


# In[10]:


# convert x_train and y_train into numpy arrays
x_train,y_train=np.array(x_train),np.array(y_train)


# In[11]:


#reshape data
x_train=np.reshape(x_train,(x_train.shape[0],x_train.shape[1],1))
x_train.shape                   


# In[16]:


#Building our LSTM Model
model=Sequential()
model.add(LSTM(50,return_sequences=True,input_shape=(x_train.shape[1],1)))
model.add(LSTM(50,return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))


# In[17]:


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


# In[18]:


model.fit(x_train,y_train,batch_size=1,epochs=1)


# In[59]:


#create testing data set
test_data=scaled_data[training_data_len -60: , :]
x_test=[]
y_test=dataset[training_data_len:, :]
for i in range(60,len(test_data)):
    x_test.append(test_data[i-60:i,0])


# In[60]:


#convert data into numpy array
x_test=np.array(x_test)


# In[61]:


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


# In[62]:


#prediction model
predictions=model.predict(x_test)
predictions=scaler.inverse_transform(predictions)


# In[63]:


#Get the root mean squared error (RMSE)
rmse=np.sqrt(np.mean(predictions - y_test)**2)
rmse


# In[64]:


#plot the data
train=data[:training_data_len]
valid=data[training_data_len:]
valid['Predictions']=predictions
#visualization
plt.figure(figsize=(16,8))
plt.title('Model')
plt.xlabel('Date',fontsize=18)
plt.ylabel('Close Price USD ($)',fontsize=18)
plt.plot(train['Close'])
plt.plot(valid[['Close','Predictions']])
plt.legend(['Train','Val','Predictions'],loc='lower right')
plt.show()

есть способ, которым мы можем преодолеть это, и я понимаю, что точность прогнозирования будет низкой в будущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...