【Python】调取tushare和joinquant的数据写入本地MySQL数据库(推荐)(技术实现过程)

本次需求,源于<数据建设小项目_构建量化投资分析模型>,其文字报告版发于个人知乎专栏 https://zhuanlan.zhihu.com/p/349686026
按照《构建量化投资分析模型_数据指标体系构建V0.2_20210309》的进度,先获取了基本面数据和技术面数据(另带一些基础数据);至于风险预警、行业评估、宏观环境等其他专题模块,迟些再细化体系指标和获取数据。
在这里插入图片描述

本篇CSDN帖子主要记录代码实现过程,不涉及更深入分析。完整版的分析报告,统一发布于个人知乎专栏<数据决策分析之路>

—— —— ——
原来的练手贴,也就练练手,不推荐其中使用的入库方式(效率低,傻),链接如下。
【练手帖】将本地Excel数据表格导入本地MySQL数据库(不推荐)
—— —— ——

【完整代码↓↓↓】

import pandas as pd
import numpy as np

import datetime
import time
import os

import warnings  
warnings.filterwarnings('ignore')

# 查看tushare当前版本
import tushare as ts
print("tushare.version :",ts.__version__)

# 设置token(自行官网获取,我这先码掉),看看例子
tushare_token = '1b4c5a07cb9ce8d326138xxxxxxxxxxxxxxx'
pro = ts.pro_api(tushare_token)

# datetime.timedelta调用的股票数据时间段参数
timeperiod = -3650  

# 查看上证指数过去10年(3650天)的数据
df2 = pro.daily(ts_code='000001.SZ',
                start_date = (datetime.date.today()+datetime.timedelta(days=timeperiod)).strftime("%Y-%m-%d"),
                end_date = datetime.date.today().strftime("%Y-%m-%d"))
print("\n上证指数标准化日期及排序前:\n",df2.head())

# 标准化日期,获取时间的“年、月、日” (亲测自定义函数change_date(s)可行)
def change_date(s):
    s = datetime.datetime.strptime(s, "%Y%m%d")  # 把日期标准化,转化结果如:20150104 => 2015-01-04 00:00:00
    s = str(s)  # 上一步把date转化为了时间格式,因此要把date转回str格式
    return s[:10] # 只获取年月日,即“位置10”之前的字符串
df2['trade_date'] = df2['trade_date'].map(change_date)  # 用change_date函数处理列表中date这一列,如把“20150104”转化为“2015-01-04”
df2.sort_values(by='trade_date',axis=0,ascending=True,inplace=True)  # 从后面print(df2.head())验证升序成功

print("\n上证指数标准化日期及排序后:\n",df2.head())

# 下面用tushare新接口 tushare.pro 来获取其他列表数据

# 新建当期财经数据列表合集文件夹,用于储存当期财经数据
total_path = os.path.abspath('.')
print("运行文件根目录 "+total_path)

path = total_path+r'\本期财经数据列表合集'+str(datetime.date.today())
try:
    os.mkdir(path)
except:
    pass
print("\n已新建本期文件夹 "+path)

# —— —— 查询当前所有正常上市交易的股票列表
alldata1 = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
alldata_path = path +'\当前所有正常上市交易的股票列表'+str(datetime.date.today())+'.xlsx'
alldata1.to_excel(alldata_path, index=False)

print("\n当前所有正常上市交易的股票列表:\n",alldata1.head(10).append(alldata1.tail(10)))


# —— —— 获取指数基础信息
indexbasic1 = pro.index_basic(market='SW')
indexbasic1_path = path +'/指数基础信息列表_SW'+str(datetime.date.today())+'.xlsx'
indexbasic1.to_excel(indexbasic1_path, index=False)
print("\n指数基础信息列表_SW:\n",indexbasic1.head())

indexbasic2 = pro.index_basic()
indexbasic2_path = path +'/指数基础信息列表_默认SSE'+str(datetime.date.today())+'.xlsx'
indexbasic2.to_excel(indexbasic2_path, index=False)
print("\n指数基础信息列表_默认SSE:\n",indexbasic2.head())


# —— —— 获取指数每日行情

# indexdaily = pro.index_daily(ts_code='399300.SZ')
indexdaily_code = '000001.SH'
indexdaily = pro.index_daily(ts_code = indexdaily_code)
indexdaily_path = path +'/指数每日行情'+indexdaily_code+str(datetime.date.today())+'.xlsx'
indexdaily.to_excel(indexdaily_path, index=False)

# #或者按日期取
# df = pro.index_daily(ts_code='399300.SZ', start_date='20180101', end_date='20181010')

print("\n指数每日行情:\n",indexdaily.head())


