【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]] #查看前三條數據 新聞詞雲分析 新浪財經新聞頻率非常高,基本上幾秒中就可以刷出幾條新的新聞,面對如此多的信息,如何快速地通過關鍵詞過濾掉不必要的信息呢?「詞雲」是當下比較流行的文本關鍵詞可視化分析手段,即通過對新聞文本中出現頻率較高的「關鍵詞」予以視覺上的突出,形成「關鍵詞雲層」或「關鍵詞渲染」,過濾掉大量的文本信息,使大家只要一眼掃過文本就可以領略財經新聞的梗概。 #提取新聞標題內容並轉化為列表(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:windowsfontssimsun.ttc") #font_path顯示中文字體,這裡使用黑體 #生成詞雲 wc.generate(new_text) image_colors = ImageColorGenerator(img) #設置圖片大小 plt.figure(figsize=(14,12)) plt.imshow(wc) plt.title(新浪財經新聞標題詞雲 (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 = [責任編輯, , , 也, 上, 後, 前, 為什麼, 再, ,,認為,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:WindowsFontsSTZHONGS.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:WindowsFontsSTZHONGS.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處理在金融場景上的應用會越來越廣泛,並將日益成為智能金融的基石。未來智能金融應用場景有很多,如智能投研、智能投顧、智能風控、智能客服、智能監管、智能運營等,這些場景應用對機器學習、深度學習的要求將會越來越高。本文採用簡單的詞雲分析、字典分詞、句子情緒判斷對財經新聞文本進行了初淺的探索,希望能起到拋磚引玉的作用。◆◆ Python金融量化◆◆專註於分享Python在金融數據分析和量化投資上的應用、經濟分析框架和金融思維。掃描下面二維碼,歡迎關注Python金融量化,關注請回復使用指南,免費獲取金融乾貨。一起學習,共同進步! http://weixin.qq.com/r/UyqttQfEwFq-rUPW939B (二維碼自動識別)往期精彩回顧 Python金融數據分析系列:股票分析入門Python帶你笑看江湖 Python金融財務分析 Python獲取財經數據和可視化分析玩轉Python量化金融工具之NumPy玩轉Python金融量化利器之Pandas 經濟金融分析框架與思維:大勢觀瀾與研判邏輯經濟危機--明斯基時刻 共克時艱,你做好準備了嗎? 推薦閱讀: 相关文章 {{#data}} {{title}} {{/data}}