← 返回博客列表

【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #04】分红增发解禁看不懂?7类公告数据一次拉全

2026年09月28日 09:22 · 智兔数服 · 别再到处找免费股票数据API:官方204个接口32篇讲透

摘要:【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #04】分红增发解禁看不懂?7类公告数据一次拉全 系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数

系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数 · 仅依赖 requests
适用:想做红利策略 / 解禁排雷,但还在公告页面手动翻分红送转、十大股东的读者;数据由智兔数服提供。本篇给沪深A股「历年分红 / 历年增发 / 历年配股 / 十大股东 / 流通股东 / 股本变化 / 基金持股」7 个端点的分组地图、一次拉全的代码、送转比例换算的坑,全部只依赖 requests,所有示例均为演示数据,不构成投资建议。

1. 你将得到什么

读完这一篇,你能拿走四样东西:

  1. 一张分组地图:7 个分红 / 股东端点按「分红融资 / 股东结构 / 持股变动」分成 3 组;
  2. 一次拉全的代码:/hs/gs/jnff 拿历年分红,/hs/gs/sdgd 拿最新十大股东;
  3. 送转比例的取法:分红接口的「10送X转Y派Z」要自己拆成每股口径;
  4. 三个真实踩坑点,都是第一次用几乎一定会踩的。

代码全部自包含,复制进 .py 直接能跑,不依赖 numpy / pandas。

2. 本篇取数约定

  • 全部接口都是 GET + query 参数,token 放在查询串里(?token=xxx);
  • 统一基址 https://api.zhituapi.com;
  • 代码块里的 你的智兔token 是占位符,换成你的 token 即可;
  • 所有接口路径均取自官方已验证文档,跨篇零重复。
  • 数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。

3. 7 个端点分 3 组

先建立地图。分红 / 股东类一共 7 个端点,按用途分:

组 端点 用途 更新频率
分红融资 /hs/gs/jnff 历年分红(送转派) 每年披露后
分红融资 /hs/gs/jnzf 历年增发 每年披露后
分红融资 /hs/gs/jjxs 历年配股 每年披露后
股东结构 /hs/gs/sdgd 十大股东(最新报告期) 每季披露后
股东结构 /hs/gs/ltgd 流通股东(最新报告期) 每季披露后
持股变动 /hs/gs/gdbh 股本变化历史 每日盘后
持股变动 /hs/gs/jjcg 基金持股(最新报告期) 每季披露后

4. 核心模板函数

import requests, time

BASE = "https://api.zhituapi.com"
TOKEN = "你的智兔token"

def _hit_key(d, *cands, default=None):
    if not isinstance(d, dict):
        return default
    for c in cands:
        if c in d and d[c] not in (None, "", "-", "null"):
            return d[c]
    low = {str(k).lower(): v for k, v in d.items()}
    for c in cands:
        v = low.get(str(c).lower())
        if v not in (None, "", "-", "null"):
            return v
    return default


def _get(path, params=None, timeout=10, retries=2, backoff=0.6, default=None):
    q = {"token": TOKEN}
    if params:
        q.update(params)
    last = ""
    for i in range(retries + 1):
        try:
            r = requests.get(BASE + path, params=q, timeout=timeout)
            if r.status_code == 200:
                try:
                    return r.json()
                except ValueError:
                    return default
            last = "HTTP %s %s" % (r.status_code, (r.text or "").strip()[:80])
        except Exception as e:
            last = "%s: %s" % (type(e).__name__, e)
        if i < retries:
            time.sleep(backoff * (i + 1))
    return {"_error": last}


def fetch_div(code):   return _get("/hs/gs/jnff",  {"code": code}, default=[])
def fetch_seo(code):   return _get("/hs/gs/jnzf",  {"code": code}, default=[])
def fetch_right(code): return _get("/hs/gs/jjxs",  {"code": code}, default=[])
def fetch_top10(code): return _get("/hs/gs/sdgd",  {"code": code}, default=[])
def fetch_float(code): return _get("/hs/gs/ltgd",  {"code": code}, default=[])
def fetch_capchg(code):return _get("/hs/gs/gdbh",  {"code": code}, default=[])
def fetch_fund(code):  return _get("/hs/gs/jjcg",  {"code": code}, default=[])


