← 返回博客列表

【Python 量化取数指南 #08】基金持仓穿透接口实测

2026年09月20日 09:05 · 智兔数服 · Python 量化取数指南

摘要:【Python 量化取数指南 #08】基金持仓穿透接口实测 系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests 数据:由智兔数服提供。更多接口见 智兔数服技术博客

系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests
数据:由智兔数服提供。更多接口见 智兔数服技术博客

1. 你将得到什么

  • 基金持仓 3 类端点的完整代码:基金持股、股票持仓穿透、资产持仓穿透
  • 一个从「基金 → 底层股票」和「股票 → 持有它的基金」双向穿透的小示例
  • 一个离线 run_check(),不填 token 也能验证逻辑

2. 本篇取数约定

  • 基金持股(某基金持有哪些股票):/hs/gs/jjcg/{code}{code}=基金代码,如 110011.SH
  • 股票持仓穿透(某股票被哪些产品持有):/jh/zh/gpcc/{code}{code}=股票代码)
  • 资产持仓穿透(组合子层):/jh/zh/zccc/{code}
  • 请求:GET https://api.zhituapi.com<path>?token=<你的智兔token>
  • 基金/股票代码都带市场后缀;返回多为 list

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_holding(fund_code="110011.SH", stock_code="600519.SH"):
    # 4.1 基金 → 底层股票 /hs/gs/jjcg/{fund_code}
    data, err = _get(f"/hs/gs/jjcg/{fund_code}")
    if err:
        print("基金持股失败:", err)
    else:
        items = data if isinstance(data, list) else (data.get("data") or [])
        print(f"  基金 {fund_code} 持有股票 {len(items)} 只")
        for it in (items or [])[:5]:
            print("    底层:", _hit_key(it, "code", "dm"),
                  _hit_key(it, "name", "mc"),
                  "占比:", _to_float(_hit_key(it, "ratio", "zb", "比例")))

    # 4.2 股票 → 持有它的产品 /jh/zh/gpcc/{stock_code}
    data, err = _get(f"/jh/zh/gpcc/{stock_code}")
    if err:
        print("股票持仓穿透失败:", err)
    else:
        items = data if isinstance(data, list) else (data.get("data") or [])
        print(f"  持有 {stock_code} 的产品 {len(items)} 个")

def run_check():
    synth = [{"code": "000001.SZ", "name": "合成股", "ratio": 0.08}]
    print(f"  [run_check] 合成穿透 {len(synth)} 条: {synth[0]['name']}")

if __name__ == "__main__":
    demo_holding()
    run_check()

返回字段说明:基金持股 list 每项含 code/dm(股票代码)、name/mc(名称)、ratio/zb/比例(持仓占比)。股票持仓穿透返回持有该股票的产品清单,字段类似。先 print(data) 看真实结构。

5. 坑与注意事项

  1. 代码方向别反/hs/gs/jjcg/{code}{code}基金代码;/jh/zh/gpcc/{code}{code}股票代码,混了返回空。
  2. 报告期滞后:持仓按季度披露,最新可能落后 1~2 月,别当实时。
  3. 占比口径:有的按净值、有的按市值,先 print 核对再汇总。
  4. 十大重仓 ≠ 全仓:接口常只返回前十大,别当完整持仓做归因。
  5. 字段名三套ratio/zb/比例,用 _hit_key
  6. 限流:穿透多只建议加 sleep,免费证书尤甚。

6. 常见报错速查

报错 / 现象 原因 处理
404 代码方向反/缺后缀 确认基金 vs 股票代码
返回空 无持仓披露 换有数据的标的
占比求和≠1 仅前十大 别当全仓
KeyError 字段名不符 print(data) 看真实 key

7. 小结与下一篇预告

小结:基金持仓穿透用 /hs/gs/jjcg/(基金→股票)和 /jh/zh/gpcc/(股票→产品)双向打通;注意代码方向、报告期、前十大口径三件事。

下一篇计划写 #09《港股通数据接口实测与跨市场取数》:用港股通成交与港股财报端点,做跨市场(AH)取数示例。

8. 免责声明

本文仅演示公开数据接口的用法,所有代码示例均为演示数据,不构成任何投资建议;实际返回字段以接口文档与你的证书权限为准。数据由 智兔数服 提供,更多接口示例见 技术博客


免费领取证书 / 查看完整接口文档,可前往 智兔数服官网

想亲自试一下?免费获取证书