基于 Neo4j 和 Tushare 数据构建小型金融知识图谱

看到米哥和Libra的关于知识图谱的文章,又在近期完成证券分析的课设,想到了关联方分析能不能用知识图谱进行可视化操作,就运用neo4j进行了小型金融知识图谱尝试,基于tushare数据实现股票与行业、股东、概念股、高管信息的知识图谱。

本项目主要实现逻辑:

1.数据结构化

2. 配置neo4j

3. 数据处理

4. 导入neo4j

5. 查看关联信息

数据获取

Libra获取的关联数据主要是行业信息,我这次做的全一点,主要采用的API接口有:stock_basic、top10_holders、concept、concept_detail。同时我还对东方财富中的高管信息进行爬取了,这个就不详述了,用requests包或者其他进行爬取(刚学习不会scrapy框架,代码差轻喷)。
注:红框为需要获取的数据

获取数据代码如下,将获取的数据储存到csv文件中,neo4j支持csv格式:

import tushare as ts
import csv
import time
import pandas as pd

pro = ts.pro_api('1dbda79ce58d052196b7ddec1663d53e4ea20571195a1a6055aab0c7')

# 获取stock_basic
stock_basic = pro.stock_basic(list_status='L', fields='ts_code, symbol, name, industry')
# 重命名行,便于后面导入neo4j
basic_rename = {'ts_code': 'TS代码', 'symbol': '股票代码', 'name': '股票名称', 'industry': '行业'}
stock_basic.rename(columns=basic_rename, inplace=True)
# 保存为stock.csv
stock_basic.to_csv('stock.csv', encoding='gbk')

# 获取top10_holders
holders = pd.DataFrame(columns=('ts_code', 'ann_date', 'end_date', 'holder_name', 'hold_amount', 'hold_ratio'))
# 获取一年内所有上市股票股东信息(可以获取一个报告期的)
for i in range(3610):
    code = stock_basic['TS代码'].values[i]
    top10_holders = pro.top10_holders(ts_code=code, start_date='20180101', end_date='20181231')
    holders = holders.append(top10_holders)
    time.sleep(0.3)# 数据接口限制
# 保存为holders.csv
holders.to_csv('holders.csv', encoding='gbk')

# 获取concept,并查看概念分类数量
concept = pro.concept()
concept.to_csv('concept_num.csv', encoding='gbk')

# 获取concept_detail
concept_details = pd.DataFrame(columns=('id', 'concept_name', 'ts_code', 'name'))
for i in range(358):
    id = 'TS' + str(i)
    concept_detail = pro.concept_detail(id=id)
    concept_details = concept_details.append(concept_detail)
    time.sleep(0.3)
# 保存为concept_detail.csv
concept_details.to_csv('concept.csv', encoding='gbk')

获取所有concept_detail和holders用了一个蠢办法,本人自学学艺不精,望谅解,整个代码运行速度非常慢,大概10多分钟才结束,请教大佬如何优化代码。

配置Neo4j

因为没有深入学习过,就简单介绍一下neo4j。neo4j是一个高性能的,NOSQL图形数据库。比传统的关系型数据库快1000倍,neo4j将关系分为节点(nodes)和关系(relationships)两部分,节点和关系均可以有不同的属性。

1

下载Ne4j

官网:https://neo4j.com
好像需要注册才能下载,下载桌面版或者community版本。

2

配置Ne4j

配置系统环境变量

NEO4J_HOME = C:\download\Neo4j\neo4j-community-3.5.5-windows\neo4j-community-3.5.5

Path = %NEO4J_HOME%\bin;

3

运行Ne4j

以管理员身份在cmd运行neo4j.bat console
正常运行看见starting就是成功了,配置好了会有下面弹出(不需要重复启动,一个坑)

4

访问Ne4j

neo4j是在网址查看数据库的,所以在浏览器使用http://localhost:7474/browser/网址查看即可。第一次启动会出现修改账号密码,默认账号密码均为neo4j。

5

注册Ne4j服务

以管理员身份在cmd运行 neo4j install-serivce
开启neo4j服务:neo4j start
停止neo4j服务:neo4j stop(导入新数据库时需要用,或者选择重启)
重启neo4j服务:neo4j restart

