我正在学习使用RNN来预测市场指数,例如S& P500(注意;这是S& P指数,而不是500家不同的公司)。除了价格变动数据,我还提供其他信息,如RSI,MACD,EMA
我将来有3个标签,1w,2w 3w,我将从单独的CSV加载。
说这是我的示例数据(完全构成):
price change RSI MACD EMA
0.3 3.2 0.1 0.0
-0.1 3.1 0.1 0.0
-1.2 3.8 0.1 0.2
0.9 2.7 0.1 0.2
1.3 1.7 0.2 0.2
然后,我为标签
设置了单独的CSV1w future price change % 2w future price change % 3w future price change %
1.2 1.8 -0.3
0.8 0.2 1.1
0.2 1.5 0.7
1.2 1.7 0.1
-0.2 1.8 -0.3
我的麻烦是我只能找到使用单一功能和/或使用未来训练数据作为标签的示例,而我为标签使用单独定义的数据集。
我已经拼凑了下面的代码,但是我在这一行得到了一个换形错误:
mse = loss.eval(feed_dict={X: trX, Y: trY})
我怀疑我的数据格式是错误的,因为它仍然采用我用于训练“正常”前馈网络的格式。我怀疑需要进行一些重新塑造,但说实话,我不知道由于具有多重功能而导致的格式。我可能也错误地定义了模型(?)。
如果有人能帮助我,我将不胜感激。
我还有一个问题:以前(正如你在代码中看到的那样)我会改组数据,这对于迷你批量前馈NN来说很好,但是如何使用RNN,其中我假设您需要按顺序显示数据?接下来,让我说我适应了股票(而不是市场指数);我是否需要逐个库存地显示数据以构成移动窗口,而不是每天都这样做?显然,在日常的基础上,每行数据都是针对不同的股票。
对不起所有的问题,仍然让我的头围绕着RNN!
import tensorflow as tf
import numpy as np
import pandas as pd
import datetime
from sklearn.model_selection import train_test_split
# hyperparameters
epochs = 600
batch_size = 128
num_hidden = 100
df = pd.read_csv('C:\\python\\MarketData-Inputs.csv',header=None)
ldf = pd.read_csv('C:\\python\\MarketData-Results.csv',header=None)
# 20% test, shuffle the data, and use random state for like-like comparison between runs
trX, teX, trY, teY = train_test_split(df, ldf, test_size=0.2, shuffle=True, random_state=42)
trX = trX.values.astype('float')
trY = trY.values.astype('float')
teX = teX.values.astype('float')
teY = teY.values.astype('float')
print(trX.shape)
print(trY.shape)
print(teX.shape)
print(teY.shape)
#data params
features_size = len(trX[0])
labels_size = len(trY[0])
step_size = 3
tf.reset_default_graph()
X = tf.placeholder("float", [None, step_size, features_size], name="X")
Y = tf.placeholder("float", [None, labels_size], name="Y")
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=num_hidden, activation=tf.nn.relu)
rnn_outputs, _ = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, num_hidden])
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, labels_size)
outputs = tf.reshape(stacked_outputs, [-1, step_size, labels_size])
with tf.name_scope("loss"):
loss = tf.reduce_sum(tf.square(outputs - Y))
training_op = tf.train.AdamOptimizer().minimize(loss)
tf.summary.scalar("loss", loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
for ep in range(epochs):
sess.run(training_op, feed_dict={X: trX, Y: trY})
if ep % 100 == 0:
mse = loss.eval(feed_dict={X: trX, Y: trY})
print(ep, "\tMSE:", mse)
y_pred = sess.run(stacked_outputs, feed_dict={X: teX})
print(y_pred)
答案 0 :(得分:0)
好的,我想我是这样的。在我的例子中,我不是对数据进行批处理,但是RNN期望输入张量至少为3级,所以我需要在输入数据中添加一个额外的维度,以提供[批处理,序列,特征大小]的形式,我可以在这里做:
trX = np.expand_dims( trX.values.astype('float'), axis=0)
trY = trY.values.astype('float')
teX = np.expand_dims( teX.values.astype('float'), axis=0)
teY = teY.values.astype('float')
我的占位符看起来像这样。
X = tf.placeholder("float", [None, sequence_size, features_size], name="X")
Y = tf.placeholder("float", [None, labels_size], name="Y")
关于我关于改组数据的问题:我想我现在也可以回答我自己的问题;数据序列应保留,因为序列的顺序对RNN很重要(这是它们的全部要点)。相反,数据可以通过批处理进行洗牌。因此批处理由我们整个数据集的随机子集组成。因此,如果整个数据集是1000个时间步,并且我的批量大小为100,那么我可以创建10个批次,然后以随机/随机顺序将批次呈现给RNN。
希望这有助于将来。