Use NLP to predict stock price movement associated with news
基于事件驱动的股票预测情感分析
使用自然语言处理(NLP)根据路透社新闻预测股票价格变动
网站
欢迎访问我们的网站:GolenRocks.me。本项目的主旨在利用贝叶斯深度神经网络和新闻标题建立股票价格预测的关系。
方法
-
数据收集与预处理
1.1 使用爬虫获取公开上市公司的详细信息
1.2 利用BeautifulSoup抓取路透社新闻
1.3 通过urllib获取股价数据
-
特征工程(词化)
2.1 统一单词格式:统一时态,单复数形式,去除标点符号和停用词
2.2 实现独热编码
2.3 对词序列(本质上是矩阵)填充,保持相同维度
-
使用随机梯度拉格朗日动态训练一组贝叶斯卷积神经网络以提高鲁棒性
-
采用稀疏模型预测未来新闻
需求
- Python 3
- PyTorch > 0.4
- numpy
- NLTK
- 爬虫工具
- pip3 安装lxml
- pip3 安装bs4
- pip3 安装urllib
使用
注:如果您不想花时间爬取数据和训练模型,可以直接跳到第4步。
1. 数据收集
1.1 从NASDAQ下载股票代码列表
$ ./crawler/all_tickers.py 20 # 保留例如前20%市值的公司
1.2 使用BeautifulSoup从路透社抓取新闻标题
注意:可能需要一个月以上的时间来获取所需新闻.
假设我们找到了关于2018年5月18日COO卢奇辞职的一则新闻在reuters.com上的信息:
可以使用以下脚本来抓取并将其格式化为本地文件:
$ ./crawler/reuters.py # 我们可以关联新闻与公司和日期,这比彭博新闻更精确

通过对公司代码和日期的暴力迭代,最终可以得到大约40万条新闻的数据集。由于一家公司在同一天可能有多条新闻,当前版本仅使用topStory新闻来训练我们的模型,并忽略其他新闻。
1.3 使用urllib抓取历史股票价格
改进:使用相对于S&P 500的标准化回报率而不是回报率。
$ ./crawler/yahoo_finance.py # 生成原始数据:stockPrices_raw.json,包含开盘价、收盘价等
$ ./create_label.py # 利用原始价格数据生成stockReturns.json
2. 特征工程(词化)
统一单词格式,将单词映射到词向量,使每个句子都转化为一个矩阵。
统一单词格式的细节包括:转小写,删除标点,移除停用词,统一时态和单复数。
$ ./tokenize_news.py
3. 训练贝叶斯卷积网预测股票价格走势。
输入以下命令训练一套稳健的贝叶斯模型。
$ ./main.py -epochs 500 -static False
4. 预测与分析
举例说明如何使用稀疏模型响应百度卢奇离职的新闻:
$ ./main.py -predict "Top executive behind Baidu's artificial intelligence drive steps aside"
>> 卖出
这个预测是有道理的,让我们再看一个例子:
Eli Lilly and Co (LLY.N)
FRI, JUN 1 2018
UPDATE 2-Lilly gets U.S. nod for arthritis drug, sets price well below rivals
* Drug priced at $25,000/year, 60 pct lower to AbbVie's Humira
$ ./main.py -predict "UPDATE 2-Lilly gets U.S. nod for arthritis drug sets price well below rivals"
>> 卖出
降低药品价格似乎有助于在业务中获得市场份额,但并未提及太多关于技术更新的信息,我们认为这是一种恶性价格竞争,对公司利润无益。因此出售礼来股票不是一个坏决定。
接下来,看看买入的情况:
Alphabet Inc (GOOG.O)
WED, MAY 30 2018
Google launches the second app in China, woos top smartphone market
* BEIJING Alphabet Inc's Google has launched a file managing tool in several Chinese app stores as it
* looks for fresh inroads into the world's biggest smartphone market, where most of the internet
* giant's top products remain banned.
$ ./main.py -predict "Google launches the second app in China woos top smartphone market"
>> 强烈买入
现在您基本了解了模型的工作方式,让我们用回溯测试评估过去两周新闻的表现。
$ ./main.py -eval True
>> 测试 - 损失: 0.6761 准确率: 58.07%(41.8/72.0) 83.50%(3.3/3.9) 100.00%(0.0/0.0) 0.00%(0.0/0.0)
注意:预测是平均值,这就是为什么会有浮点数的原因。从左到右,预测变得更加确定。58%实际上比我预期要高,我相信在更长的时间范围内进行测试,性能会变差。然而,只要预测优于随机猜测(50%),那么在一个有利可图的游戏上押注(假设没有交易成本和流动性问题),你就不会亏钱。
5. 未来工作
这是一个初步的工作。更好的标签应基于公司股票价格变化与其所在行业的比较,而不是S&P 500,这在精神上类似于套期保值。
根据Tim Loughran和Bill McDonald,有些词汇在金融领域具有强烈的正面和负面含义,例如企业并购。因此我们需要深入研究这些词汇以找到更多信息。此外,对各个行业的详尽分析和比较也很有用。
另一个简单但有趣的例子可以在金融情感分析部分1和部分2中找到。
由于一个全面的停用词列表对于提高预测能力非常有帮助,欢迎您构建一个更好的停用词列表并与大家分享。
参考文献:
- Yoon Kim, 用于句子分类的卷积神经网络, EMNLP, 2014
- J Pennington, R Socher, CD Manning, GloVe: 全局向量表示词, EMNLP, 2014
- Max Welling, Yee Whye Teh, 通过随机梯度拉格朗日动力学学习贝叶斯, ICML, 2011
- Tim Loughran和Bill McDonald,2011,《当负债不是负债时? 文本分析、词典和10-K报告》,《财务学报》,66:1,35-65。
- H Lee等人,文本分析对股票价格预测的重要性, LREC, 2014
- Xiao Ding, 基于事件驱动的股票预测深度学习, IJCAI2015
- 在TensorFlow中实现CNN进行文本分类
- 使用深度学习预测电影评论的情感-Keras
- 使用LSTM循环神经网络进行序列分类-Keras
- tf-idf + t-sne
- 序列分类中的CNN实现
- 开始使用Python中的Word2Vec和Glove
- PyTorch实现Kim的用于句子分类的卷积神经网络