如何通过Tushare获得A股历史股价数据

如何通过Tushare pro获得A股历史股价数据

作者的 Tushare ID:418326
推荐:https://tushare.pro/register?reg=418326

摘要

上次分享了Tushare的注册流程,今天来实战一下,看看如何通过Tushare pro来获得历史股价数据。
前提条件:

  1. 已经成功注册,即拥有接口token
  2. 获得120积分(注册100+补全资料20)

首先介绍一下Tushare

“Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过Tushare的数据存储功能,将数据全部保存到本地后进行分析。应一些用户的请求,从0.2.5版本开始,Tushare同时兼容Python 2.x和Python 3.x,对部分代码进行了重构,并优化了一些算法,确保数据获取的高效和稳定。” —摘自旧版官网
新版的Tushare(即Tushare pro)的官网地址为:https://waditu.com/

注册教程

如何正确注册Tushare
https://blog.csdn.net/Bro_Bear/article/details/113830066
##获得历史股价数据

目标

获取国内A股2018年1月到2021年1月的历史股价数据

环境配置

默认已经安装了python环境,执行pip install tushare就行了
安装tushare

ps:也可以看官方的教程

获取接口token

  1. 登陆后点击个人头像进入用户中心(可以顺便确认一下自己的积分够不够120)
  2. 点击“接口TOKEN”即可获得token(右边有个复制按钮~)
    ps:也可以看官方的教程

用户中心
token

Coding

导入库并设置token
import tushare as ts
import time,os
import datetime
import pandas as pd
from config import config
import logging

#设置token,这样之后请求api的时候就不用带token了
my_token='把上面获得的接口token粘贴在这里'
pro = ts.pro_api(my_token)
ts.set_token(my_token)

#日志文件
logging.basicConfig(
filename=config.gpjg_logfile,
level=logging.ERROR,
format='%(levelname)s:%(asctime)s\t%(message)s'
)
获得A股的股票代码

list_status是股票的上市状态, L上市 D退市 P暂停上市

# 获得A股code
code = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date,list_status')#上市
time.sleep(1)#友好一点,请求一下休息一下
code2 = pro.query('stock_basic', exchange='', list_status='P', fields='ts_code,symbol,name,area,industry,list_date,list_status')#暂停上市
time.sleep(2)
code3 = pro.query('stock_basic', exchange='', list_status='D', fields='ts_code,symbol,name,area,industry,list_date,list_status')#退市
code=pd.concat([code,code2,code3],axis=0,ignore_index=True)#将返回的DataFrame拼接起来

stock_code=code['ts_code'].tolist()#股票代码
stock_name=code['name'].tolist()#股票名称
  • 具体参数可以参考官网的文档
获得股票价格

根据股票代码,获得【start_datei,end_datei)时间内的日价格数据,添加了失败重试

def get_gpjg(ts_code,ts_name,start_date, end_date,freq='D', adj=None,adjfactor=False):
    info=' %s %s %s ... ' % (ts_code+'_'+ts_name, start_date,end_date)
    for xx in range(5):# 失败后,尝试5次
        try:
            print('try',info,xx)
            logging.critical('try'+info+str(xx))
            # 文档 https://waditu.com/document/2?doc_id=109
            # 原api(start_date,end_date】 因此将前后都减去1天得到【start_datei,end_datei)
            df = ts.pro_bar(ts_code=ts_code, adj=adj,adjfactor=adjfactor, start_date=start_date, end_date=end_date,freq=freq)
            print('get',info,xx)
            print('wait~')
            logging.critical('get'+info+str(xx))#日志
            return df
        except:
            print('failed'+info+str(xx))
            logging.critical('failed'+info+str(xx))
            time.sleep(config.gpjg_wait_time)
    error_img='error! %s'% '\t'.join(map(str,[get_gpjg.__name__, ts_code,ts_name,start_date, end_date,freq, adj,adjfactor]))
    print(error_img)
    logging.error(error_img)
    raise RuntimeError(error_img)#失败抛出异常
主函数

获得三个类型的股票价格

for adj in ['未复权','qfq','hfq']:# 不复权 qfq前复权 hfq后复权 
    for i in range(len(stock_code)):# 按股票代码依次获取
        ts_code=stock_code[i]
        ts_name=stock_name[i]
        dir_path=os.path.join(config.gpjg_dir,'%s_%s_%s'%(adj,config.gpjg_start_date,config.gpjg_end_date))#输出文件目录
        file_path=os.path.join(dir_path,'%s.csv'%(ts_code))#输出文件的全路径
        if not os.path.exists(config.gpjg_dir):
            os.mkdir(config.gpjg_dir)
        if not os.path.exists(dir_path):
            os.mkdir(dir_path)
        if os.path.exists(file_path):# 避免多次运行代码时重复获取数据
            continue
        if adj=='未复权':
            df=get_gpjg(ts_code,ts_name,config.gpjg_start_date,config.gpjg_end_date,freq='D', adj=None,adjfactor=False)
        else:
            df=get_gpjg(ts_code,ts_name,config.gpjg_start_date,config.gpjg_end_date,freq='D', adj=adj,adjfactor=True)

        if df is None: #获取失败后记录在日志
            error_img='error! return is None! %s'% '\t'.join(map(str,[ts_code,ts_name,config.gpjg_start_date,config.gpjg_end_date, adj]))
            print(error_img)
            logging.error(error_img)
            continue
        df.sort_values(by='trade_date',inplace=True)#  按 时间 顺序 保存
        df.to_csv(file_path,index=False,sep=config.sep,encoding='utf-8')#保存
        time.sleep(config.gpjg_wait_time) #设置等待时间,避免被服务器当初恶意攻击

config.py 文件

import datetime
import os

class Config():
    root='./'#根目录
    sep=','#文件分隔符
    # 股票价格
    gpjg_start_date='20180101' #包含 (存在数据丢失)
    gpjg_end_date='20210201'  #包含
    gpjg_logfile='股票价格-%s.log' % datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    gpjg_dir=os.path.join(root,'股票价格')
    gpjg_iok=20# 每分钟能请求的次数
    gpjg_wait_time=1+60//gpjg_iok

config=Config()# 这句别漏了
效果

输出目录
输出文件
在这里插入图片描述

完整代码:

github: https://github.com/bearbro/Financial_data_from_tushare

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值