看新聞,預測股票趨勢(上)

News-Oriented Stock Prediction — Part I

Bert Lee // 李慕家
15 min readJun 22, 2020
Outline:(上)[關鍵句抽取]
1. 前言
2. 研究標的選擇
3. 資料初步觀察
4. 研究動機
5. 大漲/大跌關鍵詞(未果)
6. 大漲/大跌關鍵句型
7. 結論
(中)[ML模型]
1. SVM
(下)[DL模型]
1. BERT
2. 未來應用

1. 前言:

你有沒有認識那種每個早上一定要花兩、三個小時看報紙,然後整天就是坐在沙發上盯盤,結果就莫名多了好幾棟房子的大媽?

假設,我是說假設,真的有人能看新聞贏股票,那麼我想知道現在NLP(自然語言處理)的技術能不能也看新聞贏股票;或著,也許應該是機器教我們怎麼讀新聞,玩股票。

2020年5月1號,特斯拉CEO Elon Musk推特表示特斯拉股價太高,然後股價立刻做出反應。

當然,在應用新聞資訊預測股價變動時,會遇到許多設定上的問題:

新聞相關問題

  • 同一則新聞對不同股票的影響不同,因此訓練一個General的Model不合理,應該針對每支股票建Model?
  • 單一股票的波動,多少比例受大盤、市場影響?多少比例是因為個股的利多、利空資訊?
  • 是否可以量化某些新聞資訊,比如外資買賣、財報狀況?
  • 一則新聞出現後,反應時間是多久?
  • 哪些新聞句子、描述是對哪些股票有影響的?
  • 資料的粒度,應該切成句子、段落、還是整篇新聞?
  • 一天同一間公司有好多新聞,有正面有反面,如何給予權重?
  • 同一間公司在不同時間遇到同樣的事件,是否會造成股價同樣的反應?

其他考慮參數

  • 論壇文字、情緒資訊
  • 技術指標

研究設定問題

  • 應該將漲跌如何分類?漲多少%算漲?應該分為幾類?應該研究的是大幅漲跌的情況?

模型問題

  • 參數的選擇
  • 合理的訓練流程
  • 合理的驗證流程

等等,要考慮的會不會太多了一點?不會,因為我不一定要考慮😎。

2. 選定研究標的

個股:鴻海(2317)
時間段:2016/1/1-2018/12/31
新聞量:12,948篇
交易日:737天
平均每日新聞量:17.57篇

研究標的選擇鴻海主要因為[知名度高][新聞討論度高][交易量大]

新聞內容來自[鉅亨網][Moneydj理財網]、…[中時電子報]等9處。這次手邊剛好有資料,如果要自己爬取又要另外花費一些時間,網頁爬蟲的教學網路上很多,這裡就不贅述了。

3. 資料初步觀察:

接著先用圖表來了解研究標的基本特性

鴻海(2317)在2016–18年期間的股價走勢,最高122.5元,最低67元。
每日交易量分佈圖
每日漲跌幅分佈圖
五標
簡單的幾點發現
1. 鴻海在2016-18年區間最高點是最低點的兩倍左右,整體漲跌幅相當大,呈現一個倒V的形狀
2. 交易量分佈呈現一個Right-Skewed的形狀,在少數的日子裡會有大量的交易發生,中位數是每日32,682筆
3. 當日漲跌幅中位數是0,整體分布相當對稱,75%左右的日子漲跌幅絕對值都小於1.4。

[新聞量]與[交易量]的關係:

[新聞量]與[交易量]隨著時間的變化,相關度不高;只看得出一個現象是,交易量陡升的隔日,新聞量也會上升。(可放大查看)

4. 研究動機和設定:

老實說,我只對一日暴漲、暴跌的情況比較有興趣,我想了解能不能透過新聞資訊預測這種現象的發生。

在2016–2018期間,737個交易日內,鴻海有44次漲超過2%,出現比率是5.97%,58次跌超過2%,出現比率是7.87%。

