如何通过Tushare pro获得A股历史股价数据
作者的 Tushare ID:418326
推荐:https://tushare.pro/register?reg=418326
摘要
上次分享了Tushare的注册流程,今天来实战一下,看看如何通过Tushare pro来获得历史股价数据。
前提条件:
- 已经成功注册,即拥有接口token
- 获得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
就行了
ps:也可以看官方的教程
获取接口token
- 登陆后点击个人头像进入用户中心(可以顺便确认一下自己的积分够不够120)
- 点击“接口TOKEN”即可获得token(右边有个复制按钮~)
ps:也可以看官方的教程
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)#失败抛出异常
- ps:api的具体文档
主函数
获得三个类型的股票价格
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