
Tushare Pro 这名字做量化的人应该都不陌生但我发现很多新手在 pip install tushare 装好库、拿到 token 之后第一行代码就栽在“抱歉您没有访问该接口的权限”这个报错上。这个提示特别误导人乍一看像是代码写错了实际上是账号权限和积分体系的问题。这篇文章我就是想把这些年的踩坑经验一次性说清楚从安装、token 配置到这个权限问题到底怎么解决以及后面怎么判断自己能用哪些接口、数据落地怎么安排都走一遍。先说结论这个报错基本上不是因为你的代码有问题而是 Tushare Pro 把数据接口拆成了不同的权限等级你的账号积分不够或者这个接口需要单独申请你还没申请。搞懂这套规则比多写几行代码有用得多。1. 项目背景与整体思路1.1 Tushare Pro 是什么Tushare Pro 是一个开源的金融数据接口平台严格来说是 Tushare 的升级版。老版本 Tushare 用起来很简单一个接口全搞定但后来数据源合规压力变大再加上高频调用的成本问题Tushare Pro 改成了按接口、按积分控制权限的模式。它的数据覆盖面非常广股票日线、分钟线、财务数据、宏观经济、期货、基金、数字货币甚至另类数据都有。对做量化研究的人来说它是目前国内最容易接入、数据质量还算稳定的免费数据源之一。只要你注册账号、完成实名认证就能拿到一个 token靠这个 token 调接口拉数据。需要注意它跟直接用爬虫抓股票数据不一样Tushare Pro 本质上是别人维护好的数据服务你只是通过 API 去查数据经过了清洗和格式化省掉了很多预处理麻烦。比如日线数据它会自动处理复权因子你可以直接拿到前复权或后复权价格这个对回测来说非常重要。1.2 为什么会出现“接口权限”问题这个问题的根源在于 Tushare Pro 的权限体系。它不像普通 API 那样你注册了就能调所有接口而是用“积分”来决定你能用哪些接口以及每分钟能调多少次。“抱歉您没有访问该接口的权限”这个报错我见过的大致分三种情况第一你的账号积分低于该接口要求的最低分值第二这个接口需要单独申请比如某些高频或特殊数据第三接口权限已经开通但你的 token 初始化位置不对或者用了旧版 API 的调用方式。前两种情况最常见。很多新手不理解为什么一个数据接口还要搞这么多限制其实它的逻辑很直白——数据库查询是有成本的免费开放意味着服务器得承受大量请求高分用户和付费用户理应获得更多资源。这套机制虽然用起来不爽但确实保证了数据更新的持续性。1.3 内容适配人群这篇文章适合以下几类人刚接触 Tushare Pro照着网上的老教程写代码却发现报权限错误的因为积分不够被卡在某个接口上想知道有没有别的办法绕过去或者快速提分的已经在用 Tushare Pro但想更系统地管理自己的调用频率和数据落地方案的。如果你是纯新手建议先把安装和 token 配置部分看明白再去研究积分问题。如果你已经能正常拉数据只是偶尔碰到某个接口提示无权限那可以直接跳到第 3 节和第 5 节我列了完整的排查思路。2. 安装准备与环境配置2.1 环境要求和安装命令Tushare Pro 的 Python 库叫tushare支持 Python 3.6 以上版本我建议直接上 Python 3.9 或 3.10太老的版本有些依赖可能装不上。它本身不重核心依赖是pandas和requests所以如果你已经在做数据分析基本不会引入额外麻烦。安装命令很简单pip install tushare如果你用国内镜像源可以这样装速度会快很多pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple装完之后验证一下import tushare as ts print(ts.__version__)能打印出版本号就说明环境没问题。我遇到过装完直接 import 报错的情况基本都是 pandas 版本冲突先把 pandas 升级一下就行。2.2 Token 的获取与初始化拿到 token 的前提是注册 Tushare Pro 账号并完成实名认证。注册之后登录网页在“个人主页”里能看到一个 token 字符串通常是一串很长的字母加数字。拿到 token 之后初始化方式有两种方式一直接在代码里赋值import tushare as ts ts.set_token(你的token字符串) pro ts.pro_api()方式二用配置文件方式把 token 写到本地文件tushare set_token 你的token字符串然后每次在代码里直接调ts.pro_api()就行。我建议用方式二因为 token 不用硬编码进代码里方便后续代码分享或上版本管理。初始化完成之后可以先用最简单的接口试一下df pro.trade_cal(exchangeSSE, start_date20240101, end_date20240110) print(df)这个接口是交易日历对积分要求很低一般注册了就能用。如果它能正常返回数据说明你的 token 配置没问题。2.3 验证安装是否成功很多人在ts.pro_api()这步就卡住了报错信息往往是Authentication failed或者抱歉您没有访问该接口的权限。注意这两个报错含义完全不同前者是 token 本身有问题后者是权限不够。验证 token 是否有效有个小技巧直接访问 Tushare Pro 网页端的 API 调试页面选一个自己确定有权限的接口测试。如果网页端能返回数据代码端不行那问题大概率出在ts.set_token()是否在ts.pro_api()之前执行。这个顺序错了你用的就是默认 token肯定没权限。3. 权限问题的核心细节解析3.1 权限错误的实际含义那句“抱歉您没有访问该接口的权限”来自 Tushare Pro 服务端的统一拦截逻辑。当你向服务端发请求时服务端会先校验 token 是否合法然后校验积分是否满足这个接口的最低要求然后再校验这个接口是否对你单独开放。拿它文档里提到的 doc_id108 来说这页专门讲的是接口权限和积分的关系里面有一张列表每个接口对应不同积分档位。比如有些基础行情接口只要 120 积分就能用有些分钟线数据要 2000 积分有些特别详细的财务数据可能要求更高。这个报错就像一个门禁系统你的工牌token能进公司大门但有些机房高积分接口需要额外的门禁卡。你要么升级门禁卡充积分要么换一个自己能进的机房用低分接口。3.2 积分体系与权限申请Tushare Pro 的积分获取方式有几种注册初始积分、完成实名认证加积分、每日签到加积分、充值购买会员。说实话它的积分体系有点复杂不同时期规则还会微调但核心逻辑是一样的积分越高能用的接口越多每分钟调用次数也越多。我这里有一个大概的对应关系具体数值请以 Tushare Pro 官方文档为准数据类别常见接口大致最低积分要求交易日历trade_cal120 积分股票基础信息stock_basic120 积分日线行情daily120 积分周线月线weekly / monthly120 积分分钟线stk_mins2000 积分以上财务数据income / balancesheet2000 积分开始资金流向moneyflow5000 积分以上龙虎榜top_list5000 积分以上如果你想申请某个接口的权限在网页端“数据权限”页面能找到申请入口有些接口直接点击申请即可有些需要满足积分条件之后自动开放。注意极少有接口是“永远无法开放”的只要你积分到了基本都能用。3.3 接口权限的正确使用方式解决了是否能用的问题还得搞清楚怎么用。我见过很多人拿着一个接口文档就开始写代码结果字段不对、参数不对又反过来以为是权限问题。实际上 Tushare Pro 的接口参数是强校验的少传一个参数或者传错格式都会报错。以日线行情为例标准的调用格式是df pro.daily(ts_code000001.SZ, start_date20240101, end_date20240131)它要求ts_code必须是带后缀的股票代码比如000001.SZ是平安银行600000.SH是浦发银行。不带后缀或者后缀写错服务端会直接拒绝有时候报的就是参数缺失。所以当你看到权限错误时先别急着充积分检查一下是不是接口本身的参数问题。正确的做法是去官方文档把接口定义、参数列表、输出字段全部看一遍再在网页端的调试工具里实际跑一次确保自己的请求格式没问题。4. 实操过程从请求到数据落地4.1 调用基础行情接口我建议新手第一个实战接口直接用daily它的权限门槛低、返回字段丰富、和后续计算指标关联紧密。完整的演示代码如下import tushare as ts import pandas as pd ts.set_token(你的token字符串) pro ts.pro_api() df pro.daily(ts_code000001.SZ, start_date20240101, end_date20240131) print(df.head()) print(df.columns)返回的结果是一个 DataFrame包含以下几个常用字段ts_code、trade_date、open、high、low、close、pre_close、change、pct_chg、vol、amount。这里的vol单位是手amount单位是千元很多人在计算量能指标时会搞错我建议拿到数据后先做单位换算再存库。4.2 处理权限异常的完整代码方案考虑到很多人的积分确实不够我写一段容错代码至少让你知道问题出在哪个环节import tushare as ts import time ts.set_token(你的token字符串) pro ts.pro_api() def fetch_data_with_retry(func, **kwargs): max_retry 3 for i in range(max_retry): try: df func(**kwargs) return df except Exception as e: print(f第{i1}次调用失败: {e}) if 没有访问该接口的权限 in str(e): print(当前账号积分不足或接口未开通建议去Tushare Pro网页端查看具体权限) return None elif 每分钟 in str(e): print(触发频率限制等待60秒后重试) time.sleep(60) else: time.sleep(5) return None df fetch_data_with_retry(pro.daily, ts_code000001.SZ, start_date20240101, end_date20240131)这里用了一个简单重试机制核心思想是区分错误类型。没有访问该接口的权限这个错误重试多少次都没用直接提示用户去网页端处理。如果是频率限制就等一段时间再重新拉。4.3 参数选择与数据落地数据拉下来之后你大概率不会只用一次所以我建议把数据落成本地文件或者数据库避免反复调用占用积分和频率。最省事的方法是存成 CSVdf.to_csv(daily_000001.csv, indexFalse)如果数据量比较大我推荐存 SQLite或者直接上 MySQL。我自己项目的模式是每天增量拉取当日数据追加到数据库里然后做定时任务。Tushare Pro 的接口很适合增量更新因为每条数据都有交易日字段按日期去重比较容易。有一部分人会用 pandas 的to_sql直接写入 MySQL这需要装sqlalchemy和pymysqlfrom sqlalchemy import create_engine engine create_engine(mysqlpymysql://root:passwordlocalhost:3306/quantdata) df.to_sql(daily, engine, if_existsappend, indexFalse)这里有个注意点to_sql如果第一次写入会自动建表但字段类型可能需要手动调整特别是日期字段最好转成datetime类型否则后面做查询筛选会麻烦。5. 常见问题与排查技巧实录5.1 权限报错排查清单我根据自己的经验整理了一个排错顺序按照这个顺序检查基本能解决 90% 的权限报错问题排查步骤操作说明1. Token 是否有效网页端调试工具测试排除 token 本身失效2. Token 初始化顺序确认set_token()在pro_api()之前顺序反了等于没设置3. 接口积分要求看文档确认最低积分积分不够就是权限错误4. 接口是否单独申请网页端查数据权限页面部分接口需要手动开通5. 参数是否完整核对 ts_code 格式和日期参数参数错误有时也提示无权限我强烈建议先做第 3 步和第 4 步。积分不够的情况去个人主页看自己的积分对照文档要求就能确认接口需要单独申请的在数据权限页面直接点申请一般几分钟到一天内会批复。5.2 积分与频率限制的避坑指南很多人以为积分够了一切就顺畅了其实还有一个隐藏限制每分钟调用次数。即使你有权限短期内疯狂调接口也会触发流量限制报错信息同样会带有“权限”或“频率”相关字眼。我实测下来普通 120 积分档位的日线接口一分钟大概能调几十次看起来不少但如果你写循环拉几千只股票的日线很快就会被限流。我的经验是做好三重防护第一单次循环里加time.sleep(0.2)之类的延时第二做好失败重试和退避机制第三批量拉数据时先拉列表再按日期范围分桶去请求避免一次性 pull 太多数据。这样既能稳定拉数据也不会把服务器打爆。另外一个常见误区是重复拉历史数据。如果你只是做日线级别的回测最好把历史数据全量拉一次存本地之后每天增量更新不要每次跑脚本都全量拉一遍既浪费积分又容易触发限流。5.3 其他实用经验最后说几个网上很少提到的细节第一Tushare Pro 返回的日期字段是字符串格式不是 datetime。做回测前建议统一转一下df[trade_date] pd.to_datetime(df[trade_date])第二ts_code的股票代码后缀不是随便写的SH和SZ分别代表上交所和深交所但创业板和科创板要用SZ和SH区分这本身没毛病。不过北交所的代码后缀是BJ千万别搞混。第三Tushare Pro 的pro_bar接口可以方便地获取复权数据但它的参数和pro.daily不完全一样。使用复权数据时建议直接调用ts.pro_bar()它会自动处理复权因子省得你自己计算df ts.pro_bar(ts_code000001.SZ, adjqfq, start_date20240101, end_date20240131)第四如果你要拉全市场股票列表用stock_basic接口但记得加list_statusL参数只获取上市状态的股票避免退市的股票混进你的股票池。第五关于积分提升如果你是个人学习用每天签到加完善个人资料也能慢慢攒积分但如果你要高频使用分钟线和财务数据我建议直接考虑付费服务省下的时间比积分值钱得多。就我个人的感受来说Tushare Pro 的数据质量和稳定性在免费数据源里算是良心了它唯一让人头疼的就是这层权限门槛。不过换个角度想正是因为有这套机制它才能长期稳定地提供服务而不是被少数人刷爆。你只要花一次时间搞懂积分和权限规则后面所有接口都是一个套路调 token、看权限、写代码、落地数据流程非常成熟。