為簡單起見,我研究的是[從上次收盤後今天收盤前新聞]與[今日漲跌幅]之間的關係。若收到不錯的結果,會再嘗試調整新聞與股價變動時間差的設定。

5. 大漲、大跌之關鍵詞:

其中最直觀的研究,就是找到在大漲、大跌前新聞內容的關鍵詞。可以透過統計的方法(TF-IDF, Chi-Square…),計算[大漲大跌新聞]高頻出現的關鍵詞。

第一步,也是關鍵的一步就是分詞(word segmentation)。我開始測試現今(May 2020)開源、方便使用的分詞器,包括:jieba, thulac, pkuseg, hanlp.

分詞器:

分詞器在不同測試集的準確度表現。

實測1:

org: 無獨有偶,天風國際證券12月也將蘋果2019年第1季iPhone整體出貨量下調大約2成。jieba: 無獨| 有| 偶| ,| 天風國際| 證券| 12| 月| 也| 將蘋果| 2019| 年| 第| 1| 季| iPhone| 整體| 出貨量| 下| 調大約| 2| 成| 。thulac: 無獨有偶| ,| 天風| 國際| 證券| 12月| 也| 將蘋果| 2019年| 第1| 季iPhone| 整體| 出| 貨量| 下調| 大約| 2| 成| 。pkuseg: 無獨| 有偶| ,| 天風| 國際| 證券| 12月| 也| 將| 蘋果| 2019年| 第1| 季| iPhone| 整| 體| 出| 貨量| 下| 調| 大| 約| 2成| 。hanlp: 無獨| 有| 偶| ,| 天| 風| 國| 際證| 券| 12月| 也| 將| 蘋| 果| 2019| 年| 第| 1| 季| iPhone| 整| 體| 出| 貨| 量| 下| 調| 大| 約| 2| 成| 。

實測2:

org: 花旗給予iPhone代工廠鴻海和富士康股票「賣出」評等,並認為鴻海遭受的衝擊更大,因為對蘋果新機的曝險較高。jieba: 花旗| 給予| iPhone| 代工| 廠鴻海| 和| 富士康| 股票| 「| 賣出| 」| 評等| ,| 並認| 為鴻海| 遭受| 的| 衝擊| 更| 大| ,| 因為| 對| 蘋果| 新機| 的| 曝險| 較| 高| 。thulac: 花旗| 給予| iPhone代| 工廠| 鴻海| 和| 富士康| 股票| 「賣| 出| 」評| 等| ,| 並認| 為鴻海| 遭受| 的| 衝擊| 更| 大| ,| 因| 為對| 蘋果| 新機| 的| 曝險| 較| 高| 。pkuseg: 花旗| 給| 予| iP| hone代工廠鴻海| 和| 富士康股票「賣| 出| 」評| 等| ,| 並認| 為鴻海| 遭受| 的| 衝擊| 更| 大| ,| 因| 為對| 蘋果| 新| 機| 的| 曝險| 較| 高| 。hanlp: 花旗| 給| 予| iPhone| 代工| 廠鴻| 海| 和| 富士康| 股票| 「| 賣| 出| 」| 評| 等| ,| 並| 認| 為| 鴻| 海| 遭受| 的| 衝| 擊| 更大| ,| 因| 為| 對| 蘋| 果新| 機| 的| 曝| 險較| 高| 。

效果個人認為都達不到預期,在實測1中,竟然只有pkuseg切出[蘋果]、只有jieba切出[出貨量]、只有thulac切出[下調]…。

如果連第一步都分不出詞,後續的關鍵詞統計效果基本上也不會很好,因此就沒有繼續做下去。

6. 大漲、大跌之關鍵句型:

既然關鍵詞不好做,那我想知道能不能找出關鍵句子

在這裡有點與關鍵詞的做法不同,關鍵詞是統計單詞的出現次數,但是句子幾乎不會重複出現,因此,我想出一個方法,就是先將句子進行Clustering,再來觀察在大漲、大跌新聞中各種句子cluster出現頻率是否有顯著差異。

