利用卷积网络来预测股票价格的变动

本文探讨了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 预测优势更好的情况下,那么,这种统计预测能力能否通过最佳地执行策略(策略规定的买入和卖出)转化为实际现金,仍然有待观察。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


展开阅读全文

没有更多推荐了,返回首页