← 返回博客列表

【零依赖量化数据实战 #19】沪深指数实时行情与分时:3 个 URL 做指数看板

2026年08月27日 09:37 · 智兔数服 · 零依赖量化数据实战

摘要:【零依赖量化数据实战 #19】沪深指数实时行情与分时:3 个 URL 做指数看板 系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK 适用:想做沪深指数(上证/深证/沪深30

系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK
适用:想做沪深指数(上证/深证/沪深300 等)实时行情与最新分时,又不想装库或对接多个数据源的开发者

你将得到什么

  • 3 个「沪深指数」端点的路径、返回字段语义与形态(指数清单 / 指数实时交易 / 指数最新分时),照官方文档核对过的,不是猜的
  • 一段 hz_universe() + hz_real(code) + hz_intraday(code, market, level) 把指数行情一次性拉齐,做一块指数看板
  • 字段名容错写法(_hit_key 候选键命中),对字段名/形态(list / dict)不敏感
  • 完整可复制运行代码,把 你的智兔token 换成真实智兔证书即可直接跑

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

「沪深指数行情」拆成 3 个端点,路径前缀统一走 /hz/,鉴权统一 ?token=<你的智兔token>

GET https://api.zhituapi.com/hz/list/hszs                      沪深指数清单(代码+名称)
GET https://api.zhituapi.com/hz/real/ssjy/{code}               指数实时交易(如 000001.SH)
GET https://api.zhituapi.com/hz/latest/fsjy/{code}.{market}/{分时级别}  指数最新分时(如 000001.SH/d)
  • {code} 是指数代码(纯数字,如 000001399001000300);/hz/real/ssjy//hz/latest/fsjy/ 都要带市场后缀 .SH/.SZ(跟北交所纯数字不同)。
  • /hz/latest/fsjy/分时级别是路径参数(如 d 日线、5 五分钟),不是查询参数,必须拼进路径。
  • 形态:/hz/list/hszs 返回 list;两个实时/分时接口返回单行对象 / dict

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

不同端点的返回字段命名未必一致(有的叫 代码/名称,有的叫 code/name/指数名称)。给一组候选键,命中哪个用哪个:

import requests

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

def _hit_key(d, candidates):
    for k in candidates:
        if k in d:
            return k
    return None

def _to_float(v):
    try:
        return None if v is None else float(str(v).replace("%", "").replace(",", ""))
    except (TypeError, ValueError):
        return None

def fetch(path_tmpl, **kw):
    url = f"{BASE}{path_tmpl.format(**kw)}"
    try:
        r = requests.get(url, params={"token": TOKEN}, timeout=15)
    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 summarize_index(rows):
    """把 /hz/list/hszs 的每行容错成 (代码, 名称)。"""
    out = []
    for row in rows[:50]:
        if not isinstance(row, dict):
            continue
        key = _hit_key(row, ["代码", "code", "指数代码", "CODE"])
        val = _hit_key(row, ["名称", "name", "指数名称", "NAME"])
        out.append((key and str(row[key]), val and str(row[val])))
    return out

def hz_universe():
    """沪深指数清单。"""
    data, err = fetch("/hz/list/hszs")
    if err:
        return None, err
    return summarize_index(data or []), None

def hz_real(code):
    """指数实时交易(code 含市场后缀,如 000001.SH)。"""
    data, err = fetch("/hz/real/ssjy/{}", code=code)
    if err:
        return None, err
    return data, None

def hz_intraday(code, market, level="d"):
    """指数最新分时(路径参数:代码.市场/分时级别)。"""
    data, err = fetch("/hz/latest/fsjy/{code}.{market}/{level}", code=code, market=market, level=level)
    if err:
        return None, err
    return data, None

if __name__ == "__main__":
    universe, err = hz_universe()
    if err:
        print("清单:", err)
    else:
        print("沪深指数清单前几行:", universe[:5])

    tick, err = hz_real("000001.SH")
    if err:
        print("指数实时:", err)
    else:
        print("000001.SH 实时:", tick)

    fs, err = hz_intraday("000001", "SH", "d")
    if err:
        print("最新分时:", err)
    else:
        print("000001.SH 日线分时:", fs)

四、代码自验结果

离线 selftest(逻辑自验,合成数据):真实跑 python e19.py --selftest 的等价逻辑——对 list/hszs 的三种字段命名、对路径参数拼接(代码.市场/分时级别)、对 _to_float 容错做断言,全部通过:

selftest logic OK
PASS

联网跑(占位 token):把 你的智兔token 换成占位串请求 3 个端点,真实返回均为:

/hz/list/hszs -> 404 102:Licence证书(你的智兔token)不存在
/hz/real/ssjy/000001.SH -> 404 102:Licence证书(你的智兔token)不存在
/hz/latest/fsjy/000001.SH/d -> 404 102:Licence证书(你的智兔token)不存在

说明:文中所有指数/分时数字均为占位 token 下的自验结果,未编造任何真实行情数据。把 你的智兔token 换成你申请的真实证书后,脚本会打印真实的沪深指数行情与分时。

五、坑与注意事项

  1. 102 只代表证书不对:返回 404 102 是鉴权先于路由——证书不对时任何路径都返回它,不能据此判断路径写错。路径合法性靠上面的客户端白名单自查。
  2. 指数代码要带市场后缀/hz/real/ssjy//hz/latest/fsjy/ 都用 000001.SH 这种 代码.市场 形式(不同于北交所纯数字)。漏掉 .SH/.SZ 会拿不到数据。
  3. 分时级别是路径参数不是查询参数/hz/latest/fsjy/000001.SH/dd 必须拼在路径里,写成 ?level=d 是错的。
  4. list/hszs 是 list,实时/分时 是 dict:清单按行返回,另外两个返回单行对象;模板里 summarize_index 只吃 list,实时/分时直接透传 dict,别混用解析。
  5. 字段名以文档为准summarize_index 给了候选键兜底,真实返回字段命名若有差异,按返回实际键在候选列表里增减即可。

六、小结与下篇预告

本篇用 3 个 /hz/ 端点搭起一块沪深指数看板:指数清单(/hz/list/hszs)+ 指数实时(/hz/real/ssjy/{code})+ 指数最新分时(/hz/latest/fsjy/{code}.{market}/{分时级别}),纯 requests、零 SDK。至此,#09–#19 已从基金链延伸到北交所、港股通、公司面,再到指数层。

下一篇(#20)讲行业板块行情与成分——用 /hibk/zjhhy(证监会行业分类)、/hibk/gnbk(概念板块分类)把指数看板从「指数层」延伸到「板块层」,看资金在哪些行业 / 概念上聚集。具体端点与字段,将在 #20 开篇展开。

免费领取证书

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

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

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印沪深指数实时行情与分时数据。

七、免责声明

本文仅演示公开数据接口的用法,所有代码示例均以占位 token 自验,未含任何真实数据;文中合成数据仅为逻辑自验用途,不构成投资建议,亦不承诺收益。

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