實際作法如下:(1) 將文章切割成句子。
(2) 將句子按照長度分為短句、中短句、中長句三組。
(3) 將句子透過預訓練好的BERT Multi-Language Model轉換為句向量。
(4) 將句向量依Mini Batch K-means分群為2048群。
(5) 計算句子群的TF,DF,Chi-Square值。
(6) 找出大漲關鍵句子群。
(7) 找出大跌關鍵句子群。
(8) 觀察結果。

(1) 將文章切割成句子:

總新聞數為12,948篇,經標點符號切割後有797,049個句子,平均每篇新聞有61.6個句子,句子長度中位數是10。

(2) 句子長度分類:

為了去除句子長度在比較句子意義上的影響,我將句子按照長度分為三個類別,分別為長度3–7的短句(258,170句)、長度8–12的中短句(284,832句)、長度13–28的中長句(254,047句)。

(3) 生成句子向量:

透過bert-as-service使用Google預訓練好的BERT Model(此處選用多語言版本BERT-Base, Multilingual Cased),為每個句子生成句向量(Sentence Embedding),每一個句子轉換成一個768維的向量。

(4) 句子Clustering:

在將句子進行Clustering時,必須同時讓Cluster內的Variance足夠小,又要讓每個Cluster的大小不至於過小,因此如果使用K-Means Clustering的話,如何選取k就很重要。此處尚未嘗試使用降維技術,而直接用Mini Batch K-means做分群,k選擇2048。

(5) 計算句子群的TF, DF, Chi-Square值:

我們總共會計算的參數包括:

全部TF: 此[句子cluster]在所有新聞中出現的總次數
全部DF: 此[句子cluster]在所有新聞中出現在多少篇新聞中
全部TF-IDF: (1+log(全部TF))*log(新聞總數/全部DF),TF-IDF原理可網搜。
大漲TF: 此[句子cluster]在大漲新聞(當天漲幅超過2%)中出現的總次數
大漲DF: 此[句子cluster]在大漲新聞中出現在多少篇新聞中
大漲TF-IDF: (1+log(大漲TF))*log(大漲新聞數/大漲DF)
大漲TF期望值: 全部TF/新聞總數*大漲新聞數
大漲DF期望值: 全部DF/新聞總數*大漲新聞數
大漲TF卡方值(保留正負號): (大漲TF-大漲TF期望值)^2 / 大漲TF期望值
大漲DF卡方值(保留正負號): (大漲DF-大漲DF期望值)^2 / 大漲DF期望值
大跌與大漲相仿,此略。

(6) 找出大漲關鍵句子群

嘗試不同組合後,發覺[大漲TF卡方值*大漲DF卡方值*全部TF-IDF]的組合可以很好的表達關鍵句型,在此稱之為[句子關鍵性],我們分別列出句子關鍵性最高的句子群。

短句:

cluster short 135: (關鍵性:16743)
1.47 萬張
8.43 萬張
cluster short 1011: (關鍵性:12053)
盤中焦點股
盤中焦點股
cluster short 1529: (關鍵性:9759)
季增45.3%
年增 1.2%
cluster short 1813: (關鍵性:6523)
台半5425
台半5425
cluster short 1253: (關鍵性:6035)
在過去是很少見
等待來年再戰

中短句:

cluster med 59: (關鍵性:90792)
4.三星 5007
5.麗清 3346
cluster med 1570: (關鍵性:52483)
月增24.65%
月增 17.67%
cluster med 362: (關鍵性:38874)
5.康舒 6282
24.花仙子 1730
cluster med 1571: (關鍵性:20951)
股價漲4.17%
股價漲3.02%
cluster med 1174: (關鍵性:20393)
3.台積電 2330
7.台積電 2330

中長句:

cluster long 589: (關鍵性:35981)
第 9 名中鋼 5033 張
第 5 名強茂 7198 張
cluster long 1870: (關鍵性:14958)
11月營收13.48億元、年增12.92%
10月營收月增21.22%、年增103.66%
cluster long 510: (關鍵性:8273)
道瓊指數週三收盤飆漲超過千點或5%
指數盤中一度大漲逾 190 點
cluster long 2036: (關鍵性:8082)
前3名依序為鴻海 2317
第 5 名中信金 7405 張
cluster long 520: (關鍵性:6635)
柏承 11 月營收 3.1 億
元瑞祺電 11 月營收 3.62 億元

