一文了解卷积神经网络在股票中应用

译者 | 阿尔法计算生(个人微信:ixci001)

摘要

卷积神经网络使计算机视觉领域发生了革命性的变化。本文探讨了CNNs的一个典型应用:利用卷积网络来预测股票价格的变动,即利用卷积网络来预测过去价格波动的时间序列,其目的是利用它们来买卖股票,以赚取利润。

▌1. 介绍

在较高的层次上,我们将训练一个卷积神经网络,将给定资产过去价格的时间序列数据图像(在我们的案例中,是在纽约证交所交易的SPY合约)中。然后,我们将在接下来的几分钟内预测价格的走势。如果CNN正确地预测价格走势,我们可以在CNN说价格今后上涨的时候通过购买赚钱,然后在几分钟之内以更高的价格出售。

我们既使用传统的统计业绩衡量标准(即R2),也使用“paper trade”模拟器来评估经过培训的网络,使我们能够了解如果我们按照CNN的预测买卖合同会发生什么情况;特别是,我们可以看到,遵循经过训练的CNN的策略将多么有利。当然,这种方法取决于脆弱的能力,市场中的其他参与者不可能对CNN的买卖做出什么反应,但它至少让我们对CNN作为交易者的能力有了一定程度的信心。

▌2.问题陈述和技术方法

2.1 收集数据

训练CNN选择股票的过程的第一步是收集一些历史数据。在纽约证券交易所交易的标准普尔500指数ETF信托(符号:SPY)上提供了一个一分钟的股票数据。 具体来说,对于每个每个交易日的分钟,我们有数据1中列出的数据。

2.2 特征的初步选择

由于项目需要我们使用像素数据,所以我不得不将这个价格数据转换成图像。这本身就提出了一个有趣的挑战,但一个非常明显的起点是,将一段时期内合同价格的图表(特征)作为我们的输入(特征),然后用它来预测将来某个时间(比如,5分钟之前)的价格。那么,如果我们预测价格会上涨(下跌),我们将在现在买入(卖出)并在5分钟内卖出(买入)以获得利润。

首先,合约价格是什么意思?回想一下,Google Finance为我们提供了四种不同的交易日中每分钟的价格。目前,我只选择在一分钟内只使用high price和low price ,因为这两个价格隐含地约束了另外两个价格(open price和close price)。此外,high price 和low pirce 直观上包含比open price 和 close price 更多的信息,因为open price 和close price 在某种意义上是统计的工作:这些价格是市场在Google抽样时碰巧出现的价格(或任何收集数据的人)

其次,我们的时间序列图应该追溯到过去多远?这在原则上是另一个超参数,应该在卷积网络建立之后进行调整,但就目前而言,我已经用一个30–分钟的窗口进入了过去。总而言之,模型的输入是30分钟时间窗口的高价格和低价格的图形。这些图像使用numpy和matplotlib库绘制,并保存为RGB图像。 示例输入如下图2.2所示。

表1:提供的分钟数据

图1:卷积网络的示例图像输入。 高价格呈蓝色,低价格呈绿色。

特征(见第6节)。

2.3 选择应对措施

我之前提到,我们将使用过去价格数据(以图像形式)的30分钟窗口来预测未来某个时间点的资产价格。我们现在将探讨选择响应变量进行预测的复杂性。

首先,就像这些特性一样,我们可以选择未来多远的时间来预测价格的波动。实际上,我们希望这个时间长度(她之后称为预测水平线,或简称为水平线)是短的,因为随着时间的推移,我们所获得的任何预测信号越来越多地被市场上的随机噪声淹没。同时,我们不能把眼界看得太短,否则我们将无法根据我们的预测信号有效地执行(即买入或卖出);到了极点,用100%的准确度预测未来的价格是微不足道的(因为价格的变化不能快于光速),但这一预测对于赚钱的目的是完全无用的!

目前,我已经决定在构成模型输入的过去价格窗口结束之后使用5分钟的水平线(如上所述)。除了对水平的选择外,我们还必须准确地指出我们想要预测的数量。一个明显的选择是在水平线周期结束时尝试预测价格本身(即从时间(t-30)到时间t给出了过去30分钟的价格数据窗口,尝试预测时间(t + 5)价格),如果水平线是5分钟)。然而,预测价格的变化比预测时间t和时间t + 5更有用,因为这最终决定了现在买入(卖出)和5分钟内卖出(买入)是否有利可图,以便锁定利润。

