为什么选择Tushare
做股票研究或者量化交易,第一步永远是拿到数据。行情软件看盘方便,但要把数据导出成Excel或者喂给Python策略,往往很麻烦。Tushare就是来解决这个问题的。它是一个免费开源的Python库,把A股的行情、财务、宏观数据打包成函数调用,几行代码就能把历史K线拉下来。对散户和量化新手来说,门槛低、数据全、更新快,是入门首选。
准备工作:注册与安装
Tushare的使用需要先注册账号。打开官网,用手机号注册,登录后进入个人主页,找到“接口TOKEN”一栏,复制那串字符。这串token就是你的钥匙,每次调用接口都要带上。
安装Tushare很简单,命令行输入:
pip install tushare
如果已经安装,用pip install tushare --upgrade升级到最新版。

核心操作:初始化与获取数据
拿到token后,在Python里这样初始化:
import tushare as ts
ts.set_token('你的token')
pro = ts.pro_api()
pro_api是主要入口,所有数据都通过它调用。
获取股票列表
先知道市场上有哪些股票。调用stock_basic接口:
df = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
print(df.head())
list_status='L'表示上市状态,fields指定返回字段。返回的DataFrame里包含股票代码、名称、行业、上市日期。
获取日线行情
最常用的接口是daily:
df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
print(df.head())
参数ts_code是股票代码,格式为“代码.交易所”,比如平安银行是000001.SZ。start_date和end_date是日期范围。返回的数据包括开盘价、最高价、最低价、收盘价、成交量、成交额。
如果想一次拿多只股票,可以用逗号分隔代码,但注意单次请求有数量限制。
获取复权数据
除权除息会导致价格跳空,回测必须用复权数据。pro_bar接口可以获取前复权、后复权行情:
df = ts.pro_bar(ts_code='000001.SZ', adj='qfq', start_date='20230101', end_date='20231231')
adj='qfq'是前复权,adj='hfq'是后复权。前复权适合看盘和回测,后复权适合计算历史真实收益。
获取财务数据
基本面数据通过fina_indicator接口获取:
df = pro.fina_indicator(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
返回净资产收益率、每股收益、毛利率等指标。注意财务数据按季度更新,不是每天都有。
获取宏观数据
做股票不能不看宏观。Tushare提供CPI、PPI、M2、GDP等数据:
df = pro.cn_cpi(start_m='202301', end_m='202312')
这些数据能帮你判断市场大环境,对策略择时有帮助。
避开这些坑
Tushare的免费版有积分限制。新注册用户积分很少,只能调用基础接口和少量数据。想拿更多数据,要么做任务攒积分,要么充值。不同接口需要的积分不同,比如daily只要120分,fina_indicator要2000分。调用前先查接口文档,确认积分够不够。
接口有频率限制。比如daily每分钟最多调500次,超了会被封禁几分钟。批量拉数据时加个time.sleep(0.5),别把服务器惹毛了。
数据格式是DataFrame,列名是英文。用df.columns看一眼,别搞混vol和amount。日期字段是字符串,要转成datetime才能做时间序列分析。
一个完整的例子
假设你想回测双均线策略,需要贵州茅台2023年的前复权数据:
import tushare as ts
import pandas as pd
ts.set_token('你的token')
pro = ts.pro_api()
df = ts.pro_bar(ts_code='600519.SH', adj='qfq', start_date='20230101', end_date='20231231')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df.sort_index(inplace=True)
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
df['signal'] = 0
df.loc[df['ma5'] > df['ma20'], 'signal'] = 1
df.loc[df['ma5'] < df['ma20'], 'signal'] = -1
print(df[['close', 'ma5', 'ma20', 'signal']].tail())
这样就把数据拉取、清洗、信号生成串起来了。
其他数据源对比
Tushare不是唯一选择。AkShare完全免费,接口更杂;Baostock免费但数据量少;Wind和聚宽收费,数据质量高但贵。对散户和量化新手,Tushare的性价比最高。积分门槛可以通过签到、分享、邀请慢慢攒,不急着花钱。
期货数据也能用Tushare获取,比如fut_daily接口拿期货日线,fut_mapping拿主力合约映射。做商品期货策略,这些接口够用了。
Tushare的社区很活跃,遇到问题去官网搜接口文档,或者加官方QQ群问。文档里每个接口都有参数说明和示例,照着抄就能跑通。数据是量化交易的燃料,先把燃料备足,再谈策略。