当前位置:首页>python>量化系列(105): Python 可视化龙虎榜数据,看懂游资与机构操作动向

量化系列(105): Python 可视化龙虎榜数据,看懂游资与机构操作动向

  • 2026-10-06 00:15:33
量化系列(105): Python 可视化龙虎榜数据,看懂游资与机构操作动向

龙虎榜

每次复盘看龙虎榜,一大堆买卖席位看得眼花缭乱,分不清哪些是机构进场、哪些是游资短线炒作?学会龙虎榜可视化,一键梳理席位数据,轻松掌握机构资金动向,复盘效率直接翻倍。

今天我们来学习一下同花顺官方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
string
带交易所后缀的标准代码,例如 002407.SZ。
ticker
string
6 位股票代码。
name
string
股票简称。
concept_list
array
所属概念列表,元素包含 name。
change
number
当日涨跌幅,小数形式。
net_value
number
龙虎榜净买入金额,单位元。
net_rate
number
龙虎榜净买入占比,小数形式。
hot_rank
integer
同花顺人气排名,数值越小越靠前。
buy_value
number
买方金额,单位元。
sell_value
number
卖方金额,单位元。
limit_reason
string
涨跌停原因。
range_days
integer
上榜区间天数,1 为当日榜,3 为 3 日榜。
org_net_value
number
机构净买入金额,单位元。
org_net_rate
number
机构净买入占比,小数形式。
org_buy_num
integer
买入机构数。
org_sell_num
integer
卖出机构数。
amount
number
成交金额,单位元。
hot_money_net_value
number
股票维度游资合计净买入金额,单位元。
hot_money_net_rate
number
股票维度游资合计净买入占比,小数形式。
hot_money_item_net_value
number
该游资在该股上的净买入金额,单位元。
hot_money_item_net_rate
number
该游资在该股上的净买入占比,小数形式。

hot_money_items[] 字段:

字段
类型
说明
name
string
游资名称。
buying
number
聚合净买入金额,单位元。
rows
array
该游资关联股票列表,字段同 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量化   #股票量化  #龙虎榜数据 #同花顺量化接口  #同花顺量化  #金亥跃江聊量化 #金亥跃江

最新文章

随机文章