此外,在t1 < t2的两个时间点,可以有多种方法来衡量价格差异。首先,我们必须决定我们要预测的价格(high、low、open或close)。在决定价格的一些措施后,分别在时间t1和t2获得价格测量值p1和p2,有两种广泛接受的计算金融价格变动(也称为回报)的方法:

和对数返回:

我选择定义资产的价格(为了定义一个响应变量)成为我们考虑的一分钟内高低价格的平均值。另外,我选择使用log返回而不是算术返回。

具体来说,回归问题是:从时间t-30到时间t作为输入给出高价格和低价格的图像,作为输出预测从时间t到时间t + 5的对数返回,即预测:

其中pi表示交易日的分钟i的高价格和低价格的均值。

2.4 损失函数的选择

训练卷积网络时,我将使用l2损失函数。以后,我们可以考虑不同的损失函数选择,但是l2损失在金融回归问题上是非常标准的。此外,Caffe很容易支持l2回归其EUCLIDEAN_LOSS层。

重要的是要注意,与输入窗口的长度不同,损失函数的选择不是一个要调优的超参数。这是因为不同的损失函数是完全不同的问题,而不仅仅是针对同一个问题的不同解决方案。不同的损失函数对应于“displeasure”或“dissatisfaction”的不同概念,我们预测我们正在尽量减少。当比较不同的损失函数时,认为一个参数设置比另一个参数更“好”是没有意义的。

话虽如此,在交易中,对一个战略或模型的最终考验是它赚了多少钱。在这个意义上,只有通过不同的损失函数来实现不同的优化问题,才可能有意义,然后看哪个优化问题产生最有利可图的策略。

▌3. 建立基线

最基本的金融模型是普通最小二乘回归(OLS)。为了建立性能基准,我将这个模型用于一组非常简单的功能。

具体来说,我拍摄了600×800的时间序列图像,并将其缩小为32×54的缩略图。另外,我将图像从四个通道(RGBA)转换为一个(灰度)。 缩略图然后对应于空间$R^{1728}$中的点。将每个灰度缩略图及其对应的log返回作为训练对(xi,yi),然后将线性模型拟合到4000点的训练数据集,并对996个点的数据集进行测试。

线性模型的样本内样本R2为0.428,对于这种嘈杂的数据来说相当令人印象深刻。然而,任何统计模型的最终测试是如何执行抽样。 测试集上的这种线性模型的样本外样本R2是一个令人尴尬的-12.2。 显然,没有人应该使用这种模式在市场上交易,除非他想失去很多钱!

最终的卷积网络应该可以轻松地击败这些结果。首先,使用的基线模型(OLS)非常简单。其次,特征(像素数据)具有很少的线性结构,可以被利用来预测log返回。具有许多非线性的运输网络可以纠正这种情况(不是双关语)。最后,这个OLS基线中使用的功能空间大大减少:我们将图像缩小到缩略图,并删除所有颜色信息。 考虑到完整的输入数据,CNN应该能够做得更好。

理想情况下,我们应该能够在一个超出样本的测试集中获得R2> 0。这意味着我们要比单纯的策略做得更好,即总是猜测未来5分钟的log返回将是测试集中的平均log返回(通常在0分钟左右)。如果我们能够定期做到这一点,那么如果我们有很好的执行能力(能够快速买卖的能力),那么我们有一个有利可图的交易策略。

▌4. 流程

在以下部分中,我将介绍如何系统地对网络体系结构,超级参数以及模型中的功能(图像)进行更改。具体来说,我的工作流程如下:

  • 使用matplotlib从数据生成特征。
  • 将图像功能和log返回响应转换为HDF5使用 hdf5_convert.py
  • 使用生成网络架构文件,一个脚本由Piazza的同学提供。
  • 通过修改solver.txt调整超参数。
  • 使用Caffe训练网络。
  • 使用visualize_weights.py可视化训练网络中的权重。
  • 通过使用caffe_compute_r2.py计算样本外的R2来评估网络。

▌5. 超参调优

为了实现更低的损失(从而获得更高的R2),我所做的第一件事是调整solver.prototxt文件中指定的优化超参数。这包括staring learning rate, learing rate update,parameters和优化方式(SGD,Adagrad,or NAG(Nesterov 加速梯度))。一开始10000次训练迭代,SGD,α一开始设置为0.01,并且γ = 0.1 every 5,000(即步长设置为5000)。此外,momentum term 设定为μ= 0.9。

图2:训练和验证结果:随机梯度下降算法(SGD), $\alpha _{init} = 0.2$,μ = 0.9, γ = 0.5, step size = 2000

图3:训练和验证结果:Nesterov 加速梯度(NAG)

