← 返回博客列表

【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #02】涨停跌停与特色股池:5类股池接口实战评测

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

摘要:【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #02】涨停跌停与特色股池:5类股池接口实战评测 系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数

系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数 · 仅依赖 requests
适用:想做量化选股池 / 打板盯盘,但还在盯盘软件手动刷涨跌停、去股吧抄股池的读者;数据由智兔数服提供。本篇给沪深A股「涨停 / 跌停 / 强势 / 新股 / 指标」5 个特色股池端点的分组地图、一行拉全的代码、各股池字段差异的坑,全部只依赖 requests,所有示例均为演示数据,不构成投资建议。

1. 你将得到什么

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

  1. 一张分组地图:5 个特色股池端点按用途分成 3 组,知道涨停池、跌停池、新股池该敲哪个门;
  2. 一行拉全的代码:/hs/pool/ztgc 一次返回当日涨停股池,不用爬虫翻页;
  3. 各股池字段差异的解法:涨停池有「连板天数」,跌停池要区分「一字跌停」还是「跳水跌停」;
  4. 三个真实踩坑点,都是第一次用几乎一定会踩的。

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

2. 本篇取数约定

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

3. 5 个端点分 3 组

先建立地图。特色股池类一共 5 个端点,按用途分:

组 端点 用途 更新频率
上涨股池 /hs/pool/ztgc 当日涨停股池,含连板天数、封单额 盘中实时
下跌股池 /hs/pool/dtgc 当日跌停股池,含跌停类型 盘中实时
事件股池 /hs/pool/qsgc 新股(次新)股池 每日盘后
强势股池 /hs/pool/cxgc 创新高 / 强势股池 每日盘后
指标股池 /hs/pool/zbgc 指标股(权重 / 成分)股池 每日盘后

4. 核心模板函数

import requests, time

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_int(v, default=0):
    try:
        if v in (None, "", "-", "null", "None"):
            return default
        return int(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}


# ---------- 3. 股池类封装 ----------
def fetch_zt():  return _get("/hs/pool/ztgc", default=[])
def fetch_dt():  return _get("/hs/pool/dtgc", default=[])
def fetch_qs():  return _get("/hs/pool/qsgc", default=[])
def fetch_cx():  return _get("/hs/pool/cxgc", default=[])
def fetch_zb():  return _get("/hs/pool/zbgc", default=[])


# ---------- 4. 涨停连板天数排序 ----------
def top_limit_streaks(n=10):
    """涨停股池按连板天数降序取前 n"""
    rows = fetch_zt()
    if isinstance(rows, dict) and "_error" in rows:
        return [], rows["_error"]
    out = []
    for r in rows or []:
        code = _hit_key(r, "code", "dm", default="")
        name = _hit_key(r, "name", "mc", default="")
        streak = _to_int(_hit_key(r, "lbs", "lbts", "连板天数", default=1))
        out.append((streak, code, name))
    out.sort(key=lambda x: x[0], reverse=True)
    return out[:n], None


# ---------- 5. 校验 ----------
def run_check():
    # 1) 字段容错
    assert _hit_key({"Code": "000001", "Name": "平安银行"}, "code", "dm") == "000001"
    assert _to_int("-") == 0 and _to_int("3") == 3

    # 2) 涨停池连板排序
    fake = [{"code": "600519.SH", "name": "贵州茅台", "lbs": "2"},
            {"code": "000001.SZ", "name": "平安银行", "lbs": "5"},
            {"code": "300750.SZ", "name": "宁德时代", "lbs": "1"}]
    _orig = fetch_zt
    fetch_zt = lambda: fake
    top, err = top_limit_streaks(2)
    fetch_zt = _orig
    assert err is None and top[0][0] == 5 and top[1][0] == 2

    print("校验通过")


if __name__ == "__main__":
    run_check()
    print("-" * 62)
    for name, path in [("涨停股池", "/hs/pool/ztgc"),
                       ("跌停股池", "/hs/pool/dtgc"),
                       ("新股股池", "/hs/pool/qsgc"),
                       ("强势股池", "/hs/pool/cxgc"),
                       ("指标股池", "/hs/pool/zbgc")]:
        data = _get(path, default=[])
        if isinstance(data, dict) and "_error" in data:
            print("%-10s %-18s -> %s" % (name, path, data["_error"][:60]))
        else:
            print("%-10s %-18s -> %d 条" % (name, path, len(data)))

5. 跑通示例

把上面的代码复制到本地,填入你的 智兔token 即可直接运行:它会请求 5 个特色股池接口、拉取真实数据,并输出各股池的条数;top_limit_streaks 还能按连板天数给涨停股排序(各字段含义见前文各小节)。

6. 坑与注意事项

坑 1:涨停池和跌停池的字段命名不对称。
/hs/pool/ztgc 返回「连板天数 / 封单额 / 首次涨停时间」,而 /hs/pool/dtgc 返回「跌停类型 / 成交额」,两者字段结构不同,别用一套解析函数通吃。_hit_key 的容错就是为这种大小写 / 中英文混用准备的。

坑 2:股池是盘中实时数据,盘后可能清空或延迟。
/hs/pool/ztgc、/hs/pool/dtgc 是盘中实时更新的,收盘后接口可能返回空数组或最后快照。做历史回测别直接拿实时股池当历史涨跌停清单,要用专门的历史停板接口(见后续分时与停板篇)。

坑 3:新股池和强势股池的更新节奏不一致。
/hs/pool/qsgc(新股)是事件驱动,只有新股上市那几天有数据;/hs/pool/cxgc(强势 / 创新高)是每日盘后更新。写定时任务时别把它们当成同样频率,新股池空了别报错退出。

7. 小结与下篇预告

本篇把沪深A股 5 个特色股池端点分成 3 组,给出一行拉全的代码,top_limit_streaks 按连板天数给涨停股排序,_hit_key 处理股池字段不对称。

下一篇:《【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #03】公司概况股东靠手抄?17项上市公司详情一行查清》:用 /hs/gs 一组接口,把公司简介 / 上市信息 / 历届高管 / 经营范围等上市公司详情一键取全。

8. 免责声明

本文仅演示沪深A股特色股池数据的取数方法,所有代码示例均为演示数据,未含任何真实行情数值,不构成投资建议,亦不承诺收益。


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

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

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印涨停 / 跌停 / 新股 / 强势 / 指标股池数据。

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