谷葆春
(北京信息科技大學計算機學院,北京100101)
對于短線的股票交易者來說,每天的復盤工作是重要的環節,第二天買和賣的股票大部分都是在復盤的時候發現并做好交易計劃的。而每天漲停的股票是市場的焦點票,吸引了游資和眾多交易者的關注,因此每天對漲停的股票進行復盤和分析,是短線交易員非常基礎和重要的工作。用手工的方法復盤,對漲停股票進行梳理和分析,會花費大量的時間和人力成本,用軟件來實現每天的漲停板股票分析則能有效地解決這一問題。
目前市面上的交易軟件很多,它們包含每天的股票數據,也能提供選股器方便用戶的選股操作,但能自動實現每天復盤工作的軟件基本沒有。所以本項目開發了一個自動的漲停板復盤軟件,系統通過爬蟲抓取東方財富網上提供的漲停股票數據,包括價格、漲跌幅、成交量、換手率、漲停時間等,確定各支股票所屬的板塊,然后給出各板塊的龍頭股。
由于一支股票的漲停可能是多個原因造成的,而漲停的原因對于分析股票接下來的持續性有很大的影響,所以系統通過爬取新浪財經里的各股票的財報、研報和公司公告,判斷是否由于基本面和股權變更等原因漲停;爬取新浪搜索內的股票新聞,判斷是否由于消息面和政策面漲停。
對于多數據源爬蟲來說,最重要的是設置合理的URL 隊列。系統對公告、財報和研報的爬取采取廣度優先遍歷策略,首先確定這三個數據加入URL 隊列中的順序,由于每只股票的公告、財報和研報數據有很多條,而判斷漲停原因只需要最近的數據,所以系統只爬取前五條的信息。接著依次將公告、財報和研報頁面的前五個URL 加入隊列,第五條之后的數據和其他與主題無關的數據則不進入URL 隊列。
每篇公告、研報或新聞的數據量通常都很多,所以系統對每個公告、研報和新聞采取抽取摘要的方法簡化數據。目前主流的文本摘要自動生成有兩種方式,分別是抽取式和生成式。抽取式是從整篇文章中獲取一些關鍵句,將這些句子有機組合,得到一篇文章摘要,期間不修改句子本身。而生成式則是計算機通過自然語言處理對文章的內容進行分析和理解,再使用自然語言生成技術,生成不同于文章中原有句子的自動文章摘要。本系統的摘要采用抽取式中的TextRank算法。
系統整體結構圖如圖1 所示。

圖1 系統結構圖
系統有兩個爬蟲,一個是爬取股票的數據,另一個是為了判斷漲停原因而爬取的企業的新聞、公告、財報(包括年報和季報)、研報等信息。
股票數據主要是通過爬取東方財富網站的漲停股池、昨日漲停股池和炸板股池三個數據來實現后面的復盤工作。經過分析,這三頁股票數據都采用了AJAX技術,AJAX 是指Asynchronous JavaScript and XML,即異步JavaScript and XML 技術,通過在后臺與服務器進行少量的數據交換,AJAX 可以使網頁實現異步更新,這意味著可以在不重新加載整個網頁的情況下,對網頁的部分數據進行更新。
對于采用了AJAX 技術的網頁,可通過分析AJAX請求,找到對應的加載數據的JavaScript 腳本,從而獲得該頁面上JSON 格式的數據。在Python 中裝載該數據后,即可獲得股票的各數據,包括:股票代碼、股票名稱、漲跌幅、最新價格、成交額、換手率、封板資金、封板時間、總板數、第幾板、連板數和所屬行業,等等,最后將這些數據保存在一個Excel 文件里,為了方便處理也同時保存一份在數據庫里。
由于新上市的股票經常得到投資者的額外關注,所以會產生一定的情緒溢價,新股和次新股也經常被作為一個獨立的板塊進行處理。因此在獲得股票的數據后,對于新股和次新股的股票進行標記,把它們歸屬到新股和次新股板塊。
股票數據爬蟲的流程圖如圖2 所示。

