龙虎榜
每次复盘看龙虎榜,一大堆买卖席位看得眼花缭乱,分不清哪些是机构进场、哪些是游资短线炒作?学会龙虎榜可视化,一键梳理席位数据,轻松掌握机构资金动向,复盘效率直接翻倍。
今天我们来学习一下同花顺官方Api最后一个功能,查看龙虎榜的功能
龙虎榜数据按交易日返回 A 股龙虎榜首页整体榜单。一个接口覆盖“全部 / 机构榜 / 游资榜”,通过 board_type 区分。 接口固定返回全量数据,不分页。
游资榜展示:
关联个股:
龙虎榜数据接口
查询机构 在 2026-08-21 的龙虎榜
https://fuyao.aicubes.cn/api
/a-share/special-data/dragon-tiger-list
?board_type=org&date=2026-08-21
{ "code": 0, "message": "success", "request_id": "58fba2e96fe644be9d8c6ee31aa7b960", "data": { "timestamp": 1787241600000, "board_type": "org", "trade_date": "2026-08-21", "count": 33, "stock_count": 32, "stock_items": [ { "thscode": "600547.SH", "ticker": "600547", "name": "山东黄金", "concept_list": [ { "name": "黄金概念" }, { "name": "国企改革" }, { "name": "数字经济" } ], "change": 0.049575, "net_value": 855648751.87, "net_rate": 0.04945275, "hot_rank": 82, "buy_value": 3371674861.76, "sell_value": 2516026109.89, "range_days": 3, "org_net_value": 439393585.55, "org_net_rate": 0.02539502, "org_buy_num": 1, "org_sell_num": 1, "hot_money_net_value": -273426170.29 }, { "thscode": "300142.SZ", "ticker": "300142", "name": "沃森生物", "concept_list": [ { "name": "生物疫苗" }, { "name": "流感" }, { "name": "创新药" } ], "change": 0.064815, "net_value": 506112365.36, "net_rate": 0.06187621, "hot_rank": 33, "buy_value": 1217288510.42, "sell_value": 711176145.06, "range_days": 1, "org_net_value": 174825083.18, "org_net_rate": 0.02137374, "org_buy_num": 3, "org_sell_num": 1, "hot_money_net_value": -92298315.14 }, { "thscode": "002437.SZ", "ticker": "002437", "name": "誉衡药业", "concept_list": [ { "name": "仿制药一致性评价" }, { "name": "医药电商" }, { "name": "创新药" } ], "change": -0.080338, "net_value": -183332481.99, "net_rate": -0.06121514, "hot_rank": 36, "buy_value": 366312073.21, "sell_value": 549644555.2, "range_days": 1, "org_net_value": 168512960.1, "org_net_rate": 0.05626686, "org_buy_num": 3, "org_sell_num": 0, "hot_money_net_value": -296317008 }, { "thscode": "002491.SZ", "ticker": "002491", "name": "通鼎互联", "concept_list": [ { "name": "5G" }, { "name": "数据中心(AIDC)" }, { "name": "光纤概念" } ], "change": 0.100156, "net_value": 107468920.49, "net_rate": 0.01479639, "hot_rank": 3, "buy_value": 871358898.96, "sell_value": 763889978.47, "limit_reason": "中报扭亏+光纤光缆+储能安防", "range_days": 1, "org_net_value": 167141952.47, "org_net_rate": 0.02301221, "org_buy_num": 2, "org_sell_num": 1, "hot_money_net_value": -89957240.89 } ] } }
查询游资 在 2026-08-21 的龙虎榜
https://fuyao.aicubes.cn/api/a-share
/special-data/dragon-tiger-list
?board_type=hot_money&date=2026-08-21
{ "code": 0, "message": "success", "request_id": "6a896452a4164595b30c01dae7eb0cb2", "data": { "timestamp": 1787241600000, "board_type": "hot_money", "trade_date": "2026-08-21", "count": 55, "stock_count": 49, "stock_items": [], "hot_money_items": [ { "name": "方新侠", "buying": 172171152.900000, "rows": [ { "thscode": "688114.SH", "ticker": "688114", "name": "华大智造", "concept_list": [ { "name": "基因测序" }, { "name": "智能医疗" }, { "name": "脑机接口" } ], "change": 0.082188, "net_value": 159685659.47, "net_rate": 0.05525735, "hot_rank": 373, "buy_value": 608727174.92, "sell_value": 449041515.45, "range_days": 3, "org_net_value": -88301206.81, "amount": 2889853606, "hot_money_net_value": 121600652.41, "hot_money_net_rate": 0.04207848, "hot_money_item_net_value": 88392818.320000, "hot_money_item_net_rate": 0.0305872997 }, { "thscode": "688185.SH", "ticker": "688185", "name": "康希诺", "concept_list": [ { "name": "生物疫苗" }, { "name": "猴痘概念" }, { "name": "CRO概念" } ], "change": 0.200062, "net_value": 201512763.89, "net_rate": 0.10656305, "hot_rank": 155, "buy_value": 415146254.91, "sell_value": 213633491.02, "range_days": 1, "amount": 1891019107, "hot_money_net_value": 278658569.3, "hot_money_net_rate": 0.14735894, "hot_money_item_net_value": 83778334.580000, "hot_money_item_net_rate": 0.0443032724 } ] }, { "name": "宁波桑田路", "buying": 112807269.160000, "rows": [ { "thscode": "688185.SH", "ticker": "688185", "name": "康希诺", "concept_list": [ { "name": "生物疫苗" }, { "name": "猴痘概念" }, { "name": "CRO概念" } ], "change": 0.200062, "net_value": 201512763.89, "net_rate": 0.10656305, "hot_rank": 155, "buy_value": 415146254.91, "sell_value": 213633491.02, "range_days": 1, "amount": 1891019107, "hot_money_net_value": 278658569.3, "hot_money_net_rate": 0.14735894, "hot_money_item_net_value": 112807269.160000, "hot_money_item_net_rate": 0.0596542196 } ] } ] }}

