← 返回博客列表

【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #22】沪股通十大成交去哪查?11个接口,北向+南向成交榜+历史全取

2026年10月08日 08:22 · 智兔数服 · 别再到处找免费股票数据API:官方204个接口32篇讲透

摘要:【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #22】沪股通十大成交去哪查?11个接口,北向+南向成交榜+历史全取 系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 ·

系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数 · 仅依赖 requests
适用:做量化 / 选股 / 复盘,但还在手动导 CSV、网页复制、自写爬虫的读者。本篇给北向·南向成交榜与历史的 11 个端点的分组地图、北向/南向十大成交与历史的代码,全部只依赖 requests,所有示例均为演示数据,不构成投资建议。数据由智兔数服提供。

1. 你将得到什么

读完这一篇,你能拿走四样东西:

  1. 一张分组地图:11 个端点按用途分组,知道什么数据该敲哪个门;
  2. 一行取数的代码:主要端点一次返回,不用循环拼装;
  3. 当日榜与历史榜参数及子母排行关系的坑;
  4. 三个真实踩坑点,都是第一次用几乎一定会踩的。

代码全部自包含,复制进 .py 直接能跑,不依赖 numpy / pandas。

2. 本篇取数约定

  • 全部接口都是 GET + query 参数,token 放在查询串里(?token=xxx);
  • 统一基址 https://api.zhituapi.com;
  • 代码块里的 你的智兔token 是占位符,换成你的 token 即可;
  • 所有接口路径均取自官方已验证文档,跨篇零重复。
  • 数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。

3. 11 个端点分 3 组

先建立地图。北向·南向成交榜与历史一共 11 个端点,按用途分:

组 端点 用途 更新频率
十大成交 /ht/nbzj/hgts 沪股通十大成交 每日盘后
十大成交 /ht/nbzj/sgts 深股通十大成交 每日盘后
成交榜 /ht/nbzj/hcjd 沪成交榜 每日盘后
成交榜 /ht/nbzj/scjd 深成交榜 每日盘后
排行 /ht/nbzj/bxpm 北向排行 每日盘后
排行 /ht/nbzj/hgpm 沪股通排行 每日盘后
排行 /ht/nbzj/sgpm 深股通排行 每日盘后
历史 /ht/nbzj/hgls 沪股通历史 每日盘后
历史 /ht/nbzj/shls 深股通历史 每日盘后
历史 /ht/nbzj/ghls 港股通沪历史 每日盘后
历史 /ht/nbzj/gsls 港股通深历史 每日盘后

4. 核心模板函数

import requests, time
from urllib.parse import quote

BASE = "https://api.zhituapi.com"
TOKEN = "你的智兔token"

# ---------- 1. 字段容错与类型归一 ----------
def _hit_key(d, *cands, default=None):
    """字段容错:接口偶发大小写/中英文混用时,按顺序取第一个非空值"""
    if not isinstance(d, dict):
        return default
    for c in cands:
        if c in d and d[c] not in (None, "", "-", "null"):
            return d[c]
    low = {str(k).lower(): v for k, v in d.items()}
    for c in cands:
        v = low.get(str(c).lower())
        if v not in (None, "", "-", "null"):
            return v
    return default


def _to_float(v, default=None):
    try:
        if v in (None, "", "-", "null", "None"):
            return default
        return float(v)
    except (TypeError, ValueError):
        return default


# ---------- 2. 统一请求:重试 + 退避 ----------
def _get(path, params=None, timeout=10, retries=2, backoff=0.6, default=None):
    """返回 JSON;失败重试 retries 次仍失败则返回 {'_error': 原因}"""
    q = {"token": TOKEN}
    if params:
        q.update(params)
    last = ""
    for i in range(retries + 1):
        try:
            r = requests.get(BASE + path, params=q, timeout=timeout)
            if r.status_code == 200:
                try:
                    return r.json()
                except ValueError:
                    return default
            last = "HTTP %s %s" % (r.status_code, (r.text or "").strip()[:80])
        except Exception as e:
            last = "%s: %s" % (type(e).__name__, e)
        if i < retries:
            time.sleep(backoff * (i + 1))
    return {"_error": last}

