关于深度学习进行金融预测的报告

这是之前为了参加某次活动而写的一个研究小报告,算是对自己自学的一些总结。

前言

随着信息科技的进步,人类开始进入大数据时代。海量的数据,快速提高的计算能力,和对数据隐含的信息的需求,催生了一项面目一新的技术—深度学习。从89年Yenn Lecun将cnn用于手写数字识别,到吴恩达将深度学习用于猫的识别,再到谷歌的AlphaGo击败围棋世界冠军,深度学习以其强大的特征抽取和学习能力引发了巨大的浪潮,成为现在高新科技领域的一个研究重点,并且正在渗透进入多个行业。人们期望它能像击败围棋世界冠军一样,解决其所在行业的未解难题。

在投资领域中,股票等的价格预测一直是投资者极度关注的难题。因为涉及到国家政策、全球经济、个体交易者期望的外部因素,金融中的价格数据经常呈现出非线性,非平稳的特点,让人难以捉摸。根据有效市场理论(Efficient Market Hypothesis),股票价格呈随机游走状态。而在实际市场中,价格则往往存在某种变化的模式,同时,也受到外部消息的严重影响。对于价格波动中潜在的变化模式,由于深度学习所具有的强大的特征抽取能力,深度学习有能力在海量的数据中挖掘出变化的规律,从而给交易决策者提供宝贵的参考。

这份报告将使用深度学习的方法来进行价格预测的尝试。

方法

深度学习模型的选择

卷积神经网络在图像识别等多个领域取得了显著的成功。虽然卷积神经网络具有强大的特征识别能力,但是时间序列中的特征往往具有时间关系,传统的卷积神经网络的卷积和池化所带来的平移不变性,使得其难以模拟潜在的时间关系。虽然可以通过改变卷积方式的方法来对模型进行改进,但是文献调研表明,卷积神经网络在时间序列分析中并不常用。而在目前,LSTM是在应用中最为有效的序列模型。

相关技巧

数据预处理
  • 1、设置窗口

    使用者可以通过设定窗口长度,截取一定长度的价格序列来进行分析。

  • 2、数据标准化

    相比于直接使用原始的价格数据,对数据进行标准化处理会是更好的选择。常用的标准化方法有z-score标准化,min-max标准化等,也可以通过计算回报率来简单处理。

  • 超参数搜索

    超参数对深度学习的效果和表现有着重要的影响。相比于手动调整参数更依赖于经验与对模型的理解,让计算机自动进行超参数搜索会是一个更节省人力的方法。对于超参数较少的模型,使用者可以采用网格搜索的方法,在预先定义的有限组合中进行搜索。网格搜索的计算代价会随着超参数数量呈指数级增长。另一个更可行的方法是随机搜索。这两种方法在scikit-learn中都有对应模块。

  • 提前终止

    对于复杂的模型,随着训练时间的推移,模型将存在过拟合的风险。当训练时间足够长时,往往会出现验证集误差不降反升的情况。此时可以使用提前终止的策略,当验证集上的误差在事先指定的循环次数内没有进一步改善时,算法就会终止。提前终止将有效地防止过拟合,同时,它也有效地选择了训练的轮数。

  • Bagging

    Bagging(bootstrap aggregating)是通过结合几个模型降低泛化误差的技术。bagging通过对已有数据集进行重复采样,来构造新的数据集并进行训练,最后获得多个模型结果,并进行平均。可以证明bagging可以有效地减少泛化误差。在理想的情况下,通过训练出偏差小,而方差较大的多个模型,然后进行模型平均,使用者能得到更为理想的结果。

外部消息集成

虽然时间序列数据中蕴含着价格变动的模式,然而金融市场的价格变动经常受到外界消息的强烈影响,在很多时候,一个外界的消息可以迅速改变当前的价格变动模式。在进行投资决策时,必须要对价格变化的模式和外部的信息进行集成。事实上,交易员Q在进行决策时,就是一种各种信息的集成。以下是两种可用的信息:

  • 其它市场指标数据

    可以使用当前市场指标数据对价格进行回归分析,把结果集合到最终的决策中。

  • 媒体和社交网络信息

    媒体和社交网络上蕴含了大量的群体的观点和信息。通过对社交网络的文字进行处理,研究者可以获得当前大众群体对投资对象的观点和看法。从媒体中抽取出利好或利空的消息,也将对交易策略提供有效的信息。

初步完成的工作

因为时间、硬件、数据以及个人的知识的不足,此处仅仅完成了一个很不成熟的尝试,使用LSTM来对已有的金融价格数据进行预测。程序代码在code文件夹中。

  • 数据的预处理

    观察附件1.1可以发现,自2016-12-08之后,该金融标的价格就再也没有改变。考虑到所有缺少的数值都由最近的之前工作日的值来替代,因此有理由认为在这之后的值都已经缺失,因此需要对其进行删除。

    此处选择90天的窗口,对时间序列进行截断,使用前90天的价格序列来预测下一个价格。窗口长度是一个超参数,后续可以通过超参数搜索的方法调整。对一段子序列{a1,….an},此处只通过以下式子进行简单处理:

    最后从处理得到的序列中,抽取10%的子时间序列来作为测试序列

  • LSTM模型的构建和训练

    Keras基于Theano或TensorFlow,是一个常用的神经网络库。其优点是高度模块化,非常适合快速实验,进行简易快速的原型设计。此处使用keras快速的搭建了一个LSTM模型来进行实验,模型结构如下:
    lstm
    在训练的过程中,程序使用训练集数据中的5%的数据作为验证集,并且使用了提前终止的训练策略。同时,程序使用MSE(最小均方误差)作为代价函数,使用了RMSProp作为优化方法。在模型中,包括节点个数,优化方法等都可以作为超参数进行进一步优化,比如流行的优化方法就还有Adam,SGD等。

  • 结果

    在完成模型的训练后,使用测试集对模型进行检测,通过90天的时间序列来预测下一个价格。得到的图像如下所示:

prediction_point_by_point

但是因为结果仅仅反映当前价格相对90天前的价格的变化,而在实际使用中,更需要关注的前后两天的价格变化趋势。在对结果变换回实际结果后,模型对前后两天的价格变化趋势的预测的准确率约为65%。程序的一次运行结果保存在code文件夹的ipython.html中。

模型的预测结果并不是十分令人满意,模型本身也有许多需要改进之处,比如标准化方法的选取。同时,也没有进行超参数搜索和Bagging。个人认为,模型还有一定的提高空间,需要后续的工作和学习来进行完善和提高。

后续计划

  • 超参数搜索

    模型中具有较多的超参数,包括数据初始化的窗宽选取,标准化的方法,模型的节点,优化的方法,初始学习率乃至激活函数的类型等。使用随机搜素的方法可以选取出更为合适的超参数。

  • Bagging

    如前文所说,Bagging是一个减少泛化误差的强大的方法,任何机器学习算法都可以从Bagging中大幅获益(代价则是更多的运算和空间需求)。在机器学习竞赛中,获胜的算法往往都是多个模型的平均。模型集合使得使用者可以在单个模型总追求更小的偏差,而容许较大的方差。

  • 大数据平台下的深度学习

    无论是深度学习本身,还是超参数搜索和模型集合,所需要的计算能力都是巨大的。对于超参数搜索和模型集合来说,在大数据平台下并行求解是相对简单的。