python - 简单的 MLP 时间序列训练产生意想不到的平均线结果

标签 python neural-network deep-learning theano lasagne

我正在尝试使用简单的时间序列预测。给定数量的输入(1 分钟滴答) Net 应该尝试预测下一个。我用不同的设置训练了 3 个网络来说明我的问题:

enter image description here

在右侧,您可以看到 3 个训练器 MLP - 随机命名和颜色编码,以及一些训练数据。在左侧 - 由这些网络做出的预测图和白色的实际验证数据。该图是通过遍历验证数据的每个刻度(白色),将 30|4|60 (Nancy|Kathy|Wayne) 之前的刻度输入网络并绘制它将在当前刻度位置预测的内容绘制的。

多层感知器的设置(Nancy|Kathy|Wayne 设置):

几何:2x30|4|60 个输入节点 -> 30|4|60 个隐藏层节点 -> 2 个输出
时代数:10|5|10
学习率:0.01
动量:0.5|0.9|0.5
非线性:纠正
损失:平方误差

似乎随着更多的训练应用 - 预测会收敛到某种平均线,这根本不是我所期望的。我期待预测与验证数据有点接近,但有一定的误差。
我是否选择了错误的模型、误解了机器学习的一些核心概念或在烤宽面条/theano 中做错了什么?

最相关(在我看来)代码部分的快速链接:

  • MLP Geometry definition
  • Functions compilation
  • Training and validation
  • Instantiating MLP
  • CSV training data parsing

  • 这里或多或少是完整的来源:
  • Data used for training格式 - 日期;开盘价;最高价;最低价;收盘价;成交量 - 仅使用日期、最高价和最低价
  • MLP module
  • Gui 模块相关 MLP interaction parts
  • 最佳答案

    首先,我要赞扬您使用非线性整流。根据玻尔兹曼机的发明者 Geoffrey Hinton 所相信的,非线性整流器是人类大脑事件的最佳支撑。

    但是对于您选择的其他部分,我建议您更改 NN 架构。对于股票市场的预测,您应该使用一些循环神经网络:最简单的候选者可能是 Elman 或 Jordan 网络。或者你可以尝试更复杂的,比如 LSTM 网络。

    另一部分建议,我建议修改您在 NN 中提供的内容。一般来说,我建议您应用缩放和标准化。例如,不要输入 NN 原始价格。以下列方式之一修改它(这些建议不是一成不变的):
    1. 输入价格变化的 NN 百分比。
    2. 如果您输入 NN 30 个值,并且想要预测两个值,则从 30 + 2 个值中减去所有 32 个值的最小值,并尝试预测 2 个值,但基于 30。然后只需添加到结果的最小值32 个值。

    不要在 NN 中只提供日期。它对 NN 没有任何关于进行预测的说明。而是输入 NN 日期和时间作为分类值。分类意味着您在多个条目中转换日期时间。例如,您可以考虑以下一些内容,而不是给 NN 2016/09/10。

  • 交易年份很可能不会提供任何有用的信息。所以你可以省略交易年份。
  • 09 代表月数或大约九月。您可以选择以月份的 NN 数输入,但我强烈建议您在 NN 中输入 12 个,并且在 1 月份的情况下,第一个 NN 输入 1,其他 11 个输入为零。通过这种方式,您将训练您的网络,将 1 月的交易期与 6 月或 12 月的交易期分开。我还建议以同样的方式对星期几进行分类输入。因为周一的交易与周五的交易不同,尤其是在非农日。
  • 对于几个小时,我建议使用 6 - 8 小时的编码。它将帮助您训练网络以考虑不同的交易时段:亚洲、法兰克福、伦敦、纽约。
  • 如果您决定在 NN 中输入一些指标,那么对于某些指标,请考虑温度计编码。通常,像 ADX 这样的指标需要温度计编码。

  • 根据您在有关如何使用最小值的评论中提出的问题,我将为您提供简化示例。
    假设您想在欧元/美元收盘价后用于训练神经网络:
    1.1122、1.1132、1.1152、1.1156、1.1166、1.1173、1.1153、1.1150、1.1152、1.1159。
    我将使用窗口大小 3(只是为了简单起见)和预测窗口大小 2 来演示学习,而不是用于学习 30 的窗口大小。
    用于预测的总数据等于 3。输出将为 2。对于学习,我们将使用前 5 个值,或者:
    1.1122、1.1132、1.1152、1.1156、1.1166
    然后是另外 5 个值或:
    1.1132、1.1152、1.1156、1.1166、1.1173
    在第一个窗口中的最小值是:1.1122。
    然后从每个值中减去 1.1122:
    0、0.002、0.003、0.0033、0.0034。作为输入,您输入 NN 0、0.002、0.003。作为 NN 的输出,您期望 0.0033、0.0034。如果您想让它学习得更快,请输入 NN 标准化和缩放值。然后每次您都需要对输入进行去规范化和去缩放。

    另一种方式,输入价格变化的 NN 百分比。如果您需要 sample ,请告诉我。

    还有一条更重要的建议。不要只使用 NN 进行交易。绝不!!!更好的方法是发明一些具有一定成功率的系统。例如 30%。然后使用 NN 将成功率提高到 60%。

    我还想为您提供一些指标的温度计编码示例。考虑 ADX 指标和以下示例:

    a.>10 >20 >30 >40
    1 0 0 0
    湾>10 >20 >30 >40
    1 1 0 0
    示例 a 在 ADX 大于 10 的 NN 中提供输入。
    示例 b 提供了 ADX 大于 20 的 NN 中的输入。

    您可以修改温度计编码以提供随机输入。通常,随机在 0 - 20 和 80 - 100 的范围内具有意义,在极少数情况下在 20 - 80 的范围内具有意义。但与往常一样,您可以尝试看看。

    关于python - 简单的 MLP 时间序列训练产生意想不到的平均线结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896985/

    相关文章:

    python - 如何分组和计算其他列。 Pandas

    neural-network - Dropout 可以提高训练数据性能吗?

    python - Tensorflow 训练期间 GPU 使用率非常低

    python - 加载pytorch模型从0.4.1到0.4.0?

    python - 在 tensorflow 中训练后如何使用模型(保存/加载图表)

    python - scikit-learn 中预计算内核的网格搜索中的嵌套交叉验证

    python - Tox virtualenv 混淆

    python - 为什么嵌套列表索引与列表推导式交换?

    python - 如何提高前馈神经网络的准确性?

    machine-learning - 使用 onnx 模型在 Arm NN android 上运行推理