def fetch_ht_nbzj_hgts(): return _get("/ht/nbzj/hgts", default=[])
def fetch_ht_nbzj_sgts(): return _get("/ht/nbzj/sgts", default=[])
def fetch_ht_nbzj_hcjd(): return _get("/ht/nbzj/hcjd", default=[])
def fetch_ht_nbzj_scjd(): return _get("/ht/nbzj/scjd", default=[])
def fetch_ht_nbzj_bxpm(): return _get("/ht/nbzj/bxpm", default=[])
def fetch_ht_nbzj_hgpm(): return _get("/ht/nbzj/hgpm", default=[])
def fetch_ht_nbzj_sgpm(): return _get("/ht/nbzj/sgpm", default=[])
def fetch_ht_nbzj_hgls(): return _get("/ht/nbzj/hgls", default=[])
def fetch_ht_nbzj_shls(): return _get("/ht/nbzj/shls", default=[])
def fetch_ht_nbzj_ghls(): return _get("/ht/nbzj/ghls", default=[])
def fetch_ht_nbzj_gsls(): return _get("/ht/nbzj/gsls", default=[])

# ---------- 3. 校验 ----------
def run_check():
    assert _hit_key({"Code": "000001", "Name": "平安银行"}, "code", "dm") == "000001"
    assert _to_float("-") is None and _to_float("12.5") == 12.5
    enc = "/x/%s" % quote("示例")
    assert "示例" not in enc and "%" in enc
    print("校验通过")


if __name__ == "__main__":
    run_check()
    print("-" * 62)
    for name, path in [
                               ("沪股通十大成交", "/ht/nbzj/hgts"),
                       ("深股通十大成交", "/ht/nbzj/sgts"),
                       ("沪成交榜", "/ht/nbzj/hcjd"),
                       ("深成交榜", "/ht/nbzj/scjd"),
                       ("北向排行", "/ht/nbzj/bxpm"),
                       ("沪股通排行", "/ht/nbzj/hgpm"),
                       ("深股通排行", "/ht/nbzj/sgpm"),
                       ("沪股通历史", "/ht/nbzj/hgls"),
                       ("深股通历史", "/ht/nbzj/shls"),
                       ("港股通沪历史", "/ht/nbzj/ghls"),
                       ("港股通深历史", "/ht/nbzj/gsls")
    ]:
        data = _get(path, default=[])
        if isinstance(data, dict) and "_error" in data:
            print("%-12s %-40s -> %s" % (name, path, data["_error"][:60]))
        else:
            print("%-12s %-40s -> %d 条" % (name, path, len(data)))

5. 跑通示例

把上面的代码复制到本地,填入你的 token 即可直接运行:它会请求对应接口、拉取真实数据,并输出各端点的条数(各字段含义见前文各小节)。

6. 坑与注意事项

坑 1:当日榜与历史榜分开。
十大成交 /ht/nbzj/hgts 是当日榜,历史用 /hgls 且带日期。

坑 2:子母排行别重复。
北向排行 /ht/nbzj/bxpm 含沪/深股通排行,别重复计。

坑 3:分清买卖方向。
成交榜的「买入/卖出」金额要分清方向。

7. 小结与下篇预告

本篇把北向南向成交榜类 11 个端点分成 3 组,给出成交榜与历史的代码,并用 run_check 验证字段容错。

下一篇:《【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #23】可转债数据去哪找?3个接口,一览+比价+实时行情全拿》:用本篇同组接口,把下一类数据一次取全。

8. 免责声明

本文仅演示北向·南向成交榜与历史数据的取数方法,所有代码示例均为演示数据,未含任何真实行情数值,不构成投资建议,亦不承诺收益。


免费领取证书
数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。

领取路径:进入 www.zhituapi.com → 点击「请求证书」→「证书获取」→「免费版」(邮箱验证 3 步即可拿到 token)。

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印对应数据。

想亲自试一下?免费获取证书