手把手教學(xué)構(gòu)建證券知識(shí)圖譜/知識(shí)庫(kù)(含碼源)關(guān)系可視化展示
手把手教學(xué)構(gòu)建證券知識(shí)圖譜/知識(shí)庫(kù)(含碼源):網(wǎng)頁(yè)獲取信息、設(shè)計(jì)圖譜、Cypher查詢、Neo4j關(guān)系可視化展示
demo展示:

碼源下載見(jiàn)文末跳轉(zhuǎn)
碼源下載見(jiàn)文末跳轉(zhuǎn)
1.數(shù)據(jù)源
本項(xiàng)目需要用到兩種數(shù)據(jù)源:一種是公司董事信息,另一種是股票的行業(yè)以及概念信息。
公司董事信息
這部分?jǐn)?shù)據(jù)包含在data目錄下的stockpage壓縮文件中,?面的每一個(gè)文件是以XXXXXX.html命名,其中XXXXXX是股票代碼。這部分?jǐn)?shù)據(jù)是由同花順個(gè)股的?頁(yè)爬取而來(lái)的,執(zhí)行解壓縮命令unzip stockpage.zip即可獲取。比如對(duì)于600007.html,這部分內(nèi)容來(lái)自于http://stockpage.10jqka.com.cn/600007/company/#manager
股票行業(yè)以及概念信息
這部分信息也可以通過(guò)?上公開(kāi)的信息得到。在這里,我們使用Tushare工具來(lái)獲得,詳細(xì)細(xì)節(jié)見(jiàn)之后具體的任務(wù)部分。
2.從?頁(yè)中抽取董事會(huì)的信息
在我們給定的html文件中,需要對(duì)每一個(gè)股票/公司抽取董事會(huì)成員的信息,這部分信息包括董事會(huì)成員“姓名”、“職務(wù)”、“性別”、“年齡”共四個(gè)字段。首先,姓名和職務(wù)的字段來(lái)自于:

在這里總共有12位董事成員的信息,都需要抽取出來(lái)。另外,性別和年齡字段也可以從下附圖里抽取出來(lái):

最后,生成一個(gè) executive_prep.csv文件,格式如下:
注:建議表頭最好用相應(yīng)的英文表示。
3.獲取股票行業(yè)和概念的信息
分類(lèi)數(shù)據(jù)_提供股票的分類(lèi)信息數(shù)據(jù),從股票類(lèi)型的不同角度進(jìn)行數(shù)據(jù)分類(lèi),在一些統(tǒng)計(jì)套利方法的應(yīng)用中,時(shí)常會(huì)以股票的分類(lèi)來(lái)做切入,比如對(duì)某些行業(yè)或概念進(jìn)行階段統(tǒng)計(jì)來(lái)決定近期的交易策略等。TuShare 提供的分類(lèi)數(shù)據(jù)主要包括以下類(lèi)別:
行業(yè)分類(lèi)
概念分類(lèi)
地域分類(lèi)
中小板分類(lèi)
創(chuàng)業(yè)板分類(lèi)
風(fēng)險(xiǎn)警示板分類(lèi)
滬深 300 成份股及權(quán)重
上證 50 成份股
中證 500 成份股
終止上市股票列表
暫停上市股票列表
行業(yè)分類(lèi)
在現(xiàn)實(shí)交易中,經(jīng)常會(huì)按行業(yè)統(tǒng)計(jì)股票的漲跌幅或資金進(jìn)出,本接口按照 sina 財(cái)經(jīng)對(duì)滬深股票進(jìn)行的行業(yè)分類(lèi),返回所有股票所屬行業(yè)的信息??紤]到是一次性在線獲取數(shù)據(jù),調(diào)用接口時(shí)會(huì)有一定的延時(shí),請(qǐng)?jiān)跀?shù)據(jù)返回后自行將數(shù)據(jù)進(jìn)行及時(shí)存儲(chǔ)。sina 財(cái)經(jīng)提供的行業(yè)分類(lèi)信息大致如下圖所示:

返回值說(shuō)明:
code:股票代碼
name:股票名稱(chēng)
c_name:行業(yè)名稱(chēng)
對(duì)于這部分信息,我們可以利?工具Tushare來(lái)獲取,官網(wǎng)為http://tushare.org/ ,使用pip命令進(jìn)行安裝即可。下載完之后,在python里即可調(diào)用股票行業(yè)和概念信息。參考鏈接:http://tushare.org/classifying.html#id2
通過(guò)以下的代碼即可獲得股票行業(yè)信息,并把返回的信息直接存儲(chǔ)在stock_industry_prep.csv文件里。
import tushare as ts
df = ts.get_industry_classified()
# TODO 保存到"stock_industry_prep.csv"
類(lèi)似的,可以通過(guò)以下代碼即可獲得股票概念信息,并把它們存儲(chǔ)在stock_concept_prep.csv文件里。
df = ts.get_concept_classified()
# TODO 保存到“stock_concept_prep.csv”
4.設(shè)計(jì)知識(shí)圖譜
設(shè)計(jì)一個(gè)這樣的圖譜:
創(chuàng)建“人”實(shí)體,這個(gè)人擁有姓名、性別、年齡
創(chuàng)建“公司”實(shí)體,除了股票代碼,還有股票名稱(chēng)
創(chuàng)建“概念”實(shí)體,每個(gè)概念都有概念名
創(chuàng)建“行業(yè)”實(shí)體,每個(gè)行業(yè)都有?業(yè)名
給“公司”實(shí)體添加“ST”的標(biāo)記,這個(gè)由LABEL來(lái)實(shí)現(xiàn)
創(chuàng)建“人”和“公司”的關(guān)系,這個(gè)關(guān)系有董事長(zhǎng)、執(zhí)行董事等等
創(chuàng)建“公司”和“概念”的關(guān)系
創(chuàng)建“公司”和“行業(yè)”的關(guān)系
設(shè)計(jì)結(jié)果如下:

