适用场景与调用限制概览
基金估值跟踪 API 聚合了实时估值、指数行情、基金详情及常用指数批量查询四个功能,适合量化投研、个人复盘、基金组合监控等场景。但任何公开接口都有调用频率和用量边界约束。本接口的公开文档明确指出,未认证的匿名调用每日最多 50 次,而使用 API Key 后虽然 QPS 固定为 5 次/秒,但每日总量通常远高于匿名限制(具体以运营方策略为准)。了解这些边界,有助于合理规划请求,避免因超限导致服务不可用。
接口能力边界
本接口支持四种 action:
| action | 功能 | 参数 code | 返回数据特点 |
|---|---|---|---|
| estimate | 基金实时估值 | 基金代码(6位) | 盘中每分钟更新,含最新净值、估算净值、涨跌幅 |
| index | 单个指数行情 | 指数代码(6位) | 新浪主+东方财富备容灾 |
| info | 基金详细信息 | 基金代码(6位) | 历史收益、基金经理、风险等级等 |
| indices | 批量常用指数 | 无需 code | 一次性返回上证、深证成指、创业板等 6 个指数 |
每个 action 返回的数据结构虽有差异,但最外层都是统一响应格式:code、msg、data、request_id。
调用频率与用量约束
根据官方文档:
- QPS(每秒查询数):5 次/秒。超过此频率的请求会被直接拒绝,返回状态码 429(Too Many Requests)或错误码提示。
- 匿名调用日配额:未携带 Authorization 请求头时,每天最多 50 次。超出后接口将返回鉴权错误 (通常是 401 或 403)。
- 认证调用:携带有效的 API Key(通过
Authorization: Bearer sk_live_xxx)后,日配额会大幅提升(具体需参考文档或账户信息),同时仍受 QPS=5 的限制。 - 并发控制:QPS=5 意味着单客户端可以在 1 秒内连续发送 5 个请求,但第 6 个请求应等待至少 200 毫秒后再发出。在实际工程中,建议使用令牌桶或间隔等待策略。
特别注意:不要在同一秒内对同一个action和code并发请求,这不仅浪费配额,还可能触发上游限流。
请求参数与鉴权
必要参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| action | string | 是 | "estimate" / "index" / "info" / "indices" |
| code | string | 当 action ≠ "indices" 时必填 | 6 位数字基金或指数代码 |
可选参数
Authorization请求头:格式为Bearer sk_live_xxxxxxxxxxxxxx。匿名调用时可不传,但受日配额限制。- 早期文档或示例中曾使用
X-API-Key请求头,但当前推荐标准为Authorization。两种方式可能同时被支持,但以文档最新规定为准。
cURL 请求示例
以下示例展示使用 API Key 获取基金005827(易方达蓝筹精选混合)的实时估值:
curl -sS \ -X GET \ -H "Authorization: Bearer YOUR_API_KEY" \ "https://v1.apizero.cn/api/fund?action=estimate&code=005827"若将YOUR_API_KEY替换为有效的 Key,则返回 JSON;若未携带 Key,则受每日 50 次限制。
对于无需 code 的批量指数查询,可以省略 code:
curl -sS \ -X GET \ -H "Authorization: Bearer YOUR_API_KEY" \ "https://v1.apizero.cn/api/fund?action=indices"Python 代码接入与限流处理
使用 Python 的requests库时,建议加入重试与退避逻辑,以应对限流:
import requests import time BASE_URL = "https://v1.apizero.cn/api/fund" API_KEY = "sk_live_xxxxxxxxxxxxxx" # 替换为真实 Key def fetch_fund_estimate(code, retries=3): headers = {"Authorization": f"Bearer {API_KEY}"} params = {"action": "estimate", "code": code} for attempt in range(1, retries+1): try: resp = requests.get(BASE_URL, headers=headers, params=params, timeout=10) if resp.status_code == 429: print(f"Attempt {attempt}: rate limited, waiting {2**attempt}s") time.sleep(2**attempt) continue resp.raise_for_status() data = resp.json() if data.get("code") != 0: print(f"API error: {data.get('msg')}") continue return data["data"] except requests.exceptions.RequestException as e: print(f"Attempt {attempt} failed: {e}") time.sleep(2**attempt) raise Exception("Max retries exceeded") result = fetch_fund_estimate("005827") print(result)此代码实现了指数退避重试,当收到 429 时等待逐渐变长,有效遵守 QPS=5 限制。
响应字段解读
成功响应的通用结构(以 action=estimate 为例):
{ "code": 0, "data": { "action": "estimate", "fund_code": "005827", "fund_name": "易方达蓝筹精选混合", "net_value": 1.7393, "estimate": 1.727, "change_rate": -0.71, "nav_date": "2026-04-30", "update_time": "2026-05-06 15:00" }, "msg": "成功", "request_id": "abc123def456" }code: 0 表示成功,非零表示错误。msg: 错误信息。data: 业务数据,具体字段因 action 而异。request_id: 请求唯一标识,可用于排错。
对于 action=index 和 action=info,data 结构不同,具体可查阅文档。
常见错误码及处理
| 状态码 | 错误码 (code) | 含义 | 处理方法 |
|---|---|---|---|
| 200 | 0 | 成功 | - |
| 200 | 1001 | 参数缺失或无效 | 检查 action 和 code 是否正确 |
| 200 | 1002 | 基金代码不存在 | 核实基金代码 |
| 401 | - | 鉴权失败 | 检查 API Key 有效性;匿名调用超出日配额 |
| 403 | - | 禁止访问 | 可能 IP 被限制或账户异常 |
| 429 | - | 请求过于频繁 | 降低请求频率,等待后重试 |
| 500 | - | 服务端错误 | 稍后重试,若持续请反馈 |
工程化注意事项
1. 缓存策略
对于 action=info(基金详情)这类更新频率较低的数据(如历史收益率),建议设置至少 1 小时的缓存,避免反复请求。对于 action=estimate,盘中每分钟更新,可缓存 30 秒到 1 分钟。对于 action=index,指数行情通常每 5 秒刷新,但本接口受上游限制,建议缓存间隔 10 秒以上。
2. 并发与 QPS 控制
QPS=5 是硬性限制。应当使用信号量或令牌桶限制并发请求数。例如 Python 中使用asyncio.Semaphore或throttle库。
3. 错误重试策略
除 429 外,对于 5xx 错误可重试 2-3 次,间隔递增。对于 4xx(除 429 外)通常不应重试,而是检查参数或鉴权。
4. 匿名调用的配额监控
如果使用匿名调用,需在客户端记录当日请求计数。每次请求后递减配额。超过 50 次后需等待次日 UTC 0 点重置。更推荐使用 API Key 以避免此限制。
5. 上游容灾
本接口使用三路上游(天天基金、新浪、东方财富),并已修复新浪通道的sh/sz前缀 bug。即便如此,网络波动仍可能导致返回空数据或错误。应在客户端做好数据有效性校验,例如检查estimate字段是否为正常浮点数。
参考文档
- 官方文档页:https://apizero.cn/aidocs/fund
- 原始 Markdown 文档:https://apizero.cn/aidocs/fund/raw.md