【Python 量化取数指南 #06】实时行情 API 实测与可用性对比
摘要:【Python 量化取数指南 #06】实时行情 API 实测与可用性对比 系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests 数据:由智兔数服提供。更多接口见 智兔
系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests
数据:由智兔数服提供。更多接口见 智兔数服技术博客。
1. 你将得到什么
- 实时行情 3 类端点的完整代码:全市场快照、单只五档、单只分时、ETF 实时
- 一个本地测延迟的小脚本(记录请求耗时,判断够不够盘中用)
- 一张「延迟/可用性」对照表,帮你选盘中盯盘用哪个
2. 本篇取数约定
- 全市场实时快照:
/hs/real/ssjy/(list,量大) - 单只五档:
/hs/real/five/{code}({code}=600519.SH) - 单只分时:
/hs/real/time/{code} - ETF 实时:
/jh/hq/etflist - 请求:
GET https://api.zhituapi.com<path>?token=<你的智兔token> - 实时数据盘中才有,休市返回收盘快照或空
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. 跑通示例:实时行情 + 延迟测试
def demo_realtime():
# 4.1 全市场快照(一次拉一大批,测耗时)
t0 = time.time()
data, err = _get("/hs/real/ssjy/")
dt = time.time() - t0
if err:
print("快照失败:", err)
else:
items = data if isinstance(data, list) else (data.get("data") or [])
print(f" 快照 {len(items)} 条,耗时 {dt*1000:.0f}ms")
# 4.2 单只五档 /hs/real/five/600519.SH
data, err = _get("/hs/real/five/600519.SH")
if err:
print("五档失败:", err)
else:
print(" 五档结构:", type(data).__name__)
# 4.3 ETF 实时 /jh/hq/etflist
data, err = _get("/jh/hq/etflist")
if err:
print("ETF失败:", err)
else:
items = data if isinstance(data, list) else (data.get("data") or [])
print(f" ETF数量: {len(items)}")
if __name__ == "__main__":
demo_realtime()
返回字段说明:快照 list 每项含 code/dm、price/zxj/new/close(最新价)、name/mc、pct/zdf(涨跌幅)。五档返回买一~买五、卖一~卖五档位与量。
5. 坑与注意事项
- 休市无实时:非交易时段
/hs/real/ssjy/返回的是上一交易日收盘快照,别当成「实时」。 - 快照量大:全市场一次几千条,盘中高频轮询会被限流,建议缓存 + 定时增量。
- 单只五档字段多:
bid1~bid5、ask1~ask5、bv1~bv5、av1~av5,先print看真实键名。 - 延迟看网络也看证书:免费证书节点可能慢,生产要实测 P99。
- 时区:返回时间为北京时间,跨时区程序注意转换。
- 别用实时端点做回测:回测用历史
/hz/history/fsjy/(见第 5 篇)。
6. 常见报错速查
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
429 |
轮询太频 | 降频 + 缓存 |
| 返回收盘价 | 休市 | 交易时段再测 |
| 超时 | 网络/证书慢 | 调大 timeout |
KeyError |
字段名不符 | print(data) 看真实 key |
7. 小结与下一篇预告
小结:盘中盯盘用 /hs/real/ssjy/(全市场)或 /hs/real/five/{code}(单只五档),ETF 用 /jh/hq/etflist;务必实测延迟再上生产。
下一篇计划写 #07《股票财务数据 API 评测与取值》:用财务类端点一次拉全资产负债表/利润表/现金流量表,并给出指标计算示例。
8. 免责声明
本文仅演示公开数据接口的用法,所有代码示例均为演示数据,不构成任何投资建议;实际返回字段以接口文档与你的证书权限为准。数据由 智兔数服 提供,更多接口示例见 技术博客。
免费领取证书 / 查看完整接口文档,可前往 智兔数服官网。
想亲自试一下?免费获取证书