基于tushare的股票数据构建<一>
tushare中提供了很多非常优秀的数据结构,但是并不是所有的数据都对自己有用,这里需要进行构建自己的数据库以方便后续进行数据建模
tushare数据
tushare是完全免费的一个数据源,不只是有股票数据,还有很多期货数据,有着和谐的社区,为了防止有人恶意的申请接口,造成数据拥堵,tushare采用的是注册账号的方式,注册完账号后生成自己的token,之后接口申请的时候带上token就能获取数据。
注册地址:https://tushare.pro/register?reg=261052
积分制度:为了促进维护tushare社区,采用的是积分制度,积分越高具有的权限越大,不过通常注册后送的积分就能够获取到足够的信息了,积分永不消失
数据分类
本次只处理两种类型的数据,一种是基于季度更新数据,另外一种是公司的基本信息数据,进行数据整合与归类
按照季度进行更新的数据主要是关于很多季度报的信息数据,公司的基本信息数据大多都是不怎么变更的信息,比如上市公司所属行业,公司董事等信息。
主要逻辑
数据都是基于tushare上的接口,比如利润表,资产负债表等
前期准备工作:设计好mysql数据库
1从tushare上获取到需要的数据信息
2对数据进行清洗,变换成需要的数据类型等
3将信息整合起来进行存储
需要注意的是单纯的存储信息是比较容易的,但是自己的数据库需要保证信息的准确性与即时性,所以需要对信息进行更新
存储并非一次促成的,可能存储断点续存的需求,所以需要对重复数据进行识别与判定
数据规范表
字段非常多,数据量很大,需要进行数据归类,具有相似结构的数据进行归类存储,这里需要自己事先设计好数据规范表,方便以后进行查询与更改
一下给出我自己的数据规范表,这也是mysql数据的设计方式
按报表数据整合表:这个表是根据数据更新周期为季度的的整合数据,我认为这些数据对我的模型有用
通用字段
- 股票代码(ts_code)
ts_code - 报告日期(end_date)
report_date - 交易所(jys)
jys
财务数据
主营业务构成 - 主营业务来源(bz_item)
bz_item - 主营业务收入(bz_sales)
bz_sales - 主营业务利润(bz_profit)
bz_profit - 主营业务成本(bz_cost)
bz_cost - 主营业务构成是否有数据(if_have_zyywgc)
if_have_zyywgc,1表示有,0表示无
利润表 - 基本每股收益(basic_eps)
basic_eps - 稀释每股收益(diluted_eps)
diluted_eps
- 营业总收入(total_revenue)
total_revenue
- 营业收入(revenue)
revenue
- 营业总成本(total_cogs)
total_cogs
- 营业支出(oper_exp)
oper_exp
- 营业利润(operate_profit)
operate_profit
- 利润总额(total_profit)
total_profit
- 所得税费用(income_tax)
income_tax
- 净利润-含少数股东损益(n_income)
n_income
- 净利润-不含少数股东损益(n_income_attr_p)
n_income_attr_p
- 年初未分配利润(undist_profit)
undist_profit
- 可分配利润(distable_profit)
distable_profit
- 利润表是否有数据(if_have_lrb)
if_have_lrb,1表示有,0表示无
资产负债表
- 末期总股本(total_share)
total_share
- 为未分配利润(undistr_porfit)
undistr_porfit
- 货币资金(money_cap)
money_cap
- 应收账款(accounts_receiv)
accounts_receiv
- 固定资产(fix_assets)
fix_assets
- 无形资产(intan_assets)
intan_assets
- 研发支出(r_and_d)
r_and_d
- 商誉(goodwill)
goodwill
- 资产总计(total_assets)
total_assets
- 应付账款(acct_payable)
acct_payable
- 应交税费(taxes_payable)
taxes_payable
- 资产负债表是否有数据(if_have_zcfzb)
if_have_zcfzb,1表示有,0表示无
现金流量表
- 净利润(net_profit)
net_profit
- 支付的各项税费(c_paid_for_taxes)
c_paid_for_taxes
- 处置固定资产、无形资产、其他长期资产收回的现金净额(n_recp_disp_fiolta)
n_recp_disp_fiolta
- 处置子公司及其他营业单位收到的现金净额(n_recp_disp_sobu)
n_recp_disp_sobu
- 投资支付现金(c_paid_invest)
c_paid_invest
- 取得子公司、及其他营业单位支付的现金净额(n_disp_subs_oth_biz)
n_disp_subs_oth_biz
- 汇率变动对现金的影响(eff_fx_flu_cash)
eff_fx_flu_cash
- 债务转为资本(conv_debt_into_cap)
conv_debt_into_cap
- 现金末期余额(end_bal_cash)
end_bal_cash
- 减现金初期余额(beg_bal_cash)
beg_bal_cash
- 现金流量表是否有数据(if_have_xjllb)
if_have_xjllb,1表示有,0表示无
市场参考数据
前十大股东
- 前十股东名(holder_name)
holder_name
- 前十持有数量(hold_amount)
hold_amount
- 持有比例(hold_ratio)
hold_ratio
- 前十大股东是否有数据(if_have_qsdgd)
if_have_qsdgd,1表示有,0表示无
前十大流通股东
- 流通股东名称(holder_name)
lt_holder_name
- 持有数量(hold_amount)
lt_hold_amount
- 持有比例(lt_hold_ratio)
lt_hold_ratio,数据源网页无法获取,后续计算处理
- 前十大流通股东是否有数据(if_have_ltqsdgd)
if_have_ltqsdgd,1表示有,0表示无
概念明细
- 股票名称(name)
name
- 概念id(id)
gn_id
- 概念名称(concept_name)
concept_name
- 概念股明细列表是否有数据(if_have_gngmxlb)
if_have_gngmxlb,1表示有,0表示无
以上是基于季度的数据整合,我通过多个接口获取我想要的信息
股票的基本信息也是需要的,比如某股票是属于哪个版块,哪个行业,哪些概念,董事,董秘等,这些都关系到选股的时候需要参考的信息
股票基本数据整合表
股票列表信息
- 股票代码(ts_code)
ts_code - 代码(symbol)
symbol - 名称(name)
stock_name - 所在地区(area)
area - 所属行业(industry)
Industry - 市场类型(market)
market - 上市时间(list_date)
list_date - 是否沪深港通标的(is_hs)
is_hs,N表示否,H表示沪股通,S表示深沪通
沪深股通成分股 - 沪深港通类型(hs_type)
hs_type,SH上海,SZ深圳 - 纳入沪深港通时间(in_date)
in_date - 剔除沪深港通时间(out_date)
out_date - 是否沪深港通最新数据(is_new)
is_new,1是,0否 - 沪深港通数据是否存在(if_have_hsgtcf)
if_have_hsgtcf,1存在,0不存在
上市公司基本信息 - 法人代表(chairman)
chairman - 总经理(manager)
manager - 董秘(secretary)
secretary - 注册资本(reg_capital)
reg_capital - 所在省份(province)
province - 所在城市(city)
city - 公司简介(introduction)
introduction - 员工人数(employees)
employees - 主要业务及产品(main_business)
main_business - 经营范围(business_scope)
business_scope - 是否存在上市公司基本信息(if_have_base_info)
if_have_base_info - 更新日期(up_date)
up_date
数据获取前的mysql表格创建
mysql表格是基于自己设计的数据规范表而言的,这种一个mysql表57个字段,加上主键id共58个字段,至少我是记不清每个字段的含义以及字段名的,所以需要事先自己定好,并写好注释,方便以后自己查询与维护
CREATE TABLE `quarterly_list` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ts_code` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '股票代码',
`report_date` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '报告日期',
`jys` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '交易所',
`bz_item` text CHARACTER SET utf8 COMMENT '主营业务来源',
`bz_sales` text CHARACTER SET utf8 COMMENT '主营业务收入',
`bz_profit` text CHARACTER SET utf8 COMMENT '主营业务利润',
`bz_cost` text CHARACTER SET utf8 COMMENT '主营业务成本',
`if_have_zyywgc` int(11) DEFAULT NULL COMMENT '主营业务构成是否有数据',
`basic_eps` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '每股基本收益',
`diluted_eps` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '稀释每股收益',
`total_revenue` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '营业总收入',
`revenue` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '营业收入',
`total_cogs` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '营业总成本',
`oper_exp` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '营业支出',
`operate_profit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '营业利润',
`total_profit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '利润总额',
`income_tax` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '所得税费用',
`n_income` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '净利润_含少数股东损益',
`n_income_attr_p` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '净利润_不含少数股东损益',
`undist_profit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '年初未分配利润',
`distable_profit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '可分配利润',
`if_have_lrb` int(11) DEFAULT NULL COMMENT '利润表是否有数据',
`total_share` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '总股本',
`undistr_porfit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '未分配利润',
`money_cap` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '货币资金',
`accounts_receiv` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '应收账款',
`fix_assets` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '固定资产',
`intan_assets` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '无形资产',
`r_and_d` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '研发支出',
`goodwill` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '商誉',
`total_assets` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '资产总计',
`acct_payable` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '应付账款',
`taxes_payable` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '应交税费',
`if_have_zcfzb` int(11) DEFAULT NULL COMMENT '资产负债表是否有数据',
`net_profit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '净利润',
`c_paid_for_taxes` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '支付的各项税费',
`n_recp_disp_fiolta` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '处置固定资产、无形资产、其他长期资产收回的现金净额',
`n_recp_disp_sobu` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '处置子公司及其他营业单位收到的现金净额',
`c_paid_invest` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '投资支付金额',
`n_disp_subs_oth_biz` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '取得子公司、及其他营业单位支付的现金净额',
`eff_fx_flu_cash` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '汇率变动对现金的影响',
`conv_debt_into_cap` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '债务转为资本',
`end_bal_cash` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '现金末期余额',
`beg_bal_cash` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '减现金初期余额',
`if_have_xjllb` int(11) DEFAULT NULL COMMENT '现金流量表是否有数据',
`holder_name` text CHARACTER SET utf8 COMMENT '前十股东',
`hold_amount` text CHARACTER SET utf8 COMMENT '前十持有量',
`hold_ratio` text CHARACTER SET utf8 COMMENT '持有比例',
`if_have_qsdgd` int(11) DEFAULT NULL COMMENT '前十大股东是否有数据',
`lt_holder_name` text CHARACTER SET utf8 COMMENT '流通股东名称',
`lt_hold_amount` text CHARACTER SET utf8 COMMENT '流通股东持有量',
`lt_hold_ratio` text CHARACTER SET utf8 COMMENT '流通股东持有比例',
`if_have_ltqsdgd` int(11) DEFAULT NULL,
`name_stock` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`gn_id` text CHARACTER SET utf8 COMMENT '概念id',
`concept_name` text CHARACTER SET utf8 COMMENT '概念名称',
`if_have_gngmxlb` int(11) DEFAULT NULL COMMENT '概念明细列表是否有数据',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
股票基本信息配置表
CREATE TABLE `stock_base_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ts_code` varchar(255) DEFAULT NULL COMMENT '股票标识',
`symbol` varchar(255) DEFAULT NULL COMMENT '股票代码',
`stock_name` varchar(255) DEFAULT NULL COMMENT '股票名称',
`area` varchar(255) DEFAULT NULL COMMENT '所在地区',
`industry` varchar(255) DEFAULT NULL COMMENT '所属行业',
`market` varchar(255) DEFAULT NULL COMMENT '市场类型',
`list_date` varchar(255) DEFAULT NULL COMMENT '上市时间',
`is_hs` varchar(255) DEFAULT NULL COMMENT '是否沪深港通标的',
`hs_type` varchar(255) DEFAULT NULL COMMENT '沪深港通类型',
`in_date` varchar(255) DEFAULT NULL COMMENT '纳入沪深港通时间',
`out_date` varchar(255) DEFAULT NULL COMMENT '剔除沪深港通时间',
`is_new` varchar(255) DEFAULT NULL COMMENT '是否沪深港通最新数据',
`if_have_hsgtcf` int(255) DEFAULT NULL COMMENT '沪深港通数据是否存在',
`chairman` varchar(255) DEFAULT NULL COMMENT '法人代表',
`manager` varchar(255) DEFAULT NULL COMMENT '总经理',
`secretary` varchar(255) DEFAULT NULL COMMENT '董秘',
`reg_capital` varchar(255) DEFAULT NULL COMMENT '注册资本',
`province` varchar(255) DEFAULT NULL COMMENT '所在省份',
`city` varchar(255) DEFAULT NULL COMMENT '所在城市',
`introduction` text COMMENT '公司简介',
`employees` varchar(255) DEFAULT NULL COMMENT '员工人数',
`main_business` text COMMENT '主要业务及产品',
`business_scope` text COMMENT '经营范围',
`if_have_base_info` int(11) DEFAULT NULL COMMENT '是否存在上市公司基本信息',
`up_date` date DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3617 DEFAULT CHARSET=utf8;
mysql表格设计完成
导包与配置
这里需要用到pndas进行数据处理,时间社会,tushare导入,下载配置,配置mysql的信息
import tushare as ts
import pandas as pd
from datetime import datetime
import pymysql
LINK_MYSQL = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'passwd': 'Python_123456',
'charset': 'utf8',
'db': 'stock', # 自己的mysql库
}
ts.set_token('填写你自己的token')
pro = ts.pro_api()
不知道怎么获取token的可以直接进入到tushare主页里面的说明,或者参考本人的前一篇文章
需要定义一个判定函数,不是每次从接口中都返回自己期望的数据,有时候因为网络延迟等原因造成数据丢失也是很正常的,有时候别人本来就没有更新数据,当然返回的是空所以需要对获取的数据进行判定
# 定义对获取数据进行判定的函数
def judge_data(data):
# 判定数据是否为空 如果为空则返回false
return False if len(data) == 0 else True
用于判定返回的data数据数据是否存储
按季度更新的信息整合
主营业务构成
通过主营业务构成接口进行数据获取
# 定义获取 财务数据 主营业务构成
def get_finance_main_business(stocks_label, period):
# 进行数据获取
df = pro.fina_mainbz(ts_code=f'{stocks_label}', type='P', period=period,
fields='bz_item,bz_sales,bz_profit,bz_cost,update_flag') # 用于标识是否更新过
# 进行数据判别
if judge_data(df):
# 表示有数据
return {
'bz_item': '||'.join(list(df.bz_item.values)),
'bz_sales': '||'.join([str(i) for i in list(df.bz_sales.values)]),
'bz_profit': '||'.join([str(i) for i in list(df.bz_profit.values)]),
'bz_cost': '||'.join([str(i) for i in list(df.bz_profit.values)]),
'if_have_zyywgc': 1
}
else:
# 表示数据为空
return {
'bz_item': None, 'bz_sales': None, 'bz_profit': None, 'bz_cost': None,
'if_have_zyywgc': 0} # 最后一个用来标注该表没有获取到数据
当获取具体的某个股票信息的主营业务信息的时候,这里需要进行数据的拼接,一个公司的主营业务可以有多个,个数上并不是一定的,这里采用的是字符串拼接的方式,把字段bz_item等多条字段使用||进行拼接成新的字符串存储
利润表
获取利润表信息
# 获取 财务数据 利润表
def get_finance_profit_statement