【Python金融量化】财经新闻文本分析

内容来自:微信公众号:python金融量化
关注可了解更多的金融与Python干货。
引言

“80%的商业信息来自非结构化数据,主要是文本数据”(Seth
Grimes),这一说法可能夸大了文本数据在商业数据中的占比,但是文本数据所蕴含的信息价值是毋庸置疑的。在信息爆炸的社会,文本数据量如此庞大,我们能做什么呢?事实上,能做的有很多,主要取决于你的目标是什么。
自然语言处理(NLP)是人工智能(AI)一个重要的子领域,目前比较流行的语言模型包括有限状态机、马尔可夫模型、词义的向量空间建模;机器学习分类器:朴素贝叶斯、逻辑回归、决策树、支持向量机、神经网络;序列模型:隐藏马尔可夫模型、循环神经网络(RNN)、长短期记忆神经网络(LSTMs)。Python金融量化分析进入到高阶阶段后,将进一步探索这些模型方法在金融市场或金融场景上的运用。
本文试图通过词云和情绪判断,对财经新闻进行基本的文本分析和数据挖掘,以起到抛砖引玉的效果。

财经新闻文本分析

本文用的是Python 3.6版本,直接在Jupyter Notebook上写code和交互运行,需要用到的package包括pandas、tushare、matplotlib、jieba、wordcloud,如果没有安装这些包,需要先安装,在cmd(命令提示符)上运行命令“pip install xxx(如tushare)”

数据获取

tushare是目前比较好用的数据开源包,可以免费获取股票、期货、宏观、基本面等数据,之后的金融量化分析实践基本上都会使用该包来获取数据,具体使用方法,可以到tushare的官网查看。

#注意:黑色方框背景里的代码可以左右滑动查看 #引入需要用到的包 #金融量化分析常用到的有:pandas(数据结构)、 #numpy(数组)、matplotlib(可视化)、scipy(统计) import tushare as ts import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import jieba import jieba.analyse from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator #正常显示画图时出现的中文和负号 from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei'] mpl.rcParams['axes.unicode_minus']=False df=ts.get_latest_news(show_content=True) #获取当前即时财经新闻(如本文是2018年11月17日) #默认是80条,可以通过参数“top= ”来设置 #保存数据到本地 #df.to_csv("D:/CuteHand/news.csv",encoding='gbk') #加encoding='gbk'才不会中文乱码,如果存在“非法字符”,可能也会报错 #数据清洗,保留需要的字段 df=df[['time','title','content']] #查看前三条数据 df.head(3) 

在这里插入图片描述
新闻词云分析

新浪财经新闻频率非常高,基本上几秒中就可以刷出几条新的新闻,面对如此多的信息,如何快速地通过关键词过滤掉不必要的信息呢?“词云”是当下比较流行的文本关键词可视化分析手段,即通过对新闻文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,过滤掉大量的文本信息,使大家只要一眼扫过文本就可以领略财经新闻的梗概。

#提取新闻标题内容并转化为列表(list) #注意原来是pandas的数据格式 mylist = list(df.title.values) #对标题内容进行分词(即切割为一个个关键词) word_list = [" ".join(jieba.cut(sentence)) for sentence in mylist] new_text = ' '.join(word_list) #图片可以根据需要更改,这里使用了中国地图.jpg #读取图片 img = plt.imread("中国地图.jpg") #设置词云格式 wc = WordCloud(background_color="white", mask=img,#设置背景图片 max_font_size=120, #字体最大值 random_state=42, #颜色随机性 font_path="c:\windows\fonts\simsun.ttc") #font_path显示中文字体,这里使用黑体 #生成词云 wc.generate(new_text) image_colors = ImageColorGenerator(img) #设置图片大小 plt.figure(figsize=(14,12)) plt.imshow(wc) plt.title('新浪财经新闻标题词云\n(2018年11月17日)',fontsize=18) plt.axis("off") plt.show() #将图片保存到本地 #wc.to_file("财经新闻标题词云.jpg") 

在这里插入图片描述
从上面新闻的标题词云图可以看出,今晚(22:00运行程序,不同时间得到结果不一样)新闻关键词主要有:美国、中国、科技、券商、比特币、退市、暴跌…光看标题,可能又隐藏了比较多的信息,我们可以进一步分析新闻文本的内容。

