前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QuantML | 使用财务情绪与量价数据预测稳健的投资组合(附代码)

QuantML | 使用财务情绪与量价数据预测稳健的投资组合(附代码)

作者头像
量化投资与机器学习微信公众号
发布2019-06-20 20:53:47
2K0
发布2019-06-20 20:53:47
举报

动机和背景

投资组合管理是最大化投资组合回报的过程。投资组合经理根据他们对风险的偏好,代表客户做出交易决策。他们在决定他们应该在投资组合中持有哪些股票以平衡风险和获取最大回报之前,分析不同的资产的优势和劣势。这使得投资组合管理变得困难。我们的目标是通过使用预测建模和深度学习技术使这个过程更好,根据下个季度的预测股价生成稳定的投资组合。

在过去,人们做了很多预测公司股票价格的尝试,并且尝试去理解新闻文章,Twitter帖子和其他平台的文字内容如何影响股票价格。这些尝试涉及分析上述资源的情绪影响并预测股价。尚未探讨过的是财务报告的情绪影响在预测股价上的效果。哈佛商学院发表了一份工作论文,名为“Lazy Prices”。论文指出财务报告对公司的市值有影响。他们表示,报表的相似性(Jaccard和Cosine Score)急剧变化可以增加或减少公司的市值[1]。

译者注:该论文认为年报或季报中常规内容的变动包含有用的预测信息,做空报表变动大的公司,做多报表无变动的公司,可以获得超额收益。

问题陈述

该项目要求我们首先探索金融领域,并收集有关股票价格变动,交易方法和投资组合管理技术的信息。我们了解到目前为止数据科学在金融方面的影响力如何,并提出了我们想要关注的三个主要问题:

1、企业提交的季度和年度财务报告在多大程度上影响其股价?

2、包含历史财务报告的情绪因素,股票价格的预测会发生什么改变?

3、我们如何使用下一季度的预测值建立稳定的投资组合?

这些问题具有挑战性,因为我们不得不对该领域进行大量的背景研究。使用正确的特征和进行适当的特征工程来提出最佳预测方法具有非常陡峭的学习曲线。除此之外,这些文件的数据来源和格式不一致,因此解析数据也是一项巨大的挑战。这里涉及两种不同的数据源:一种是来自财务报告的数据,另一种是股票行情数据。为了准备分析数据集并训练我们的预测模型,我们必须研究各种方法来整合这两种数据源。这些数据集彼此之间不是直接对齐的,因为OHLC(开高低收)数据每天发布,而SEC报告每季度发布一次。要将这两种数据合并在一起,我们必须仔细匹配日期,然后深思熟虑地进行特征工程来构造下个季度的预测值。

数据工作

数据采集

来自EDGAR的SEC 10-Q和10-K文件。

我们数据处理流程的第一步是解析SEC Edgar(电子数据收集,分析和检索)数据库。这是一个由美国证券交易委员会(“SEC”)维护的在线数据库,用于跟踪上市公司提交的所有SEC文件,现在包含超过1200万份此类文件。

由于EDGAR在撰写本文时不支持除公司代码和中央索引键(CIK)之外的任何过滤选项,因此我们不得不提取标普500 [2]公司所有10-K和10-Q文件,而不是只提取我们感兴趣的某段时间内的文件。

我们从数据库中为S&P 500所有股票收集了大约60 GB的数据。由于EDGAR将每个用户的请求数限制为每秒10次,因此我们必须添加一些额外的模块以适应此限制。此外,考虑到数据集的庞大规模,我们在下载时对每个下载的股票进行维护和检查,以便在发生故障时允许在稍后恢复并避免任何数据丢失。

来自QuandlAPI的OHLC数据

OHLC(open-high-low-close)是包含每个工作日股票开盘价,最高价,最低价和收盘价的数据集。该数据集在我们流程的后期是用于训练模型的最重要信息之一。我们利用Stocker [3](Quandl API的Python接口)来检索每个标普500指数公司的OHLC数据。

数据准备

来自EDGAR的SEC 10-Q和10-K报表文件

我们发现收集的10-K和10-Q SEC文件是高度非结构化的,因为它包含HTML标签,符号和数字表。我们通过删除不相关的数据来清理这些文件,然后将HTML解析为干净的文本数据,然后用于分析情绪。为了清理和解析,我们使用了正则表达式,NumPy和BeautifulSoup。