注:實(shí)體名字和關(guān)系名字需要易懂,對(duì)于上述的要求,并不一定存在唯一的設(shè)計(jì),只要能夠覆蓋上面這些要求即可?!癝T”標(biāo)記是?用來(lái)刻畫(huà)?個(gè)股票嚴(yán)重虧損的狀態(tài),這個(gè)可以從給定的股票名字前綴來(lái)判斷,背景知識(shí)可參考百科ST股票,“ST”股票對(duì)應(yīng)列表為['*ST', 'ST', 'S*ST', 'SST']。
ST 股票,意即“特別處理”的股票。該政策針對(duì)的對(duì)象是出現(xiàn)財(cái)務(wù)狀況或其他狀況異常的。1998年4月22日,滬深交易所宣布,將對(duì)財(cái)務(wù)狀況或其它狀況出現(xiàn)異常的上市公司股票交易進(jìn)行特別處理(Special Treatment),由于“特別處理”,在簡(jiǎn)稱(chēng)前冠以 ST,因此這類(lèi)股票稱(chēng)為 ST 股。
5.創(chuàng)建可以導(dǎo)?Neo4j的csv文件
在前兩個(gè)任務(wù)里,我們已經(jīng)分別生成了 executive_prep.csv, stock_industry_prep.csv, stock_concept_prep.csv,但這些文件不能直接導(dǎo)入到Neo4j數(shù)據(jù)庫(kù)。所以需要做?些處理,并生成能夠直接導(dǎo)入Neo4j的csv格式。 我們需要生成這?個(gè)文件:executive.csv, stock.csv, concept.csv, industry.csv, executive_stock.csv, stock_industry.csv, stock_concept.csv。對(duì)于格式的要求,請(qǐng)參考:https://neo4j.com/docs/operations-manual/current/tutorial/import-tool/

6.利用上面的csv文件生成數(shù)據(jù)庫(kù)
neo4j_home$ bin/neo4j-admin import --id-type=STRING --nodes executive.csv --nodes stock.csv --nodes concept.csv --nodes industry.csv --relationships executive_stock.csv --relationships stock_industry.csv --relationships stock_concept.csv
這個(gè)命令會(huì)把所有的數(shù)據(jù)導(dǎo)入到Neo4j中,數(shù)據(jù)默認(rèn)存放在 graph.db 文件夾里。如果graph.db文件夾之前已經(jīng)有數(shù)據(jù)存在,則可以選擇先刪除再執(zhí)行命令。
把Neo4j服務(wù)重啟之后,就可以通過(guò)localhost:7474觀察到知識(shí)圖譜了。
注意:這些csv要放到~/.config/Neo4j Desktop/Application/neo4jDatabases/database-xxxx/installation-4.0.4下,即與bin文件夾同級(jí),否則需要絕對(duì)路徑
簡(jiǎn)單查詢命令
# 查詢node
MATCH (n:Concept) RETURN n LIMIT 25
# 查詢r(jià)elationship
MATCH p=()-[r:industry_of]->() RETURN p LIMIT 100
7.基于構(gòu)建好的知識(shí)圖譜,通過(guò)編寫(xiě)Cypher語(yǔ)句回答如下問(wèn)題
(1) 有多少個(gè)公司目前是屬于 “ST”類(lèi)型的?
match (n:ST) return count(distinct(n)) 104
(2) “600519”公司的所有獨(dú)立董事人員中,有多少人同時(shí)也擔(dān)任別的公司的獨(dú)立董事職位?
MATCH (m:Company{code:'600519'})<-[:employof{jobs:'獨(dú)立董事'}]-(n:Person)-[:employof{jobs:'獨(dú)立董事'}]->(q:Company) RETURN count(distinct(n)) 3
(3) 有多少公司既屬于環(huán)保行業(yè),又有外資背景?
MATCH (:Concept{name:'外資背景'})<-[:conceptof]-(m:Company)-[:industryof]-(:Industry{name:'環(huán)保行業(yè)'}) RETURN count(distinct(m)) 0
(4) 對(duì)于有鋰電池概念的所有公司,獨(dú)立董事中女性人員比例是多少?
MATCH (m:Concept{name:'鋰電池'})<-[:conceptof]-(n:Company)<-[:employof{jobs:'獨(dú)立董事'}]-(p:Person{gender:'女'}) MATCH (m:Concept{name:'鋰電池'})<-[:conceptof]-(n:Company)<-[:employof{jobs:'獨(dú)立董事'}]-(p2:Person) RETURN count(distinct(p))*1.0/count(distinct(p2)) 0.3541666666666667
8.構(gòu)建人的實(shí)體時(shí),重名問(wèn)題具體怎么解決?
(1) 最好的方式是用身份證或者其他唯一能確定人的方式去關(guān)聯(lián)。 (2) 在本例中,我用 姓名、年齡、性別3個(gè)字段做唯一的,將這3個(gè)字段做md5。
碼源下載見(jiàn)文末跳轉(zhuǎn)
碼源下載見(jiàn)文末跳轉(zhuǎn):(https://blog.csdn.net/sinat_39620217/article/details/131587291)
更多優(yōu)質(zhì)內(nèi)容請(qǐng)關(guān)注公號(hào)&知乎:汀丶人工智能;會(huì)提供一些相關(guān)的資源和優(yōu)質(zhì)文章,免費(fèi)獲取閱讀。