#以第一条新闻内容为例(比特币暴跌新闻) #数据清洗 #将titles列专门提取出来,并转化为列表形式 d=list(df.content[0]) content=''.join(d) #设置分词黑名单,手动暴力解决 #以后探索使用机器学习和深度学习进行分词 blacklist = ['责任编辑', '\n','\t', '也', '上', '后', '前', '为什么', '再', ',','认为','12','美元', '以及', '因为', '从而', '但', '像','更', '用', '“', '这', '有', '在', '什么', '都','是否','一个' ,'是不是','”', '还', '使', ',', '把', '向','中', '新', '对', ' ', ' ', u')', '、', '。', ';', '之后','表示','%', ':', '?', '...', '的','和', '了', '将', '到', ' ',u'可能','2014','怎么', '从', '年', '今天', '要', '并', 'n', '《', '为', '月', '号', '日', '大','如果','哪些', '北京时间', '怎样', '还是', '应该','这个', '这么','没有','本周','哪个', '可以','有没有'] #将某些固定词汇加入分词 stopwords=['比特币','利空','对冲基金', '分析师','移动均线','数字货币','中本聪'] for word in stopwords: jieba.add_word(word) #设置blacklist黑名单过滤无关词语 d = {} #将词语转入字典 for word in jieba.cut(content): if word in blacklist: continue if len(word)<2: #去除单个字的词语 continue d[word] = d.get(word, 0) + 1 #使用jieba.analyse d=''.join(d) tags=jieba.analyse.extract_tags(d,topK=100, withWeight=True) tf=dict((a[0],a[1]) for a in tags) backgroud_Image = plt.imread('比特币.jpg') wc = WordCloud( background_color='white', # 设置背景颜色 mask=backgroud_Image, # 设置背景图片 font_path='C:\Windows\Fonts\STZHONGS.TTF', # 若是有中文的话,这句代码必须添加 max_words=2000, # 设置最大现实的字数 stopwords=STOPWORDS,# 设置停用词 max_font_size=150,# 设置字体最大值 random_state=30) wc.generate_from_frequencies(tf) plt.figure(figsize=(12,12),facecolor='w',edgecolor='k') plt.imshow(wc) # 是否显示x轴、y轴下标 plt.title(df.title[0],fontsize=15) plt.axis('off') plt.show() 

在这里插入图片描述

从上面新闻内容的词云图,不难看出,比特币出现了暴跌,悲观情绪笼罩…。

#将上述词云作图包装成函数 def plot_news_cloud(df,n): txt= [line.strip() for line in df.content[n]] text=''.join(txt) tags=jieba.analyse.extract_tags(text,topK=100, withWeight=True) tf=dict((a[0],a[1]) for a in tags) backgroud_Image = plt.imread('中国地图.jpg') #可以自己找适合的图片做背景,最后是背景白色 wc = WordCloud( background_color='white', # 设置背景颜色 mask=backgroud_Image, # 设置背景图片 font_path='C:\Windows\Fonts\STZHONGS.TTF', # 若是有中文的话,这句代码必须添加 max_words=2000, # 设置最大现实的字数 stopwords=STOPWORDS,# 设置停用词 max_font_size=150,# 设置字体最大值 random_state=30) wc.generate_from_frequencies(tf) plt.figure(figsize=(12,10),facecolor='w',edgecolor='k') plt.imshow(wc) plt.title(df.title[n],fontsize=18) plt.axis('off') plt.show() #画出第6条新闻的词云图 plot_news_cloud(df,5) 

在这里插入图片描述
新闻情绪判断

通过新闻标题来判断该新闻报道内容为积极性/消极性的概率。这部分代码较长,不在此展示,感兴趣的朋友可以关注公众号并回复“文本1”免费获取代码。

def word_processing(text): #数据清洗,限于篇幅,代码省略 def sentiment_score_list(dataset): #数据处理和情绪判断主函数, #限于篇幅,代码省略 def sentiment_score(senti_score_list): #情绪得分汇总 #将上述新闻标题去掉空格,写入列表里(list) y=[] t1=list(df.title) for i in range(len(t1)): x=t1[i].split() x=','.join(x) if i<len(t1)-1: x=x+'。' y.append(x) #显示前三条新闻标题 y[:3] 

结果显示

[‘暴跌后逼近”死亡交叉”,比特币下个目标是1500美…。’, ‘全球资管巨头:未来5年投资,你需要留意这5件事。’,
‘洲际酒店被指泄露花总护照信息并调侃,波及德云社。’]

#将上述标题内容合成一起,以句号结尾 wlist=[line.strip() for line in y] wlist=''.join(wlist) #wlist senti_score_list=sentiment_score_list(wlist) text=sentiment_score(senti_score_list) print(text) p=0 n=0 for i in range(len(text)): if text[i]>0: p+=1 else: n+=1 print("正面新闻数目:{0},负面新闻数目:{1}".format(p,n)) 

输出结果

[-33, 11, -1, 12, -9, 0, -6, 0, -8, -5, -8, 8.0,14, 13, 0, -2.0, 7,
3, 9, -8, 3, -3, 4, -4, 8, 22,19, 11, -11, -16, 6,13, 11, 9, 0, -9,
12, 2, 4,12,-10, 6, 2, -4, -6, -13, 7,-9, 0, -28, 11, -10, -4, -13,
0, -3, -1, 0, 0, 7,9,15,12,7, 7, 0, 1, 0, 0,0, 12.0, -9, 15, -11, 1,
-9, 1, -6, 9, 0] 正面新闻数目:38,负面新闻数目:42

结语

金融行业是人工智能最先应用的行业之一,文本挖掘和NPL处理在金融场景上的应用会越来越广泛,并将日益成为智能金融的基石。未来智能金融应用场景有很多,如智能投研、智能投顾、智能风控、智能客服、智能监管、智能运营等,这些场景应用对机器学习、深度学习的要求将会越来越高。本文采用简单的词云分析、字典分词、句子情绪判断对财经新闻文本进行了初浅的探索,希望能起到抛砖引玉的作用。

原文链接:https://blog.csdn.net/weixin_43174639/article/details/84645807?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165277607816782425152803%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165277607816782425152803&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-13-84645807-null-null.nonecase&utm_term=%E6%96%B0%E9%97%BB

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
文明发言,共建和谐米科社区
提交
头像

昵称

取消
昵称表情图片