资讯动态

Tushare Pro股票数据接口详解:从基础调用到实战避坑

发布时间:2026/10/6 16:37:35 来源:尧图企业网站定制
拿到Tushare Pro的token之后很多人第一反应是直接调pro.daily()把行情拉下来结果不是报权限错误就是被限流再不然就是拉下来一堆数据不知道对不对。这篇文章就从股票基本数据接口入手把Tushare Pro里最常用、最核心的几个接口捋一遍包括接口能做什么、参数怎么填、返回的数据长什么样、实际调用时会踩哪些坑顺带讲讲我自己的使用习惯。无论你是刚接触量化分析的新手还是已经在用其他数据源想切换过来这篇都能给你省点试错时间。1. 为什么选Tushare Pro作为股票数据接口1.1 免费数据接口里它最接近“专业级”做股票数据分析第一步永远是拿数据。市面上真正免费、稳定、文档齐全的股票数据接口其实不多。很多财经网站有开放接口但要么数据格式不规范要么没有复权因子要么接口不稳定爬虫写起来还得维护selector非常折腾。Tushare Pro在这个梯队里属于“免费里最接近专业级”的选择数据覆盖面广从基础行情到财务数据、资金流向、期货期权都有而且Python调用方式统一返回的是pandas DataFrame和数据分析流程无缝衔接。我最初用的是Tushare旧版后来切到Pro版最大的感受是数据质量确实靠谱。日线行情、复权因子、交易日历这些基础数据都有专门接口字段定义清晰单位统一基本不用做太多清洗。对于个人学习、策略回测、课程设计这类场景Tushare Pro完全够用不需要一上来就上Wind或者Choice那种商业终端动辄几万块一年的费用个人根本扛不住。1.2 积分权限机制先搞清楚再动手Tushare Pro和普通免费接口最大的不同是它有积分体系。新注册用户默认有120积分能调用一部分基础接口积分越高能用的接口越多单次拉取的数据量上限也越高。第一次用的时候容易蒙明明文档里写得好好的一调用就报“抱歉您没有访问该接口的权限”其实就是积分不够。所以拿到token的第一件事不是急着写拉数代码而是去官网看一眼积分规则。交易日历、股票列表、日线行情这种基础接口门槛很低基本注册就有权限但像财务三大报表、分钟线、包含ST标记的每日指标这些就需要更高积分。积分可以通过完善个人信息、每日签到、社区贡献这些方式获取说实话对只想拉点日线数据做分析的人来说初始积分基本够用。后面我会在实操部分给出“基础积分够用清单”免得你对着文档一个个试。2. 准备工作注册、Token与Python环境2.1 注册和Token初始化Tushare Pro的注册流程很简单官网用手机号注册就行登录后在“个人主页-接口TOKEN”页面能看到一串字母数字混合的token这就是你调用所有接口的凭证。每个token绑定一个账号调用接口时会校验权限和频率所以token一定要保密别随手传到GitHub上不然别人用你的额度不说还有可能触发限流。Python端安装很简单pip install tushare就行。初始化token有两种方式我推荐在代码里统一设置方便管理import tushare as ts # 方式一直接设置token推荐代码里只写这一处 ts.set_token(你的token字符串) # 方式二通过pro接口初始化 pro ts.pro_api(你的token字符串) # 之后统一用pro这个对象调用所有接口 df pro.trade_cal(exchangeSSE, start_date20240101, end_date20241231)有一点要注意ts.set_token()设置的是全局token之后再调用ts.pro_api()可以不传参数直接用全局配置。如果代码里有多个账号的token需要切换那就每次显式传入token创建新的pro对象别混用。我自己习惯写一个配置模块把token放在环境变量里读取这样换机器、换环境都不用改代码。2.2 pandas与数据接口的配合Tushare Pro返回的数据基本都是pandas DataFrame列名是英文文档里都有对应说明。建议先熟悉几个常用操作df.head()看前几行、df.info()看字段和缺失值、df.describe()看统计特征。数据接口返回的字段有的单位是“元”有的是“千元”还有的是“手”不看文档直接算会出大问题。这里先给一个我常用的“环境检查”思路拉一个交易日历、拉一只股票的日线数据、看一眼列名和行数确认数据接口通了、网络没问题、权限够再开始写正式的分析代码。这样能把“环境问题”和“业务问题”隔离排查起来快很多。3. 核心接口逐个拆解交易日历、股票列表、日线行情、复权因子3.1 交易日历trade_cal一切时间过滤的基础交易日历是很多人忽略但实际非常重要的接口。A股有节假日调休光靠“周一到周五”判断交易日完全不靠谱比如国庆节前后、春节前后经常有周末补班但股市不开盘的情况。做时间序列分析、计算收益率、对齐多只股票数据时用交易日历做日期底表能省掉无数麻烦。import tushare as ts pro ts.pro_api() # 获取2024年上交所的交易日历 cal pro.trade_cal(exchangeSSE, start_date20240101, end_date20241231) print(cal.head())返回的主要字段有字段名含义说明exchange交易所代码SSE为上交所SZSE为深交所cal_date日期YYYYMMDD格式is_open是否交易1为交易日0为休市日pretrade_date上一交易日做日期对齐时非常有用实话说我几乎每个数据处理流程都会先拉一次交易日历然后筛选is_open 1的日期作为时间轴。特别是做多股票收益率的合并表格时不同股票可能因为停牌导致日期对不齐用pretrade_date字段可以正确填充“上一交易日”的数据避免时间错位。这个接口权限要求很低新注册用户就能调用属于必会接口。3.2 股票列表stock_basic建立股票池的起点股票列表是另一个基础中的基础。它返回当前所有上市股票的基本信息包括股票代码、名称、行业、上市日期、退市日期等。做股票池筛选、做全市场扫描、做“排除ST股”这类操作都离不开它。# 获取沪深两市当前上市状态的股票列表 stock_list pro.stock_basic(exchange, list_statusL, fieldsts_code,symbol,name,area,industry,market,list_date) print(stock_list.head()) print(len(stock_list))list_status参数是重点它的取值范围有三档L上市状态就是当前正常交易的股票D退市状态已经退市的股票P暂停上市状态。默认是L但如果你做历史回测一定要把D的股票也拉出来不然会引入“幸存者偏差”问题——只看现在还活着的股票策略的回测结果会虚高因为你躲开了那些已经退市的“坏股票”。这个细节做量化的人都知道但新手特别容易踩。ts_code是Tushare的股票编码方式格式是“600000.SH”沪市或“000001.SZ”深市后面调日线、财务接口都用这个作为股票标识。注意它和纯数字的symbol比如“600000”不一样很多接口只接受ts_code所以代码里最好统一用ts_code做关联键。3.3 日线行情daily最常用的行情接口日线接口是整个Tushare Pro里调用频率最高的接口之一。它返回股票每天的开盘价、最高价、最低价、收盘价、成交量、成交额等字段。做K线图、算收益率、写均线策略全部以这个接口为基础。# 获取单只股票一段时间内的日线数据 df_daily pro.daily(ts_code000001.SZ, start_date20240101, end_date20240301) print(df_daily.head()) print(df_daily.columns.tolist())字段大概包括字段名含义说明ts_code股票代码带交易所后缀trade_date交易日期YYYYMMDD格式open / high / low / close开高低收注意是开盘价、最高价、最低价、收盘价pre_close昨收价前一日收盘价和涨跌幅计算直接相关change涨跌额当日收盘价与昨收价的差pct_chg涨跌幅百分比数值比如3.5代表涨3.5%vol成交量单位是“手”1手等于100股amount成交额单位是“千元”不是“元”amount单位是“千元”这是文档里写了但很多人不看的坑。如果你要把成交额换成“元”需要乘以1000如果换成“万元”则除以10。做资金流向分析或者计算换手率的时候单位搞错结果就全错了。另外要注意daily接口单次最多返回5000条数据。如果拉全市场几千只股票的日线建议按股票代码逐个循环拉取每只股票一次拉完再存本地别尝试一次传多个代码这个接口一次只支持单只股票部分Pro接口支持多只但daily不支持。我自己实测拉一只股票10年日线大概2500条一次就能拉完但要控制请求频率Tushare Pro有频率限制单分钟调用次数过多会被临时封禁。3.4 复权因子adj_factor回测一定要复权如果你算过“贵州茅台从上市到现在涨了多少倍”可能发现用不复权价格算出来的结果不太对甚至会算出负的涨幅——因为中间有分红除权。复权因子的作用就是把历史价格调整到同一基准让价格序列真正反映“持有这个资产”的收益变化。Tushare Pro专门提供adj_factor接口返回每日复权因子用这个因子可以把不复权价格转换为前复权或后复权价格。# 获取复权因子 adj pro.adj_factor(ts_code000001.SZ, start_date20240101, end_date20240301) print(adj.head())Tushare官方文档里的复权公式逻辑是后复权价等于不复权价乘以复权因子部分情况下直接给出后复权价前复权价则基于最新因子归一化调整。实际计算中用adj_factor和daily的字段做乘除就能完成转换。我自己的做法是直接把adj_factor合并到日线DataFrame里然后算出后复权价用于计算收益率因为后复权价格序列更稳定不会因新除权而改变历史数据展示K线图时再用前复权价图形更贴近当前价格水平视觉习惯自然。关于“前复权”和“后复权”的选择做策略回测我强烈建议用“后复权”价格计算收益率因为它的历史数据不会因为后来的分红除权而改变回测结果更稳定。如果用前复权每次除权后历史价格都会变导致同样的策略在不同时间回测结果不一致很难复现。实际上许多第三方量化平台和金融终端在计算收益曲线时也默认使用后复权价格序列就是这个原因。对于分析股票基本面匹配的技术指标如均线、MACD前复权价更直观一旦涉及“长期收益计算”“策略回测”请务必备一份后复权价。3.5 每日指标daily_basic换手率、市盈率一次搞定daily_basic这个接口和daily配合使用效果很好。它返回的是每天的基础指标包括换手率、市盈率总市值口径和流通市值口径都有、市净率、总市值、流通市值等。做股票筛选时这些指标比纯价格数据有用得多。# 获取每日指标 basic pro.daily_basic(ts_code000001.SZ, start_date20240101, end_date20240301, fieldsts_code,trade_date,turnover_rate,pe,pe_ttm,pb,total_mv,circ_mv) print(basic.head())常用字段字段名含义说明turnover_rate换手率百分比比如5.2代表5.2%pe市盈率静态市盈率总市值/去年的净利润pe_ttm滚动市盈率总市值/最近四个季度净利润之和更实时pb市净率总市值/净资产total_mv总市值单位是“万元”circ_mv流通市值单位是“万元”total_mv和circ_mv的单位是“万元”不是“元”也不是“千元”。之前我就吃过亏把总市值当成“元”来算结果金额大得离谱。做选股策略时可以先用total_mv筛市值区间、用pe_ttm筛估值、用turnover_rate筛选活跃度这些在daily_basic里一次就能拿到不需要再拼接口。3.6 基础财务数据选股的“数据地基”除了行情数据基本财务数据也是股票分析的常客。Tushare Pro把三大报表拆成了income利润表、balancesheet资产负债表、cashflow现金流量表几个接口按季度更新。做价值投资筛选、计算ROE、分析营收增速都需要这些数据。# 获取利润表关键字段 income pro.income(ts_code000001.SZ, start_date20230101, end_date20231231, fieldsts_code,ann_date,f_ann_date,end_date,report_type,total_revenue,revenue,operate_profit,total_profit,n_income) print(income.head())这里有几个字段要解释一下end_date报告期比如20231231代表2023年年报数据ann_date公告日期公司实际发布财报的日期f_ann_date财报实际发布日期有些公司会延期report_type报表类型1代表合并报表2代表母公司报表做分析统一用合并报表数值为1的n_income净利润单位是“元”。财务数据最坑的是“报告期”和“公告日期”的区别。你要做的是“财报发布后的选股策略”必须用ann_date作为时间轴而不是end_date。因为财报的公布有滞后性年报最晚可以拖到次年4月底如果你在1月份用上年年报数据做筛选那个时间点数据其实还没公布属于“未来函数”。这类问题做回测时非常隐蔽不仔细处理很容易得出“穿越”的收益率。3.7 交易日历的正确打开方式时间序列分析的时间轴上面几个接口各自单独用已经很强了但它们组合起来才是完整的数据方案。我自己的标准流程是这样的用trade_cal拉取分析区间内所有交易日作为时间轴底表用stock_basic拉取股票池比如排除ST、排除上市不足60天的新股循环股票代码依次调daily、adj_factor、daily_basic按trade_date对齐合并用复权因子计算后复权价格再去计算日收益率、累计收益率需要财务指标时用ann_date做时间对齐避免未来函数。这套流程跑下来基本上“股票基本数据接口”能覆盖的日常需求都够用了。数据量不大时全部放pandas内存里处理没问题数据量大了我一般会用to_csv存本地或者入库下次直接读文件避免反复调接口。接口是免费的但也要省着用毕竟有频率限制。4. 常见报错与排查技巧实录4.1 “抱歉您没有访问该接口的权限”这是新手最常见的报错。原因基本就是积分不够。解决方案很简单去官网“积分”页面看目标接口所需积分然后对照自己当前积分。想快速提升积分可以完善个人资料、绑定手机邮箱、参与社区任务。不过说实话基础日线、交易日历、股票列表这几样初始积分就能用如果想要分钟线、财务数据等更高权限的接口花点时间做任务升积分即可不必掏钱。这个报错还有另一个隐藏情况检查一下是不是token传错了或者代码里用了ts.set_token()但没有重新ts.pro_api()。我遇到过几次改了token但pro对象是之前创建的导致一直用的旧token。重启内核或重新创建pro对象就能解决。4.2 “每分钟接口访问次数限制”Tushare Pro按积分档次设置了不同的每分钟调用频率比如每分钟10次、20次、50次等。循环拉几百只股票的时候很容易超限。我的做法是在循环里加一个sleep每次请求之间停0.2-0.5秒更稳妥的是按积分档位计算合适的间隔比如每分钟允许10次就设0.6秒的间隔。另外要特别注意异常重试机制。网络波动或者偶尔的服务端5xx错误会导致请求失败如果不做重试整个循环会中断。我一般会写一个简单的“失败重试”逻辑import time def fetch_with_retry(func, retries3, **kwargs): for i in range(retries): try: return func(**kwargs) except Exception as e: print(f请求失败重试 {i 1}/{retries}错误{e}) time.sleep(1) raise RuntimeError(重试多次仍失败)实测下来大部分临时性错误重试一两次就能通过。4.3 数据缺失停牌、未上市、退市拉数据时会遇到某只股票某一天没有数据最常见的原因是停牌。比如重大资产重组停牌几个月停牌期间自然没有行情数据。做多股票合并表格时用“左连接交易日历”再“前向填充”可以保留停牌期间的价格假设价格不变这样不会因为停牌导致时间轴断裂。还有一种情况是股票还没上市或者已经退市。用stock_basic的list_date字段做过滤可以去掉上市时间不足的数据用退市日期字段可以截断退市之后的数据。特别是做10年期的长时间回测不处理退市股会引入严重的幸存者偏差。4.4 数据字段含义不清Tushare的文档其实做得不错但字段太多新手容易搞混。我的经验是每个接口第一次使用前先拉一小段数据然后逐列打印出来核对一下单位和含义。特别是下面几个高频陷阱vol单位是“手”要换算成“股”就乘以100amount单位是“千元”要换算成“元”就乘以1000total_mv和circ_mv单位是“万元”财务数据里n_income单位是“元”交易日历的cal_date是字符串不是日期类型做时间排序时最好转成datetime或统一用YYYYMMDD的int比较。这些坑只要踩过一次后面基本就能形成条件反射看到字段先查单位。5. 从基础数据到实际分析场景组合与延伸5.1 股票组合分析一次拉取多只股票并合并很多人的目标是做“股票组合分析”比如手里有5只股票想看它们的历史收益曲线、算相关性矩阵、组合风险指标。用上面的基础接口完全可以实现。核心逻辑就是用stock_basic建立股票池循环拉数据再用pandas处理成宽表。我自己写过一个简单的示例拉取5只股票最近一年的日线数据用后复权收盘价计算日收益率然后合并成一张表import pandas as pd import tushare as ts import time pro ts.pro_api() # 股票池 stock_pool [000001.SZ, 600000.SH, 000002.SZ, 600519.SH, 000858.SZ] price_dict {} for code in stock_pool: # 拉日线 df pro.daily(ts_codecode, start_date20240101, end_date20241231) # 拉复权因子并合并 adj pro.adj_factor(ts_codecode, start_date20240101, end_date20241231) df df.merge(adj[[trade_date, adj_factor]], ontrade_date, howleft) # 计算后复权收盘价 df[close_adj] df[close] * df[adj_factor] # 只保留需要的时间列和价格列 df df[[trade_date, close_adj]].sort_values(trade_date) price_dict[code] df.set_index(trade_date)[close_adj] time.sleep(0.3) # 控制频率 # 合并成宽表每一列是一只股票的后复权收盘价 price_df pd.DataFrame(price_dict) print(price_df.head())这里有个小技巧后复权价的计算公式是“不复权价 × 复权因子”得到的价格序列可以做跨时间维度的收益比较如果你想看的是“最新价格位置的历史行情形态”转成前复权更直观。实际做组合分析时拿后复权价算收益率数值正确且不受新除权事件影响。5.2 时间序列模型的前置准备热搜词里有“时间序列模型 股票”“股票预测 算法”如果你准备用ARIMA、LSTM或者Prophet这类模型做股票价格预测数据处理的第一步依然是拉日线、做复权、计算收益率。预测目标一般不是原始价格而是收益率或者对数收益率这样序列更平稳模型效果更容易评估。基础数据清洗的框架可以这么写# 对数收益率 price_df price_df.sort_index() log_returns np.log(price_df / price_df.shift(1))这里price_df是上面合并后的后复权收盘价宽表。把收益率序列作为模型的输入特征或预测目标就完成了从“原始数据”到“模型可用数据”的转换。这个过程中股票基本数据接口是最底层的地基地基不牢后面的模型再花哨也是白搭。5.3 免费接口与商业终端的取舍最后聊几句个人体验。商业终端比如Wind、Choice数据确实更全面、接口更稳定但费用对个人用户极不友好。Tushare Pro作为免费金融数据接口在个人学习、课程设计、小型策略研究场景下性价比非常突出。它的日线、复权、交易日历、财务摘要等核心数据质量和商业终端差别不大主要差距在分钟级高频数据、实时行情、深度财务附注这些偏专业场景。我现在的习惯是个人项目和研究脚本统一走Tushare Pro数据量不大时直接内存处理数据量大了落SQLite或者本地文件。官方文档其实写得挺细只是散我这篇等于帮你把股票基本数据接口的骨架搭好了照着敲一遍基本上手没问题。最后分享一个个人习惯每次调接口之前先看一眼Tushare官网的接口文档更新公告。这个接口偶尔会调整字段、新增参数但文档更新可能滞后或者不明显。我在实际使用中养成一个习惯——定期同字段数据抽样比对和官网文档示例核对确认字段单位、口径没变化。数据接口这种底层工具一次踩坑就可能影响整个分析结论保持对文档和数据的敏感度能省下大量返工时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