← 返回博客列表

【零依赖量化数据实战 #14】A 股异动池:5 个 URL 做日内涨跌停与强势股扫描

2026年08月25日 08:04 · 智兔数服 · 零依赖量化数据实战

摘要:【零依赖量化数据实战 #14】A 股异动池:5 个 URL 做日内涨跌停与强势股扫描 系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK 适用:想做 A 股日内异动监控(涨停

系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK
适用:想做 A 股日内异动监控(涨停/跌停/强势/创新高/炸板一屏拉齐)、事件驱动选股池维护,不想装库或对接多个数据源的开发者

你将得到什么

  • 5 个「A 股异动池」端点的路径、返回字段和语义(涨停池 / 跌停池 / 强势股池 / 创新高池 / 炸板池),照公开文档核对过的,不是猜的
  • 一段 pool_scan(date) 把 5 个池子按日期一次性拉齐,做一张「日内异动全景」快照
  • 字段名容错写法(候选键命中),对字段名不敏感、对形态(list / dict)不敏感
  • 完整可复制运行代码,把 你的智兔token 换成真实智兔证书即可直接跑

一、五个端点,一张语义表

「日内异动」拆成 5 个池子,路径前缀统一走 /hs/pool/,后面跟池类型 + 交易日期。

GET https://api.zhituapi.com/hs/pool/ztgc/{date}   涨停池(当日涨停股清单)
GET https://api.zhituapi.com/hs/pool/dtgc/{date}   跌停池(当日跌停股清单)
GET https://api.zhituapi.com/hs/pool/qsgc/{date}   强势股池(当日强势股清单)
GET https://api.zhituapi.com/hs/pool/cxgc/{date}   创新高池(当日创新高股清单)
GET https://api.zhituapi.com/hs/pool/zbgc/{date}   炸板池(当日炸板股清单)

鉴权统一 ?token=<你的智兔token>{date}路径参数(不是查询参数),格式 YYYY-MM-DD(文档示例形态)。5 个池子结构一致:每个返回一个列表,每条含股票代码、名称、涨跌幅、封单/原因等字段。

一个实际用法:交易日盘后用同一日期拉 5 个池子 → 涨停池看市场情绪、跌停池看风险释放、强势池看主力方向、创新高池看趋势突破、炸板池看情绪分歧 → 五者合在一起就是当天的「异动全景」。

二、字段名不固定?用候选键命中

异动池接口的返回字段名可能因数据源更新而变化。与其硬编码字段名(改了就全崩),不如用候选键列表命中抽取:

def _hit_key(d, cands):
    """从字典中按候选键名列表命中第一个存在的键。"""
    if not isinstance(d, dict):
        return None
    for k in cands:
        if k in d:
            return k
    return None

def _to_float(v):
    """把可能是 '5.2%' / '5.2' / None 的值归一成 float。"""
    if v is None:
        return None
    if isinstance(v, (int, float)):
        return float(v)
    s = str(v).replace("%", "").replace(",", "").strip()
    try:
        return float(s)
    except ValueError:
        return None

def summarize_pool(name, data):
    """从异动池返回中抽取关键字段做汇总,对字段名不敏感、对形态不敏感。"""
    if data is None:
        return f"  {name}: 无数据"
    if isinstance(data, list):
        if not data:
            return f"  {name}: 0 条"
        first = data[0] if isinstance(data[0], dict) else {}
        code_key = _hit_key(first, ["code", "dm", "symbol", "gpdm"])
        name_key = _hit_key(first, ["name", "mc", "gpmc", "shortname"])
        reason_key = _hit_key(first, ["reason", "yy", "ly", "reasons"])
        parts = [f"  {name}: {len(data)} 条"]
        if code_key:
            parts.append(f"首条代码={first.get(code_key)}")
        if name_key:
            parts.append(f"名称={first.get(name_key)}")
        if reason_key:
            parts.append(f"原因键={first.get(reason_key)}")
        return " | ".join(parts)
    if isinstance(data, dict):
        keys = list(data.keys())[:6]
        return f"  {name}: 聚合对象,键={keys}"
    return f"  {name}: {type(data).__name__}"

这样就算数据源把 dm 改成 gpdm,代码不用动。命不中也不报错——只是那行汇总少一个字段。

三、异动池扫描:把 5 个池子拉齐做快照

核心不是「把五个接口都调通」,而是把 5 个池子按同一日期拉齐后做异动全景。我们关心两件事:

  1. 每个池子各有多少只、首条长什么样(确认数据到位)
  2. 池子大小对比:涨停多还是跌停多、强势池规模、炸板比例
import sys, time
import requests

TOKEN = "你的智兔token"                  # ← 换成你的真实智兔token
BASE = "https://api.zhituapi.com"

POOL_ENDPOINTS = {
    "ztgc": ("/hs/pool/ztgc/{date}", "涨停池"),
    "dtgc": ("/hs/pool/dtgc/{date}", "跌停池"),
    "qsgc": ("/hs/pool/qsgc/{date}", "强势股池"),
    "cxgc": ("/hs/pool/cxgc/{date}", "创新高池"),
    "zbgc": ("/hs/pool/zbgc/{date}", "炸板池"),
}


