【零依赖量化数据实战 #15】可转债数据三件套:3 个 URL 做转债全貌扫描
摘要:【零依赖量化数据实战 #15】可转债数据三件套:3 个 URL 做转债全貌扫描 系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK 适用:想做可转债全市场扫描、转债估值比较、
系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK
适用:想做可转债全市场扫描、转债估值比较、盘中行情监控,不想装库或对接多个数据源的开发者
你将得到什么
- 3 个「可转债」端点的路径、返回字段和语义(全量清单 / 比较 / 实时行情),照公开文档核对过的,不是猜的
- 一段
kzz_snapshot()把 3 个端点一次性拉齐,做一张「可转债全貌」快照 - 字段名容错写法(候选键命中),对字段名不敏感、对形态(list / dict)不敏感
- 完整可复制运行代码,把
你的智兔token换成真实智兔证书即可直接跑
一、三个端点,一张语义表
「可转债全貌」拆成 3 个端点,路径前缀统一走 /kzz/,无路径参数。
GET https://api.zhituapi.com/kzz/list 可转债清单(全市场标的列表)
GET https://api.zhituapi.com/kzz/comparison 可转债比较(估值/溢价率对比)
GET https://api.zhituapi.com/kzz/spot 可转债行情(实时报价)
鉴权统一 ?token=<你的智兔token>。3 个端点都是整板/全量返回,无路径参数。list 给标的宇宙(代码+名称),comparison 给估值对比数据(溢价率/到期收益率等),spot 给实时行情报价。
一个实际用法:先用
list拿到全市场可转债清单 → 用comparison筛出低溢价/高收益的标的 → 用spot看实时价格做买卖判断。三步串起来就是一张「可转债扫描看板」。
二、字段名不固定?用候选键命中
可转债接口的返回字段名可能因数据源更新而变化。与其硬编码字段名(改了就全崩),不如用候选键列表命中抽取:
def _hit_key(d, cands):
"""从字典中按候选键名列表命中第一个存在的键。"""
if not isinstance(d, dict):
return None
for k in cands:
if k in d:
return k
return None
def _to_float(v):
"""把可能是 '5.2%' / '5.2' / None 的值归一成 float。"""
if v is None:
return None
if isinstance(v, (int, float)):
return float(v)
s = str(v).replace("%", "").replace(",", "").strip()
try:
return float(s)
except ValueError:
return None
def summarize_kzz(name, data):
"""从可转债返回中抽取关键字段做汇总,对字段名不敏感、对形态不敏感。"""
if data is None:
return f" {name}: 无数据"
if isinstance(data, list):
if not data:
return f" {name}: 0 条"
first = data[0] if isinstance(data[0], dict) else {}
code_key = _hit_key(first, ["code", "dm", "bondcode", "zqdm", "symbol"])
name_key = _hit_key(first, ["name", "mc", "bondname", "shortname"])
price_key = _hit_key(first, ["price", "last", "new", "zxj", "close", "dqp"])
parts = [f" {name}: {len(data)} 条"]
if code_key:
parts.append(f"首条代码={first.get(code_key)}")
if name_key:
parts.append(f"名称={first.get(name_key)}")
if price_key:
parts.append(f"价格键={first.get(price_key)}")
return " | ".join(parts)
if isinstance(data, dict):
keys = list(data.keys())[:6]
return f" {name}: 聚合对象,键={keys}"
return f" {name}: {type(data).__name__}"
这样就算数据源把 dm 改成 bondcode,代码不用动。命不中也不报错——只是那行汇总少一个字段。
三、可转债扫描:把 3 个端点拉齐做看板
核心不是「把三个接口都调通」,而是把 3 个维度的数据归一后做全貌扫描。我们关心两件事:
- 每个端点各返回多少条、首条长什么样(确认数据到位)
- 清单/比较/行情的数据是否对齐(标的数是否一致)
import sys, time
import requests
TOKEN = "你的智兔token" # ← 换成你的真实智兔token
BASE = "https://api.zhituapi.com"
KZZ_ENDPOINTS = {
"list": ("/kzz/list", "可转债清单"),
"comparison": ("/kzz/comparison", "可转债比较"),
"spot": ("/kzz/spot", "可转债行情"),
}
def fetch(name, token=TOKEN, timeout=15):
"""拉一个可转债端点,返回 (data, err)。"""
path, _ = KZZ_ENDPOINTS[name]
url = f"{BASE}{path}"
try:
r = requests.get(url, params={"token": token}, timeout=timeout)
except requests.RequestException as e:
return None, f"网络异常:{e}"
if r.status_code != 200:
return None, f"{r.status_code} {r.text.strip()[:140]}"
try:
payload = r.json()
except ValueError:
return None, f"非 JSON 返回:{r.text[:140]}"
if isinstance(payload, dict):
detail = payload.get("detail") or payload.get("error")
return None, f"业务错误:{detail or list(payload)[:6]}"
return payload, None
def kzz_snapshot(token=TOKEN, sleep=0.2):
"""拉 3 个可转债端点做一张「可转债全貌」快照。"""
if token == "你的智兔token":
print("[演示] TOKEN 为占位符,下面请求会返回错误码契约;请换成真实 token 后再跑。")
snap = {}
for name in KZZ_ENDPOINTS:
data, err = fetch(name, token=token)
if err:
print(f" {name} ({KZZ_ENDPOINTS[name][1]}): 暂不可用:{err}")
snap[name] = None
else:
print(summarize_kzz(name, data))
snap[name] = data
time.sleep(sleep)
return snap
sleep=0.2 是限频保护——3 个端点 + 0.2 秒间隔 ≈ 0.6 秒,远在限频内。
四、代码自验结果
离线自测 6 项全 PASS(真实输出,不联网):
selftest PASS: 端点注册完整(3/3) / _hit_key 命中 / _to_float 去百分号 / 列表汇总 / 空数据兜底 / 字段名不敏感 共 6 项
联网跑(占位 token)真实输出:
[演示] TOKEN 为占位符,下面请求会返回错误码契约;请换成真实 token 后再跑。
list (可转债清单): 暂不可用:404 102:Licence证书(你的智兔token)不存在
comparison (可转债比较): 暂不可用:404 102:Licence证书(你的智兔token)不存在
spot (可转债行情): 暂不可用:404 102:Licence证书(你的智兔token)不存在
3 个端点契约一致,单端点失败不影响整体流程、程序友好退出。本文未编造任何可转债清单/比较/行情数据——换成覆盖该接口的正式证书后重跑,即可打印真实可转债全貌。
五、坑与注意事项
坑 #1:102 不代表路径写对了。 鉴权发生在路由匹配之前。把路径故意写错配无效 token,同样返回 102。路径合法性只能靠客户端按白名单自查——本文 3 个路径是照公开文档核对的。
坑 #2:清单(list)是静态宇宙,行情(spot)是动态的。 kzz/list 给的是可转债标的池子(代码+名称),不含实时价;实时价要走 spot。comparison 给的是估值对比数据(溢价率/到期收益率),也不含实时盘口。三个端点各管一摊,别指望从清单里拿到报价。
坑 #3:可转债代码和股票代码形态不同。 沪市可转债以 11 开头(如 113001),深市以 12 开头(如 128001)。与股票代码 600519/000001 完全不同。混用会拿不到数据——清单端点返回的是转债代码,不是正股代码。
坑 #4:comparison 的溢价率字段可能是百分号字符串。 像 "15.3%" 这种形态,需要 _to_float 去掉 % 再比较。直接 float("15.3%") 会报 ValueError。系列统一的 _to_float 已经处理了百分号和千分位逗号。
小结与下篇预告
这篇你拿到了 3 个可转债端点(清单/比较/行情)、字段名容错抽取写法、以及一个把 3 维拉齐做可转债全貌扫描的模板,顺带避开了 102 误判、清单含行情误期、转债代码混用股票代码、溢价率百分号解析四个坑。
下一篇(#16)讲港股通资金与持股——用 /ht/nbzj/lxgl(陆股通流向)+ /ht/nbzj/hgtc(港股通持仓)+ /ht/nbzj/sgtc(深股通持股)+ /ht/nbzj/ah(A+H 对比)把视野从可转债扩展到北上资金,做一张「港股通资金扫描看板」。
免费领取证书
数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。
领取路径:进入 www.zhituapi.com → 点击「请求证书」→「证书获取」→「免费版」(邮箱验证 3 步即可拿到 token)。
把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印可转债清单行情与比较数据。
免责声明
本文仅演示公开数据接口的用法,所有代码示例均以占位 token 自验,未含任何真实可转债数据;文中合成数据仅为逻辑自验用途,不构成投资建议,亦不承诺收益。投资决策请基于你自己的判断与风险承受力。