| | |
|---|
thscode | | 带交易所后缀的标准代码,例如 002407.SZ。 |
ticker | | |
name | | |
concept_list | | |
change | | |
net_value | | |
net_rate | | |
hot_rank | | |
buy_value | | |
sell_value | | |
limit_reason | | |
range_days | | |
org_net_value | | |
org_net_rate | | |
org_buy_num | | |
org_sell_num | | |
amount | | |
hot_money_net_value | | |
hot_money_net_rate | | |
hot_money_item_net_value | | |
hot_money_item_net_rate | | |
hot_money_items[] 字段:
| | |
|---|
name | | |
buying | | |
rows | | 该游资关联股票列表,字段同 stock_items[]。 |
龙虎榜可视化
工具函数
# ============================================================================# 二、工具函数# ============================================================================@st.cache_data(ttl=300, show_spinner=False)def fetch_dragon_tiger(api_key: str, board_type: str, trade_date: str) -> Dict[str, Any]: """调用龙虎榜接口, 返回原始 data 字典; 出错时抛出带中文说明的异常.""" if not api_key or not api_key.strip(): raise ValueError("缺少 API Key (X-api-key)") try: resp = requests.get( API_BASE_URL, params={"board_type": board_type, "date": trade_date}, headers={"X-api-key": api_key.strip()}, timeout=REQUEST_TIMEOUT, ) except requests.RequestException as exc: raise RuntimeError(f"网络请求失败: {exc}") from exc try: payload = resp.json() except ValueError as exc: raise RuntimeError(f"返回内容非 JSON (HTTP {resp.status_code})") from exc if payload.get("code", -1) != 0: code = payload.get("code") msg = payload.get("message", "未知错误") raise RuntimeError(f"接口返回错误 code={code}: {msg}") return payload.get("data", {})def fmt_money(val: Optional[float]) -> str: """金额格式化为 亿 / 万 单位字符串. 保留底层数值用于排序.""" if val is None or (isinstance(val, float) and pd.isna(val)): return "—" x = float(val) sign = "-" if x < 0 else "" ax = abs(x) if ax >= 1e8: return f"{sign}{ax / 1e8:.2f}亿" if ax >= 1e4: return f"{sign}{ax / 1e4:.1f}万" return f"{sign}{ax:.0f}"def fmt_pct(val: Optional[float]) -> str: """小数涨跌幅转百分比字符串.""" if val is None or (isinstance(val, float) and pd.isna(val)): return "—" return f"{val * 100:+.2f}%"def fmt_int(val: Optional[float]) -> str: if val is None or (isinstance(val, float) and pd.isna(val)): return "—" return f"{int(val):,}"def get_concepts(item: Dict[str, Any]) -> str: cl = item.get("concept_list") or [] names = [c.get("name", "") for c in cl if isinstance(c, dict) and c.get("name")] return "、".join(names) if names else "—"def get_range_label(days: Optional[int]) -> str: if days == 1: return "当日榜" if days == 3: return "三日榜" return f"{days}日榜" if days else "—"def money_color(val: Optional[float]) -> str: """净买入类数值: 正=红, 负=绿.""" if val is None or (isinstance(val, float) and pd.isna(val)) or val == 0: return COLOR_NEUTRAL return COLOR_UP if val > 0 else COLOR_DOWNdef change_color(val: Optional[float]) -> str: """涨跌幅: 正=红, 负=绿.""" if val is None or (isinstance(val, float) and pd.isna(val)) or val == 0: return COLOR_NEUTRAL return COLOR_UP if val > 0 else COLOR_DOWN
数据渲染
# ============================================================================# 六、机构榜 / 全部榜 渲染# ============================================================================def render_stock_board(stock_items: List[Dict[str, Any]], board_type: str, actual_date: str) -> None: if not stock_items: st.info("该榜单下无股票维度数据。") return df = build_stock_df(stock_items) has_org = "机构净买入" in df.columns # ---------- 筛选 ---------- st.subheader("🔎 筛选与明细") f_cols = st.columns([2, 1, 1, 1]) with f_cols[0]: keyword = st.text_input("🔍 名称 / 代码 搜索", placeholder="例如: 山东黄金 / 600547") with f_cols[1]: sign_opt = st.selectbox("净买入方向", ["全部", "仅净买入为正", "仅净买入为负"]) with f_cols[2]: range_opt = st.selectbox("上榜区间", ["全部", "当日榜", "三日榜"]) with f_cols[3]: min_net = st.number_input("最小净买入(万)", min_value=0, value=0, step=1000) filtered = df.copy() if keyword: kw = keyword.strip() filtered = filtered[ filtered["名称"].str.contains(kw, na=False) | filtered["代码"].str.contains(kw, na=False) ] if sign_opt == "仅净买入为正": filtered = filtered[filtered["龙虎榜净买入"] > 0] elif sign_opt == "仅净买入为负": filtered = filtered[filtered["龙虎榜净买入"] < 0] if range_opt != "全部": filtered = filtered[filtered["区间"] == range_opt] if min_net > 0: filtered = filtered[filtered["龙虎榜净买入"] >= min_net * 1e4] st.write(f"共筛选出 **{len(filtered)}** 条记录") # ---------- 明细表 (带配色) ---------- if not filtered.empty: styled = style_stock_df(filtered, has_org) st.dataframe(styled, use_container_width=True, height=520) csv = df_to_csv(filtered) st.download_button( "⬇️ 导出明细 CSV", data=csv, file_name=f"龙虎榜_{board_type}_{actual_date}.csv", mime="text/csv", ) # ---------- 图表 ---------- st.subheader("📈 可视化分析") c1, c2 = st.columns(2) with c1: st.plotly_chart( chart_top_net(stock_items, top_n=15), use_container_width=True, ) with c2: st.plotly_chart( chart_concept_net(stock_items, top_n=15), use_container_width=True, ) if has_org: st.plotly_chart( chart_org_compare(stock_items, top_n=15), use_container_width=True, )def style_stock_df(df: pd.DataFrame, has_org: bool) -> Any: """对涨跌 / 净买入类列做数值格式 + 红绿配色的 Styler.""" fmt_map = {} for col in ["涨跌幅", "净占比", "机构净占比"]: if col in df.columns: fmt_map[col] = fmt_pct for col in ["龙虎榜净买入", "买入额", "卖出额", "机构净买入", "成交金额"]: if col in df.columns: fmt_map[col] = fmt_money for col in ["人气排名", "买入机构数", "卖出机构数"]: if col in df.columns: fmt_map[col] = fmt_int styler = df.style.format(fmt_map, na_rep="—") color_cols = ["涨跌幅"] for col in ["龙虎榜净买入", "机构净买入"]: if col in df.columns: color_cols.append(col) def _color(val, fn): return f"color: {fn(val)}" for col in color_cols: fn = change_color if col == "涨跌幅" else money_color styler = styler.map(lambda v: _color(v, fn), subset=[col]) styler = styler.hide(axis="index") return styler# ============================================================================# 七、游资榜 渲染# ============================================================================def render_hot_money(hot_money_items: List[Dict[str, Any]], actual_date: str) -> None: if not hot_money_items: st.info("该交易日游资榜无数据。") return summary_df, details = build_hotmoney_df(hot_money_items) st.subheader("🔥 游资净买入排行") st.plotly_chart(chart_hot_money(summary_df, top_n=15), use_container_width=True) st.subheader("📋 游资明细 (点击展开关联个股)") # 按净买入降序展示 ordered = summary_df.sort_values("净买入合计", ascending=False) for _, row in ordered.iterrows(): name = row["游资名称"] net = row["净买入合计"] n_stocks = int(row["关联股票数"]) with st.expander(f"🔥 {name} · 净买入 {fmt_money(net)} · 关联 {n_stocks} 只个股"): detail = details.get(name, pd.DataFrame()) if detail.empty: st.caption("无关联个股明细") continue dcol1, dcol2 = st.columns([3, 1]) with dcol1: st.dataframe( style_stock_df(detail, "机构净买入" in detail.columns), use_container_width=True, height=min(360, 60 + 40 * len(detail)), ) with dcol2: st.metric("净买入合计", fmt_money(net), help="该游资全部关联个股净买入聚合") st.metric("关联个股", f"{n_stocks} 只") csv = summary_df.to_csv(index=False, encoding="utf-8-sig") st.download_button( "⬇️ 导出游资排行 CSV", data=csv, file_name=f"游资榜_{actual_date}.csv", mime="text/csv", )
有需要的,可看评论区方式获取源码。
免责声明:本文仅供技术交流,不构成任何投资建议。股市有风险,投资需谨慎。
如果你觉得这篇文章说到了心坎里,请点个“在看”,点个关注,并转发给身边的朋友,让更多人支持小亥!
#Python量化 #股票量化 #龙虎榜数据 #同花顺量化接口 #同花顺量化 #金亥跃江聊量化 #金亥跃江