Py学习  »  机器学习算法

深度学习是如何利用数据特征进行投资预测的?

唤之 • 5 年前 • 602 次点击  
在上一篇《相比传统量化投资方法,深度学习的出现会引领新一轮的技术革命吗?》中,我们讲到,运用深度学习技术,可以通过公司的一些基本面特征判断未来股票的收益率,深度学习模型提供了一种解开重要关联关系的手段。今天我们将具体来说说深度学习,是如何解决这个问题的。

【选择深度学习预测未来的目标】

首先,我们必须为机器学习系统设定一个可以鉴别的目标。当一个投资者作出是否投资一个股票的时候,投资者首先关心的是这个公司的未来。投资者所买的是的公司未来表现,但是,未来是未知的,因此我们所要解决的问题是能否用现有的数据来预测未来。当然,我们要回答一个很关键的问题,就是我们手中掌握的数据和我们对现有的对数据处理的方法,对未来是否有预测的能力。如果所获得的数据与公司的未来没有本质的关联关系,即便最好的数据处理方法也无法找到本来就不存在的关联关系。

将新的技术工具应用于投资时,首先人们想到的是应用于短期交易,比如,有关于一个公司的新闻出来以后,机器学习系统能够在几毫秒之内对新闻是利好还是利空做出解读,并在一秒钟之内完成交易;这与人工操作相比,人工阅读文章最快也需要几分钟的时间,手工交易还要另加几分钟的时间,显然,在高频交易的时间段,人工已经退出了与机器竞争的舞台,机器有绝对优势。另一方面,有良好的统计数据证明,从长远来看,公司股值的长期走势与其不断发展的基本面有重要关联关系。可以说,公司基本面的强弱是决定公司股值长期走势的首要因素。诺贝尔奖获得者罗伯特席勒以及股神巴菲特都认为股票市场价格在短期内波动极大,可预测性低,而股值的长期走势与其基本面息息相关,可预测性较高。

其次,我们必须选择一个预测目标。在这个实际案例中,我们使用了深度神经网络来预测股票在未来的一年时间内价格表现是高于还是低于市场中值的表现。预测股票未来一年的表现,对众多投资者来说是属于长期投资的目标,同时,在这个时间范围我们还持有足够数量的可以学习的数据。

1962年,一些数据库开始有高质量的公司基本面数据,到目前大约有55年的数据。如果我们试图预测五年时间内的股票表现,那么我们的学习过程将只有11个独立的时间段,这个数据量很可能不足以训练机器学习系统;如果我们的时间段是一个月,我们将有660个独立的时间段。虽然更多的时间段有助于机器学习,但在一个月的时间范围内,外生因素更可能主导股价变动,而基本面数据很可能并不是主要因素,因此,我们认为在一个月这个时间段股票基本面对股价并不一定有预测的能力。所以我们选择预测未来一年股价的表现; 一年这个时间段是更长时间段(5年)和更短时间段(1个月)的适当折中选择。

【选择深度学习工具包】

机器学习技术通常可以用 Python,R,C ++ 等编程语言实现。当然,大型的公司可能倾向于内部开发,但对大多数用户来说,只要加入一个开发者社区,就可以免费使用第三方开发的软件包。近年来,机器学习软件包的数量大幅增加,用户只需要选择适当的开源软件包,就可以快速进入项目的开发。

上图列举了目前最通用的开源机器学习软件包。机器学习有数百个常用的算法,根据这些算法的工作方式,这些算法可以分为不同的类型。例如,回归算法(Regression)用于模拟变量之间的关系; 决策树算法(Decision Tree)构建决策模型并用于解决分类或回归等问题。因为我们的输入数据是一个时间序列,最常用的 R 软件包是一个可以从网上下载的 “rnn” 插件。在这个实际案例中,我们选择的预测模型是 RNN 递归神经网络(Recurrent Neural Network)。

【深度学习解决方案的初始设置】

