【干货】基于TensorFlow卷积神经网络的短期股票预测

【导读】近期,意大利公数据科学家Mattia Brusamento撰写了基于Tensorflow卷积网络的

短期股票预测教程,在这篇博文中,你将会看到使用卷积神经网络进行股票市场预测的一个应用案例,主要是使用CNN将股票价格与情感分析结合,来进行股票市场预测,CNN网络通过TensorFlow实现。博文一步步展示了从数据集创建、CNN训练以及对模型评估等等入手,带你进入基于TensorFlow实现的股票市场预测分析。


摘要




在机器学习中,卷积神经网络(CNN)是已经成功地应用于计算机视觉任务中的一类神经网络。在这个项目中,我将使用CNN将股票价格与情感分析结合,来进行股票市场预测。本文CNN网络的实现是利用TensorFlow来实现的。在本文中,我将按以下步骤进行阐述:数据集创建、CNN训练和对模型评估。



  • 数据集:

在本节中,简要描述了构建数据集、数据源和情感分析的过程。

 

  • Tick 数据(买单/买单数据)

为了构建数据集,我首先选择了一个行业,然后专注于研究该行业。我决定选取卫生健康领域在201614日至2017930日期间数据,并将它们分为训练集和评估集。特别值得一提的是,这些Tick 数据是从nasdaq.com网站上下载的,只保留那些非常大或中等市值的公司。从这些Tick 数据开始,股票和新闻数据分别使用Google财经和内部的API进行检索。

 

  • 股票数据:

正如前面提到的,从Google财经历史API中检索股票数据。

"https://finance.google.com/finance/historical?q={tick}&startdate={startdate}&output=csv",对于表中的每个tick

时间单位是一天,我所保留的值是收盘价。为了训练,使用线性插值(pandas.DataFrame.interpolate)填充缺失的天数:

 

  • 新闻数据和情感分类: 


 

为了检索新闻,我使用intrinioAPI。对于每个tick,我从“https://api.intrinio.com/news.csv?ticker={tick}”下载相关的新闻数据。数据以csv格式显示,如下图:

TICKER,FIGI_TICKER,FIGI,TITLE,PUBLICATION_DATE,URL,SUMMARY,例子如下



我们会根据标题已经删除了重复的新闻。最后,TICKER, PUBLICATION_DATE  SUMMARY列被保留。

 

情绪分析在SUMMARY列上进行,使用LoughranMcDonald 金融情感字典进行金融情绪分析,在pythonntiment python库中实现。

这个库提供了一个tokenizer,它也执行词干还原和停用词的删除,以及一个标记化的文本评分的方法。从get_score方法中选择的作为情感代理的值是对立的,计算公式如下:


import pysentiment as ps

lm = ps.LM()
df_news['SUMMARY_SCORES'] =df_news.SUMMARY.map(lambda x: lm.get_score(lm.tokenize(str(x))))
df_news['POLARITY'] =df_news['SUMMARY_SCORES'].map(lambda x: x['Polarity'])

 

没有新闻的日期用0极性填充。

最后,数据被TICK和日期分组,总结了TICK有多个消息的日期的极性分数。

 

  • 完整数据集:


 

通过合并股票和新闻数据,我们得到如下的数据集,从2016-01-042017-09-30的所有日期划分为154个刻度,并且股票的收盘价和极性值分别为:

 



  • 基于TensorFlow的CNN:


 

为了在Tensorflow中实现卷积神经网络,我使用了官方教程作为参考。

https://www.tensorflow.org/tutorials/layers


它展示了如何使用层来构建卷积神经网络模型并识别MNIST数据集中的手写数字。为了应用于我们的工作,我们需要调整我们的输入数据和网络。

 

  • 数据建模:


 

输入数据这样来建模:单个特征元素是一个154x100x2张量:

  • 154ticks

  • 100个连续交易日

  • 2个通道,一种是股票价格,一种是极性值

Lables被建模为长度154的向量,如果第二天的股票价格上升,其中每个元素都是1,否则是0



 

这样,就有了一个包含100天的时间滑动窗口,所以前100天不能用作标签。训练集包含435个条目,而评估集数目为100

 

  • 基卷积神经网络:


 

已经从TensorFlow教程的例子开始构建CNN,然后使之适用于我们的任务。前两层卷积层和pooling层的高度都等于1,因此它们对单个股票进行卷积和汇集,最后一层的高度等于154,以了解股票之间的相关性。最后是密集层,最后一个长度为154,每个股票对应一个。网络的规模可以用笔记本电脑在数据集上进行几个小时的训练。部分代码如下:



  • 评估:


 

为了评估模型的性能,我们没有使用标准的度量方法,但是已经建立了一个更接近于模型实际应用的模拟。

 

假定以初始资本(C)等于1开始,对于评估集的每一天,我们将资本分成N个等份,其中N1154

 

我们把C / N放在我们模型预测的具有最高概率的前N个股票上,其他的0个。

 

此时我们有一个代表我们每天分配的向量A,我们可以计算每日收益/损失,用A乘以当天每个股票的百分比变化。

 

我们用户一个新的资本C = C  +delta,我们可以在第二天再投资。

 

最后,我们会得到大于或小于1的资本,这取决于我们的选择的优劣。

 

该模型的一个良好的baseline已经在N = 154中被确定:这代表了所有股票的通用表现,它模拟了我们在所有股票上平均分配资本的情景。这产生了大约4.27%的收益。

 

出于评估的目的,数据已经得到纠正,消除了市场关闭的日期。

 

对于不同N的取值,模型性能表现如下图:


红色虚线表示的是0基线,而橙色的线是N=154的基线。最好的表现是在N=12的情况下获得的,其收益约为8.41%,几乎是市场基线的两倍。对于几乎每个大于10N,都有一个不错的表现,都比基线好,而N太小会降低性能。

 

  • 结论:


 

第一次尝试TensorflowCNN并将其应用到财务数据中是非常有趣的。这是一个玩具型例子(非实用性的),使用相当小的数据集和网络结构,但它显示了这个模型的潜力。


请随时提供反馈和意见,或在LinkedIn上与我联系。

 

  • 个人简历:


 

Mattia获得了米兰理工大学计算机(ComputerEngineering from Politecnico di Milano)工程硕士学位,之后在代尔夫特理工大学(TUDelft)从事推荐系统。Mattia现在在一家意大利公司担任网络安全领域的数据科学家。

 

相关文献




  • Understanding     Deep Convolutional Neural Networks with a practical use-case in Tensorflow     and Keras

  • Exploring     Recurrent Neural Networks

  • Data     Scientist: The Hottest Job on Wall Street


参考链接:

https://www.kdnuggets.com/2017/12/tensorflow-short-term-stocks-prediction.html


-END-

专 · 知

人工智能领域主题知识资料查看获取【专知荟萃】人工智能领域25个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)

同时欢迎各位用户进行专知投稿,详情请点击

诚邀】专知诚挚邀请各位专业者加入AI创作者计划了解使用专知!

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!

点击“阅读原文”,使用专知

展开全文
Top
微信扫码咨询专知VIP会员