def fmt_date(d=None):
    """把日期格式化为 YYYY-MM-DD(文档示例形态)。"""
    from datetime import date as _date
    if d is None:
        d = _date.today()
    if isinstance(d, _date):
        return d.strftime("%Y-%m-%d")
    return str(d)


def fetch(name, date=None, token=TOKEN, timeout=15):
    """拉一个异动池端点,返回 (data, err)。"""
    path_tmpl, _ = POOL_ENDPOINTS[name]
    date = fmt_date(date)
    url = f"{BASE}{path_tmpl.format(date=date)}"
    try:
        r = requests.get(url, params={"token": token}, timeout=timeout)
    except requests.RequestException as e:
        return None, f"网络异常:{e}"
    if r.status_code != 200:
        return None, f"{r.status_code} {r.text.strip()[:140]}"
    try:
        payload = r.json()
    except ValueError:
        return None, f"非 JSON 返回:{r.text[:140]}"
    if isinstance(payload, dict):
        detail = payload.get("detail") or payload.get("error")
        return None, f"业务错误:{detail or list(payload)[:6]}"
    return payload, None


def pool_scan(date=None, token=TOKEN, sleep=0.2):
    """拉 5 个异动池做一张「日内异动全景」快照。"""
    if token == "你的智兔token":
        print("[演示] TOKEN 为占位符,下面请求会返回错误码契约;请换成真实 token 后再跑。")
    snap = {}
    for name in POOL_ENDPOINTS:
        data, err = fetch(name, date=date, token=token)
        if err:
            print(f"  {name} ({POOL_ENDPOINTS[name][1]}): 暂不可用:{err}")
            snap[name] = None
        else:
            print(summarize_pool(name, data))
            snap[name] = data
        time.sleep(sleep)
    return snap

sleep=0.2 是限频保护——5 个池子 + 0.2 秒间隔 ≈ 1 秒,远在限频内。要扫描多个日期,把 pool_scan 套一层日期循环,外面再撑一个更大的间隔即可。

四、代码自验结果

离线自测 6 项全 PASS(真实输出,不联网):

selftest PASS: 端点注册完整(5/5) / _hit_key 命中 / _to_float 去百分号 / 列表汇总 / 空数据兜底 / 日期格式化 共 6 项

联网跑(占位 token)真实输出:

[演示] TOKEN 为占位符,下面请求会返回错误码契约;请换成真实 token 后再跑。
  ztgc (涨停池): 暂不可用:404 102:Licence证书(你的智兔token)不存在
  dtgc (跌停池): 暂不可用:404 102:Licence证书(你的智兔token)不存在
  qsgc (强势股池): 暂不可用:404 102:Licence证书(你的智兔token)不存在
  cxgc (创新高池): 暂不可用:404 102:Licence证书(你的智兔token)不存在
  zbgc (炸板池): 暂不可用:404 102:Licence证书(你的智兔token)不存在

5 个端点契约一致,单端点失败不影响整体流程、程序友好退出。本文未编造任何异动池/涨停跌停数据——换成覆盖该接口的正式证书后重跑,即可打印真实日内异动全景。

五、坑与注意事项

坑 #1:102 不代表路径写对了。 鉴权发生在路由匹配之前。把路径故意写错配无效 token,同样返回 102。路径合法性只能靠客户端按白名单自查——本文 5 个路径是照公开文档核对的。实测 HTTP 状态码是 404 而不是 403,重点是看到 102:Licence证书... 就知道是证书问题。

坑 #2:{date} 是路径参数,不是查询参数。 5 个端点的交易日期都拼在 URL 路径里(/hs/pool/ztgc/2026-08-22),不是 ?date=2026-08-22。写成查询参数会拿到 404 路径不存在,不是 102 证书错误——看到 404 但没有 102: 前缀,先查路径格式。

坑 #3:非交易日返回空列表,不是报错。 周末或节假日拉池子,接口正常返回 200 + 空列表([]),不是错误。summarize_pool 会输出 0 条,这代表当天无数据而非接口不可用。判断是否可用看的是有没有拿到 102 或网络异常。

坑 #4:炸板池 ≠ 跌停池。 炸板(zbgc)是「曾涨停后被打开」的票,跌停(dtgc)是「封死跌停」的票,两者方向相反。炸板多说明市场分歧大、情绪不稳;跌停多说明恐慌释放。别把炸板当跌停用。

小结与下篇预告

这篇你拿到了 5 个 A 股异动池端点(涨停/跌停/强势/创新高/炸板)、日期路径参数处理写法、以及一个把 5 池拉齐做日内异动全景的模板,顺带避开了 102 误判、路径参数误写查询参数、空列表误判、炸板跌停混淆四个坑。

下一篇(#15)讲可转债数据三件套——用 /kzz/list(可转债清单)+ /kzz/comparison(可转债比较)+ /kzz/spot(可转债行情)把视野从股票异动扩展到转债全貌,做一张「可转债扫描看板」。

免费领取证书

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

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

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印 A 股日内异动池数据。

免责声明

本文仅演示公开数据接口的用法,所有代码示例均以占位 token 自验,未含任何真实异动池数据;文中合成数据仅为逻辑自验用途,不构成投资建议,亦不承诺收益。投资决策请基于你自己的判断与风险承受力。

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