圖2 股票數據爬蟲流程圖
系統關于股票的新聞信息在新浪搜索里爬取,而公告、財報和研報信息則在新浪財經里爬取,系統對這三個數據的爬取采取廣度優先遍歷策略。
對于一只股票來說,先將它的公告URL 加入隊列,由于該頁面內部的URL 眾多,而系統是只爬取前五個公告的信息,前五條后面的公告和其他的非公告信息忽略掉,所以將該頁面上的前5 個公告的URL 加入隊列,并設置狀態為False,表示沒有訪問過。然后隊頭的URL 出列,加入已完成隊列FinishedQueue,并設置它的狀態為True,表示該鏈接已被訪問。爬取到前5 個公告頁面的數據,提取摘要后存入數據庫。再依次將財報和研報的URL 加入當前訪問隊列,分別獲得前五個財報和研報的數據[2]。
對于新聞數據的爬取與公告等信息有所不同,需要使用Selenium 工具模擬用戶的登錄操作。在新浪搜索頁面中輸入某只股票的名稱,點擊搜索后會搜出很多近期關于這只股票的新聞消息,為了獲得這些消息頁面的URL 地址,系統采取動態抓取的方法,使用Selenium 工具。Selenium 是在程序中通過代碼調用瀏覽器,模擬用戶輸入關鍵詞并查找的過程。Selenium 首先在新浪搜索頁面查找輸入框輸入關鍵詞,再點擊搜索按鈕實現搜索功能,這時候將獲得結果頁面的前五個新聞URL 加入隊列。
算法的實現過程如下:
Step 1:公告進入URL 隊列。
Step 2:獲取前5 個數據的URL,依次加入URL隊列。
Step 3:隊頭URL 出列,標記為True。
Step 4:獲取前5 條的信息存入數據庫。
Step 5:若未獲得財報的數據,則財報的URL 入隊列,轉至Step2;若已獲得,則轉至Step6。
Step 6:若未獲得研報的數據,則研報的URL 入隊列,轉至Step2;若已獲得,則轉至Step7。
Step 7:若未獲得新聞的數據,則對新聞頁面使用Selenium 工具進行處理,然后將新聞的URL 入隊列,轉至Step3;若已獲得,則轉至Step8。
Step 8:任務結束。
漲停的原因分析需要獲得股票的公告、新聞、研報和財報等數據,這些數據內容較多,逐一閱讀較為繁瑣也沒有必要,這時候可對這些內容進行自動摘要處理,這屬于自然語言處理的范疇。目前主流的文本摘要自動生成有兩種方式,分別是抽取式和生成式。本系統的摘要采用抽取式中的TextRank 算法。
TextRank 是一種文本排序算法,由谷歌的網頁重要性排序算法PageRank 算法改進而來,它能夠從一個給定的文本中提取出該文本的關鍵詞和關鍵詞組,并使用抽取式的自動文摘方法提取出該文本的關鍵句。
PageRank 算法早期主要用于對在線搜索結果中的網頁進行排序,它根據互聯網上頁面之間的鏈接關系給出一個正實數,即PageRank 值,表示每個頁面的重要程度。PageRank 值越高,說明網頁越重要,在互聯網搜索的排序中越可能被排在前面。
若整個互聯網是一個有向圖,節點是網頁,每條邊是轉移概率。網頁瀏覽者在每個頁面上依照連接出去的超鏈接,以等概率跳轉到下一個網頁,并且在網頁上持續不斷地進行這樣的隨機跳轉,這個過程形成了一階馬爾科夫鏈。在不斷地跳轉之后,這個馬爾科夫鏈會形成一個平穩分布,而PageRank 就是這個平穩分布,每個網頁的PageRank 值就是平穩概率。
隨機瀏覽模型中每個網頁的PR(PageRank)值,可通過以下公式計算:

