55

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

 4 years ago
source link: https://www.tuicool.com/articles/V3YJBfU
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者简介:合肥工业大学经济学院学生

bEFrAjV.jpg!web

2amY7v7.jpg!web

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

本项目主要实现逻辑:

1.数据结构化

2. 配置neo4j

3. 数据处理

4. 导入neo4j

5. 查看关联信息

数据获取

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

z2i2yeu.jpg!web

QbYziem.jpg!web

nAFRBvZ.jpg!web

eiYr6fy.jpg!web

f2MBFnN.jpg!web

获取数据代码如下,将获取的数据储存到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;

EZnaQzy.jpg!web

3

运行Ne4j

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

JJbqM3z.jpg!web

4

访问Ne4j

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

UV3Une2.jpg!web

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也可以是英文或中文

m6nINfv.jpg!web

stock.csv文件

m2YbEnb.jpg!web

executive.csv文件

n2YVRn2.jpg!web

industry.csv文件

Jv6nMbq.jpg!web

holders.csv文件

ZNjI7nz.jpg!web

concep.csv文件

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

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

MvaEVjz.png!web

stock_cocept.csv文件

zMnyQnQ.png!web

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/

jqymmif.jpg!web

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

RVf2auJ.jpg!web

2

连接数据库

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

UJnq6je.jpg!web

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

查找关联信息

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

mAZRBnA.jpg!web

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

 match(n) return n


查看一个企业关联方

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

zya2eeu.jpg!web

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

002303美盈森股票具体情况:

BNvuiuN.jpg!web

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

7jIzYv2.jpg!web

6BN3IjQ.jpg!web

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

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

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

BjYNNvq.jpg!web

【扩展阅读】

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

知识图谱及金融相关

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

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

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK