【Python金融量化】財經(jīng)新聞文本分析

引言

“80%的商業(yè)信息來自非結(jié)構(gòu)化數(shù)據(jù),主要是文本數(shù)據(jù)”(Seth Grimes),這一說法可能夸大了文本數(shù)據(jù)在商業(yè)數(shù)據(jù)中的占比,但是文本數(shù)據(jù)所蘊含的信息價值是毋庸置疑的。在信息爆炸的社會,文本數(shù)據(jù)量如此龐大,我們能做什么呢?事實上,能做的有很多,主要取決于你的目標是什么。

自然語言處理(NLP)是人工智能(AI)一個重要的子領(lǐng)域,目前比較流行的語言模型包括有限狀態(tài)機、馬爾可夫模型、詞義的向量空間建模;機器學習分類器:樸素貝葉斯、邏輯回歸、決策樹、支持向量機、神經(jīng)網(wǎng)絡;序列模型:隱藏馬爾可夫模型、循環(huán)神經(jīng)網(wǎng)絡(RNN)、長短期記憶神經(jīng)網(wǎng)絡(LSTMs)。Python金融量化分析進入到高階階段后,將進一步探索這些模型方法在金融市場或金融場景上的運用。

本文試圖通過詞云和情緒判斷,對財經(jīng)新聞進行基本的文本分析和數(shù)據(jù)挖掘,以起到拋磚引玉的效果。

財經(jīng)新聞文本分析

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

數(shù)據(jù)獲取

tushare是目前比較好用的數(shù)據(jù)開源包,可以免費獲取股票、期貨、宏觀、基本面等數(shù)據(jù),之后的金融量化分析實踐基本上都會使用該包來獲取數(shù)據(jù),具體使用方法,可以到tushare的官網(wǎng)查看。

#注意:黑色方框背景里的代碼可以左右滑動查看
#引入需要用到的包
#金融量化分析常用到的有:pandas(數(shù)據(jù)結(jié)構(gòu))、
#numpy(數(shù)組)、matplotlib(可視化)、scipy(統(tǒng)計)
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
#正常顯示畫圖時出現(xiàn)的中文和負號
from pylab import mplmpl.rcParams['font.sans-serif']=
['SimHei']mpl.rcParams['axes.unicode_minus']=False
df=ts.get_latest_news(show_content=True)
#獲取當前即時財經(jīng)新聞(如本文是2018年11月17日)
#默認是80條,可以通過參數(shù)“top= ”來設置
#保存數(shù)據(jù)到本地#df.to_csv("D:/CuteHand/news.csv",encoding='gbk') 
#加encoding='gbk'才不會中文亂碼,如果存在“非法字符”,可能也會報錯
#數(shù)據(jù)清洗,保留需要的字段df=df[['time','title','content']]
#查看前三條數(shù)據(jù)

新聞詞云分析

新浪財經(jīng)新聞頻率非常高,基本上幾秒中就可以刷出幾條新的新聞,面對如此多的信息,如何快速地通過關(guān)鍵詞過濾掉不必要的信息呢?“詞云”是當下比較流行的文本關(guān)鍵詞可視化分析手段,即通過對新聞文本中出現(xiàn)頻率較高的“關(guān)鍵詞”予以視覺上的突出,形成“關(guān)鍵詞云層”或“關(guān)鍵詞渲染”,過濾掉大量的文本信息,使大家只要一眼掃過文本就可以領(lǐng)略財經(jīng)新聞的梗概。

#提取新聞標題內(nèi)容并轉(zhuǎn)化為列表(list)
#注意原來是pandas的數(shù)據(jù)格式
mylist = list(df.title.values)
#對標題內(nèi)容進行分詞(即切割為一個個關(guān)鍵詞)
word_list = [" ".join(jieba.cut(sentence))
                for sentence in mylist]
new_text = ' '.join(word_list)
#圖片可以根據(jù)需要更改,這里使用了中國地圖.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('新浪財經(jīng)新聞標題詞云\n(2018年11月17日)',fontsize=18)
plt.axis("off")
plt.show()
#將圖片保存到本地
#wc.to_file("財經(jīng)新聞標題詞云.jpg")
image

從上面新聞的標題詞云圖可以看出,今晚(22:00運行程序,不同時間得到結(jié)果不一樣)新聞關(guān)鍵詞主要有:美國、中國、科技、券商、比特幣、退市、暴跌…光看標題,可能又隱藏了比較多的信息,我們可以進一步分析新聞文本的內(nèi)容。