这是一个学习速率太低,衰退率太低。因此,训练损失从初始值几乎没有变化,验证损失也保持不变。我决定通过增加初始学习率,增加γ的值和减小步长来提高优化超参数的移动性(因此α将更频繁地更新)。具体来说,我将初始学习率设置为0.2,γ到0.5,步长设置为2000.μ保持在原始值0.9。这导致了训练和验证损失情况如图2所示。

接下来,我决定试验Nesterov的加速梯度。为了做到这一点,我只需要将线求解器类型:NESTEROV添加到求解器文件中。这导致了图3中描绘的训练和验证损失。这并不显着改善动量SGD损失。

当我切换到使用不同的网络架构和不同的功能(见下文)时,我必须适当地更新solver.prototxt中的超参数。然而,相同的基本方法(提出一些超参数,运行网络,绘制训练和验证损失曲线)被证明是有用的,实际上,相同的超参数设置通常是接近最佳的,稍作修改。

▌6. 特征工程

从图2.2可以看出,典型的输入价格窗口图像是什么样的。在poster会议之后,一些评论者提出了更好的投入选择。特别是,我的图像输入没有使用红色通道来编码任何数据。红色通道可以更好地利用,例如,通过使用它来存储关于低价格和高价格的平均值的数据,或交易日每分钟的数量。其他人建议我在图像数据中使用不同的可视化文件:而不是在每个时间点绘制一个简短的窗口的绝对价格,我可以改为绘制一个频谱图并且可视化频域中的价格数据。

最终,我尝试了两种以上的投入。第一种与原始图像数据相似,因为它使用了价格序列的时间–域表示,只不过我还使用了volume数据,它是用红色标绘在不同的轴上的。如图4所示。

图4:示例图像输入。像以前一样,high price为蓝色,low price 为绿色。 volume(右轴)为红色。

我尝试的另一种代表是所谓的相关特征。回想一下,标准普尔500指数是500种不同股票(权益)的权重篮子。也就是说,拥有一个单位(份额)的SPY相当于拥有500家成分企业中的每一个股份。表2列出了标准普尔500指数中最大份额的10家公司。

Table 2:Top 10 components of the S&P 500. Data from [2]

总体而言,前十大股票包含了标普500指数的17.53%。我使用这10个组成部分以下列方式计算神经网络的输入:在每个30分钟的窗口内,我收集了标普500指数和十大成分中的每一个的平均价格(low price和high price的平均值)时间序列。然后,我计算了SPY的价格系列与每个成分的价格系列之间的关系系数。这导致-1和1之间的十个不同的值。然后我将这10个值绘制在热图中,颜色范围从红色(高相关)到蓝色(低相关)。示例功能图像如下所示图5。希望在标普500指数走高的同时,其与成分股的关系呈现出不同的下跌趋势的模式。

图5:示例图像输入。 有十个色样; 每个表示SPY与前十名中不同库存的相关性。

▌7. 网络工程

我尝试重复的第一个网络结构convolution-ReLU-pool层(5 blocks),再加入一个fully-connected 层,这个被称为原始架构。不幸的是,这导致性能相当差:样本R2 为 −0.06 ,略差于“总是猜测log返回将是平均值log返回(大约0)”的策略,这将达到(R2)的0。

在Yuke的建议之后,我将初始网络结构中最后一个卷积层的权重可视化,看看是什么问题。问题是池已经太多了,所以到最后一层的输入是非常模糊的,网络的最终层(特别是仿射层)在这些模糊的时候无法区分不同的图像。

为了解决这个问题,我尝试了一个新的网络结构,它不使用池,直到几个convolution循环 - ReLU。具体来说,我使用了三个blocks of conv–ReLU,然后是two blocks of conv–ReLU–pool,之后是一个单一的仿射层。让我们称之为减少的架构,因为它比原始架构的层数更少。这导致性能有所改善; 结果示于表3中。如图6和图7所示,这个新网络结构的权重在上面的价格窗口和volume数据特征上(如图4所示)被显示在下面。显然,一些结构的价格和volume图由最后一层的权重捕获,即图像在通过网络时不会变得模糊得太严重。

另外,我可以看到针对热图功能训练的相同(简化)架构网络的最终卷积层权重。 此数据显示在图8中。颜色垂直条纹的影响是清晰可见的。

表3:不同特征,体系结构的样本外样本R2

图6:经过训练后,降低架构网络的第一层price和volume特征的权重。

图7:针对price和volume特征的训练后的缩减架构网络的最后卷积层的权重。

图8:减少架构网络的最后卷积层的权重在训练后的热图特征上。

