【零依赖量化数据实战 #01】沪深实时行情:3 行 Python 拿到最新报价
摘要:【零依赖量化数据实战 #01】沪深实时行情:3 行 Python 拿到最新报价 系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK 适用:想用 Python 拉 A 股(沪/
系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK 适用:想用 Python 拉 A 股(沪/深)实时行情、做自选股监控、接价格预警的开发者
你将得到什么
- 用
requests一个 GET 拿到单只沪深股票的实时快照(最新价、涨跌幅、名称等) - 一个对字段名「不敏感」的解析函数,接口返回结构微调也不崩
- 处理
102/104错误码的正确姿势(不是收盘没数据,是证书权限) - 完整可复制运行的代码,把
你的智兔token换成真实证书即可直接跑
一、先把实时行情拉下来
智兔沪深实时行情接口(公开文档 hsdataapi.html 覆盖):
GET https://api.zhituapi.com/hs/real/ssjy/{code}
{code} 是沪深代码,如 600519(贵州茅台)、000001(平安银行)。token 用查询参数带上。
先写一个最朴素的版本,确认链路通:
import requests
TOKEN = "你的智兔token" # ← 换成你的真实智兔 token
BASE = "https://api.zhituapi.com"
def fetch_realtime(code, token=TOKEN):
url = f"{BASE}/hs/real/ssjy/{code}"
r = requests.get(url, params={"token": token}, timeout=10)
r.raise_for_status()
return r.json()
就这么几行。下面把它写得更稳——网络异常、非 200、非 JSON 都兜住,统一返回 (data, err):
import sys, time, requests
TOKEN = "你的智兔token" # ← 换成你的真实智兔 token
BASE = "https://api.zhituapi.com"
def fetch_realtime(code, token=TOKEN):
"""拉单只沪深实时快照,返回 (data, err);err 非空表示失败。"""
url = f"{BASE}/hs/real/ssjy/{code}"
try:
r = requests.get(url, params={"token": token}, timeout=10)
except requests.RequestException as e:
return None, f"网络异常:{e}"
if r.status_code != 200:
# 102/104 为智兔公开错误码契约
return None, f"{r.status_code} {r.text.strip()[:120]}"
try:
return r.json(), None
except ValueError:
return None, f"非 JSON 返回:{r.text[:120]}"
def summarize(d):
"""从实时快照抽取关键字段,字段名不敏感,结构变了也不 KeyError。"""
if not isinstance(d, dict):
return None
price = d.get("p") or d.get("price") or d.get("now")
pct = d.get("zf") or d.get("zdf") or d.get("pct_change")
name = d.get("name") or d.get("mc") or d.get("stock_name")
if price is None and pct is None and name is None:
return {k: d.get(k) for k in list(d)[:6]} # 未知结构安全回退
return {"name": name, "price": price, "pct": pct}
def selftest():
fx = [
{"p": 1700.0, "zf": 1.23, "name": "贵州茅台"}, # 常见字段名
{"price": 12.5, "pct_change": -0.5, "stock_name": "平安银行"}, # 另一套字段名
{"foo": "x", "bar": 1}, # 未知结构
]
for f in fx:
assert summarize(f) is not None, "summarize 不应返回 None"
print("selftest PASS: summarize 对常见/未知字段结构均安全抽取,无 KeyError")
def main():
if TOKEN == "你的智兔token":
print("[演示] TOKEN 为占位符,下面请求会返回 102 错误契约;请换成真实智兔 token。")
for code in ["600519", "000001", "300750"]:
d, err = fetch_realtime(code)
if err:
print(f"{code} 暂不可用: {err}")
else:
print(f"{code} -> {summarize(d)}")
time.sleep(0.2)
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--selftest":
selftest()
else:
main()
复制即跑:把 你的智兔token 换成真实证书,直接 python main.py;想先看解析逻辑不联网,跑 python main.py --selftest。
二、常见坑
- 返回
102/104不是「收盘没数据」:占位 token 或证书权限不足会返回102:Licence证书不存在、104:缺少token参数。这是证书权限问题,不是交易时段问题。换覆盖该接口的正式智兔证书即可。 - 字段名别写死:不同版本字段名可能是
p/price、zf/zdf,一律用.get()容错取值,接口结构微调也不崩。 - 生产别裸奔:示例为可读性直接
requests.get,真实项目加超时 + 退避重试(Demo 源码可直接复用)。
小结与下篇预告
本篇你拿到了单只沪深实时行情。下一篇(#02)讲怎么先拉全市场股票清单 /hs/list/all,再批量轮询做自选股监控——批量访问正是需要更高配额证书的场景,按需升级即可。
免费领取证书
数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。
领取路径:进入 www.zhituapi.com → 点击「请求证书」→「证书获取」→「免费版」(邮箱验证 3 步即可拿到 token)。
把代码里的 你的智兔token 换成你拿到的真实 token,上面的示例就能直接拉到真实行情。
免责声明
本文仅演示智兔数服公开数据接口的用法,所有代码示例均以占位 token 自验,未含任何实时行情数据;不构成投资建议,亦不承诺收益。投资决策请基于你自己的判断与风险承受力。