#以第一條新聞內(nèi)容為例(比特幣暴跌新聞)
#數(shù)據(jù)清洗#將titles列專門提取出來,并轉(zhuǎn)化為列表形式d=list(df.content[0])
content=''.join(d) 
#設置分詞黑名單,手動暴力解決
#以后探索使用機器學習和深度學習進行分詞
blacklist = ['責任編輯', '\n','\t', '也', '上', '后', '前',   '為什么', '再',
 ',','認為','12','美元', '以及', '因為', '從而', '但', '像','更', '用',   
 '“', '這', '有', '在', '什么', '都','是否','一個'  ,'是不是','”', '還', '使', ',
', '把', '向','中',    '新', '對', ' ', ' ', u')', '、', '。', ';',   '之后',
'表示','%', ':', '?', '...', '的','和',    '了', '將', '到', ' ',u'可能',
'2014','怎么',    '從', '年', '今天', '要', '并', 'n', '《', '為',  '月', '號', 
'日', '大','如果','哪些',   '北京時間', '怎樣', '還是', '應該','這個', 
 '這么','沒有','本周','哪個', '可以','有沒有']
#將某些固定詞匯加入分詞
stopwords=['比特幣','利空','對沖基金', 
  '分析師','移動均線','數(shù)字貨幣','中本聰']
for word in stopwords:    
        jieba.add_word(word)
        #設置blacklist黑名單過濾無關(guān)詞語
d = {} #將詞語轉(zhuǎn)入字典
for word in jieba.cut(content):     
       if word in blacklist:         
              continue    
       if len(word)<2: 
 #去除單個字的詞語        
             continue   
 d[word] = d.get(word, 0) + 1 
#使用jieba.analysed=''.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, # 設置最大現(xiàn)實的字數(shù)    
         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()
image

從上面新聞內(nèi)容的詞云圖,不難看出,比特幣出現(xiàn)了暴跌,悲觀情緒籠罩..。

#將上述詞云作圖包裝成函數(shù)
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, # 設置最大現(xiàn)實的字數(shù)         
      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)
image

新聞情緒判斷

通過新聞標題來判斷該新聞報道內(nèi)容為積極性/消極性的概率。這部分代碼較長,不在此展示,感興趣的朋友可以關(guān)注公眾號并回復“文本1”免費獲取代碼。

def word_processing(text):
#數(shù)據(jù)清洗,限于篇幅,代碼省略
def sentiment_score_list(dataset):
#數(shù)據(jù)處理和情緒判斷主函數(shù),#限于篇幅,代碼省略
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]

結(jié)果顯示

['暴跌后逼近"死亡交叉",比特幣下個目標是1500美…。',
'全球資管巨頭:未來5年投資,你需要留意這5件事。',
'洲際酒店被指泄露花總護照信息并調(diào)侃,波及德云社。']

#將上述標題內(nèi)容合成一起,以句號結(jié)尾
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("正面新聞數(shù)目:{0},負面新聞數(shù)目:{1}".format(p,n))

輸出結(jié)果

[-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]
正面新聞數(shù)目:38,負面新聞數(shù)目:42

結(jié)語

金融行業(yè)是人工智能最先應用的行業(yè)之一,文本挖掘和NPL處理在金融場景上的應用會越來越廣泛,并將日益成為智能金融的基石。未來智能金融應用場景有很多,如智能投研、智能投顧、智能風控、智能客服、智能監(jiān)管、智能運營等,這些場景應用對機器學習、深度學習的要求將會越來越高。本文采用簡單的詞云分析、字典分詞、句子情緒判斷對財經(jīng)新聞文本進行了初淺的探索,希望能起到拋磚引玉的作用?!簟? Python金融量化◆◆專注于分享Python在金融數(shù)據(jù)分析和量化投資上的應用、經(jīng)濟分析框架和金融思維,歡迎關(guān)注Python金融量化,關(guān)注請回復使用指南,免費獲取金融干貨。一起學習,共同進步!


◆◆ 關(guān)于Python金融量化◆◆
專注于分享Python在金融數(shù)據(jù)分析和量化投資上的應用、經(jīng)濟分析框架和金融思維。掃描下面二維碼,歡迎關(guān)注Python金融量化,關(guān)注請回復使用指南,免費獲取金融干貨。一起學習,共同進步!

python金融.jpg

往期精彩回顧



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容