# —— —— 获取沪股通、深股通成分数据

#获取沪股通成分
shcf = pro.hs_const(hs_type='SH') 
shcf_path = path +'/沪股通成分数据'+str(datetime.date.today())+'.xlsx'
shcf.to_excel(shcf_path, index=False)
print("\n沪股通成分数据:\n",shcf.head())

#获取深股通成分
szcf = pro.hs_const(hs_type='SZ')
szcf_path = path +'/深股通成分数据'+str(datetime.date.today())+'.xlsx'
szcf.to_excel(szcf_path, index=False)
print("\n深股通成分数据:\n",szcf.head())

# 连接数据库
from sqlalchemy import create_engine
# engine = create_engine("mysql+mysqldb://{}:{}@{}/{}".format('username', 'password', 'host:port', 'database'))
engine = create_engine("mysql+mysqlconnector://{}:{}@{}/{}".format('quant_invest', '123456', 'localhost', 'quant_invest'))
con = engine.connect()
 
df2.to_sql(name='上证指数3650_ts', con=con, if_exists='append', index=False)
# 用MySQL的desc可以发现数据库自动创建了表并默认指定了列的格式:
# 此处参考帖子 https://blog.csdn.net/u011884100/article/details/90715359

# 继续将其他数据入库
alldata1.to_sql(name='当前所有正常上市交易的股票列表_ts', con=con, if_exists='append', index=False)
indexbasic1.to_sql(name='指数基础信息列表_SW_ts', con=con, if_exists='append', index=False)
indexbasic2.to_sql(name='指数基础信息列表_默认SSE_ts', con=con, if_exists='append', index=False)
indexdaily.to_sql(name='指数每日行情_ts', con=con, if_exists='append', index=False)
shcf.to_sql(name='沪股通成分数据_ts', con=con, if_exists='append', index=False)
szcf.to_sql(name='深股通成分数据_ts', con=con, if_exists='append', index=False)

# con.close()

# 聚宽量化平台 joinquant 

from jqdatasdk import *
auth('1883888xxxx','xxxx888888') #ID是申请时所填写的手机号;Password为聚宽官网登录密码

# 查询是否连接成功
is_auth = is_auth()
print(is_auth)

# 查询当日剩余可调用条数
print(get_query_count())    #描述:查看当日剩余可调用条数,试用账号默认是每日100万条;正式账号是每日2亿条。

# 获取平台支持的所有股票、基金、指数、期货信息
all_securities_jq = get_all_securities(types=[], date=None)
all_securities_jq.head()

# 查询平安银行2014年的年报
q = query(
        income.statDate,
        income.code,
        income.basic_eps,
        cash_flow.goods_sale_and_service_render_cash
    ).filter(
        income.code == '000001.XSHE',
    )

ret = get_fundamentals(q, statDate='2014')
ret.to_sql(name='测试_平安银行2014年的年报_jq', con=con, if_exists='append', index=False)

# 财务指标数据
# 按季度更新, 统计周期是一季度。可以使用get_fundamentals(query(indicator),date,statDate)查询

ind2020 = get_fundamentals(query(indicator),statDate = '2020')
ind2019 = get_fundamentals(query(indicator),statDate = '2019')
ind2018 = get_fundamentals(query(indicator),statDate = '2018')
ind2017 = get_fundamentals(query(indicator),statDate = '2017')
ind2016 = get_fundamentals(query(indicator),statDate = '2016')

ind_last5years = ind2020.append([ind2019,ind2018,ind2017,ind2016], ignore_index=True)
ind_last5years.to_sql(name='基本面_财务指标数据_近五年年报_2016to2020_jq', con=con, if_exists='append', index=False)

# 市值数据(每日更新)
# 每天更新,可以使用get_fundamentals(query(valuation),date),指定date为某一交易日,获取该交易日的估值数据。

evaluation_today = get_fundamentals(query(valuation),date = str(datetime.date.today()))
# evaluation_today = get_fundamentals(query(valuation),date = '2021-03-01')

evaluation_today.to_sql(name='基本面_市值数据_逐日新增_jq', con=con, if_exists='append', index=False)

【数据表一览】

目前数据库表还不太多,暂时不需要按应用专题或者其他形式分类管理。
PS:尾缀 ts 表示数据来源于tushare,尾缀 jq 表示数据来源于joinquant.
在这里插入图片描述
2021.12.26更新:
马上就打脸。当需要从全局来考虑,获取可能需要使用的数据时,发现需要按应用专题或者其他形式分类管理了。大概长这样:
(1)数仓分层
在这里插入图片描述

(2)表数据分类及命名规则
在这里插入图片描述
数据仓库及数据表示例:
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值