← 返回博客列表

【Python 量化取数指南 #07】股票财务数据 API 评测与取值

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

摘要:【Python 量化取数指南 #07】股票财务数据 API 评测与取值 系列:《Python 量化取数指南》|连载项目 · 纯 GET 取数 · 仅依赖 requests 数据:由智兔数服提供。更多接口见 智兔数

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

1. 你将得到什么

  • 财务数据 4 类端点的完整代码:资产负债表、利润表、现金流量表、财务比率、财务总表
  • 一个把「营收/净利/ROE」抽出来做横向对比的小示例
  • 一个离线 run_check(),不填 token 也能验证逻辑

2. 本篇取数约定

  • 资产负债表:/hs/fin/balance/{code}
  • 利润表:/hs/fin/income/{code}
  • 现金流量表:/hs/fin/cashflow/{code}
  • 财务比率:/hs/fin/ratios/{code}
  • 财务总表(速览):/hs/gs/cwzb/{code}
  • 请求:GET https://api.zhituapi.com<path>?token=<你的智兔token>
  • {code}=600519.SH;财报多为季度/年度口径,注意报告期字段

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_finance(code="600519.SH"):
    # 4.1 财务总表(速览)
    data, err = _get(f"/hs/gs/cwzb/{code}")
    if err:
        print("财务总表失败:", err)
    else:
        print("  财务总表结构:", type(data).__name__, "| 样例:", _hit_key(data, "name", "mc"))

    # 4.2 利润表 /hs/fin/income/{code}
    data, err = _get(f"/hs/fin/income/{code}")
    if err:
        print("利润表失败:", err)
    else:
        rows = data if isinstance(data, list) else (data.get("data") or [])
        if rows:
            r0 = rows[0]
            rev = _to_float(_hit_key(r0, "revenue", "yyzsr", "营业收入"))
            np_ = _to_float(_hit_key(r0, "net_profit", "jlrtb", "净利润"))
            print(f"  利润表报告期 {_hit_key(r0,'date','rq','报告期')} 营收 {rev} 净利 {np_}")

    # 4.3 财务比率 /hs/fin/ratios/{code}
    data, err = _get(f"/hs/fin/ratios/{code}")
    if err:
        print("比率失败:", err)
    else:
        print("  比率结构:", type(data).__name__)

def run_check():
    synth = {"name": "合成股", "revenue": 1000, "net_profit": 150}
    print(f"  [run_check] 营收 {synth['revenue']} 净利 {synth['net_profit']}")

if __name__ == "__main__":
    demo_finance("600519.SH")
    run_check()

返回字段说明:财务总表含 name/mc(名称)、各项同比增速;三张表多为 list(按报告期),每项含 date/rq(报告期)、yyzsr/revenue(营收)、jlrtb/net_profit(净利)等;比率含 roeeps 等。字段名三套并存,统一 _hit_key

5. 坑与注意事项

  1. 报告期口径:财报按季度/年度,date/rq 是报告期不是交易日期,别当行情日用。
  2. 单位不一致:有的接口返回「万元」有的「元」,先 print 核对单位再算比率。
  3. 字段名三套revenue/yyzsr/营业收入 都可能出现,用 _hit_key 候选键。
  4. 更新滞后:财报法定披露有延迟,最新报告期可能落后 1~2 月,别当成实时。
  5. ST/新股可能缺表:部分标的无完整财报,做好空值兜底。
  6. 比率自己算更稳roe = 净利/净资产,直接取接口比率若不准可本地重算。

6. 常见报错速查

报错 / 现象 原因 处理
404 代码缺后缀 检查 {code}=600519.SH
返回空 无财报/新股 换成熟标的
单位错 万元/元混 print 核对
KeyError 字段名不符 print(data) 看真实 key

7. 小结与下一篇预告

小结:财务数据走 /hs/fin/*/hs/gs/cwzb/{code},核心是「报告期 + 单位 + 三套字段名」三件事;抽指标统一 _hit_key,比率本地校验更稳。

下一篇计划写 #08《基金持仓穿透接口实测》:用基金持仓类端点穿透到底层股票,给出持仓归因示例。

8. 免责声明

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


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

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