如何从tushare获取股票历史数据写入自己的MySQL数据库[通俗易懂]

如何从tushare获取股票历史数据写入自己的MySQL数据库[通俗易懂]如何从tushare获取股票历史数据写入自己的MySQL数据库点击https://tushare.pro/register?reg=414428,免费注册后,即可获取tushare的token,就可以下载金融数据了。1.tushare推荐方法如果你需要读取全部股票的历史数据,tushare给的建议是按“天”获取。因为tushareapi限制一次获取最高5000条记录,而A股市场目前有3000多只股票,提取一次数据不会超过api的限制记录数。代码如下:importtus

大家好,又见面了,我是你们的朋友全栈君。

如何从tushare获取股票历史数据写入自己的MySQL数据库

点击 https://tushare.pro/register?reg=414428 ,免费注册后即可获取 tushare 的 token,就可以下载各种金融数据了。

1. tushare推荐方法

如果你需要读取全部股票的历史数据,tushare 给的建议是按 “天” 获取。因为 tushare api 限制一次获取最高5000条记录,而A股市场目前有3000多只股票,提取一次数据不会超过 api 的限制记录数。

代码如下:

import tushare as ts
pro = ts.pro_api()
df = pro.daily(trade_date='20200325')

然后通过日期循环,就可以获取所有股票的历史数据了。
日期信息可以通过交易日历获得:

#获取20200101~20200401之间所有有交易的日期
df = pro.trade_cal(exchange='SSE', is_open='1', 
                            start_date='20200101', 
                            end_date='20200401', 
                            fields='cal_date')
print(df.head())

输出

cal_date
0 20200102
1 20200103
2 20200106
3 20200107
4 20200108

为了保持数据提取的稳定性,tushare 建议先建立一个专门的函数,实现一个重试机制,见下面代码:

def get_daily(self, ts_code='', trade_date='', start_date='', end_date=''):
    for _ in range(3):
        try:
            if trade_date:
                df = self.pro.daily(ts_code=ts_code, trade_date=trade_date)
            else:
                df = self.pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
        except:
            time.sleep(1)
        else:
            return df

然后通过循环调取数据:

for date in df['cal_date'].values:
     df = get_daily(date)

上述方法使用的是 pro.daily() 函数,目前 tushare 提供了一个新的“通用行情接口” pro_bar() ,而且内部已经存在重试机制,所以现在可以直接用 ts.pro_bar() 函数来获取历史数据了。

2.获取个别数据

如果不需要那么多的数据,只要个别股票的所有数据,还可以按tscode来获取。
使用 ts.pro_bar() 代替 pro.daily() 。

上一篇 《学习python想连接MySQL,没有练习数据怎么办?》 已经把股票基础信息保存在MySQL数据库里了,本篇需要从 stock_basic 里获取上市公司的上市日期。

2.1. 在数据库stock下,增加表 stock _all

在这里插入图片描述
用 Navicat 看着更方便,设 ts_code + trade_date 作为主键,避免数据重复。
在这里插入图片描述

2.2. 代码如下

# -*- coding: utf-8 -*-
#
# Author: wxb
# Purpose: 初始化数据库 stock_all,数据来源 tushare, 数据接口说明 https://waditu.com/document/2?doc_id=109
# Latest Version: V1.0 @ 2021/1/10 15:20
# File: init_stock_all.py
import sys
import time
import pymysql
import tushare as ts
def str_date_to_num(str_date):
# 把字符串日期转换为以‘秒’为单位的整数
tmp_date = time.strptime(str_date, "%Y%m%d")
second = int(time.mktime(tmp_date))
return second
def num_to_str_date(second):
# 把以‘秒’为单位的日期整数转换为字符串日期
tmp_date = time.localtime(second)
str_date = time.strftime("%Y%m%d", tmp_date)
return str_date
if __name__ == '__main__':
# 设置 TUSHARE_token, 初始化API接口
ts.set_token('你从tushare获得的token')
pro = ts.pro_api()
# 建立数据库连接
db = pymysql.connect(host='127.0.0.1', user='root', password='你的MySQL密码', database='stock', charset='utf8')
cursor = db.cursor()
# 举例用的2个股票代码
stock_pool = ['000001.SZ', '000002.SZ']
for tscode in stock_pool:
# 从 stock_basic 表中获取上市日期
sql_query = f'SELECT `list_date` FROM stock_basic WHERE `ts_code` = "{tscode}"'
# print(sql_query)
cursor.execute(sql_query)
data = cursor.fetchone()
if not data:
print(f'Failed to get the list_date of "{tscode}"')
continue
# 设置起始日期
start_date = data[0]
# 设置当前日期为结束日期
end_date = time.strftime('%Y%m%d', time.localtime())
print(f'"{tscode}" : {start_date} - {end_date}')
# 因为tushare api对提取有限制,每次最多提取5000条数据,这里要进行分次提取
# 字符串日期转换成数字用于计算
s_dt = str_date_to_num(start_date) - 1 * (24 * 60 * 60)
e_dt = str_date_to_num(end_date)
# 每次提取日期范围5000天,因为含有非交易日,所以返回数据不会超过5000条记录
# 因为日期转换返回的是'秒',所以这里要乘以“ 24小时 * 3600秒/小时 ”
step = 5000 * (24 * 60 * 60)
tot_records = 0    # 写入数据库的记录数
tot_rows = 0    # 从api读到的记录数
for dt in range(s_dt, e_dt, step):
sdate = num_to_str_date(dt + 1 * (24 * 60 * 60))
t_dt1 = dt + step
t_dt2 = t_dt1 if t_dt1 < e_dt else e_dt
edate = num_to_str_date(t_dt2)
try:
# 获取stock日线行情,同时要求返回复权因子
df = ts.pro_bar(ts_code=tscode, start_date=sdate, end_date=edate, adj='', adjfactor=True)
except Exception as e:
print(e)
continue
# 如果没有数据返回,继续
if df is None:
continue
# 返回 rows 个记录,写入数据库
rows = df.shape[0]
tot_rows += rows
print('"%s" : %4s records returned for date range %s - %s' % (tscode, rows, sdate, edate))
values = []
for index in range(rows):
stk_data = tuple(df.loc[index])
# if index <= 10: print(stk_data)
values.append(stk_data)
try:
sql_insert = 'INSERT INTO `stock_all` (`ts_code`, `trade_date`, `open`, `high`, `low`, `close`, `pre_close`, `change`, `pct_chg`, `vol`, `amount`, `adj_factor`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
tot_records += cursor.executemany(sql_insert, values)
db.commit()
except Exception as e:
print(e)
db.rollback()
print(f'"{tscode}" : {tot_records} of {tot_rows} records were inserted.\n')
cursor.close()
db.close()
print('Done!')

