金融与市场数据
面向 AI Agent 的 财务报表 API
比较面向 AI Agent 的财务报表 API:供应商覆盖、规范化结构、Python 代码、会计校验、来源追踪与生产控制。
发布日期:2026年4月12日 · QVeris团队制作

本文目录
核心结论:先确定报表契约,再选择供应商
Financial Datasets 适合需要标准化美国报表与 Filing 来源追溯的团队;FMP 适合希望在一个全球 API 中获得标准化、TTM、增长和 As-reported 报表的工作流;SEC EDGAR 是权威的美国 XBRL 证据层,但需要团队自行负责标准化;Alpha Vantage 适合简单原型;需要全球发行人覆盖时可评估 EODHD 与 Finnhub。生产选择最终取决于期间语义、重述、标识、来源、许可和实测字段完整度。
一次获取利润表、资产负债表和现金流量表,并提供报告期间筛选与 Filing 元数据。
在完整金融 API 中提供标准化、TTM、Growth、Bulk 和 As-reported 端点。
当权威性比现成报表表格更重要时,使用 Company Facts 与 Filing Submissions。
需要带交易所身份的全球证券和非美国报表历史时进行评估。
搜索“财务报表 API”的人真正需要什么
这个搜索并不是在询问“什么是利润表”。用户通常需要选择数据源、获取三张报表、对齐期间、处理修订,并让每个计算都能追溯到 Filing。只列字段或只宣传路由层,并没有解决实现问题。
本页负责供应商中立的选型与架构;独立的 FMP 财务报表指南 继续承担品牌专属的端点与验证教程。
适用人群与前置条件
本指南适合构建股票研究 Agent、选股器、估值系统、契约监控、组合复盘和可追溯金融 Copilot 的工程师。默认目标不是拿到一次 Demo 响应,而是应对特殊财年、供应商修正、字段缺失和审计问题。
- 测试集至少包含普通公司、银行、保险公司、ADR、非自然年公司、亏损公司和近期重述公司。
- 取数前把年度、季度、YTD 和 TTM 定义为不同契约。
- API 凭证只放在服务端,并把套餐权限与代码分开记录。
- 提前确定标准化数值与 Filing 不一致时的权威来源。
年度、季度、TTM 与 As-reported 是不同契约
| 契约 | 含义 | 常见错误 |
|---|---|---|
| 年度 | 一个已披露财年,不一定在 12 月结束。 | 只按自然年标记。 |
| 季度 | 单季度数值,或由供应商推导出的季度。 | 把单季度值与 Filing 的年初至今值混用。 |
| TTM | 由最近期间滚动求和或取得最新时点。 | 把 TTM 当成公司直接披露的报表。 |
| As-reported | 接近原始 Filing 分类体系的发行人标签与数值。 | 假设字段天然可跨公司比较。 |
| 标准化 | 供应商映射到统一 Schema 的结果。 | 丢掉解释映射的原始 Tag 与来源。 |
Agent 可用的财务报表 API 选型标准
- 覆盖:发行人、交易所、在市/退市证券、历史深度、银行、保险和外国发行人。
- 期间语义:财年、财季、起止日、Filing Date、Accepted Date,以及单季/YTD。
- 报表模式:标准化、As-reported、年度、季度、TTM、Bulk、分部与重述历史。
- 证据:Accession Number、Filing URL、Source Tag、单位、币种、获取时间与版本身份。
- 运维:限额、Bulk 行为、修正策略、缓存和再分发权、状态报告与支持。
财务报表 API 供应商对比
| 方案 | 适用场景 | 官方能力 | 上线前验证 |
|---|---|---|---|
| Financial Datasets | 带 Filing 追溯的美国公司标准化报表 | 一次获取三表;年度、季度、TTM;期间筛选;Accession 与 Filing 字段 | 美国市场边界、套餐限制、特殊行业完整度与修订行为 |
| FMP Stable | 广泛金融数据栈与多种报表模式 | 利润表、资产负债表、现金流、TTM、Growth、Bulk、报告日期与 As-reported | 套餐权限、地区深度、字段空值率与 Point-in-time 行为 |
| SEC EDGAR | 美国第一方 Filing 与 XBRL 证据 | Submissions、Company Facts、Company Concept、Frames、实时更新与夜间 Bulk | 自定义 Tag、单位、Context、财年、公平访问运维及无浏览器 CORS |
| Alpha Vantage | 简单原型与标准化年度/季度报表 | 利润表、资产负债表和现金流函数,并映射 GAAP/IFRS Taxonomy | 配额、证券范围、字段映射、空值处理与刷新时间 |
| EODHD | 带交易所身份的全球基本面 | 版本化 Fundamentals 端点、交易所后缀、部分字段过滤与全球报表 Sections | 具体交易所覆盖、套餐权限、Payload 大小与各发行人缺失字段 |
| Finnhub | 连接全球基本面、预期与行情 | 全球公司长历史报表,以及 Estimates、Transcript、Revenue Segment 与 KPI | 端点权限、标准化/原始语义与分地区覆盖 |
按工作流选型,而不是按功能数量选型
跨公司筛选需要可预测的字段名、单位、期间和覆盖统计,同时保留 Raw Link 供下钻。
重要结论需要 Accession Number、已披露事实、Source Tag 和可复现取数路径。
跨交易所只用 Ticker 并不安全,应映射发行人、证券、上市地、交易所、币种和供应商 Symbol。
回测和历史 Agent 答案需要“当时已知”的数据,而不是今天修正后的旧期间数值。
供应商中立的财务报表架构
映射发行人、证券、上市地、交易所、可用的 CIK/LEI/ISIN 以及供应商 Symbol。
转换前保存响应、可安全记录的请求参数与 Header、获取时间、状态和内容哈希。
映射身份、期间、币种、单位倍率、报表类型、标准字段、原始字段、数值与来源。
只连接兼容期间,执行会计与语义校验,再把数据包标记为通过、警告或拒绝。
只用通过验证的输入计算比率,并把引用、公式、单位和校验结果附到 Agent 答案。
获取三张报表并保留证据 Envelope
下面以 Financial Datasets 为例,因为官方端点可一次返回三张报表。真正重要的是 Evidence Envelope:每个供应商 Adapter 都应使用同样模式。
import hashlib
import json
import os
from datetime import datetime, timezone
import requests
def fetch_statement_bundle(ticker: str, period: str = "annual", limit: int = 8):
endpoint = "https://api.financialdatasets.ai/financials"
params = {"ticker": ticker, "period": period, "limit": limit}
response = requests.get(
endpoint,
params=params,
headers={"X-API-KEY": os.environ["FINANCIAL_DATASETS_API_KEY"]},
timeout=30,
)
response.raise_for_status()
raw = response.json()
stable = json.dumps(raw, sort_keys=True, separators=(",", ":"))
return {
"provider": "financial_datasets",
"endpoint": endpoint,
"request": params,
"retrievedAt": datetime.now(timezone.utc).isoformat(),
"rawSha256": hashlib.sha256(stable.encode()).hexdigest(),
"raw": raw,
"statements": raw.get("financials", raw),
}
bundle = fetch_statement_bundle("AAPL", period="annual")
print(bundle["rawSha256"], bundle["statements"].keys())绝不记录 API Key;只对有限的瞬时失败进行有界重试;遵守限额 Header;标准化前先写入 Raw Snapshot,避免映射变化抹掉原始证据。
先使用长表 Fact Schema,再重建报表
供应商的宽表响应便于展示,但不适合多供应商标准化。应先把每个数值转换成 Fact Record,完成身份和期间验证后再 Pivot 成报表。
| 字段组 | 必需字段 | 作用 |
|---|---|---|
| 身份 | issuerId, securityId, listingId, providerSymbol | 避免 ADR、双重上市和 Ticker 重用错误。 |
| 期间 | periodType, startDate, endDate, fiscalYear, fiscalQuarter | 区分年度、单季、YTD、Instant 与 TTM。 |
| 数值 | statement, canonicalField, rawField, value, currency, unitScale | 让转换过程明确且可逆。 |
| 证据 | provider, filingDate, accession, sourceUrl, retrievedAt, rawSha256 | 复现答案并识别后续修正。 |
连接三张报表前,先对齐身份与期间
不要只用 Ticker 与年份连接。应使用发行人身份、期间类型、Period End、财年、财季、币种和 Filing Version。利润表与现金流量表多为 Duration Fact,资产负债表很多项目是 Instant Fact;仅有自然季度标签不足以证明它们属于同一数据包。
映射到内部财务期间模型前,保存原始标签与日期。
记录组成季度、公式、缺失季度策略和推导时间。
财务期间先结束,之后 Filing 才提交并被接收。
零是已披露数值;Null 可能表示缺失、不适用、未映射或不可用。
把会计关系转化为验证测试
def close_enough(left, right, abs_tol=1_000, rel_tol=0.002):
scale = max(abs(left), abs(right), 1)
return abs(left - right) <= max(abs_tol, rel_tol * scale)
def validate_period(bundle):
errors, warnings = [], []
bs, cf = bundle["balance"], bundle["cashFlow"]
if not close_enough(
bs["totalAssets"],
bs["totalLiabilities"] + bs["totalEquity"],
):
errors.append("balance_sheet_equation_failed")
if all(cf.get(k) is not None for k in
["beginningCash", "changeInCash", "endingCash"]):
if not close_enough(
cf["beginningCash"] + cf["changeInCash"],
cf["endingCash"],
):
warnings.append("cash_rollforward_failed")
if len({bundle[x]["currency"] for x in
["income", "balance", "cashFlow"]}) != 1:
errors.append("currency_mismatch")
if len({bundle[x]["periodEnd"] for x in
["income", "balance", "cashFlow"]}) != 1:
errors.append("period_end_mismatch")
return {"valid": not errors, "errors": errors, "warnings": warnings}- 同时使用绝对与相对容差;四舍五入和供应商展示方式会产生小差异。
- 核对 Capex、发债、回购和分红前先确认正负号规则。
- 只有组件定义和范围一致时才重新计算小计。
- 按期间记录校验状态,单个失败季度不能静默污染多年趋势。
重述与供应商修正需要版本化历史
同一 Report Period 可能出现在原始 Filing、修订文件和后续报表的比较列中;供应商也可能在首次取数后改进 Taxonomy 映射。覆盖旧行会破坏 Point-in-time 可复现性。建议使用“发行人 + 期间 + 报表模式 + Filing/Accession + 供应商版本 + 获取快照”的只追加键。
当前答案优先使用最新通过验证的版本,并披露发生过重述;历史回测应使用模拟决策时点当时可获得的版本。
安全、成本、延迟与许可控制
特定 Filing Snapshot 可长期缓存;Latest Statement 别名需要重新验证和修正检测。
存在 Bulk 或夜间 Archive 时,不要对数千 Symbol 并发逐个请求。
Secret 证明身份;Plan Record 决定允许的端点、历史深度与用途。
内部分析、终端展示、衍生数据、缓存和转售可能对应不同合同权限。
常见财务报表失败模式
| 现象 | 可能原因 | 修复 |
|---|---|---|
| Revenue 大约放大四倍 | 把 YTD 当单季,或对季度值重复年化 | 保存 Duration 起止日与推导方法,不只依赖 Q 标签 |
| 资产不等于负债加权益 | 期间、单位、币种、范围混用,或映射不完整 | 拒绝该 Join Bundle,计算前检查 Raw Field |
| 历史答案静默变化 | 重述或供应商修正覆盖旧行 | 使用只追加版本、Hash、Effective Time 与 Observed Time |
| 银行或保险比率异常 | 把工业公司 Schema 套到特殊行业报表 | 按行业 Schema 路由并执行行业专属验证 |
| 缺失值变成有效的零 | 解析或 Prompt 中把 Null 强制转换为零 | 使用可空类型和明确的 Missing Reason Code |
QVeris 模式:Discover → Inspect → Call
QVeris 位于供应商端点之上,承担能力发现与路由,而不会变成金融数据来源。Agent 先发现“带 Filing URL 的年度标准化报表”等能力,检查 Schema、覆盖、限制和权限,再用受控输入调用选定工具;标准化响应仍必须保留底层供应商与 Filing 证据。
按报表模式、地区、财务期间、来源与延迟搜索能力。
检查标识、字段定义、Null 行为、权限、限额和证据字段。
调用最小范围,保留 Raw Response,验证标准化 Bundle,并引用来源。
财务报表 API 常见问题
哪种财务报表 API 最适合 AI Agent?
没有通用赢家。Financial Datasets 擅长标准化美国报表与来源;FMP 提供广泛的标准化和 As-reported 端点;SEC EDGAR 是美国第一方 XBRL 证据;EODHD 或 Finnhub 更适合扩展全球覆盖。
Agent 应使用标准化还是 As-reported 报表?
筛选和跨公司比较使用标准化报表;审计、特殊项目和重要结论应保留 As-reported Fact 与 Filing 引用。
年度、季度与 TTM 报表可以混用吗?
不可以。它们是不同的期间契约。应保存期间类型、起止日、财年、财季和 Filing Date,只比较兼容期间。
Agent 应如何验证资产负债表?
使用明确容差检查资产约等于负债加权益,同时保留原始币种、单位、来源和已披露数值。
为什么报表发布后数值还会变化?
公司可能修订 Filing,供应商可能修正映射,后续报表也可能重述比较期间。应保存只追加快照,并区分 Report Period、Filing Date 与 Retrieval Time。
只使用 SEC EDGAR 足够构建生产金融 Agent 吗?
它可以作为权威美国证据层,但多数团队仍需要标识映射、XBRL 标准化、缓存、Taxonomy 处理和报表组装。
每个标准化数值应保留哪些来源字段?
保留供应商、端点、发行人和证券标识、Report Period、Filing Date、Accession 或 Source URL、币种、单位倍率、Raw Field、获取时间与 Raw Payload Hash。
QVeris 位于财务报表工作流的哪一层?
QVeris 帮助 Agent 发现、检查和调用供应商工具;供应商响应与底层 Filing 仍是记录源。
官方资料与相关实现指南
覆盖、Schema、配额和商业权限会变化。确定供应商前,请核对当前官方文档,并运行代表性发行人测试集。
让每个财务结论都可复现
使用 QVeris 发现并检查报表能力,并在整个工作流中保留供应商身份、财务期间语义、原始证据、验证状态与 Filing 引用。
开始使用 QVeris档案链接有效不代表已获访问权限、字段可用、价格确定或当前调用成功;执行前须检查当前契约。