作为数据准备的一部分,我们还为每个CIK生成了10-K和10-Q文件的CikList列表映射文件,其中包含日期,SEC类型,文件名,CIK和股票代码。日期字段是SEC表格的提交日期; SEC类型为10-Q或10-K,文件名为SEC文件名。

每个CikList映射文件大约有12行用于10-K和34行用于10-Q SEC,时间窗口是10年。我们使用这些映射文件来跟踪每个CIK的SEC报表。这些保存的映射稍后用于计算与每个CIK相对应的所有SEC报表的情绪。

来自QuandlAPI的OHLC数据

通过Python Stocker模块,可以轻松获取每个股票的Pandas dataframe格式的OHLC数据。但是,由于我们用过去90天窗口(原因将在下文介绍)对下一季度进行预测,因此我们必须先进行一些数据处理才能将其提供给我们的深度学习模型。

我们使用了90天的窗口(一个季度是90天)将每行构造为包含该期间所有OHLC数据的X和Adj.Close作为Y.我们构造该数据的可视化方法如图1所示:

图1:在OHLC数据上创建的90天窗口

数据集成

将情绪分数与OHLC数据相结合

将Quandl API获得的OHLC数据与基于日期的SEC文件的情绪相结合是很复杂的,因为SEC文件日期和OHLC季度日期不同。

对于OHLC数据,季度股票收益率分别为第3,第6,第9和第12个月,而对于SEC,季度数据为第2,第5,第7和第10个月。

因此,为了解决这个问题,我们使用了Pandas的“forward”合并方法,该方法将该季度SEC文件的情绪分数与下一个最近的日期的股票价格数据相匹配。这种映射背后的目的是分析在财务报告发布后如何影响收盘价的。我们在图2中显示了合并后数据的前10行。

图2:OHLC数据与GWW的SEC情绪分数合并

标准化标普500股票的OHLC数据

我们只获取标普500指数公司10年的股票数据。将这些数据限制在最近的时间窗口的原因在于,人们普遍认为财务数据是“非平稳的”并且制度的变化可能使旧数据与预测的相关性降低[4,5]。因此,我们将此期限定义为2008年1月1日至2018年12月31日。

在检索到这些数据并限制时间为最近10年之后,我们发现有些公司在2008年1月1日之后上市并且必须将其过滤以保持一致性。此过滤将数据集减少到大约300个股票。此外,在某些情况下,某些股票代码中缺少少量OHLC数据行。进一步分析并未发现这些公司历史上的任何特定事件,因此可能是Quandl API中的一些错误。为了解决这种不一致,我们使用Pandas的“插值”方法来构造那些缺失的行。

我们还使用fastai库将日期转换为“周内第几天”,“年中第几月”和“周”等,以便模型可以了解股票价格是否存在任何时间关系。

研究方法

使用NLTKVADER进行情感分析

我们使用了NLTK VADER(Valence Aware Dictionary和sEntiment Reasoner)情绪分析器,这是一个基于词典和规则的情感分析工具。在这种方法中,词典中的每个单词都被评定为是正面,负面还是中性,并且根据情绪的正面,负面或中性来计算得分。

Vader词典没有金融词典,所以我们用Loughran-McDonald Financial Sentiment Word Lists的金融词典更新了它[6,7]。

由于SEC文件的MD&A部分关注从管理层的角度对财务指标的历史描述,如果处理得当,本部分可以帮助投资者更好地预测公司未来的回报。最初,我们决定专注于MD&A部分,并尝试使用正则表达式从该部分获取内容,但由于SEC文件的结构混乱,我们未能实现它。

相反,我们获得了每份SEC文件的整个部分的正面,负面和中性情绪分数(大约4600个SEC文件)。VADER对于大文本来说非常慢,因此我们将内容分成2000个单词一组的不同批次,这使得情绪计算时间减少。对于这些批次中的每一个文件,我们计算了正面,负面和中性情绪分数并取平均值,得到每个SEC文件的最终情绪分数。

股票价格预测

如前面所述,考虑到我们在前面部分中描述的限制,我们有大约300个股票可供使用。我们通过特征工程,开始使用所有300个股票数据训练一个模型,如下:

使用90天窗口构建每个股票的pandas dataframe,如图1所示。

设置缩放器,将每个股票价格分别缩放到0到1之间。每个股票一个单独的缩放器是必不可少的,因为每个股票可以具有不同的最小和最大价格。

然后使用这些缩放器来转换每个股票的训练,验证和测试数据集。

在所有这些转换完成之后,我们使用Keras TimeseriesGenerator为所有股票级联OHLC数据,如图3所示。

图3:每个股票的级联OHLC数据

每个图层表示使用图1中所示的方法窗口化的一个股票代码的数据集。

由于硬件资源的限制,我们未能使用所有300只股票数据训练模型,并且最终不得不将其限制为前50种股票。

LSTM模型已被很好地研究并证明在时间序列数据上非常有效。我们使用Keras编译了神经网络模型,其中包含两个LSTM层,两个dropout层和一个用于输出的密集层。

在用所有50只股票(如图3所示构建)的数据训练1个模型后,我们获得了非常差的结果。为了进一步研究,我们还为50只股票的每一只都训练了单独的模型而没有级联方法。使用后者获得的结果证明更准确,趋势线反映了这些股票的真实趋势。这50个模型中的每一个都被训练了20步并且没有情绪分数。使用该方法获得的结果将在第5节中讨论。

加入情绪训练

情感分数只能每个季度计算,公司每个财政年度有三个10-Q和一个10-K文件。因此,需要将它们映射到每只股票的每日OHLC数据。我们通过将90天OHLC数据视为一个季度并且每一行复制前一季度的情绪分数。对于50个股票中的每一只,对具有与上述完全相同的架构的单独模型进行了20步的训练。第一次训练是以积极的情绪分数完成的,第二次训练是以负面的。结果将在后面的部分中讨论。

预测稳定的投资组合

我们决定创建稳定的投资组合,因为我们希望持有预测的下一季度组合。我们为了创建稳定的投资组合而采取的策略是将不相关的股票保持在同一投资组合中。我们这样做是为了避免投资组合产生巨大损失,因为如果一只股票下跌,其他股票可能平衡损失。例如:如果投资组合有2只股票[AAPL,FB],如果它们相关,如果AAPL下跌,这意味着FB也会下跌,我们会在投资组合中获得整体损失。但如果股票不相关,AAPL和FB将不会一起跌,从而防止重大损失。这创造了稳定的风险平衡的组合,可以为该季度带来持续的收益。

我们首先评估每对股票组合的相关性和协方差,并保持同一组中的每对组合之间具有弱相关性。我们考虑哪些相关系数小于0.5,并且协方差小于平均协方差的组合。然后,对于每个集合,我们基于低相关/协方差值检查可以添加哪个其他股票。

夏普比率的计算方法是,从投资组合的收益中减去无风险利率,并将该结果除以投资组合超额收益的标准差。

夏普比率较高意味着更好的风险调整回报。夏普比率大于1被认为是好的,大于2被认为是非常好的,大于3被认为是优秀的。我们设置无风险利率为2%,即美国市场的当前无风险利率。我们计算了随机选择的200个权重中每个投资组合的最佳夏普比率。根据获得的夏普比率,我们将我们的投资组合划分为好,更好,最好。

评估

评估SEC情绪对股票价格的影响

我们将季度OHLC数据与季度情绪分数进行映射,以分析正面和负面情绪如何影响收盘价。

从图4中可以看出,当积极情绪增加时,GWW下一季度的收盘价一直处于上涨趋势并且走高。在图5中出现负面情绪的情况下,出现了相反的趋势。

图4:SEC文件的积极情绪对GWW后续收盘价的时间序列影响

图5:SEC文件的负面情绪对GWW后续收盘价的时间序列影响

我们能够看到股票收盘价与SEC情绪分数之间的正负趋势。这表明上一季度的情绪分数对下一季度股票的收盘价有影响。

由于股票价格也取决于其他各种因素,我们无法看到每个季度的情绪与股票收盘价之间的这种关系。

评估股票预测

我们为50个模型中的每个模型训练了三个案例; 没有情绪,积极的情绪作为特征和负面情绪作为特征。表1中显示了所有三种情况的某只股票(WW Grainger Inc)的结果。

表1:WW Grainger Inc(GWW)的结果