在这个设置中,我们以时间间隔为一个月的间隔向我们的模型提供数据。这意味着,模型在每个时间步(月)都将现有的数据与未来股票价格12个时间步(一年)相对应,从而预测一年期股价会发生什么样的目的。我们用下图来展示这个设置的流程,公司的基本面数据做为输入,经过 RNN 网络,产出对股票未来12月表现的预测,并将预测结果与股票12月后的实际表现相对比。

首先,我们需要构建一个输入序列,这个序列代表公司基本面随着时间的发展而演变的过程,序列中的每个元素代表一个公司/月份数据的组合(我们称之为 “公司月” 数据元)。 此外,每个公司月数据元还对应于一个目标输出结果,这个目标结果就是公司股票价格在随后一年时间点的表现。在这个案例中,在每个时间点,我们计算所有股票的一年收益,然后计算收益的中位数,如果某只股票价格的年收益大于所有股票的年收益的中位数,那么我们将其目标输出结果赋值为+1。 反之,如果某只股票价格的年收益小于所有股票的年收益的中位数,那么我们将其目标输出结果赋值为-1。这样,我们可以看到如下图所示的输入/输出对应数据列。

在上数据表中,每一行表示公司演变历史序列中的一个时间点,输入数据和目标输出数据相对应,以便于对模型进行训练。通过机器学习,将一份很难读懂的公司财务报表,翻译成股票在未来一年中收益率在 +1 类别中的概率(优于表现中值的股票)。这种简单易懂的解读,虽然对机器学习来说是个小目标,但对投资者的投资决定却是一个很大的帮助。另外,投资者还可以用这种解读为起点,继续建立其他更精细的投资组合。

 在上图中,时间点 “t“ 的基本面数据是输入,模型的实际输出是在 ”t + 12“ 时间点结果属于 +1 类别的概率,这个几率会跟已知的训练目标相对比,在这里,“+1” 意味着该公司在 ”t“ 到 ”t + 12“ 期间表现优于所有股票的中值表现,“-1” 意味着该公司在 ”t“ 到 ”t + 12“ 期间表现低于所有股票的中值表现。

【深度学习系统标的筛选】

由于数据库包含着许多股票标的,我们必须缩小数据范围,选择出我们投资有兴趣的、适当的公司: 1)公司的股票市值不小于1亿美元;2)公司总部在美国的公司;3)公司的股票必须在纽交所,纳斯达克或美国证券交易所挂牌上市;4)金融业公司除外。这种对标的的筛选会使我们得到的结果在实践更具有实际意义。
 
我们排除金融类公司的原因是因为这种做法在经济学和量化金融学研究中是常见的做法。金融类公司的资产负债表中运用特别高的杠杆率,这是金融类公司的一般运作方式,其意义与实体公司的杠杆运用有本质的区别。金融类公司在美国又称为虚拟公司,对这种公司的财务报表的解读需要一个独立的RNN。所以,我们把金融公司与实体公司分开了处理,在本案例中,我们所训练的RNN只适用于实体公司。

按照上述筛选规则所选出来的数据,每个月,我们会有1300到5000家公司有适当的数据。

【数据的预处理和正规化】

显然,如果我们把公司财务报表中的数据直接输入深度学习的神经网络,RNN网络并不一定能够轻松消化这些数据;俗话说,输入的是垃圾,输出的也将是垃圾。所以,我们必须对输入数据进行预处理和正规化(normalization),以使机器学习能轻松消化输入的数据,并防止模型在训练期间记住某公司的整体概况。标普 Compustat 数据库包括以下数据单元。

对RNN网络训练的经验表明,由于技术的原因,如果输入神经元的激发数据有比较好的分布,并且局限在规范的数据范围,那么,神经网络的学习效果会更好。我们必须对公司基本面数据做正规化,这样,公司的具体身份会被删除,而公司基本面数值的相对比例会得到保留。同时,神经网络仍然能够根据需要在内部组合任意的比率,包括数据之间的非线性的关系。

