1. 程式人生 > >【Python金融量化】財經新聞文字分析

【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處理在金融場景上的應用會越來越廣泛,並將日益成為智慧金融的基石。未來智慧金融應用場景有很多,如智慧投研、智慧投顧、智慧風控、智慧客服、智慧監管、智慧運營等,這些場景應用對機器學習、深度學習的要求將會越來越高。本文采用簡單的詞雲分析、字典分詞、句子情緒判斷對財經新聞文字進行了初淺的探索,希望能起到拋磚引玉的作用。