▌8. 结果

对于这两种架构中的每一种架构(原来的架构导致了最终的图层模糊;以及精简的架构)和两种新特性中的每一种,我们训练了网络,调整了超参数,直到在至多10000次迭代中收敛,并在测试集中计算了–样本R2的–出局数据。这个过程的结果如表3所示。

总体而言,结果是压倒性的。我们无法实现大于0的样本外R2; 也就是说,你会更好地猜测下一次的价格走势将是平均价格走势(通常为0),而不是跟随我们的模型。尽管如此,这是一个很好的学习经验。

▌9.下一步工作

还有待观察,l2回归是否是作为机器学习问题的这个金融问题的最佳方法。我怀疑在实践中使用classification–based ap- proach可能会更好,特别是在高频环境下,因为在现实中,价格变动是离散的(价格的波动幅度不小于一美分)。

未来的工作还将集中在这个问题的执行方面,一旦R2是正的;也就是说,一旦我们有一个better– than–chance 预测优势更好的情况下,那么,这种统计预测能力能否通过最佳地执行策略(策略规定的买入和卖出)转化为实际现金,仍然有待观察。

最后,还有待观察图像特征是否最好。最后,图像特征是否最好还有待观察。自然,我们可以将历史price、volume、相关性或任何其他数据直接输入一个神经网络,而不是将其编码为图像,这将使数据更直接地进入网络,而不是通过当前实现所采用的迂回路线。

作者 | 阿尔法计算生(个人微信:ixci001),人工智能在投资领域应用和研究的的一个特殊程序员。长期从事股票和期货算法交易研究。

原文地址:https://www.jianshu.com/p/13d84cc2bfdf

原文发布于微信公众号 - AI科技大本营(rgznai100)

原文发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI2ML人工智能to机器学习

图文并茂,卡曼滤波

我务必向大家介绍卡尔曼滤波器(Kalman Filter),因为它之所能, 忒惊人!

8220
来自专栏量子位

举个卡戴珊的例子,讲讲Hinton的Capsule是怎么回事 | 教程+代码

Nick Bourdakos 文 李林 若朴 编译自 HackerNoon 量子位 出品 | 公众号 QbitAI ? Capsule Networks,或者说...

29950
来自专栏AI研习社

谷歌大脑发布神经网络的「核磁共振」,并公开相关代码

神经网络的可解释性一直是所有研究人员心头的一团乌云。传统的尝试进行可解释性研究的方法是通过查看网络中哪个神经元被激发来来理解,但是即使我们知道「第 538 号神...

379140
来自专栏ATYUN订阅号

【深度学习】自动驾驶汽车:实现实时交通信号灯检测和分类

今天,基本的交通灯信号灯检测问题已经得到解决。深度学习和计算机视觉的创新以强健的算法的形式存在。它们在没有开发代码的情况下工作,手动确定颜色或交通信号灯的位置。...

57860
来自专栏新智元

【超越CycleGAN】这个人体动态迁移技术让白痴变舞王(视频)

CycleGAN利用pixel2pixel技术,能自动将某一类图片转换成另外一类图片,过度真实自然,可以说是2017年最受关注的模型之一。CycleGAN论文的...

70340
来自专栏目标检测和深度学习

最实用的 50 篇文章,教你搭建机器学习 APP

本文为雷锋字幕组编译的推荐系列,原标题 Learn to Build a Machine Learning Application from Top Artic...

39070
来自专栏CreateAMind

最强UNREAL(UNsupervised REinforcement and Auxiliary Learning)简介及代码

UNREAL(UNsupervised REinforcement and Auxiliary Learning)算法

9310
来自专栏新智元

【LeCun台大演讲】AI最大缺陷是缺乏常识,无监督学习突破困境

【新智元导读】近日,在台湾大学,卷积神经网络之父、FacebookAI 研究院院长 Yann LeCun 以「Deep Learning and the Pat...

35440
来自专栏AI科技评论

谷歌大脑发布神经网络的「核磁共振」,并公开相关代码

作者:杨晓凡、camel、思颖、杨文 AI 科技评论按:神经网络的可解释性一直是所有研究人员心头的一团乌云。传统的尝试进行可解释性研究的方法是通过查看网络中哪个...

30380
来自专栏PPV课数据科学社区

深度学习带你抠像表演

前情 回顾这些年机器学习的进展,我也一直想弄点真正的机器学习产品。 几个月前,我参加了超棒的Fast.ai深度学习课程之后,我好像就开窍了,我也有了机会:得益于...

33460

扫码关注云+社区

领取腾讯云代金券