尽管我们为GWW股票获得了有希望的结果,但情况并非总是如此,一些股票的情绪从均方误差上看几乎没有影响。这表明SEC文件的情绪并不是影响股票价格的唯一因素,可能存在其他可以研究的潜在因素。例如,突然宣布能源政策的变化会对清洁能源公司产生积极或消极的影响,这种变化可以反映出下一季度的情况。如果此类变更在之前的SEC备案中从未得到解决,那么经过训练的模型将无法从该SEC备案的情绪分数中选择该信息。未来工作部分讨论了改进和避免这种情况的建议。

图6中的图显示了GWW的Adj.Close价格 。绿线表示10年期间的历史股票表现(使用此时段的数据进行模型训练)。蓝线显示没有情绪特征的预测趋势,黄线显示包括负情绪分数后的预测趋势。

测试窗口的放大视图如图7所示,包括实际和预测的趋势。请注意,尽管两种预测趋势相似,但包含负面情绪的趋势似乎更接近实际值。表1中给出的较低RMSE证实了这一点。

图6:GWW的Adj.Close

图7:比较实际Adj.Close、带和不带负面情绪得分的预测价格

投资组合优化评估

我们使用python colormaps分析了50只股票之间的相关性。

图8:50种股票的相关矩阵

蓝色对应最小相关性而红色对应于最高相关性。这意味着蓝色股票可以在同一投资组合中。例如:[sbac,msci]

在得到相关性小于0.5且协方差小于均值协方差的股票对之后,我们使用图9中的图分析了“可配对”股票和“不可配对”股票:

图9:可配对和不配对的股票

该图显示绿色的可对配对股票和蓝色不可配对股票。例如:[amgn,mat]基于其协方差和相关值有资格在同一个投资组合中。我们根据上面的图生成了投资组合,并计算了每个投资组合的夏普比率和权重分布。显示最终dataframe的前几行以供参考:

图10:构建的投资组合的最终数据框架

最后,根据夏普比率,投资组合分为好,更好和最好。以下图表显示了“好”,“更好”和“最佳”范围内投资组合的收益率和波动率值。这些图可用于评估波动率,收益率和风险之间的均衡,并选择投资组合。

图11中的图是针对“好”投资组合生成的。通过查看下面的图表进行权衡的一个例子是[ma,zion,mat,vno,sna,flir,aee,duk,etr,pnr,akam]和[ndaq,mat]。可以看出,后者的回报率为20%,具有类似1.7夏普比率的风险。

图11:“好”投资组合图

图12中的情节是针对夏普比率> = 2且<3(更好)的投资组合。这里的夏普比率越大意味着投资组合相对“好”投资组合的风险更小。如上所述,也可以在该集合中导出类似的有趣组合。该图显示了[ndaq,flir]和[wfc,rtn]之间的这种权衡,选择或者给出几乎相同的回报,但后者由于更高的夏普比率而风险更小。

图12:“更好”投资组合图

从“最佳”夏普比率范围(图13)也可以得出类似的结论。这组投资组合涉及的风险最小。

图13:“最佳”投资组合图

代码文件介绍

我们的最终产品是Jupyter notebook集合。我们将产品分为四个模块:SEC 解析,情感分析,股票预测器和投资组合生成器

SEC解析器:该模块解析SECEdgar网站,为标普500指数公司提取10-Q和10-K文件。能够实现点检验,以便稍后恢复失败的下载。它还对HTML执行清理并生成原始文本文件。

情感分析器:此模块包含两个notebook。

情绪分析 notebook:从目录中提供的SEC文件中提取正面,负面和中性情绪的分数。它将这些提取的情绪保存为CSV文件,以后可用于模型训练,可视化等。

情感可视化notebook:用于绘制情绪趋势以及股票收盘价的通用notebook。

股票预测器:此模块包含三个notebook

没有情绪的LSTM股票:执行股票数据特征工程,训练并评估每个给定股票的LSTM模型。然后将每个模型保存在各自的目录中,同时将实际价格与预测价格进行比较。训练步数和所有目录都是可配置的。

具有情绪的LSTM股票:对股票数据以及情感分析器模块中提取的情绪数据执行特征工程。然后训练并保存每个模型以及对比图。

预测生成器:此notebook 可在训练后用于加载已保存的模型并对测试数据执行预测。然后,可以将预测dataframe导出为CSV文件,以便稍后在各种情形下使用。

