用 Python 获取 A股龙虎榜数据:4 种方法对比
四种做法:直接调 HTTP API、Tushare、AkShare、自己爬网页。推荐第一种 —— 它能一次拿到机构榜 / 游资榜 / 活跃席位三种分榜(其他途径通常只给混在一起的明细),下面给出可运行代码与各自「什么时候别用」。
方法一:直接调 HTTP API(推荐)
龙虎榜是付费端点(Pro 档起):带 Key 一次请求,返回统一信封 `{ ok, endpoint, tier, elapsed_ms, source, data }`。`type` 参数选榜单:`institution` 机构榜 / `hotmoney` 游资榜 / `activeseat` 活跃席位。
返回里 `data` 是给人看的 Markdown 表,而 `structured` 是同一份数据但已结构化(对象数组)——程序里请用 `structured`,不必解析 Markdown。
import requests
KEY = "ct-你的Key" # 龙虎榜端点需要 Key(Pro 档起)
r = requests.get(
"https://api.ashareapi.com/v1/lhb",
headers={"Authorization": "Bearer " + KEY},
params={"type": "institution"}, # institution 机构 / hotmoney 游资 / activeseat 活跃席位
timeout=30,
)
body = r.json()
if not body.get("ok"):
raise RuntimeError(body) # 上游失败返回 ok=false,且不扣调用次数
for row in body["structured"][:3]:
net = float(row["netBuyAmt"]) # 字段值是字符串,算数前先转换
print(row["name"], row["instBuyBranchCount"], "家机构",
"净买", round(net / 1e8, 2), "亿")- `structured[].code` 带市场前缀(如 `sz301234`)· `tdDays` = 上榜天数 · `instBuyBranchCount` = 买入机构家数
- `instBuyAmt` / `netBuyAmt` 单位是元(不是万元)· `instBuyRate` / `netBuyRate` 是百分数(`20` 即 20%)
- 响应另带 `tables`(Markdown 表解析后的二维数组),与 `structured` 同源
三种分榜分别是什么
实测一次(2026-09-23):机构榜返回 34 只、活跃席位 161 个。机构榜第一是五洲医疗(4 家机构买入 1.35 亿、净买 3294 万);活跃席位第一是「沪股通专用」,买入 3.45 亿。
活跃席位的 `code` / `stockName` 都是分号分隔的多只股票且顺序一一对应,比如 `sh600127;sh600664;sh688105` 对应 `金健米业;哈药股份;诺唯赞` —— 用 `split(";")` 拆开即可。
| type | 榜单 | 关键字段 | 回答什么问题 |
|---|---|---|---|
| institution | 机构榜 | instBuyBranchCount 机构家数 · instBuyAmt 机构买入 · netBuyAmt 净买额 | 今天哪些股票被机构席位买入 |
| activeseat | 活跃席位 | name 席位名 · code 关联个股(分号分隔)· buyAmt 买入额 | 哪些营业部/通道最活跃(含沪股通、知名游资营业部) |
| hotmoney | 游资榜 | 当前上游无数据(见 FAQ,如实标注) | 游资动向 —— 目前拿不到 |
方法二:Tushare(top_list / top_inst)
Tushare 提供官方龙虎榜接口,数据质量稳定,但要注册拿 token 并够积分:每日明细 `top_list` 需 2000 积分以上,机构明细 `top_inst` 需 5000 积分以上(以 Tushare 官方文档为准)。
它给的是逐条明细(某股票某席位买了多少),没有按机构/游资分好的榜单 —— 要分榜得自己在明细上聚合。
# pip install tushare
import tushare as ts
pro = ts.pro_api("你的token")
df = pro.top_list(trade_date="20260923") # 龙虎榜每日明细(需 2000 积分以上)
print(df[["ts_code", "name", "net_amount", "reason"]].head())- 什么时候别用:只是想看「今天机构买了什么」—— 明细表还得自己聚合,直接用分榜更快
- 什么时候合适:你已经在 Tushare 生态里做历史研究,需要把龙虎榜和财务、行情数据一起算
方法三:AkShare(stock_lhb_detail_em)
AkShare 免 token、直接抓东财公开页面,龙虎榜入口是 `stock_lhb_detail_em(start_date, end_date)`,另有新浪系的每日详情、机构席位明细、营业部统计等接口。
代价是上游改版就会断、需要你自己升级版本维护(这是它 issue 区的主要内容)。用于一次性研究没问题,做长期跑的任务就要有人盯着。
# pip install akshare
import akshare as ak
df = ak.stock_lhb_detail_em(start_date="20260901", end_date="20260923")
print(df.head())方法四:自己爬东财 / 交易所网页(不推荐)
在没有 API 的时候才考虑。爬龙虎榜会同时踩三件事:页面结构随时变、反爬(限流 / 验证码 / 封 IP)、以及数据用途的合规判断落回你自己头上。
交易所(上交所 / 深交所)的官方披露页是最权威的来源,但它是给人看的页面,不是给程序读的接口 —— 解析成本高、字段口径还要自己对齐。
四种方法怎么选
| 对比项 | 直接调 HTTP API | Tushare | AkShare | 自己爬网页 |
|---|---|---|---|---|
| 上手成本 | 最低:一个 GET 请求 | 注册 + 攒积分 | 装库即可 | 最高:解析 + 反爬 |
| 要钱吗 | 付费端点(Pro 档起) | 积分门槛(2000 / 5000) | 免费 | 免费但费人 |
| 分榜 | 机构 / 游资 / 活跃席位 | 只有明细,需自聚合 | 只有明细,需自聚合 | 看页面 |
| 稳定性 | 多源自动切换 + 缓存 | 官方接口,稳定 | 上游改版会断 | 页面一改就断 |
| 适合 | 按天看机构与席位动向 | 历史研究 + 多数据联合 | 一次性研究 | 无 API 的特殊数据 |
几个容易踩的坑(实测)
- 字段值都是字符串:`"135160431.2"` 要 `float()` 之后再算,直接相加会变成字符串拼接
- 金额单位是元:五洲医疗 135160431.2 = 1.35 亿 —— 别当成万元再乘一次
- `instBuyRate` / `netBuyRate` 是百分数(20 = 20%),不是小数
- `code` 要带市场前缀(`sz301234` / `sh600664`);活跃席位的 code 是分号分隔的多只股票
- `data` 是 Markdown 字符串、`structured` 才是数组 —— 程序化处理用后者
- 游资榜(`hotmoney`)当前上游无数据,会返回「未找到市场数据」(实测 2026-09-17 至 09-22 都是如此)
常见错误与边界
- `401` = 没带 Key:龙虎榜是付费端点,匿名调用会被拒
- `429` = 超频:按你 Key 的档位限流,降频或升档即可
- `ok:false` = 上游取数失败:已自动换源,且不扣调用次数,重试一次通常就好
- 更新节奏:交易日盘后更新(盘中没有当日龙虎榜,这是市场的披露节奏,不是接口延迟)
- `date` 参数可查历史(`YYYY-MM-DD`),留空 = 最近交易日;休市日不会变成「今天」
常见问题
机构榜(`institution`)统计的是机构专用席位的买入:机构家数、机构买入额、净买额 —— 用来判断「有没有机构资金进场」。游资榜(`hotmoney`)看的是知名游资营业部的动向。两者是不同口径,不能相互替代。
这是如实说明:我们实测 2026-09-17 至 09-22 的游资榜都没有数据,上游该口径暂时拿不到。当前建议用机构榜 + 活跃席位:活跃席位里能看到沪股通专用和知名游资营业部(如开源证券西安西大街)的买入额与关联个股,能覆盖大部分「钱从哪来」的问题。我们会在上游恢复后自动接回,无需改代码。
交易日盘后。龙虎榜是交易所收盘后披露的,所以盘中查不到当天的(这不是接口延迟,是数据本身的产生时间)。`date` 字段/参数会告诉你数据属于哪一天。
不能。龙虎榜属于付费端点(Pro 档起);免费的是行情快照、K线、热搜、市场总览、涨跌分布这 5 个。如果你只想先验证接口形状,可以先看端点页上的返回示例。
金额字段(`instBuyAmt` / `netBuyAmt` / `totalBuyAmt` / `buyAmt`)单位都是元;比率字段(`instBuyRate` / `netBuyRate`)是百分数,`20` 表示 20%。所有数值在 JSON 里都是字符串,计算前请先 `float()`。
最后更新: 2026-09-23
代码与字段取自线上真实返回(2026-09-23 实测:机构榜 34 只 / 活跃席位 161 个 / 游资榜无数据)。Tushare 与 AkShare 的描述基于其官方文档(Tushare top_list doc_id=106、top_inst doc_id=107;AkShare stock_lhb_detail_em),接口与积分门槛以其官方为准。