其中:PR(i)為網頁i 的PR 值,L(j)為網頁j 的對外鏈出數,Bi 為所有鏈接到網頁i 的網頁集合,n 為網絡中網頁的總數,d 為阻尼系數,即按照超鏈接進行瀏覽的概率,一般取經驗值為0.85,1-d 為瀏覽者隨機跳轉到一個新網頁的概率。一個網頁的PR 值是由其他網頁的PR 值計算得到的。由于PR=A*PR(A 為概率轉移矩陣)滿足馬爾科夫鏈的性質,那么通過迭代可以得到所有網頁的PR 值。經過重復計算,這些網頁的PR 值會趨于正常和穩定。
TextRank 算法是由PageRank 算法改進而來的,它用句子代替網頁,任意兩個句子的相似性等價于網頁轉換概率,相似性得分存儲在一個方形矩陣中,類似于PageRank 中的矩陣A。用句子的相似度代替網頁的轉移概率,用歸一化的句子相似度代替了PageRank 中相等的轉移概率,這意味著在TextRank 中,所有節點的轉移概率不會完全相等。它的核心公式如下:

其中i=1,2,…n,ωji表示邊的權重,也就是句子之間的相似度。in(Vi)是指向網頁Vi 的網頁集合,Out(Vi)是網頁Vi 鏈接出去的網頁集合[3]。
Step 1:把所有文章整合成文本數據,并把文本分割成單個句子。
Step 2:文本預處理,包括去除停用詞和非漢字字符,并進行分詞。
Step 3:加載Word2Vec 詞向量,先得到句子中的所有詞語的詞向量,然后求詞向量的平均值,作為該句子的向量表示。
Step 4:計算句子向量間的相似性并存放在矩陣中,作為轉移概率矩陣A。
Step 5:然后將轉移概率矩陣轉換為以句子為節點、相似性得分為邊的圖結構,用于句子的TextRank計算。
Step 6:對句子按照TextRank 值進行排序,排名最靠前的10 個句子作為摘要[1]。
每只股票的漲停都是有原因的,可能是基本面、消息面、股權相關原因,還可能是資金面,或是新股或次新股的原因。
獲得了某只股票的各種信息后,可綜合判斷漲停的原因,如2020 年9 月7 日的海立股份漲停,它的板塊屬性有:大數據、廣東板塊、國家安防、軍工、量子通信、區塊鏈、人工智能、軟件服務、網絡安全、云計算等,最后通過該股票的新聞,發現它成功地收購了馬瑞利汽車空調的相關資產,所以它的漲停原因是并購,所屬的板塊應為泛股權。
有了漲停股池的數據,各股票漲停的原因和所屬板塊也判斷出來后,就可以確定每個板塊的龍頭股了。龍頭股確定的方法是,漲停板數最多的股票為龍頭股,如果板數相同則通過比較股票的漲停時間來確定,如同樣都是3 板,漲停時間早的就是龍頭股。每天也會有股票漲停,但因為某些原因最后沒有封住,又出現了下跌,這些漲停被砸的股票可直接通過爬蟲獲取數據后,也顯示出來,從而分析漲停又開板的原因,對整個股市的行情有一個綜合的認知。
2020 年9 月7 日部分復盤結果如表1 所示。

表1 復盤結果
漲停板股票的復盤難點在于,股票漲停原因的分析和所屬板塊的確定。股票漲停的原因有很多,有時即使漲停,對其原因的分析也是智者見智,不同的機構常給出不同的結論,所以股票漲停所屬的板塊也經常產生分歧,對它的分析也可結合次日股票的走勢情況來繼續進一步判斷。本文中對股票新聞等信息的自動摘要生成采取了抽取式,還可以采取生成式,基于神經網絡和深度學習的方法實現。獲得更為準確的股票數據摘要信息,對于判斷股票漲停的原因也會產生更加有益的幫助。