数据处理

完成数据爬取和neo4j配置,neo4j对数据有一定要求,需要对数据进行处理才能导入neo4j。
数据分两种类型,节点数据和关系数据,节点数据必须包含:ID, :LABEL,关系数据中必须包含:START_ID, :END_ID, :TYPE三个。
节点数据文件有concept.csv, execustive.csv, holders.csv, industry.csv等四个文件;
注意:其中:ID必须唯一,所以控制一下,:ID也可以是英文或中文

stock.csv文件

executive.csv文件

industry.csv文件

holders.csv文件

concep.csv文件

关系数据文件有execustive_stock.csv, holders_stock.csv, stock_concept.csv, stock_industry.csv等四个文件。(这里都差不多就展示两个文件)

注意:开始和结束代表方向,需要注意一下。

stock_cocept.csv文件

holders_stock.csv

需要注意的事项:

1. 每一个高管或行业或持股人应该具有唯一的ID

2.ID和ID之间一定要有对应,可以一对多或多对多,但一定要有对应,不然会报错找不到对应关系

3. 保存之后用文件另存为utf-8编码模式,不然导入neo4j后会乱码

4.股票代码在csv文件进行编辑后保存,在txt文件中发现少0,可以在Excel中使用公式

=REPT(0,6-LEN(需要补充的单元格))&(需要补充的单元格),股票代码格式统一,防止导入生成图谱不对应

5. 在holders.csv文件中可以只有一个报告期的,不然做出来的图会出现4条线关系

导入Ne4j

1

导入数据

neo4j导入有两种方式,可以在浏览器中输入命令手动导入,也可以通过cmd运行neo4j-admin import进行导入,本文采用第二种方式。
在cmd模式下转到neo4j中的bin目录,新建import目录,将处理的数据复制到其中。
cmd运行代码:

neo4j-admin import --mode=csv --database=stock.db --nodes import/executive.csv --nodes import/stock.csv --nodes import/concept.csv --nodes import/industry.csv --relationships import/executive_stock.csv --relationships import/stock_industry.csv --relationships import/stock_concept.csv 

其中–mode=csv代表导入数据类型,–database=stock.db代表导入数据库名称,–nodes代表导入节点,–relationships代表导入关系。
如果直接把数据放在bin文件中,可省去我的import/

数据库文件在\neo4j-community-3.5.5\data\databases

2

连接数据库

参考文章:https://blog.csdn.net/swy520/article/details/79078422
本文采用简单的方式,直接修改conf文件下的neo4j.conf文件进行连接

对标红代码进行修改,去掉前面#,修改后面数据库文件,之后cmd重启neo4j服务器即可连接成功。

查找关联信息

如果你的网页已经能显示如下页面说明你已经成功了,最后进行数据的查看,记得检查数据库名称。

查看所有数据(勿试,会卡)

 match(n) return n

查看一个企业关联方

 match(n{股票代码:'601369'}) return n

就会这两句,然后就是点点点的事情了,查询代码还需要具体学一下。

002303美盈森股票具体情况:

修改节点属性、颜色方法:

至此,所有工作都完成了,除了对股票高管、行业、投资方进行关联分析,还可以将公司新闻、增持股变化加入其中,但数据爬取困难程度也随之提高,本文主要对自己学习的一个总结,同时希望哪位大佬教教我怎么基于时间做知识图谱。

对源代码和本文数据文件有需要的小伙伴,请在本公众号私信回复“小图谱”获得打包下载链接。

更多内容请关注Tushare官方微信公众号“挖地兔”,获得更多内容。

【扩展阅读】

利用Tushare数据实现知识图谱效果

知识图谱及金融相关

Python+SQL无敌组合,值得你Pick!

利用Python创建不同资产组合的基本框架

如何正确使用Pandas库提升项目的运行速度?

如何提升动量因子策略的表现?

利用Python创建不同资产组合的基本框架

被动市场有效性是否真的有作用?

中国数据智能管理峰会7月在上海举办,有兴趣的朋友可以点击“阅读原文”报名参加。