【Python 量化取数指南 #02】免费股票数据 API 横向实测与选型
摘要:【Python 量化取数指南 #02】免费股票数据 API 横向实测与选型 系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests 数据:由智兔数服提供。更多接口见 智
系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests
数据:由智兔数服提供。更多接口见 智兔数服技术博客。
1. 你将得到什么
- 一份「免费就能拉」的 A 股 / 指数 / 可转债取数清单(6 类端点)
- 每个端点的完整可跑代码 + 返回字段说明
- 一张「免费能拿 vs 要付费」的对照表,照着判断要不要升级证书
本篇是连载第 2 篇,所有示例都复用第 1 篇的 _get 封装,复制即可运行。数据来自 智兔数服。
2. 本篇取数约定
- 请求方式:
GET https://api.zhituapi.com<path>?token=<你的智兔token> - 鉴权先于路由:返回
404 102:Licence证书(...)不存在是 token 没填/填错,不代表路径错 - 字段名不稳定:同一指标可能叫
close/收盘价/new,用_hit_key候选键兜住 - 演示证书(免费版)即可起步;免费证书有调用频次与字段范围限制,生产前先小流量探一下
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. 跑通示例:6 个免费端点
下面 4 个端点演示证书通常就能拉(指数列表、市盈率、板块、可转债),演示如何取数与解析字段。
def demo_free_list():
# 4.1 指数代码列表(沪深京指数)
data, err = _get("/hz/list/hszs")
if err:
print("指数列表失败:", err); return
items = data if isinstance(data, list) else data.get("data") or []
for it in items[:5]:
code = _hit_key(it, "code", "dm", "代码")
name = _hit_key(it, "name", "mc", "名称")
print(f" 指数 {code} {name}")
# 4.2 全市场市盈率 /himk/syl
data, err = _get("/himk/syl")
if err:
print("市盈率失败:", err)
else:
items = data if isinstance(data, list) else (data.get("data") or [])
if items:
it = items[0]
print(" 市盈率样本:", _hit_key(it, "code", "dm"),
"PE:", _to_float(_hit_key(it, "pe", "syl", "市盈率")))
# 4.3 行业板块列表 /hs/sectors/
data, err = _get("/hs/sectors/")
if err:
print("板块失败:", err)
else:
items = data if isinstance(data, list) else (data.get("data") or [])
print(f" 板块数量: {len(items)}")
# 4.4 可转债列表 /kzz/list
data, err = _get("/kzz/list")
if err:
print("可转债失败:", err)
else:
items = data if isinstance(data, list) else (data.get("data") or [])
print(f" 可转债数量: {len(items)}")
if __name__ == "__main__":
demo_free_list()
返回字段说明(以指数列表为例):常见字段 code/dm(指数代码,如 000001.SH)、name/mc(名称)、zxj/zx(最新价)。不同端点字段名不完全一致,统一用 _hit_key 容错。
5. 坑与注意事项
- 演示证书字段更少:同一端点,免费证书可能只返回部分字段,付费证书才全。别一上来按文档全字段写解析。
- 返回可能是 list 也可能是 dict:先
print(type(data))看原始结构,再决定用data[0]还是data.get(...)。 - 别把 list 当 dict 取
.get:会抛AttributeError,先判断isinstance。 - 频率限制:免费证书一般有每分钟/每日上限,循环拉多只股票时加
time.sleep(0.2~0.5)。 - token 不要硬编码进版本库:用环境变量或配置文件,避免泄露。
- 复权/停牌留到后面专门篇:本篇只取「快照类」数据,历史 K 线与复权见第 5、14 篇。
6. 常见报错速查
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
404 102:Licence证书(...)不存在 |
token 没填/错 | 检查 TOKEN 是否被占位字符串覆盖 |
401 |
证书失效 | 重新申请/更换证书 |
429 |
触发限流 | 降低并发,加 sleep,调大 backoff |
requests.exceptions.Timeout |
网络慢 | 调大 timeout |
| 返回 HTML 而非 JSON | 路径错/被拦截 | print(r.status_code, r.text[:200]) 看原始响应 |
7. 小结与下一篇预告
小结:你已能用一套 _get 拉通指数列表、市盈率、板块、可转债这 4 类免费数据;记住「先打原始结构、再用 _hit_key 容错」这个习惯,后面 14 篇都这么干。
下一篇计划写 #03《北向资金接口实测与数据解读》:在 _get 底座上,用真实接口拉沪股通/深股通资金流向与成交,并给出可跑示例与字段解析。
8. 免责声明
本文仅演示公开数据接口的用法,所有代码示例均为演示数据,不构成任何投资建议;实际返回字段以接口文档与你的证书权限为准。数据由 智兔数服 提供,更多接口示例见 技术博客。
免费领取证书 / 查看完整接口文档,可前往 智兔数服官网。
想亲自试一下?免费获取证书