2.3. 数据在这里插入图片描述

获取的是不复权的数据在这里插入图片描述
所有复权因子也有了
在这里插入图片描述

点击 https://tushare.pro/register?reg=414428 ,免费注册后即可获取 token,就能下载各种金融数据了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152730.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • leetcode二叉树的层次遍历_完全二叉树的中序序列

    leetcode二叉树的层次遍历_完全二叉树的中序序列LeetCode二叉树中序遍历1.1题目描述给定一个二叉树的根节点root,返回它的中序遍历。1.2示例示例:输入:root=[1,null,2,3]输出:[1,3,2]2.1解题2.1.1解题方法:递归二叉树的中序遍历方法:按照“左(子树)→中→右”顺序遍,可以使用递归方式进行遍历Java版解题/***Definitionforabinarytreenode.*publicclassTreeNode{*intval

  • Python表白代码合集:5种表白代码,找不到对象你来找我,这也太秀了叭

    Python表白代码合集:5种表白代码,找不到对象你来找我,这也太秀了叭文章目录一、容我啰嗦两句二、来吧,代码展示1、给女神比个小心心2、无限弹窗式表白3、这货不是表白代码,悄悄送给你们4、520表白墙5、抖音热门表白小软件6、无套路表白三、写在最后一、容我啰嗦两句爬虫看多了,对身体不好,我们来点现实的,学学表白找个女朋友他不香吗,对吧~文章最后教你们怎么打包成exe,如果你懒得搞懂代码怎么回事,直接复制代码打包成exe运行就好了。这样不管你发给别人也好,以后方便直接用也好,都很方便。咱就不整什么鸡皮疙瘩掉一地的情话啥的了,有需要的自行百度。二、来吧,代码展示

  • sourceinsight激活码3.5_pdf注册码及序列号

    sourceinsight激活码3.5_pdf注册码及序列号SI3US-032434-64929

  • 非主流文字生成_非主流文字转换器

    非主流文字生成_非主流文字转换器这是米奥的第01篇笔记作者|米奥来源|米奥笔记ID|miaobiji01为什么要重视排版回想一下,你一般都是在什么场景下来阅读公众号的推文?可能是窝在被窝时、坐公交地铁时、排队吃饭时、工作学习开小差时,甚至是厕所蹲坑时……在这么“将就”的环境下,我们很难高度集中我们的注意力来阅读一篇文章。所以,高颜值的排版要让用户看起来舒服、轻松,而不是花枝招展;另外,在这样的…

  • win10更改pip源方法

    win10更改pip源方法win10更改pip源win10安装TensorFlow卡崩具体做法win10安装TensorFlow卡崩更改为国内清华大学镜像源,即可。具体做法在c:\user(或者用户)\电脑的用户名\,目录下创建一个命名为“pip”的文件夹(如:C:\Users\Administrator\pip),在该文件夹下创建一个命名为“pip.ini”的文件,在该文件中写入以下内容:[global]in…

  • 在互联网上,没有人知道你是一条狗?「建议收藏」

    在互联网上,没有人知道你是一条狗?「建议收藏」1993年,《纽约客》(TheNewYorker)杂志刊登一则由彼得·施泰纳(PeterSteiner)创作的漫画:标题是【OntheInternet,nobodyknowsyou’readog.】这则漫画中有两只狗:一只黑狗站在电脑椅上,爪子扶着键盘。它望向站在地上、表情迷茫的另一只狗,兴奋地说:「在互联网上,没人知道你是一条狗。(OntheInternet,nobodyknowsyou’readog.)画中那只狗的台词随即成了IT界广为流传的经典笑话。那个

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号