【问题标题】:Train model for price prediction价格预测训练模型
【发布时间】:2020-12-10 11:01:38
【问题描述】:

我正在尝试制作股票预测器,我知道我将创建的模型不会很好,但尽管如此。首先在下面我将添加形成 X 和 Y 的代码。X 包含 10 天的股票价格,Y 包含答案(未来几天的价格)。

import yfinance as yf
import numpy as np
import pandas as pd
import json
from sys import exit
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import Dense 



with open('/content/drive/MyDrive/tickers.json', 'r', encoding='utf-8') as f:
  tickers_list = eval(json.loads(f.read()))['tickers'][:100] # list of tickers


X = []
Y = []


for ticker in tickers_list:
   stock = yf.download(ticker,'1990-01-01','2019-12-31')['Adj Close'].values
   for i in range(len(stock)):
     try:
       stock[i+11]
     except:
       continue
     X.append(stock[i:i+10])
     Y.append([stock[i+11]])
X = np.array(X) #price for 10 days
Y = np.array(Y) #price for next day

之后我编写了用于创建模型的代码。

X_train = np.expand_dims(X, 1)

model = Sequential()
model.add(LSTM(units=64,return_sequences=True, input_shape=(10, 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=64,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=64,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=64))
model.add(Dropout(0.2))
model.add(Dense(units=1))
model.compile(optimizer='adam',loss='mean_squared_error')

print(model.summary())

model.fit(X_train, Y, epochs=100, batch_size=32)

但是当我运行上面的代码时,我得到了错误。

Input 0 is incompatible with layer sequential_17: expected shape=(None, None, 1), found shape=[None, 1, 10]

如何解决? 谢谢你。

注意 如果您有任何建议可以使我的研究更好,请写在这里。

【问题讨论】:

  • X_train.shape 的输出是什么?
  • X_train.shape 的输出为 (474299, 1, 10)

标签: python tensorflow keras lstm


【解决方案1】:

改变这一行:

X_train = np.expand_dims(X, 2) # 2 instead of 1

【讨论】:

  • 谢谢你,你有什么建议可以改进我的模型吗?在第一个 epoch 损失之后是 nan。
  • 如果 loss 是 nan,检查你的数据集中是否有 Nan 并删除它们
  • 我不会在 30 分钟内接受你的回答,我会等待建议。你的回答解决了我的问题。
  • @BDouchet,你怎么看。从技术上讲,我的模型应该工作吗?
  • 尝试减少 LSTM 层的数量(从一层开始)。 4层可能不稳定
【解决方案2】:

我建议你使用这个函数来创建一个时间序列数据集。你的,包括错误处理,似乎不是最理想的。此功能来自官方 Tensorflow 文档的过去版本。此外,您似乎正在一个接一个地连接一堆时间序列,这没有任何意义。

def univariate_data(dataset, start_index, end_index, history_size,
                    target_size, single_step=False):
    data, labels = [], []
    start_index = start_index + history_size
    if end_index is None:
        end_index = len(dataset) - target_size
    for i in range(start_index, end_index):
        indices = np.arange(i-history_size, i)
        data.append(np.reshape(dataset[indices], (history_size, 1)))
        if single_step:
            labels.append(dataset[i + target_size])
        else:
            labels.append(dataset[i:i + target_size])
    return np.array(data), np.array(labels)

然后,您甚至不会面对您遇到的问题。最重要的是,请注意您不需要打印model.summary(),调用此方法会自动打印它。这是我提供的功能的完整工作示例:

import yfinance as yf
import numpy as np
import tensorflow as tf

stock = yf.download('aapl','1990-01-01','2019-12-31')['Adj Close'].values

def univariate_data(dataset, start_index, end_index, history_size,
                    target_size, single_step=False):
    data, labels = [], []
    start_index = start_index + history_size
    if end_index is None:
        end_index = len(dataset) - target_size
    for i in range(start_index, end_index):
        indices = np.arange(i-history_size, i)
        data.append(np.reshape(dataset[indices], (history_size, 1)))
        if single_step:
            labels.append(dataset[i + target_size])
        else:
            labels.append(dataset[i:i + target_size])
    return np.array(data), np.array(labels)

X, y = univariate_data(stock, 0, len(stock) - 1, 10, 1, True)

model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units=8,return_sequences=True,
                               input_shape=(10, 1)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(units=8,return_sequences=True))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(units=8,return_sequences=True))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(units=8))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Dense(units=1))
model.compile(optimizer='adam',loss='mean_squared_error')

model.summary()

history = model.fit(X, y, steps_per_epoch=1)
7547/7547 [==============================] - 12s 2ms/sample - loss: 286.5788

【讨论】:

  • 非常感谢
  • 如何预测? aapl = np.array(list(yf.download('AAPL','2020-11-25','2020-12-10')['Adj Close'].values)) aapl = np.expand_dims(aapl, 1) model.predict(aapl) 给我层顺序的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,1]
  • 如果你制作测试数据,你也必须通过函数来​​传递它
  • 顺便说一句,我很确定您正在一个接一个地连接多个时间序列,这没有意义。
  • 你在做什么?我知道我的模型不能很好地完成任务。
猜你喜欢
  • 2022-10-19
  • 2017-08-19
  • 2018-04-15
  • 2017-05-29
  • 2019-04-14
  • 2020-09-14
  • 2021-12-10
  • 2019-10-05
  • 1970-01-01
相关资源
最近更新 更多