(7) 找出大跌關鍵句子群

計算 [大跌TF卡方值*大跌DF卡方值*全部TF-IDF],我們可以得出大跌關鍵句子群如下(分別列前5名):

短句:

cluster short 1388: (關鍵性:39873)
跌3.21%
跌1.14%
cluster short 1491: (關鍵性:23724)
以二二點三元
三率三升
cluster short 543: (關鍵性:10335)
跌點仍超過百點
雖跌勢一度收斂
cluster short 931: (關鍵性:10303)
有限公司
有限公司
cluster short 141: (關鍵性:8326)
跌幅8.6%
跌幅1.17%

中短句:

cluster med 1192: (關鍵性:25342)
每股盈餘3-3.5元
每股盈餘10.38元
cluster med 797: (關鍵性:18161)
最高一度達71.8元
價位最低來到 67.6 元
cluster med 952: (關鍵性:15025)
美金1元交易總金額
美金0.1元交易總金額
cluster med 1441: (關鍵性:10765)
2375智寶 -424
2399映泰 -687
cluster med 139: (關鍵性:10451)
不過因外資陸續放假
因營運前景較不明朗

中長句:

cluster long 307: (關鍵性:113154)
鴻海第三季稅後純益 248.76 億元
公司第三季營業利益約7390萬美元
cluster long 618: (關鍵性:63114)
營業毛利 80,803,909
母公司業主 24,875,846
cluster long 55: (關鍵性:56818)
鴻海第三季毛利率、營益率、淨利率3率表現雖見改善
華碩第三季毛利率、營益率雙率雙降
cluster long 1739: (關鍵性:26441)
營業費用 推銷費用 8,658,5630.61
管理費用 20,405,697
cluster long 826: (關鍵性:22808)
以大型股為主的A50指數挫跌207.40點或1.99%
以科技股為主的那斯達克指數下跌33.268點

(8) 觀察結果

大漲:

  • 大漲的句子確實比較偏正向,包括[季增xx]、[年增xx]、[月增xx]、[飆漲xx]、[大漲xx]、[股價漲xx]…。
  • 描述到某些個股時,2317漲的機會或許會提升,比如:2330、5425。
  • 若鴻海出現在盤中焦點股中,那麼大漲的機會提高。
  • 長句的Cluster 589, 2036都是在描述買賣超情形,若鴻海前一日買賣超張數特別多,隔日可能會大漲。

大跌:

  • 大跌的句子確實比較偏負向,包括[跌xx]、[跌幅xx]、[跌點]、[跌勢]、[前景不明朗]、[雖然xxx]、[降]…。
  • 中短句的Cluster 139中發現到都是負面(情緒)描述,[外資尚未回頭]、[已為連續 2 周收黑]、[但銷售卻不如預期]…。

7. 結論:

確實通過一個新穎的關鍵句型研究方法,我們似乎在新聞描述中能找到一些大漲、大跌的徵兆。當然,還是有某些句型我們難以解釋為何結果會是大漲/大跌,是巧合嗎?或著有更深層的關聯性是值得研究的?

另外一個研究設定上的問題就是,究竟哪些時刻的新聞會影響到哪些時刻的股價變化。這裡是假設盤前和盤中的新聞可能會造成收盤結果大漲/大跌,但或許是在盤中已經大漲/大跌了,新聞才報出這些[漲]、[跌]字。因此,此處的結果距離我們想做到的純粹預測還是有段落差,在時間差的設定上還需要再調整。

接著,我們會試著用模型來預測[大漲]/[大跌]。

--

--

Bert Lee // 李慕家
Bert Lee // 李慕家

Written by Bert Lee // 李慕家

Seek & Find | DS @WBD | Former DS @Disney+ & @DBS Bank | Yale & NTU Alumni | LinkedIn: https://www.linkedin.com/in/bertmclee/

No responses yet