一次面向股价预测的深度学习方法尝试

本文所有内容不构成投资建议

我不是干这个的,既不研究量化,也不研究这种类型的序列预测模型。所以我只是本着玩玩的心态训了个模型,甚至可以说我就没指望能得到积极结果,这篇文章也仅仅是记录一下我瞎折腾的经过。我在其中获得的乐趣大于它的世俗意义。

异想天开

我大致有这样一些幼稚的假设:

  1. 虽然单支股票有在技术、价值上分析的意义,但我所掌握的信息不足以做出这种级别的分析。不过无论哪里,只要人一多了,群体上的行为总体就是混沌的。
  2. 基于这种假设,市场中可能存在较为一般的短期趋势。如果真的有这种趋势,那导致这种短期趋势的原因也将是表面且直接的。

因此我试图在普通的股价、交易量信息上验证是否存在这种短期趋势。

随便做做

有大概想法后,我就直接做了模型。

  1. 因为要找 general 的规律,所以对所有数据均进行了一些处理:选中第 0 天的数据作为基准,除所有其他价格,将历史价格转换为相对于第 0 天的变动率。
  2. 这是一个典型的 seq2seq 任务,所以主要结构随便用一个 Transformer。因为日均数据最好获得,所以输入为某支股票最近 N 天的数据。
  3. 由于 Transformer 对输入、输出维度都有一定要求,我们在输入接一个全连接层把每个数据都包含的多维信息(最高、最低、开盘、收盘等)嵌入到合适的维度。因为有相对顺序所以对嵌入后的维度叠加了自学习的位置编码。
  4. 输出同样接了一层全连接,将输出特征同样映射为我们需要预测的数据(最高、最低股价等)。

……说实话这根本就不算设计,只是按经验选了表现不会差的惯用结构。不过对于我们来讲只要有结果就可以,不用考虑这些。

在训练上,输入从第 N-N 天到第 +M+M 天的数据,并设置 mask 遮住预测第 ii 输出时第 ii 个输入,然后期望输出当天的实际数据相同。loss 使用 l1 或者 l2 问题都不大。

看看结果

股市数据有很多开源 API 可以获得,弱可信、低即时的数据来源甚至免费,不在此多费口舌。

我们的目的不要求这么高的即时性,多少有点数据就够了。首先以天为单位收集了近 600 天的数据,随机 8:2 划分为两部分,每部分都使用滑动窗口生成前 NN 天预测后 MM 天的数据对,分别保存为训练集和测试集。

经过一些简单的调参和训练,结果显示对于所有预测为上涨趋势的结果,模型在测试集上的预测与实际变动率的平均差值约为 4%4\%。对于短线交易来讲这个误差大概已经出局了,也许假设中的趋势不存在,或者并没有如此明显。分时的模型也许还有进一步实验的意义。

后来我留意到应该去统计 TOP-K 的平均差值,毕竟这种统计更符合实际中本金有限的情况,不过我估计结果会更差。如果有空我会再补充一下这个实验。

玩交易玩的

又回来补上了这个实验:基于该模型,测试集随机抽样然后交易前 TOP-5 的最坏情况平均收益:0.98%-0.98\%。虽然可能平均情况会是个略微正一点的数,但是那已经和模型的设计初衷相差略远了。想要提升效果,要从两个方面入手:

  1. 提升模型预测精度。一个问题是假设中的「趋势」是否存在,如果不存在那一切都免谈了。如果「趋势」存在,那么最好尽量提升一下预测效果。即使平均差值降低了,也并不能完全反映模型的预测效果,需要进一步检查差值究竟发生在什么区间内。
  2. 基于一个较为可信的模型,还需要设计交易策略。这我就不太懂了。

后续对模型和超参进行了一番修改和试验,模型在测试集上的预测与实际变动率的平均差值变为了 2.3%2.3\%。有所下降但对于短线交易还是很抽象。有空的话下一步想查下误差在哪。


一次面向股价预测的深度学习方法尝试
https://blog.chenc.me/2023/05/18/ai-enhanced-stock-trading/
作者
CC
发布于
2023年5月18日
许可协议