← 返回博客列表

【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #05】季度利润现金流去哪找?业绩预告+财务指标一页取

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

摘要:【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #05】季度利润现金流去哪找?业绩预告+财务指标一页取 系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET

系列:智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透|连载项目 · 纯 GET 取数 · 仅依赖 requests
适用:想做财务因子选股 / 业绩跟踪,但还在财报 PDF 里手动扒季度利润、现金流的读者;数据由智兔数服提供。本篇给沪深A股「季度利润 / 季度现金流 / 业绩预告 / 财务指标」4 个端点的分组地图、一页取全的代码、报告期与指标口径的坑,全部只依赖 requests,所有示例均为演示数据,不构成投资建议。

1. 你将得到什么

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

  1. 一张分组地图:4 个业绩端点按「利润表 / 现金流量表 / 预告 / 综合指标」分成 4 类;
  2. 一页取全的代码:/hs/gs/jdlr 拿季度利润,/hs/gs/cwzb 拿 ROE / 营收等综合指标;
  3. 报告期参数的取法:业绩接口要传 report_date(如 20240331),不传默认最新;
  4. 三个真实踩坑点,都是第一次用几乎一定会踩的。

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

2. 本篇取数约定

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

3. 4 个端点分 4 类

先建立地图。业绩类一共 4 个端点,按用途分:

类 端点 用途 更新频率
利润表 /hs/gs/jdlr 季度利润(营收 / 净利 / 毛利) 每季披露后
现金流量 /hs/gs/jdxj 季度现金流量(经营 / 投资 / 筹资) 每季披露后
业绩预告 /hs/gs/yjyg 业绩预告(预增 / 预减 / 扭亏) 预告期
综合指标 /hs/gs/cwzb 财务指标(ROE / 营收同比 / 资产负债率) 每季披露后

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 _to_float(v, default=None):
    try:
        if v in (None, "", "-", "null", "None"):
            return default
        return float(v)
    except (TypeError, ValueError):
        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_quarter_profit(code, rd=None):
    p = {"code": code}
    if rd: p["report_date"] = rd
    return _get("/hs/gs/jdlr", p, default=[])
def fetch_quarter_cash(code, rd=None):
    p = {"code": code}
    if rd: p["report_date"] = rd
    return _get("/hs/gs/jdxj", p, default=[])
def fetch_forecast(code):
    return _get("/hs/gs/yjyg", {"code": code}, default=[])
def fetch_indicators(code, rd=None):
    p = {"code": code}
    if rd: p["report_date"] = rd
    return _get("/hs/gs/cwzb", p, default=[])


def roe_and_growth(code, rd=None):
    rows = fetch_indicators(code, rd)
    if isinstance(rows, dict) and "_error" in rows:
        return None, rows["_error"]
    row = (rows or [{}])[0]
    return {
        "roe":    _to_float(_hit_key(row, "roe", "净资收益率", default=None)),
        "rev_yoy": _to_float(_hit_key(row, "rev_yoy", "营收同比", "yysr_tb", default=None)),
    }, None


def run_check():
    fake = [{"roe": "12.3", "rev_yoy": "8.5"}]
    _orig = fetch_indicators
    fetch_indicators = lambda c, rd=None: fake
    m, err = roe_and_growth("000001.SZ")
    fetch_indicators = _orig
    assert err is None and m["roe"] == 12.3 and m["rev_yoy"] == 8.5
    assert fetch_quarter_profit("000001.SZ", "20240331") is not None
    print("校验通过")


if __name__ == "__main__":
    run_check()
    print("-" * 62)
    code = "000001.SZ"
    rd = "20240331"
    for name, fn in [("季度利润", lambda: fetch_quarter_profit(code, rd)),
                     ("季度现金流", lambda: fetch_quarter_cash(code, rd)),
                     ("业绩预告", lambda: fetch_forecast(code)),
                     ("财务指标", lambda: fetch_indicators(code, rd))]:
        data = fn()
        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 即可直接运行:传入代码与报告期,roe_and_growth 一行取 ROE 与营收同比,4 个业绩接口一页拉全(各字段含义见前文各小节)。

6. 坑与注意事项

坑 1:业绩接口要传报告期 report_date,格式是 YYYYMMDD 季末日。
/hs/gs/jdlr、/hs/gs/jdxj、/hs/gs/cwzb 都可传 report_date=20240331(一季度末),不传默认返回最新一期。但季度利润接口如果某期还没披露会返回空,做历史回测要按披露日历逐期请求,别一次性全用默认值。

坑 2:业绩预告和正式财报口径不同,别混算。
/hs/gs/yjyg 是预告(区间值、预增预减),/hs/gs/jdlr 是正式季报(确定值)。做营收同比要用正式财报的 rev_yoy,预告只能做方向判断,直接拿预告值算因子会引入噪音。

坑 3:ROE / 资产负债率的单位与符号要看清。
/hs/gs/cwzb 的 roe 通常是百分比数值(如 12.3 表示 12.3%),不是小数;资产负债率同理。做因子归一化前先确认单位,别把 12.3 当 0.123 算,排序会全反。

7. 小结与下篇预告

本篇把沪深A股 4 个业绩端点分成 4 类,roe_and_growth 一行取 ROE 与营收同比,_to_float 处理指标单位。

下一篇:《【智兔数服|别再到处找免费股票数据API:官方204个接口32篇讲透 #06】Python实时行情总报错?五档盘口+逐笔一次跑通》:用 /hs/real·/hs/public·/hs/custom 一组接口,把实时行情 / 五档盘口 / 逐笔交易一次跑通。

8. 免责声明

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


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

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

把代码里的 你的智兔token 换成你拿到的真实 token,上面的脚本就能直接打印季度利润与财务指标数据。

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