ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Tushare Pro实战:Python获取A股行情、财务与龙虎榜数据全指南

Tushare Pro实战:Python获取A股行情、财务与龙虎榜数据全指南 这话我特别有感触。前几年刚开始接触量化分析的时候最折磨我的不是策略写不出来而是数据从哪来。今天用这个免费接口、明天手工从财经网站复制数据格式不统一、字段对不上、历史数据缺胳膊少腿一套策略还没跑起来光折腾数据就花掉一半时间。后来换到 Tushare Pro才算是把这个问题彻底解决掉。这篇文章我就以一线使用的视角把从环境搭建到实战拿数的完整过程捋一遍代码全部可以直接复制运行希望能帮你少走一些弯路。1. 为什么我选择用 Tushare Pro 解决 A 股数据获取问题先说说这个工具到底解决的是什么痛点。做 A 股数据分析的朋友应该都有体会行情软件能看图但数据导出来麻烦爬虫自己写动不动就被反爬策略挡住而且历史数据补全也是大工程市面上各种付费数据终端价格对个人玩家来说又不太友好。Tushare Pro 走的是另一种路子——它把数据整理好、接口化你只需要用 Python 调用就能拿到结构化的行情、财务、龙虎榜等数据。我当时的判断标准其实就三条这也决定了后来长时间的使用体验。第一条是数据覆盖面。日线行情、分钟线、财务指标、资产负债表、利润表、龙虎榜、融资融券、大宗交易、期货数据基本上你平时做研究能想到的品种它都有对应的接口。这意味着我不需要在多个数据源之间来回切换一个库解决大部分问题。第二条是接口设计。Tushare Pro 的接口是标准化的返回的是 pandas DataFrame和 Python 生态无缝衔接。拿到数据之后直接就能做计算、画图、建模不需要自己再做一层繁琐的格式转换。这一点对后续所有工作流来说都是巨大的效率提升。第三条是免费额度路径。虽然部分接口有积分门槛但注册、完善资料、参与社区任务都能攒积分日常使用的绝大多数接口可以免费拿下。对个人学习研究来说这个成本结构很合适。也有朋友问我为什么不直接用 akshare 或者其他开源库。我的体会是akshare 这类免费库胜在零门槛但数据稳定性和文档完整度参差不齐部分接口挂在网页爬虫上隔一段时间就可能失效Tushare Pro 的接口更接近成熟商业数据服务的体验字段说明规范、更新稳定出了问题也好排查。当然如果你只是随手拿个数据玩一玩哪个顺手用哪个都行如果是认真要做自己的数据体系Tushare Pro 的性价比优势就很明显了。2. 环境准备与最容易被忽略的安装细节我记得自己第一次装 Tushare 的时候以为和装普通库一样简单结果报了一堆错。后来回头看其实大部分问题都可以提前避免。这里把环境搭建的完整流程和容易踩的坑一起说清楚。2.1 Python 环境与 tushare 安装步骤无论你用的是 Windows、macOS 还是 Linux核心步骤是一样的。安装 Python 的时候我建议直接装 Python 3.9 以上版本Tushare 的版本迭代比较快新版本对新的 Python 兼容性更好。安装完 Python 之后强烈建议先建一个虚拟环境别一股脑往系统环境里塞包。我自己通常是这样操作的# 创建虚拟环境 python -m venv tushare_env # 激活虚拟环境 # Windows tushare_env\Scripts\activate # macOS / Linux source tushare_env/bin/activate # 升级 pip避免后续安装报错 pip install --upgrade pip # 安装 tushare、pandas、matplotlib 等常用库 pip install tushare pandas matplotlib这里提一个常见错误有些朋友在安装后立即运行import tushare结果提示找不到模块。原因经常是虚拟环境和全局环境混淆了——终端里激活的 Python 解释器和你装包的 pip 对应的不是同一个环境。最简单的确认方法是在激活环境后运行python -c import tushare; print(tushare.__version__)如果能看到版本号说明环境没问题如果报错就要检查pip是不是被软链接到了其他地方。2.2 注册 Tushare Pro 账号与 Token 配置的核心逻辑环境装好后接下来是注册账号。在 Tushare Pro 官网注册登录后进入个人主页找到接口TOKEN页面复制那一串 token。这个 token 相当于你访问数据接口的钥匙所有请求都要带上它。token 配置有两种常见方式。第一种是在代码里直接设置import tushare as ts ts.set_token(你的token) pro ts.pro_api()第二种是在项目根目录放一个.env文件用环境变量的方式管理这样更安全也方便代码库共享时隐藏敏感信息# 安装 python-dotenvpip install python-dotenv import os from dotenv import load_dotenv load_dotenv() import tushare as ts ts.set_token(os.getenv(TUSHARE_TOKEN)) pro ts.pro_api()这里多说一句token 是个人账户凭证尽量不要直接硬编码在公开的 Jupyter Notebook、GitHub 仓库或者博客示例里。我见过不少人在分享代码时把 token 一起贴出来结果账号被别人盗刷积分的情况。哪怕只是自己本地用也建议养成用环境变量的习惯。2.3 验证环境用最简单的接口测试连通性环境装好、token 配置好之后不要急着写复杂逻辑先用一个最简单的接口验证能不能连通。daily接口的积分门槛相对较低注册完善资料基本就能开通很适合作为第一个测试接口。import tushare as ts ts.set_token(你的token) pro ts.pro_api() # 获取平安银行最近几个交易日的日线行情 df pro.daily(ts_code000001.SZ, start_date20250101, end_date20250301) print(df.head())如果能在输出里看到ts_code、trade_date、open、high、low、close这些字段恭喜你整个链路已经通了可以继续往下做正经事情了。3. 核心数据接口实战行情、财务、龙虎榜一次拿全这一节是整个文章的重头戏也是你后面所有分析工作的地基。我会把日线行情、财务数据、龙虎榜数据三块分别讲透包括接口怎么调、返回什么样的数据、有哪些值得注意的字段和坑。3.1 日线行情接口从一行代码到完整的数据获取流程日线行情是所有 A 股数据分析里最基础、也最高频使用的数据。Tushare Pro 里对应的接口是pro.daily()。调用方式很简单传股票代码和日期范围就行import tushare as ts ts.set_token(你的token) pro ts.pro_api() # 获取平安银行 2025年1月1日至今的日线行情 df pro.daily(ts_code000001.SZ, start_date20250101, end_date20250301) print(df.head())返回结果长这样字段名和格式很有代表性ts_code股票代码带后缀例如000001.SZ表示深交所600000.SH表示上交所。trade_date交易日期格式是YYYYMMDD的 8 位字符串。open / high / low / close开盘价、最高价、最低价、收盘价单位是元。pre_close昨收盘价。change涨跌额等于 close 减去 pre_close。pct_chg涨跌幅单位是百分数接口直接帮你算好了。vol成交量单位是手注意 1 手 100 股。amount成交额单位是千元不是元。这里有两个非常容易弄混的地方我特意说明一下都是血泪教训。第一daily返回的数据是未复权价格。什么是未复权就是交易所每天公布的原始价格。如果一只股票发生了分红、送股除权除息之后价格会留下一个明显的跳空缺口。这个缺口不是真实的涨跌而是股本变化导致的数字变化。如果你要用历史价格计算收益率、做策略回测用未复权数据会导致结果严重失真。解决方法是使用pro_bar接口指定adjqfq前复权或adjhfq后复权。日常看盘用daily没问题但一旦涉及量化回测一定要用复权数据。第二vol和amount的单位都是缩水的。vol是手amount是千元。网上能看到很多新手把所有数据加起来算总成交额结果数量级差了好几位。如果你想把成交额换算成亿元直接df[amount] / 100000就能得到亿元口径因为amount单位是千元。3.2 财务数据接口的选择fina_indicator 与 balance_sheet 的区别财务数据这块很多初学者一开始会被一堆接口搞晕fina_indicator、income、balance_sheet、cashflow、forecast每个看着都像财务报表到底该用哪个我从实际使用的角度把它们的区别整理出来。接口名返回内容典型字段适用场景fina_indicator财务指标按报告期计算的比率roe, grossprofit_margin, debt_to_assets快速看公司赚钱能力、偿债能力income利润表revenue, n_income, operate_profit看营收、利润的绝对值balance_sheet资产负债表total_assets, total_liab, equity看资产结构、负债水平cashflow现金流量表n_cashflow_act, free_cashflow看现金流状况forecast业绩预告type, p_change_min, p_change_max事件驱动策略我个人最常用的是fina_indicator因为人家把核心比率都算好了像是roe、grossprofit_margin、debt_to_assets、netprofit_yoy这些字段做基本面筛选的时候直接拿来排序就行不需要自己再做一遍报表计算。但如果你想深入拆解某家公司的财务状况还是得回到income和balance_sheet去扣细项fina_indicator只是一个摘要视图。调用方式不复杂# 获取平安银行的财务指标数据 df_fin pro.fina_indicator(ts_code000001.SZ, start_date20240101, end_date20250301) print(df_fin.head())返回的数据是按报告期组织的大约每个季度一条字段非常多建议用df_fin.columns查看完整列表不要试图一次性记住。这里需要特别提醒一个和日线行情完全不同的特性财务数据不是连续的每日数据而是季报频率。你会发现返回的记录不是从 1 月到 12 月每个月一条而是一季报、中报、三季报、年报这样的节奏。做模型时如果你把财务数据直接和日线行情 join 在一起会产生大量重复或者缺失的报告期错位问题正确做法是按end_date报告期对齐或者对财务指标做向前填充。3.3 龙虎榜数据事件驱动的金矿但有两个关键坑龙虎榜数据是很多做短线和事件驱动策略的玩家重点关注的对象。它直接展示了市场资金博弈的痕迹哪只股票被机构买入哪只被游资炒作净买入额是多少。Tushare Pro 提供了top_list和top_inst两个相关接口。top_list返回某一天上榜的股票列表调用方式是按交易日查询# 获取 2025年2月10日 的龙虎榜数据 df_top pro.top_list(trade_date20250210) print(df_top.head())核心字段包括ts_code股票代码trade_date上榜日期name股票名称close收盘价pct_change涨跌幅net_amount净买额单位是万元buy_amount买入总额单位是万元sell_amount卖出总额单位是万元turnover_rate换手率使用龙虎榜数据有两个关键坑我在实际项目中都踩过。坑一top_list是按交易日维度的不是按股票维度的。也就是说你传的是交易日返回的是当天所有上榜股票如果你想知道某只股票的历史上榜记录需要遍历一段时间内的所有交易日然后筛选ts_code。我最早写策略脚本时就卡在这里以为传ts_code就能拿到单只股票的榜单结果返回空。坑二net_amount单位是万元不是元。不少新手直接拿这个数去和其他金额字段对比结果差了一万倍。Tushare 的文档里单位标注其实是有的但很容易被忽略。建议养成拿到数据后先head()看几行、再检查单位的好习惯。另外还有一点龙虎榜数据通常在下个交易日早上 8 点左右更新完毕。如果你写了一个每天早上自动拉取昨日龙虎榜的程序时间点最好设计在 8 点半以后留出冗余否则容易拉到不完整的数据。3.4 免费积分怎么获取一个不用花钱的路径写完三类核心接口的调用之后肯定会有朋友问积分不够怎么办 这确实是 Tushare Pro 新用户最常见的困惑。daily接口需要 120 积分fina_indicator需要 2000 积分top_list需要 2000 积分看起来门槛不低但实际上有相当一部分积分是可以免费攒出来的。我整理了自己走过的免费积分路径注册账号在 Tushare Pro 官网注册初始会送一部分基础积分。完善资料在个人中心把职业、领域、使用场景这些资料填完整会送一部分积分。我当时填完资料后积分从 120 涨到了 500 左右。发帖/回帖社区里发一个有效的帖子能够获得积分。这个看内容质量我发过几个接口使用心得帖子攒了一些。官方任务在首页和公告里偶尔会有一些活动或任务比如写接口文档、反馈 bug参与就能拿积分。这一块比较随缘但遇到了就是几十上百积分的大包。如果等不及攒积分还有一个非常实用的方案先注册一个账号用低积分接口比如 daily 需要的 120 积分注册完善资料基本就够了把行情数据这块跑通财务和龙虎榜后面再针对性升级。不要一上来就纠结所有接口全部开通那是给自己设不必要的门槛。3.5 数据落地CSV 存档与增量更新策略接口可以调通之后紧接着要面对的问题就是怎么把数据保存下来避免每次重复拉取。直接调用接口做全量拉数据会有两个问题一是慢二是浪费接口调用次数。尤其像财务和龙虎榜这种更新频率不高的数据完全可以做成本地存档。我在实际项目中常用的做法有三种。第一种全量覆盖存档。适合小数据量、低频更新的数据。比如龙虎榜每天只有几十上百条直接把当天数据追加到一个 CSV 里遇到重复日期就覆盖。简单粗暴适合个人复盘。第二种按日期增量更新。适合日线行情这种每天都更新的数据。第一次先拉全历史后面每天只拉最近一个交易日的数据追加到 CSV 尾部。这是我最常用的方式。第三种数据库存储。当数据量大到 CSV 处理不过来或者要做复杂条件查询时建议直接上 SQLite 或 MySQL。Tushare 社区里也有很多现成的数据库表结构设计可以直接抄作业。下面给一个简单的增量更新示例核心思路是记录上次拉到哪一天# 增量更新日线数据到CSV import tushare as ts import pandas as pd import os ts.set_token(你的token) pro ts.pro_api() def update_daily_to_csv(ts_code, csv_path): # 读取已有CSV的最后日期 if os.path.exists(csv_path): df_old pd.read_csv(csv_path) last_date df_old[trade_date].max() start_date str(int(last_date) 1) # 从下一天开始拉 else: start_date 20200101 # 拉取新数据 df_new pro.daily(ts_codets_code, start_datestart_date, end_date20250301) if df_new is not None and not df_new.empty: # 合并并去重 df_all pd.concat([df_old, df_new], ignore_indexTrue) df_all df_all.drop_duplicates(subset[ts_code, trade_date]) df_all.to_csv(csv_path, indexFalse) print(f更新完成新增 {len(df_new)} 条总数据 {len(df_all)} 条) else: print(没有新数据) # 使用示例 update_daily_to_csv(000001.SZ, sz000001_daily.csv)这个函数看起来简单但实际价值很高。比如你想维护一个全市场 5000 只股票的日线数据库用这个思路批量跑配合多线程或者异步很快就能攒起一份自己的本地数据资产。3.6 常见错误与排错技巧最后补一节排错指南全都是血泪经验。Tushare 新手大概率会遇到下面几个报错这里直接给出原因和解决方案。错误一抱歉您没有访问该接口的权限原因当前账号积分不足未达到该接口的积分门槛。解决检查接口文档里的积分要求攒积分或升级账号。注意这是 Tushare 最常见的报错不是代码问题是你权限不够。错误二每分钟访问次数超过限制原因Tushare Pro 对普通用户有每分钟调用次数限制。解决在调用循环中加入time.sleep(0.2)之类的时间间隔或者控制单次请求的数据量。技巧批量拉取全市场股票时尽量用trade_date维度拉取一次拿全市场而不是股票维度一只一只地拉。以日线为例用pro.daily(trade_date20250210)一次就能拿到当天全市场约 5000 只股票的数据比循环 5000 次高效得多。错误三请求超时或者连接被重置原因网络问题或者单次请求数据量太大。解决减少单次请求的时间范围比如一年一年地拉或者设置重试机制。技巧把请求封装成带重试的函数3 次重试加指数退避基本能解决 90% 的偶发网络问题。错误四数据里出现 NaN 或字段缺失原因停牌股票、新上市股票会有部分字段缺失这是正常现象。解决用df.dropna(subset[close])过滤或者在策略里对 NaN 做向前填充。心态不要试图消灭 NaNNaN 本身是信息——它告诉你这只股票当时停牌或数据未更新。错误五本地时间和接口时间不一致原因Tushare 的trade_date是北京时间但你的服务器可能在其他时区。解决统一用字符串比较不要用本地datetime.now()去构造trade_date。建议所有日期参数都用字符串硬编码或者在配置里统一管理避免时区干扰。按这个排查思路走绝大多数 Tushare 使用问题都能快速定位到根因。4. 一个能直接执行的完整示例程序理论部分说得够多了是时候把完整代码放出来了。下面这个程序我尽量写得务实一点既能把数据拿下来又能落到本地 CSV还能顺手打印几条示例方便你验证自己的环境是否配置正确。代码可以直接复制运行。 A股数据获取综合示例日线行情 财务指标 龙虎榜 作者一个曾被数据搞得头大的博主 说明请将 YOUR_TOKEN 替换成自己的 Tushare Pro token import tushare as ts import pandas as pd import time import os # 配置区 TOKEN YOUR_TOKEN ts.set_token(TOKEN) pro ts.pro_api() # 输出的CSV路径 DAILY_CSV daily_000001.csv FIN_CSV fin_000001.csv TOP_CSV top_list.csv # 1. 获取日线行情 def fetch_daily(ts_code000001.SZ, start_date20240101, end_date20250301): df pro.daily(ts_codets_code, start_datestart_date, end_dateend_date) return df # 2. 获取财务指标 def fetch_financial(ts_code000001.SZ): df pro.fina_indicator(ts_codets_code, start_date20240101, end_date20250301) return df # 3. 获取龙虎榜 def fetch_top_list(trade_date20250210): df pro.top_list(trade_datetrade_date) return df # 4. 保存到CSV def save_csv(df, path): if df is not None and not df.empty: df.to_csv(path, indexFalse, encodingutf-8-sig) print(f[OK] 已保存 {len(df)} 条数据到 {path}) else: print(f[WARN] {path} 无数据) # 主流程 if __name__ __main__: # 1. 日线行情 df_daily fetch_daily() print(f日线行情{len(df_daily)} 条) print(df_daily.head(3)) save_csv(df_daily, DAILY_CSV) time.sleep(0.3) # 控制请求频率 # 2. 财务指标 df_fin fetch_financial() print(f财务指标{len(df_fin)} 条) print(df_fin[[ts_code, end_date, roe, grossprofit_margin]].head(3)) save_csv(df_fin, FIN_CSV) time.sleep(0.3) # 3. 龙虎榜 df_top fetch_top_list() print(f龙虎榜{len(df_top)} 条) if not df_top.empty: print(df_top[[ts_code, name, close, net_amount]].head(3)) save_csv(df_top, TOP_CSV) print(\n全部完成数据已保存到本地 CSV 文件。)运行这个脚本后当前目录会生成三个 CSV 文件daily_000001.csv、fin_000001.csv、top_list.csv。每跑一次都会被覆盖如果你想要增量追加参考前面写的update_daily_to_csv()函数就行。5. 数据可视化别让数据躺在 CSV 里睡大觉数据拿到手只是第一步能把数据变成观点才是做分析的关键。下面展示两段简短的绘图代码一段是K线图一段是涨跌幅分布直方图。这两段代码都不复杂但很实用。5.1 K线图用 matplotlib 画最基础的蜡烛图K线图是 A 股分析里最常用的可视化图形。如果你不想装mplfinance这种专业库用matplotlib也能画一个简易的K线图。import matplotlib.pyplot as plt import pandas as pd import tushare as ts ts.set_token(你的token) pro ts.pro_api() # 读取刚才保存的日线数据 df pd.read_csv(daily_000001.csv) df df.sort_values(trade_date).reset_index(dropTrue) # 取最近20个交易日 df df.tail(20) plt.figure(figsize(12, 6)) # 用收盘价画折线 plt.plot(pd.to_datetime(df[trade_date]), df[close], markero, labelclose) plt.title(000001.SZ 最近20日收盘价) plt.xlabel(日期) plt.ylabel(收盘价) plt.xticks(rotation45) plt.grid(True, alpha0.3) plt.legend() plt.tight_layout() plt.savefig(kline_close.png, dpi150) plt.show()画出来之后你能直观看到价格走势。如果想画更精细的蜡烛图推荐装一个mplfinance三行代码就能出图支持均线、成交量、MACD 叠加。# 使用 mplfinance 画专业K线图需要先 pip install mplfinance import mplfinance as mpf df pd.read_csv(daily_000001.csv, index_col0, parse_datesTrue) df df.sort_index() # mplfinance 需要列名Open High Low Close Volume df_plot df[[open, high, low, close, vol]].rename(columns{ open: Open, high: High, low: Low, close: Close, vol: Volume }) mpf.plot(df_plot.tail(30), typecandle, volumeTrue, mav(5, 10, 20), title000001.SZ, stylecharles)5.2 涨跌幅分布直方图一眼看出市场情绪另外一个常用画面是把某天全市场股票的涨跌幅拉出来画成直方图看市场整体情绪。这个画面特别适合做盘后复盘。import matplotlib.pyplot as plt # 获取某一天全市场行情 df_all pro.daily(trade_date20250210) # 过滤掉无涨跌幅的数据 df_all df_all.dropna(subset[pct_chg]) plt.figure(figsize(10, 6)) plt.hist(df_all[pct_chg], bins50, colorsteelblue, edgecolorwhite, alpha0.8) plt.axvline(x0, colorred, linestyle--, linewidth1.5, label涨跌分界线) plt.title(2025-02-10 全市场涨跌幅分布) plt.xlabel(涨跌幅(%)) plt.ylabel(股票数量) plt.legend() plt.grid(True, alpha0.3) plt.tight_layout() plt.savefig(market_pct_dist.png, dpi150) plt.show()这个直方图一出来你就能立刻感受到当天市场的状态是普涨、普跌、还是结构分化。如果配合连续几天的分布变化还能看出情绪的演变过程。这些都是直接从 Tushare 数据里能得到的第一手信息。6. 进阶玩法把 Tushare Pro 变成你的量化数据中台如果你已经能熟练获取日线、财务、龙虎榜三类数据说明 Tushare Pro 的基本功已经比较扎实了。接下来提几个我自己觉得性价比极高的进阶方向每一个都值得花时间深入。6.1 自建本地数据库从 CSV 走向 SQLite当你的数据量变大CSV 文件就变得不好维护打开大文件卡顿、条件查询麻烦、数据更新容易产生重复。这时候我建议把数据迁到 SQLite。SQLite 是 Python 内置支持的轻量数据库不需要单独安装服务非常适合个人量化项目。一个基本的做法是建三张表daily、financial、top_list。然后写一个同步函数把拉取到的 DataFrame 直接to_sql()写进去。这个过程不难但数据库表结构设计需要提前规划好比如trade_date和ts_code联合起来做唯一索引防止重复数据。import sqlite3 conn sqlite3.connect(a_share.db) df_daily.to_sql(daily, conn, if_existsappend, indexFalse) df_fin.to_sql(financial, conn, if_existsappend, indexFalse) df_top.to_sql(top_list, conn, if_existsappend, indexFalse) conn.close()注意to_sql默认会在重复执行时创建重复记录个人项目里数据量不大我推荐先按唯一键查重再插入保证数据一致性。6.2 技术指标计算自己动手用 pandas 实现技术指标是很多人做策略的必备工具。TA-Lib 是量化圈最常用的技术指标库但安装有时候会让人头疼。如果你不想折腾我建议用 pandas 直接实现常见指标比如移动平均线、MACD、RSI。这些指标的计算逻辑并不复杂用rolling、ewm这些内置方法就能搞定。举个例子计算均线和 MACD# 计算均线 df[ma5] df[close].rolling(5).mean() df[ma20] df[close].rolling(20).mean() # 计算 MACD ema12 df[close].ewm(span12, adjustFalse).mean() ema26 df[close].ewm(span26, adjustFalse).mean() df[dif] ema12 - ema26 df[dea] df[dif].ewm(span9, adjustFalse).mean() df[macd] (df[dif] - df[dea]) * 2运行之后你就得到了一整列趋势指标。把这些指标和 Tushare 的基本面数据、龙虎榜数据结合起来就能搭出一个很初级的选股框架。6.3 定时任务每天早上自动拉取数据如果你希望每天开盘前自动更新数据可以写一个 Python 脚本然后用系统的定时任务去调用。以 Linux/macOS 为例用 crontabWindows 可以用任务计划程序。# 每天 8:40 运行一次数据更新脚本 40 8 * * 1-5 cd /path/to/your/project /usr/bin/python3 update_data.py update.log 21这里有个细节A 股交易日是周一到周五所以 cron 表达式里用1-5限定工作日。但遇到节假日即使在工作日也没有新数据这需要脚本里做判断如果当天trade_date的行情数据为空就直接退出不产生报警。如果你用的是云服务器那这个定时任务基本就等于一个小的自动数据中台了。每天早上打开数据库前一天的数据已经躺在那里可以直接用来写复盘或者跑策略。6.4 批量获取全市场数据两种思路的取舍最后一个进阶方向也是很多人的痛点如何批量获取全市场数据。A 股目前有 5000 只股票如果一只一只地拉日线就算每次 0.2 秒一轮也要近 20 分钟。而且 Tushare 有调用频率限制盲目快跑会被限流。我优先推荐按交易日批量拉取模式pro.daily(trade_date20250210)一次拿到全市场当天数据然后把全市场的历史数据分成多年份、按年份拉取。这样请求次数少、数据整齐后续也方便入库。如果确实需要按股票维度批量拉取建议用ThreadPoolExecutor做有限并发同时控制 QPS防止接口被限流。from concurrent.futures import ThreadPoolExecutor, as_completed def fetch_one(ts_code): try: return pro.daily(ts_codets_code, start_date20240101, end_date20250301) except Exception as e: print(f{ts_code} 失败: {e}) return None # 假设 stock_list 是你的股票列表 stock_list [000001.SZ, 600000.SH, 000002.SZ] with ThreadPoolExecutor(max_workers3) as executor: futures [executor.submit(fetch_one, code) for code in stock_list] for future in as_completed(futures): df future.result() if df is not None and not df.empty: print(df[ts_code].iloc[0], len(df))注意并发数不要开太高建议从 3~5 个线程开始测试逐步调优。7. 易错点整理一张表查清楚高频问题写到这里我想把使用过程中踩过的一些坑系统性地整理出来。这些坑不会出现在官方文档里但几乎每个深入使用 Tushare 的人都会遇到。问题现象根本原因解决方案积分不足返回无权限账号积分未达门槛完善资料 社区任务攒积分每分钟限频提示访问太频繁超过了接口频控加 sleep 或按交易日维度批量拉取未复权跳空价格突变daily 返回未复权数据用 pro_bar 指定复权方式财务报告期错位数据不均匀财务按季报频率发布按 end_date 对齐报告期龙虎榜查询方式错误top_list 不支持 ts_code 查询接口按交易日返回遍历交易日再筛选 ts_codeNaN 数据字段缺失停牌或新上市dropna 或向前填充时区问题日期差一天trade_date 是北京时间日期参数全部用字符串除了表格里的问题我再补充三个使用习惯对长期稳定使用 Tushare 很重要。习惯一把接口封装成自己的工具库。我在项目里会维护一个data_utils.py里面统一封装了 token 配置、请求重试、日期参数校验、返回格式整理。这样每次写新脚本时只需要调用封装好的函数不用重复写一堆样板代码。时间长了你会发现自己积累了一个非常适合个人习惯的数据工具箱。习惯二接数据之前先设计方案不要边拉边想。很多新手拿 Tushare 时一上来就写循环把所有数据都拉一遍结果拉完才发现字段没选对、时间范围不对、数据格式不合适又要重来。我建议先明确几个问题你要什么指标时间范围是多少数据更新频率多高要不要复权想清楚了再写代码效率会高很多。习惯三写文档、记笔记尤其是接口字段的坑。前面提到的vol单位是手、amount单位是千元、net_amount单位是万元这些都是容易踩的细节。如果不记下来过几个月回来再看代码你很可能已经忘了当初为什么那样处理。用 Markdown 维护一份自己的字段速查表长期价值很高。最后再分享一个我自己的使用习惯所有数据请求我都会统一封装在一个文件里接口参数、积分要求、字段备注全部写在函数注释中。这样做的时间越长积累的数据工具就越顺手后续不管是做报告还是写策略效率都会高出一大截。希望这篇文章能让你在 A 股数据获取上少踩几个坑把更多精力放到真正有价值的研究上去。
返回列表