def top10_holding(code):
    rows = fetch_top10(code)
    if isinstance(rows, dict) and "_error" in rows:
        return [], rows["_error"]
    out = []
    for r in (rows or [])[:10]:
        out.append({
            "holder": _hit_key(r, "name", "gdmc", "股东", default=""),
            "ratio":  _hit_key(r, "ratio", "cgbbl", "持股比例", default=""),
        })
    return out, None


def run_check():
    fake = [{"name": "香港中央结算", "ratio": "8.21"},
            {"name": "证金公司", "ratio": "2.95"}]
    _orig = fetch_top10
    fetch_top10 = lambda c: fake
    t, err = top10_holding("000001.SZ")
    fetch_top10 = _orig
    assert err is None and len(t) == 2 and t[0]["holder"] == "香港中央结算"
    print("校验通过")


if __name__ == "__main__":
    run_check()
    print("-" * 62)
    code = "000001.SZ"
    for name, fn in [("历年分红", fetch_div), ("历年增发", fetch_seo),
                     ("历年配股", fetch_right), ("十大股东", fetch_top10),
                     ("流通股东", fetch_float), ("股本变化", fetch_capchg),
                     ("基金持股", fetch_fund)]:
        data = fn(code)
        if isinstance(data, dict) and "_error" in data:
            print("%-10s -> %s" % (name, data["_error"][:60]))
        else:
            print("%-10s -> %d 条" % (name, len(data) if isinstance(data, list) else 1))

5. 跑通示例

把上面的代码复制到本地,填入你的 智兔token 即可直接运行:传入股票代码,top10_holding 取最新一期十大股东及持股比例,7 个接口一键拉全(各字段含义见前文各小节)。

6. 坑与注意事项

坑 1:分红接口的「10送X转Y派Z」要拆成每股口径。
/hs/gs/jnff 返回的是「每 10 股送 X 转 Y 派 Z 元」的A股习惯写法,做股息率计算要除以 10 转成每股。别直接拿「派 Z」当每股分红,否则股息率会算错 10 倍。

坑 2:十大股东和流通股东是「报告期」数据,不是实时。
/hs/gs/sdgd、/hs/gs/ltgd 只在季报 / 年报披露后更新,平时是常数。做高频股东变动监控别指望它,要看专门的股本变化 /hs/gs/gdbh 或盘中股东人数接口。

坑 3:基金持股与十大股东口径不同。
/hs/gs/jjcg(基金持股)统计的是公募基金持仓,和 /hs/gs/sdgd(十大股东)不是一回事——同一只股票可能进十大股东但不是基金重仓,也可能基金持仓分散没进前十。两者要分开取、别混用。

7. 小结与下篇预告

本篇把沪深A股 7 个分红 / 股东端点分成 3 组,top10_holding 一行取十大股东持股比例,_hit_key 处理股东字段的大小写混用。

下一篇:《【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #05】季度利润现金流去哪找?业绩预告+财务指标一页取》:用 /hs/gs 一组接口,把季度利润 / 季度现金流 / 业绩预告 / 财务指标一次性取全。

8. 免责声明

本文仅演示沪深A股分红与股东数据的取数方法,所有代码示例均为演示数据,未含任何真实行情数值,不构成投资建议,亦不承诺收益。


免费领取证书
数据来自 智兔数服(www.zhituapi.com):零 SDK、纯 GET、免费版即可起步。

领取路径:进入 www.zhituapi.com → 点击「请求证书」→「证书获取」→「免费版」(邮箱验证 3 步即可拿到 token)。

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印分红送转与股东结构数据。

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