← 返回博客列表

【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #07】历史分时数据难找?分时+停板快照一行取

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

摘要:【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #07】历史分时数据难找?分时+停板快照一行取 系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数 &

系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数 · 仅依赖 requests
适用:想做分时策略 / 停板回测,但历史分时只能从同花顺客户端导、还收费的读者;数据由智兔数服提供。本篇给沪深A股「最新分时 / 历史分时 / 停板价格历史 / 集合竞价 / 盘后指标」8 个端点的分组地图、一行取全的代码、分时时间戳与复权的坑,全部只依赖 requests,所有示例均为演示数据,不构成投资建议。

1. 你将得到什么

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

  1. 一张分组地图:8 个分时 / 停板端点按「分时序列 / 停板价 / 集合竞价 / 指标」分成 4 组;
  2. 一行取全的代码:/hs/latest 拿最新分时,/hs/history 拿历史分时;
  3. 停板价格的取法:/hs/stopprice/history 给每日涨跌停价,做打板回测要用它;
  4. 三个真实踩坑点,都是第一次用几乎一定会踩的。

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

2. 本篇取数约定

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

3. 8 个端点分 4 组

先建立地图。分时 / 停板类一共 8 个端点,按用途分:

组 端点 用途 更新频率
分时序列 /hs/latest 最新分时(当日 1 分钟线) 盘中
分时序列 /hs/history 历史分时(指定日期) 盘后
分时序列 /hs/pro/latest 前复权最新分时 盘中
分时序列 /hs/pro/history 前复权历史分时 盘后
停板价 /hs/stopprice/history 每日涨跌停价格历史 每日盘后
集合竞价 /hs/lup/limit 涨跌停限制 / 价格笼子 每日盘后
集合竞价 /hs/lup/auction 集合竞价成交 盘中
指标 /hs/indicators 盘后技术指标(量比 / 换手等) 每日盘后

4. 核心模板函数

import requests, time

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

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 _get(path, params=None, timeout=10, retries=2, backoff=0.6, default=None):
    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_intraday_today(code):  return _get("/hs/latest", {"code": code}, default=[])
def fetch_intraday_hist(code, date):
    return _get("/hs/history", {"code": code, "date": date}, default=[])
def fetch_intraday_qfq(code, date):
    return _get("/hs/pro/history", {"code": code, "date": date}, default=[])
def fetch_stop_price(code, date):
    return _get("/hs/stopprice/history", {"code": code, "date": date}, default=[])
def fetch_auction(code):         return _get("/hs/lup/auction", {"code": code}, default=[])
def fetch_indicators(code):      return _get("/hs/indicators", {"code": code}, default={})


def intraday_count(code, date):
    rows = fetch_intraday_hist(code, date)
    if isinstance(rows, dict) and "_error" in rows:
        return 0, rows["_error"]
    return len(rows or []), None


def run_check():
    fake = [{"t": "09:31", "p": 10.1}, {"t": "09:32", "p": 10.2}]
    _orig = fetch_intraday_hist
    fetch_intraday_hist = lambda c, d: fake
    n, err = intraday_count("000001.SZ", "20240910")
    fetch_intraday_hist = _orig
    assert err is None and n == 2
    assert fetch_intraday_qfq("000001.SZ", "20240910") is not None
    print("校验通过")


if __name__ == "__main__":
    run_check()
    print("-" * 62)
    code, date = "000001.SZ", "20240910"
    for name, fn in [("最新分时", lambda: fetch_intraday_today(code)),
                     ("历史分时", lambda: fetch_intraday_hist(code, date)),
                     ("前复权分时", lambda: fetch_intraday_qfq(code, date)),
                     ("停板价", lambda: fetch_stop_price(code, date)),
                     ("集合竞价", lambda: fetch_auction(code)),
                     ("盘后指标", lambda: fetch_indicators(code))]:
        data = fn()
        if isinstance(data, dict) and "_error" in data:
            print("%-10s -> %s" % (name, data["_error"][:60]))
        else:
            print("%-10s -> %d 条" % (name, len(data) if isinstance(data, list) else 1))

5. 跑通示例

把上面的代码复制到本地,填入你的 智兔token 即可直接运行:传入代码与日期,intraday_count 统计历史分时节点数,fetch_intraday_qfq 还能拉前复权分时(各字段含义见前文各小节)。

6. 坑与注意事项

坑 1:历史分时要传 date,且只返回交易日的分时。
/hs/history 必须传 date=20240910,非交易日返回空。做全历史分时回测要按交易日历逐日请求,别用自然日循环,否则大量空请求还浪费额度。

坑 2:普通分时和前复权分时是两套接口,除权日跳变不同。
/hs/latest / /hs/history 是未复权(除权日价格会跳空),/hs/pro/latest / /hs/pro/history 是前复权(平滑跳空)。做均线 / 形态识别要用复权版,做精确成交价复盘要用未复权版,别混用。

坑 3:停板价是回测打板的基准,不是实时价。
/hs/stopprice/history 给的是当日涨跌停价格(由昨收算),不是实际成交价。做涨停板回测要用它判断某价是否触板,再结合实时 / 逐笔接口看是否封住,别把停板价当成交价。

7. 小结与下篇预告

本篇把沪深A股 8 个分时 / 停板端点分成 4 组,intraday_count 统计分时节点数,_hit_key 处理分时字段嵌套。

下一篇:《【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #08】个股资金流向靠猜?主力净流入排名一次拉》:用 /hs/history/transaction 一组接口,把个股资金流向 / 主力净流入 / 大单净流入一次拉全。

8. 免责声明

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


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

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

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印历史分时与停板数据。

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