价格变动预测问题

人工智能 神经网络 长短期记忆 辍学
2021-10-22 09:47:50

我正在研究一个价格变动预测项目,但我被质量不佳的预测所困扰。

在每个时间步,我都使用 LSTM 来预测接下来的 10 个时间步。输入是最后 45-60 次观察的序列。我测试了几种不同的想法,但它们似乎都给出了相似的结果。该模型经过训练以最小化 MSE。

对于每个想法,我尝试了一个模型一次预测 1 个步骤,其中每个预测被反馈为下一个预测的输入,并且一个模型直接预测接下来的 10 个步骤(多个输出)。对于每个想法,我还尝试仅使用先前价格的移动平均线作为输入,并扩展输入以在这些时间步输入订单簿。每个时间步长对应一秒。

这些是迄今为止的结果:

1- 第一次尝试使用最后 N 步的移动平均线作为输入,并预测接下来 10 步的移动平均线。在时间 t,我使用价格的真实值并使用模型预测 t+1 ....t+10

这是结果:

预测移动平均线:

图片

仔细观察,我们可以看到出了什么问题:

预测似乎是一条直线。不太关心输入数据:

图片

  1. 第二次尝试是试图预测差异,而不仅仅是价格变动。这次的输入不是简单的 X[t](其中 X 是我的输入矩阵),而是 X[t]-X[t-1]。这并没有真正帮助。这次的情节是这样的:

预测差异:

图片

但仔细观察,在绘制差异时,预测值始终基本为 0。

在此处输入图像描述

在这一点上,我被困在这里并运行我们的想法来尝试。我希望在此类数据方面有更多经验的人可以为我指明正确的方向。

我是否使用正确的目标来训练模型?处理我缺少的此类数据时是否有任何细节?是否有任何“技巧”可以防止您的模型始终预测与上次看到的值相似的值?(它们确实会产生低错误,但此时它们变得毫无意义)。

至少只是关于在哪里挖掘更多信息的提示将不胜感激。

更新

这是我的配置

{
    "data": {
        "sequence_length":30,
        "train_test_split": 0.85,
        "normalise": false,
        "num_steps": 5
    },
    "training": {
        "epochs":200,
        "batch_size": 64
    },
    "model": {
        "loss": "mse",
        "optimizer": "adam",
        "layers": [
            {
                "type": "lstm",
                "neurons": 51,
                "input_timesteps": 30,
                "input_dim": 101,
                "return_seq": true,
                "activation": "relu"
            },
            {
                "type": "dropout",
                "rate": 0.1
            },
            {
                "type": "lstm",
                "neurons": 51,
                "activation": "relu",
                "return_seq": false
            },
            {
                "type": "dropout",
                "rate": 0.1
            },
            {
                "type": "dense",
                "neurons": 101,
                "activation": "relu"
            },
            {
                "type": "dense",
                "neurons": 101,
                "activation": "linear"
            }
        ]
    }
}

注意最后一层有 101 个神经元。这不是错误。我们只想预测功能和价格。换句话说,我们要预测时间 t+1 的价格,并使用预测的特征来预测时间 t+2 的价格和新特征,...

2个回答

给定一个接受价格和第二个值的模型,例如价格的移动平均线,我推荐以下配置。这是基于对 45 个输入时间步的历史的训练和对未来 10 个步的预测。我假设您的“num_steps”是训练数据的一大步。请注意,我没有对此进行测试,您很可能需要调整一两个参数:

{
    "data": {
        "sequence_length": 55,
        "train_test_split": 0.85,
        "normalise": true,
        "num_steps": 5
    },
    "training": {
        "epochs":200,
        "batch_size": 64
    },
    "model": {
        "loss": "mse",
        "optimizer": "adam",
        "layers": [
            {
                "type": "lstm",
                "neurons": 100,
                "input_timesteps": 45,
                "input_dim": 2,
                "return_seq": true,
                "activation": "relu"
            },
            {
                "type": "dropout",
                "rate": 0.2
            },
            {
                "type": "lstm",
                "neurons": 100,
                "activation": "relu",
                "return_seq": false
            },
            {
                "type": "dropout",
                "rate": 0.2
            },
            {
                "type": "dense",
                "neurons": 1,
                "activation": "linear"
            }
        ]
    }
}

试试这个并按时期绘制模型的损失和准确性。有关这方面的一些信息和代码,请参阅在 Keras 中显示深度学习模型训练历史。如果您不使用 Keras,请告诉我,我会为您指出另一篇文章/代码解决方案。

请记住,任何机器学习模型只有在建模数据和建模数据之间存在“规则”或相关性时才能发挥作用。如果没有,即使是最好的算法也无法正确预测/分类。我并不是说一定是这样,但您可能已经非常接近使用这些数据所能达到的物理极限。

也许您应该考虑在模型中添加或提取新特征。