← 返回博客列表

【Python 量化取数指南 #04】行情接口选型:实时与历史行情实测

2026年09月18日 16:13 · 智兔数服 · Python 量化取数指南

摘要:【Python 量化取数指南 #04】行情接口选型:实时与历史行情实测 系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests 数据:由智兔数服提供。更多接口见 智兔数

系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests
数据:由智兔数服提供。更多接口见 智兔数服技术博客

1. 你将得到什么

  • 一张「3 类行情端点」对照表:实时快照 / 历史 K 线 / 历史成交,分别什么时候用
  • 三个端点的完整可跑代码 + 返回结构解析
  • 一个「按场景选型」的判断清单

2. 本篇取数约定

  • 实时快照:/hs/real/ssjy/(A 股实时快照,list)
  • 历史 K 线:/hz/history/fsjy/{code}.{market}/{lvl}(指数历史 K 线,{lvl}=d/w/m 等)
  • 历史成交:/hs/history/transaction/{code}(A 股单只历史成交)
  • 请求:GET https://api.zhituapi.com<path>?token=<你的智兔token>
  • 代码格式 {code}.{market}:如 000001.SH600519.SH000001.SZ

3. 核心模板(全系列复用)

import time, json, requests

BASE = "https://api.zhituapi.com"
TOKEN = "你的智兔token"      # 演示证书(免费版)即可起步

def _get(path, params=None, timeout=15, retry=3, backoff=1.5):
    params = dict(params or {})
    params["token"] = TOKEN
    url = BASE + path
    last = None
    for i in range(retry):
        try:
            r = requests.get(url, params=params, timeout=timeout)
            if r.status_code != 200:
                last = f"HTTP {r.status_code} {r.text[:120]}"
                time.sleep(backoff * (i + 1)); continue
            try:
                return r.json(), None
            except ValueError:
                last = f"非JSON响应: {r.text[:120]}"
                return None, last
        except requests.RequestException as e:
            last = str(e); time.sleep(backoff * (i + 1))
    return None, last

def _hit_key(d, *keys, default=None):
    if not isinstance(d, dict):
        return default
    for k in keys:
        if k in d and d[k] not in (None, "", []):
            return d[k]
    return default

def _to_float(x, default=float("nan")):
    try:
        return float(x)
    except (TypeError, ValueError):
        return default

4. 跑通示例:3 类行情端点

def demo_quote():
    # 4.1 实时快照 /hs/real/ssjy/ (A股全市场快照,list)
    data, err = _get("/hs/real/ssjy/")
    if err:
        print("实时快照失败:", err)
    else:
        items = data if isinstance(data, list) else (data.get("data") or [])
        print(f"  实时快照条数: {len(items)}")
        if items:
            it = items[0]
            print("  样本:", _hit_key(it, "code", "dm"),
                  "最新价:", _to_float(_hit_key(it, "price", "zxj", "new", "close")))

    # 4.2 指数历史 K 线 /hz/history/fsjy/{code}.{market}/{lvl}
    data, err = _get("/hz/history/fsjy/000001.SH/d")   # 上证指数日线
    if err:
        print("历史K线失败:", err)
    else:
        bars = data if isinstance(data, list) else (data.get("data") or [])
        print(f"  上证日线根数: {len(bars)}")
        if bars:
            b = bars[0]
            print("  首根:", _hit_key(b, "date", "rq"),
                  "收:", _to_float(_hit_key(b, "close", "sp", "收盘")))

    # 4.3 单只历史成交 /hs/history/transaction/{code}
    data, err = _get("/hs/history/transaction/600519.SH")  # 贵州茅台
    if err:
        print("历史成交失败:", err)
    else:
        print("  茅台历史成交结构:", type(data).__name__)

if __name__ == "__main__":
    demo_quote()

返回字段说明:实时快照 list 每项含 code/dmprice/zxj/new/close(最新价)、name/mc;历史 K 线 list 每项含 date/rq(日期)、open/zk(开)、close/sp(收)、high/zg(高)、low/zd(低)、volume/cjl(量)。

5. 坑与注意事项

  1. 实时 vs 历史别混端点:实时用 /hs/real/ssjy/,历史 K 线用 /hz/history/fsjy/,历史成交用 /hs/history/transaction/
  2. 代码带市场后缀000001.SH(上证指数)、600519.SH(沪)、000001.SZ(深),缺后缀会 404。
  3. 级别参数 {lvl}:日 d、周 w、月 m、分钟 5/15/30/60,错级别返回空。
  4. 实时快照量大:全市场一次返回几千条,建议本地缓存,不要每次策略循环都拉。
  5. 复权不在本篇:历史 K 线默认未复权,复权处理见第 5、14 篇。
  6. 字段名三套并存close/sp/收盘 都可能,统一 _hit_key

6. 常见报错速查

报错 / 现象 原因 处理
404 路径不存在 代码缺 .SH/.SZ 或级别错 检查 {code}.{market}/{lvl}
429 实时快照拉太频 缓存 + 降频
返回空 list 非交易日/无数据 换交易日
KeyError 字段名不符 print(data) 看真实 key

7. 小结与下一篇预告

小结:实时看盘用 /hs/real/ssjy/、回测取 K 线用 /hz/history/fsjy/、个股成交明细用 /hs/history/transaction/;三者的「代码带市场后缀 + 级别参数」是共性坑。

下一篇计划写 #05《历史行情数据 API 评测与回测实战》:用 /hz/history/fsjy/ 拉指数日线,跑一段均线交叉回测,并补复权与字段对齐。

8. 免责声明

本文仅演示公开数据接口的用法,所有代码示例均为演示数据,不构成任何投资建议;实际返回字段以接口文档与你的证书权限为准。数据由 智兔数服 提供,更多接口示例见 技术博客


免费领取证书 / 查看完整接口文档,可前往 智兔数服官网

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