
【零依赖量化数据实战 #08】场内基金 ETF 数据接口清单 / 净值 / 持仓 / 排名一键取系列《零依赖量化数据实战》零依赖 · 纯 GET · 不 import 任何 SDK适用想做基金筛选、ETF 盯盘、持仓归因、业绩排名不想装库或对接多个数据源的开发者你将得到什么基金 / ETF 数据端点的路径家族清单 / 行情 / 净值 / 概况 / 持仓 / 排名照公开文档核对过的不是猜的一段fund_dashboard()单只基金穿透 pull_lists()/pull_ranking()全市场扫描的完整代码字段名容错写法不同数据源字段名不一样用候选键列表命中抽取换数据源不用改代码基金盯盘的最小可用模板把清单 / 净值 / 持仓 / 排名包成函数每天跑一次打印完整可复制运行的代码把你的token换成真实证书即可直接跑一、端点家族一张语义表基金 / ETF 数据拆成了几个独立端点组均见于公开文档、对客开放GET https://api.zhituapi.com/fund/list/all 全量基金清单 GET https://api.zhituapi.com/fund/list/etf ETF 基金清单 GET https://api.zhituapi.com/jh/hq/list 基金行情列表实时报价 GET https://api.zhituapi.com/jh/base/jjgk/{code} 基金概况规模/成立日/类型 GET https://api.zhituapi.com/jh/hb/lsjz/{code} 历史净值按日 GET https://api.zhituapi.com/jh/zh/gpcc/{code} 股票持仓前十大重仓股 GET https://api.zhituapi.com/jh/zh/zccc/{code} 债券持仓 GET https://api.zhituapi.com/js/pm/kfjzg/kfsjj_gpxjj_zsx 开放式股票型基金净值排名鉴权统一?token你的token。fund/list/*和jh/hq/list是全市场清单不带{code}jjgk/lsjz/gpcc/zccc是单只基金维度路径里{code}换成基金代码js/pm/...排名是固定 key 路径不同分类对应不同 key。一个实际用法先fund/list/etf拿全市场 ETF 清单 → 用jh/hq/list给它们排涨跌幅 → 挑出关注的基金用fund_dashboard(code)拉概况 历史净值 十大重仓做持仓归因。全程纯 GET不用落地任何库。二、字段名不固定用候选键命中基金端点的返回字段名可能因数据源更新而变化。与其硬编码字段名改了就全崩不如用候选键列表命中抽取def_hit_key(d,candidates):从字典中按候选键名列表命中第一个存在的键。forkincandidates:ifkind:returnkreturnNonedefsummarize(name,data):从基金端点的返回中抽取关键字段做汇总对字段名不敏感、对形态不敏感。ifdataisNone:returnf{name}: 无数据ifisinstance(data,list):ifnotdata:returnf{name}: 0 条firstdata[0]ifisinstance(data[0],dict)else{}code_key_hit_key(first,[code,dm,fundcode,jjdm,symbol])name_key_hit_key(first,[name,mc,jjmc,shortname])nav_key_hit_key(first,[nav,dwjz,jz,value,price])parts[f{name}:{len(data)}条]ifcode_key:parts.append(f首条代码{first.get(code_key)})ifname_key:parts.append(f名称{first.get(name_key)})ifnav_key:parts.append(f净值/价键{first.get(nav_key)})return | .join(parts)ifisinstance(data,dict):keyslist(data.keys())[:6]returnf{name}: 聚合对象键{keys}returnf{name}:{type(data).__name__}这样就算数据源把dm改成jjdm或fundcode代码不用动。命不中也不报错——只是那行汇总少一个字段不影响其他端点。三、批量拉取 基金盯盘模板importtimeimportrequests TOKEN你的tokenBASEhttps://api.zhituapi.comFUND_ENDPOINTS{list_all:(/fund/list/all,全量基金清单),list_etf:(/fund/list/etf,ETF 基金清单),hq_list:(/jh/hq/list,基金行情列表),jjgk:(/jh/base/jjgk/{code},基金概况),lsjz:(/jh/hb/lsjz/{code},历史净值),gpcc:(/jh/zh/gpcc/{code},股票持仓),zccc:(/jh/zh/zccc/{code},债券持仓),pm:(/js/pm/kfjzg/kfsjj_gpxjj_zsx,开放式股票型基金净值排名),}deffetch_fund(path,tokenTOKEN,timeout15):拉单个基金端点返回 (data, err)。try:rrequests.get(f{BASE}{path},params{token:token},timeouttimeout)exceptrequests.RequestExceptionase:returnNone,f网络异常{e}ifr.status_code!200:returnNone,f{r.status_code}{r.text.strip()[:140]}try:payloadr.json()exceptValueError:returnNone,f非 JSON 返回{r.text[:140]}ifisinstance(payload,dict):detailpayload.get(detail)orpayload.get(error)returnNone,f业务错误{detailorlist(payload)[:6]}returnpayload,Nonedefpull_lists(tokenTOKEN,sleep0.2):拉取全市场清单类端点不带 code。iftoken你的token:print([演示] TOKEN 为占位符请换成真实 token 后再跑。)forkeyin(list_all,list_etf,hq_list):path,descFUND_ENDPOINTS[key]data,errfetch_fund(path,token)iferr:print(f{key}({desc}): 暂不可用{err})else:print(summarize(key,data))time.sleep(sleep)deffund_dashboard(code,tokenTOKEN,sleep0.2):单只基金穿透概况 历史净值 股票持仓 债券持仓。print(f{code}基金穿透 )forkeyin(jjgk,lsjz,gpcc,zccc):path,descFUND_ENDPOINTS[key]data,errfetch_fund(path.format(codecode),token)iferr:print(f{key}({desc}): 暂不可用{err})else:print(summarize(key,data))time.sleep(sleep)defpull_ranking(tokenTOKEN):拉取基金业绩排名固定 key 路径。path,descFUND_ENDPOINTS[pm]data,errfetch_fund(path,token)iferr:print(f pm ({desc}): 暂不可用{err})else:print(summarize(pm,data))if__name____main__:pull_lists()fund_dashboard(510300)pull_ranking()_hit_key/summarize见前文拼在一起就是完整脚本。sleep0.2是限频保护清单类 3 个 单只 4 个 排名 1 个合计 8 次请求加间隔远在限频内。四、代码自验结果离线自测 6 项全 PASSselftest PASS: 端点注册完整8/8 / _hit_key 命中逻辑 / summarize 列表形态抽取 / summarize 聚合对象形态 / summarize 空数据兜底 / 错误码解析结构 共 6 项联网跑占位 token真实输出[演示] TOKEN 为占位符请换成真实 token 后再跑。 list_all (全量基金清单): 暂不可用403 102:Licence证书(你的token)不存在 list_etf (ETF 基金清单): 暂不可用403 102:Licence证书(你的token)不存在 ...8 个端点契约一致。本文未编造任何基金净值/持仓数值——换成覆盖该接口的正式证书后重跑即可打印真实基金数据。五、坑与注意事项坑 #1102 不代表路径写对了。鉴权发生在路由匹配之前。把路径故意写错/fund/list/nosuch配无效 token同样返回102。路径合法性只能靠客户端按白名单自查——本文 8 个路径是照公开文档核对的。坑 #2基金代码形态分两类。净值 / 持仓类/jh/hb/lsjz、/jh/base/jjgk、/jh/zh/*用裸代码公开文档示例000001行情类/jh/hq/*的代码常带sz/sh前缀示例sz180801。混用会拿不到数据按公开文档示例为准。坑 #3js/pm/...排名是固定 key 不是自由参数。不同分类股票型 / 货币型 / 封闭型对应不同 key 串如kfsjj_gpxjj_zsx路径是写死的别自己拼分类名。小结与下篇预告这篇你拿到了基金 / ETF 数据的完整端点家族、字段名容错抽取写法、以及一个「清单扫描 单只穿透 排名」的基金盯盘模板。下一批进入基金主题深挖#09 讲基金持仓穿透/jh/zh/gpcc/jh/zh/zccc/jh/base/jjgk做一只基金的股票/债券持仓归因。免责声明本文仅演示公开数据接口的用法所有代码示例均以占位 token 自验未含任何真实基金数据文中数据仅为接口用法演示不构成投资建议亦不承诺收益。投资决策请基于你自己的判断与风险承受力。