LSTM输出扁平线

2024-09-28 21:09:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试制作一个简单的LSTM网络来预测S&;P500下一个5%的值变化。然而,我的NN输出的几乎是一条完全平坦的线

5%的未来变化,红色为“预测”: enter image description here

我知道我永远不应该在火车组中检查我的模型,但这只是一次理智的检查,看看它是否工作

sc = MinMaxScaler(feature_range=(0,1))
dataset = dataset[5:-1]
dataset = dataset.dropna()

close = sc.fit_transform(dataset['Close'].values.reshape(-1,1))
volume = sc.fit_transform(dataset['Volume'].values.reshape(-1,1))
pct = sc.fit_transform(dataset['pct5'].values.reshape(-1,1))

close_train = []
volume_train = []
y = []
pc = []
leng = 60

for i in range(leng, len(close)):
  close_train.append(close[i - 60 : i, 0])
  volume_train.append(volume[i - 60 : i, 0])
  y.append(close[i, 0])
  pc.append(pct[i, 0])


close_train = np.array(close_train, dtype=np.float64)
volume_train = np.array(volume_train, dtype=np.float64)
y = np.array(y)
pc = np.array(pc, dtype=np.float64) #This is just adjusted pct in case you got lost

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


def buildModel(dataLength, labelLength):
  price = Input(shape=(dataLength, 1), name='price')
  volumen = Input(shape=(dataLength, 1), name='volumen')

  priceLayers1 = LSTM(60, return_sequences=True)(price)
  volumeLayers1 = LSTM(60, return_sequences=True)(volumen)

  priceLayers2 = LSTM(60, return_sequences=True)(price)
  volumeLayers2 = LSTM(60, return_sequences=True)(volumen)

  priceLayers3 = LSTM(60, return_sequences=False)(price)
  volumeLayers3 = LSTM(60, return_sequences=False)(volumen)

  output = concatenate(
      [
       price,
       volumen
      ]
  )

  output = Dense(1, activation='linear', name='dense')(output)

  model = Model(
      [
       price,
       volumen
      ],
      [
       output
      ]
  )
  opt = tf.keras.optimizers.Adam(learning_rate=0.001)
  model.compile(optimizer=opt, loss='mse')
  print(output)
  return model


rnn = buildModel(60, 4)
hist = rnn.fit(
    [
     close_train,
     volume_train
    ],
    [
     pc
    ],
    epochs = 100,
    batch_size=50
)

nsamples, nx, ny = close_train.shape
test_close = close_train.reshape((nsamples,nx*ny))

test_vol = volume_train.reshape((nsamples,nx*ny))

pred = rnn.predict([test_close[0, :60], test_vol[0, :60]])
print(pred_dim)
pred1 = sc.inverse_transform(pred_dim)


final = []
for i in range(0, len(pred1)+60):
  if i <60:
    final.append(None)
    continue
  final.append(pred1[i-60, 0])

plt.figure(figsize=(30,20))
plt.plot(dataset['pct5'])
plt.plot(final, c='r')
plt.axvline(60, c='r')

print(final)

PS:我不希望它能准确地工作,因为它实际上是不可能的,但我希望它能工作,这样我就可以继续:)


Tags: closereturnnptrainpricedatasetscshape
1条回答
网友
1楼 · 发布于 2024-09-28 21:09:43

你现在在问题中展示的模型是输入的线性回归

output = Dense(1, activation='linear', name='dense')(concatenate[price, volume])

我怀疑模型是否有可能做得更好,以预测平均。。。它可能将权重设置为尽可能接近0,并将偏差设置为信号的平均值

你可能想写些什么:

def buildModel(dataLength, labelLength):
  price = Input(shape=(dataLength, 1), name='price')
  volumen = Input(shape=(dataLength, 1), name='volumen')

  priceLayers1 = LSTM(60, return_sequences=True)(price)
  volumeLayers1 = LSTM(60, return_sequences=True)(volumen)

  priceLayers2 = LSTM(60, return_sequences=True)(priceLayers1)
  volumeLayers2 = LSTM(60, return_sequences=True)(volumeLayers1)

  priceLayers3 = LSTM(60, return_sequences=False)(priceLayers2)
  volumeLayers3 = LSTM(60, return_sequences=False)(volumeLayers2)

  x = Concatenate()([priceLayers3, volumeLayers3])
  output = Dense(1, activation='linear', name='dense')(x)
  model = tf.keras.Model([price, volumen], output)
  model.compile(optimizer='adam', loss='mse')
  return model

相关问题 更多 >