参考

批量取数

只有部分端点支持一次传多个代码,而且每个端点拼回来的方式都不一样 —— 有的多一列 symbol,有的把代码拼进列名。传之前先确认它属于哪一种。

三种批量行为

实测下来,传 sh600519,sz000001 会得到三种完全不同的结果:

行为 表现 端点
正常合并(多出代码列,一行一只) 行数翻倍,且每行带代码列 quote(多 symbol 列)· technical · profile
前缀列名(宽表,行数不变) 列数翻倍,列名变成 sh600519_code / sz000001_code chip
只取第一个代码 忽略后续代码,不报错 fund · dividend · block-trade · minute · snapshot

⚠️ 还有一个特例:margin-trade 的端点描述声明支持批量,但实测传两只时返回结构与单只相同 —— 以实测为准。

三种行为各自怎么取

① 正常合并(quote / technical / profile) —— 直接按代码列筛:

rows = resp["data"]
moutai = [r for r in rows if r["code"] == "sh600519"]   # technical / profile
# quote 的代码列叫 symbol,不是 code
moutai_q = [r for r in rows if r["symbol"] == "sh600519"]

⚠️ quote 用 symbol,technical / profile 用 code —— 列名不一致。

② 前缀列名(chip) —— 行数不变,列名带代码前缀,取数要拼接列名:

rows = resp["data"]
for r in rows:
    code = r.get("sh600519_code") or r.get("sz000001_code")
    if code and code != "-":
        profit = r.get(f"{code}_chipProfitRate")

⚠️ 这种形态每行一半是 -(因为它把两只票并排放在同一行)—— 别当成缺数据。

③ 只取第一个代码 —— 必须循环调用:

import time, requests

CODES = ["sh600519", "sz000001", "sh601318"]
out = {}
for c in CODES:
    r = requests.get("https://api.ashareapi.com/v1/dividend",
                     params={"code": c}, headers={"Authorization": f"Bearer {KEY}"},
                     timeout=10).json()
    if r.get("ok"):
        out[c] = r["data"]
    time.sleep(0.25)   # ← 降并发,别打满限流
  1. 加间隔:限流按每分钟调用数算,循环里不加间隔最容易撞 429。
  2. 判 ok 再存:空结果也是 ok: true + 空数组,属正常(见空结果不等于故障)。
  3. 429 要重试:读 Retry-After 头,等待后重试;不要原速重试。

常见误用

  • 以为所有端点都能批量 —— 只有部分支持,其余会静默只取第一个代码(丢数据,不报错)。
  • 用同一个列名筛所有端点 —— quote 是 symbol,technical / profile 是 code。
  • 拿 chip 当行数组拼 —— 它是宽表(前缀列名),行数不翻倍、每行一半是 -。
  • 循环里不加间隔 —— 直接吃 429。
  • 把 429 当失败丢弃 —— 它是限流不是故障,等待重试即可。
  • 按行数估算成本 —— 计费按请求次数算,一次批量请求就算一次。

最后更新: 2026-10-07

支持情况与返回结构为 2026-10-07 逐端点实测(同一端点分别传单只代码与 sh600519,sz000001,对比行数、列数与列名)。