教程

用 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。

Python(可直接运行,需 Key)
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(";")` 拆开即可。

institution
机构榜
instBuyBranchCount 机构家数 · instBuyAmt 机构买入 · netBuyAmt 净买额
今天哪些股票被机构席位买入
activeseat
活跃席位
name 席位名 · code 关联个股(分号分隔)· buyAmt 买入额
哪些营业部/通道最活跃(含沪股通、知名游资营业部)
hotmoney
游资榜
当前上游无数据(见 FAQ,如实标注)
游资动向 —— 目前拿不到

方法二:Tushare(top_list / top_inst)

Tushare 提供官方龙虎榜接口,数据质量稳定,但要注册拿 token 并够积分:每日明细 `top_list` 需 2000 积分以上,机构明细 `top_inst` 需 5000 积分以上(以 Tushare 官方文档为准)。

它给的是逐条明细(某股票某席位买了多少),没有按机构/游资分好的榜单 —— 要分榜得自己在明细上聚合。

对比: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 区的主要内容)。用于一次性研究没问题,做长期跑的任务就要有人盯着。

对比:AkShare 的写法(示意)
# pip install akshare
import akshare as ak

df = ak.stock_lhb_detail_em(start_date="20260901", end_date="20260923")
print(df.head())

方法四:自己爬东财 / 交易所网页(不推荐)

在没有 API 的时候才考虑。爬龙虎榜会同时踩三件事:页面结构随时变、反爬(限流 / 验证码 / 封 IP)、以及数据用途的合规判断落回你自己头上。

交易所(上交所 / 深交所)的官方披露页是最权威的来源,但它是给人看的页面,不是给程序读的接口 —— 解析成本高、字段口径还要自己对齐。

四种方法怎么选

上手成本
最低:一个 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`)看的是知名游资营业部的动向。两者是不同口径,不能相互替代。

游资榜(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),接口与积分门槛以其官方为准。