投资组合生成器和优化器:成对选择弱相关股票构建投资组合。通过给投资组合中股票的最佳权重,优化投资组合以获得最高的夏普比率。

经验教训

了解金融领域以了解哪些可能起作用绝对是一项挑战。此外,研究如何操作时间序列数据,窗口方法和使用它们训练LSTM模型是十分有趣的。我们的研究结果还表明,由于相关性和协方差等问题,为所有公司的数据训练单一模型是富有成效的。

从SEC文件中提取的情绪对预测未来股票趋势具有重要意义。我们学会了使用NTLK VADER提取非常大的文本数据(在某些情况下为100,000个单词)的情绪。

我们学习了如何通过利用相关性,协方差,夏普比率和波动率等概念来构建投资组合。诸如colormap和相关矩阵之类的相关可视化对于确认获得的结果非常有用

总结

金融机器学习最近才发展起来,很难找到合适的资源。此外,股票价格预测通常被认为是一个难题,也是大多数投资组合经理不完全依赖它的原因之一。我们已经展示了使用LSTM构建神经网络对于这个问题是可靠的。SEC文件的情绪分析也被证明是一种可靠的技术。使用更清晰的数据和使用前面描述的工具进行更多评估,我们相信结果可以进一步改进。最后,投资组合构建很难,市场也可能发生变动。我们已经展示了一种可用于降低风险并根据预测结果构建多元化投资组合的方法。

未来的工作

情感分析

对于情感分析,我们可以考虑字嵌入模型,即:Word2Vec,FastText和Universal Sentence Encoder。我们可以评估这些模型是否可以为我们提供更准确的情绪分数,并评估它们是否有助于更好的预测股票市场的趋势。

我们从SEC的文件中仅提取了积极,消极和中立的情绪。金融业还有许多其他情绪,如不确定性,诉讼性,约束性,多余性,可以进一步提取和分析。

股票价格预测

目前,我们已为所考虑的每只股票训练了单独的模型。之所以这样做是因为我们在使用前面描述的方法训练单个模型后获得了非常差的结果。但是,如果股票数量很大,这种给每只股票训练单独模型的方法可能行不通。为了解决这个问题,我们可以考虑针对一组高度相关的股票而不是单一股票进行训练。这可以减少训练模型的数量。此外,我们对处于某共线性范围内的每个股票,可以利用迁移学习来重新训练这些模型的最后一层。

我们之前解释过,包含SEC文件情绪分数并不一定会得到较低的RMSE和更好的趋势线。为了进一步验证这一结论,我们可以通过在每个季度为每个股票添加新闻情绪来增强我们的功能,并评估这些分数和SEC分数相结合是否有助于我们做出更好的预测

组合优化

有许多其他投资组合构建方法可以使用我们的预测进行评估。我们可以评估行业标准技术,如“全局最小方差投资组合(GMV)”和“反向波动率投资组合IVP”[8],并比较特定时间窗口下组合的实际效果。

最后,投资组合再平衡是投资公司的标准做法。我们可以扩展我们的方法来实现现有投资组合的再平衡,并将它们的表现与我们每季度都构造组合的方法进行对比

参考文献

1、Lazy Prices http://laurenhcohen.com/wp-content/uploads/2017/09/lazyprices.pdf

2、S&P 500 Companies https://en.wikipedia.org/wiki/List_of_S%26P_500_companies

3、Python Stocker https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker

4、Universal features of price formation in financial markets: perspectives from Deep Learning https://arxiv.org/pdf/1803.06917.pdf

5、When Is a Liability Not a Liability? Textual Analysis, Dictionaries, and 10-Ks https://www.uts.edu.au/sites/default/files/ADG_Cons2015_Loughran%20McDonald%20JE%202011.pdf

6、Financial lexicon from Loughran-McDonald Sentiment Word Lists.https://sraf.nd.edu/textual-analysis/resources/#LM%20Sentiment%20Word%20Lists

7、The Most Rewarding Portfolio Construction Techniques https://seekingalpha.com/article/1710142-the-most-rewarding-portfolio-construction-techniques-an-unbiased-evaluation

如何获取代码

后台输入(严格大小写)

投资组合-ML

—End—

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化投资与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档