我们通过一系列的预处理步骤,将源数据字段转换成具有金融属性和直觉意义的神经元输入变量。我们共用以下五类输入特征:1)股价的动量特征,2)股票的价值特征,3)正规化的公司基本面特征,4)基本面特征年同比变化,5)以及缺失值指标特征。

▲股价的动量特征的正规化
由于我们试图预测股票的未来相对表现,可以想象,股票过去不同时间段的相对表现会对未来有一定的影响力。为此,在某一个时间点,我们计算股票过去1个月,3个月,6个月和9个月的收益率。我们并不直接向 RNN 输入历史收益率参数,而是将这些参数正规化。
▲股票的价值特征的正规化
因为我们试图预测股票的未来相对表现,可以想象,股票目前的相对价值会对未来有一定的影响力。为此,我们建立两个价值输入神经元,分别代表两种很常见的价值指标, 一个是账面价值与市值的比率,另一个是收入与市值的比率 (市盈率的倒数)。

具体计算如下:     
1)账面价值与市值的比率 = 账面股本的价值 / 市值
2)收益率 = 营业收入 / 企业价值。

当然,我们对 RNN 的输入也不是直接输入上述计算数值,我们对 RNN 的输入仍然是经过正规化以后的数值,正规化的方法依然是在同组数据中排序,并将数据正规化从0到100, 100为最高比率。

▲公司的基本面特征年同比增长率
对基本面数据的本身,我们不能直接将数据输入RNN网络。我们必须对基本面数据做正规化的处理。对基本面数据的正规化方式是先计算同一组数据的标准差,然后将该组的数据除以相应的标准差。除了上述基本面特征的输入之外,我们还为 RNN 输入这些基本面的变化特征,对于许多财物报表中非负值的变量,我们用一下公式计算变化:log [v(t)/ v(t-1)]。对变量使用 “对数” 是金融工程中最常见的处理方法,这样,即便初始变量有非常大的变化,将变量取对数以后,其相应的变化还会保持温和。温和的输入不会对 RNN 网络造成异常影响。“t-1” 代表一年前的变量值,用对数方法计算收益率或者成长率,远比用百分比计算的结果好的多。用对数计算的变化率本身具有良好的分布,不需要进一步做正规化处理。

▲数据缺失值指标特征
在机器学习实践中,一个必需解决的重要问题是某些数据值的缺失。数据中的缺失值的原因有很多:比如,数据元在报告中的遗漏,报告方式的更改,数据收集有误,或者在计算比率时除零等。

在 RNN 运用实践中,有一种处理方法被证明非常成功。这个方法就是对每一个输入神经元,附加一个对应的指标神经元:如果神经元在某个时间点的数值缺失,那么其指标神经元就置1, 否则指标神经元就等于0。
对于每个公司月份的组合,我们从 Compustat 数据库中提取大约20个基本面原始数据,由此推导出:1)四个动量特征数据; 2)两个相对价值特征数据; 3)20个源数据的正规化数据;4)20个源数据的年同比变化数据; 5)对每一个输入数据,附加一个二进制指示符数据,以指示输入数据的值是否在某公司月数据集中缺失。按这个方法,RNN网络共有90几个输入神经元。

深度学习和递归神经网络在许多领域已经取得了超越人类的表现,在金融领域,深度学习对金融时间序列的处理方案近年来取得了许多成功,RNN为金融分析工具箱增添了一个崭新的能力。同时为我们提供了一种有别于经典“因子工程”中手动寻找有效因子的方法,使得计算机算法可以根据公司原始财务报表数据自动发现有预测能力的新特征。更重要的是它在文本处理领域(NLP)有突破性的进展,使得人们可以从容应对已经来临了的数据和信息的大爆炸。我们相信,深度学习为我们带来的金融领域革命性机会就在眼前。 恒生技术原创文章,未经授权禁止转载。详情见(点击)转载须知



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/ldW9IkMrgM
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/10622
 
602 次点击