如何使用Tensorflow模型进行预测?

时间:2018-07-20 14:14:59

标签: python python-3.x pandas tensorflow jupyter-notebook

我创建了tensorflow程序,以获取外汇的收盘价。我已经成功创建了前提条件,但未能理解预测未来价值的方法。看到以下是我的预测函数:

$settings = SettingUser::where('user_id', Auth::user()->id)->get();

这是用于测试和训练的完整jupyter和数据集:
My repository with code

请帮我如何预测未来的收盘价。请不要分享我尝试过的与预测有关的内容。亲爱的,让我知道一些只是在训练我所提供的基础上,无需任何支持就能预测的东西。

希望很快能听到。

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,则通过预测您的意思是预测未来的多个收盘价(例如,当前状态下的下5个收盘价)。我浏览了您的Jupyter笔记本。简而言之,您不能轻易做到这一点。

现在,您的代码处于由多个期货定义的最后三个头寸(开盘价/低价/高价/收盘价和一些指标值)。基于此,您可以预测下一个收盘价。如果您想预测更多头寸,则必须根据预测的收盘价创建一个“人造”头寸。在这里,您可以近似地认为开盘价与之前的收盘价相同,但是您只能猜测高价和低价。然后,您将计算其他期货/价值(来自指标),并将其与前两个头寸一起使用以预测下一个收盘价。您可以像这样继续进行下一步操作。

问题出在开/低/高价格上,因为您只能估算它们。您可以从数据中删除它们,重新训练模型,并在没有它们的情况下进行预测,但是它们对于指标计算可能是必需的。


我以某种方式在此处压缩了代码,以展示预测所有OHLC价格的方法:

# Data
xTrain = datasetTrain[
    ["open", "high", "low", "close", "k",
     "d", "atr", "macdmain", "macdsgnal",
     "bbup", "bbmid", "bblow"]].as_matrix()
yTrain = datasetTrain[["open", "high", "low", "close"]].as_matrix()

# Settings
batch_size = 1
num_batches = 1000
truncated_backprop_length = 3
state_size = 12

num_features = 12
num_classes = 4

# Graph
batchX_placeholder = tf.placeholder(
    dtype=tf.float32,
    shape=[None, truncated_backprop_length, num_features],
    name='data_ph')
batchY_placeholder = tf.placeholder(
    dtype=tf.float32,
    shape=[None, num_classes],
    name='target_ph')


cell = tf.contrib.rnn.BasicRNNCell(num_units=state_size)
states_series, current_state = tf.nn.dynamic_rnn(
    cell=cell,
    inputs=batchX_placeholder,
    dtype=tf.float32)

states_series = tf.transpose(states_series, [1,0,2])

last_state = tf.gather(
    params=states_series,
    indices=states_series.get_shape()[0]-1)

weight = tf.Variable(tf.truncated_normal([state_size, num_classes]))
bias = tf.Variable(tf.constant(0.1, shape=[num_classes]))

prediction = tf.matmul(last_state, weight) + bias


loss = tf.reduce_mean(tf.squared_difference(last_label, prediction))
train_step = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

# Training
for batch_idx in range(num_batches):
    start_idx = batch_idx
    end_idx = start_idx + truncated_backprop_length


    batchX = xTrain[start_idx:end_idx,:].reshape(batch_size, truncated_backprop_length, num_features)
    batchY = yTrain[end_idx].reshape(batch_size, truncated_backprop_length, num_classes)


    feed = {batchX_placeholder: batchX, batchY_placeholder: batchY}

    _loss, _train_step, _pred, _last_label,_prediction = sess.run(
        fetches=[loss, train_step, prediction, last_label, prediction],
        feed_dict=feed)

我认为编写整个代码并不重要,而且我不知道指标是如何计算的。另外,您应该更改数据馈送的方式,因为现在它仅适用于大小为1的批处理。

答案 1 :(得分:0)

我不确定您的问题是否已解决。我面临着类似的问题,这就是我解决的方法-

  • 我使用相同的代码,对神经元数量,批次大小,过去的历史记录和评估期限进行了一些调整。
  • 我使用多变量数据运行代码以预​​测未来的发展。
  • 我在数据集中输入了预测值
  • 重新计算指标。
  • 然后运行循环30分钟(我使用的是1分钟蜡烛数据)

这行得通。

让我知道您是否需要进一步的帮助。