专栏名称: 挖地兔
金融数据采集与挖掘,开启量化金融的第一扇大门。
目录
相关文章推荐
小米汽车  ·  诚邀500位米粉北京相见❤️-2025022 ... ·  10 小时前  
东方财富网  ·  尊界5月底上市!鸿蒙智行“五界”一览 ·  昨天  
东方财富网  ·  尊界5月底上市!鸿蒙智行“五界”一览 ·  昨天  
小米汽车  ·  小米SU7 ... ·  昨天  
比亚迪汽车  ·  比亚迪守护温暖回家路 ·  2 天前  
51好读  ›  专栏  ›  挖地兔

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

挖地兔  · 公众号  ·  · 2019-06-05 11:56

正文

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

前言


看到米哥和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







请到「今天看啥」查看全文