FMP(Financial Modeling Prep)是什么?一文看懂FMP行情数据源
写美股量化回测脚本、搭投研看板或者给大模型(LLM)喂公司财报时,只要你去搜美股基本面 API,大概率都会撞见 FMP(Financial Modeling Prep)。它到底是个什么体量的数据源?能拿到哪些免费爬虫抠不出来的深层材料?又有哪些需求是它根本干不了的?
不想翻几百页英文文档的,先把三条硬结论记在心里:
- FMP 的看家本领是「公司基本面纵深」:除了全球 70,000+ 只证券的日线与分钟行情外,它把美股 30+ 年的三大财务报表、SEC 原始申报科目(As Reported XBRL)、按产品与按地区拆分的营收、财报电话会文字稿、13F 机构持仓、国会议员交易和 DCF 估值全部做成了结构化 JSON 接口。
- 接口风格对写代码非常省心:全站 283 个去重接口统一挂在
/stable/路径前缀下,参数扁平直观,返回体直接是 JSON 数组,写一个通用请求函数就能把全站数据拉下来。 - 它不是盘口微观行情引擎:FMP 没有美股常规时段的逐笔成交(Trades)、没有历史买卖盘口明细(NBBO Quotes),也没有期权链数据。如果你的核心任务是盘口订单流回放或期权波动率策略,应该直接去用 Massive(原 Polygon.io);但如果你围绕公司财报、估值建模、事件驱动与中低频量价做研究,FMP 是目前极少能把基本面链条配齐的主力数据仓。
下面结合本站整理的 30 个分类、283 个接口主数据、1,429 个中文字段释义以及截至 2026 年 10 月实盘拉取的苹果(AAPL)最新数据,把 FMP 的家底、调用规律与避坑点一次讲透。
FMP 能拿到哪些数据?30 个分类、283 个接口的六大板块地图
很多人第一次打开官方文档会被长长的英文目录晃花眼。其实按我们平时写投研与回测代码的真实流程拆开,FMP 的 283 个接口正好对应 六大核心能力板块:
| 核心板块 | 包含的主要分类与代表能力 | 解决的具体研究问题 | 站内对应文档入口 |
|---|---|---|---|
| 1. 公司财报与原始披露 | 三大报表、TTM 滚动表、增长率、分产品/分地区营收、As Reported 原始报表 | 公司赚了多少钱?增长来自哪条业务线或哪个大洲?标准化科目与 SEC 10-K 原文差在哪? | 财务报表 · 分产品营收 · 分地区营收 |
| 2. 估值、评分与财务指标 | 66 项财务比率、关键指标(Key Metrics)、标准/杠杆/自定义 DCF、Piotroski F-Score 与 Altman Z-Score | 当前估值处于历史什么分位?如何用财务健康分(如 Piotroski 9 分制)批量排雷? | DCF 估值 · 财务比率 · 财务公式库 |
| 3. 定性文本与监管申报 | 财报电话会文字稿(Transcripts)、SEC 10-K/10-Q/8-K 申报检索与全文提取、并购(M&A) | 管理层在电话会上怎么解释毛利率波动?最新 8-K 披露了什么突发事项? | 财报电话会 · SEC 文件 · 公司资料 |
| 4. 聪明钱与预期差跟踪 | 13F 机构持仓与归因、内部人高管买卖(Form 4)、美国参众两院议员交易、分析师一致预期与目标价、CFTC 持仓报告 | 巴菲特上季度加仓了谁?公司高管在密集增持还是套现?季报是否超华尔街一致预期? | 机构持仓 13F · 内部人交易 · 国会交易 · 分析师数据 |
| 5. 股票行情与跨资产市场 | 实时报价、1分钟~日线历史行情、不复权/分红复权序列、ETF 持仓穿透、指数历史成分股与退市公司库、外汇/加密/大宗商品/宏观日历 | 如何拉取带现金分红复权的日线?如何拿到标普 500 历史进出名单消除回测“幸存者偏差”? | 实时行情 · 股票行情 · 指数数据 · ETF 与基金 |
| 6. 全市场批量同步(Bulk) | 按年/季一键拉取全市场三大报表、比率、DCF、评级,以及按交易日拉取全市场收盘行情(EOD Bulk) | 本地建全市场数据库时,如何免掉写几千次循环去调单股接口的麻烦? | 批量数据 · EOD 批量收盘价 |
想查某一个具体接口的参数与返回字段字典,可以随时打开本站的完整接口总览按中文分类检索。
为什么做基本面研究和量化回测,FMP 比免费爬虫省心得多?
不少开发者刚起步时都用过 yfinance 或自己写脚本抓网页,但只要把任务放进每日定时调度(Cron),很快就会撞上封 IP(HTTP 429)、网页改版断流、历史只能拉最近 4~5 期这三堵墙。FMP 真正省时间的地方,在于它把四个平时最难洗的“脏活”做成了现成接口:
1. 把营收直接拆到「具体产品线」与「地理大区」
光看苹果(AAPL)或英伟达(NVDA)的总营收增长远远不够。以前要想知道苹果在大中华区卖得怎么样、或者服务业务(Services)占比提了多少,只能自己去 10-K 年报附注里扒表格。
现在直接调 FMP 的分产品营收接口(/stable/revenue-product-segmentation)和分地区营收接口(/stable/revenue-geographic-segmentation),拿到的就是已经洗成键值对的美元数值。看一眼我们实测拉取的苹果 2024 与 2025 财年分地区营收返回(GET /stable/revenue-geographic-segmentation?symbol=AAPL&period=annual,节选前 2 期):
[
{
"symbol": "AAPL",
"fiscalYear": 2025,
"period": "FY",
"reportedCurrency": "USD",
"date": "2025-09-27",
"data": {
"Americas Segment": 178353000000,
"Europe Segment": 111032000000,
"Greater China Segment": 64377000000,
"Japan Segment": 28703000000,
"Rest of Asia Pacific Segment": 33696000000
}
},
{
"symbol": "AAPL",
"fiscalYear": 2024,
"period": "FY",
"reportedCurrency": "USD",
"date": "2024-09-28",
"data": {
"Americas Segment": 167045000000,
"Europe Segment": 101328000000,
"Greater China Segment": 66952000000,
"Japan Segment": 25052000000,
"Rest of Asia Pacific Segment": 30658000000
}
}
]
五个大区(美洲 1,783.53 亿美元、欧洲 1,110.32 亿美元、大中华区 643.77 亿美元、日本 287.03 亿美元、亚太其他 336.96 亿美元)加起来正好等于 AAPL FY2025 利润表总营收 4,161.61 亿美元,而且一眼就能看出大中华区营收从 669.52 亿美元 回调到 643.77 亿美元,而美洲与欧洲在稳步增长。
2. 同时给齐「标准化报表」与「As Reported 原始披露报表」
做跨公司横向选股时,直接调利润表、资产负债表和现金流量表,所有公司共用同一套标准字段名;而当你要核对某家公司的特殊会计科目(比如外币折算损益、套期保值重分类)时,直接调原始申报财务报表(As Reported),返回的就是公司在 SEC 10-K/10-Q 里提交的原始 XBRL 标签。两边对照,再也不用纠结“为什么 API 数字跟财报原文对不上”。
3. 自带防「未来函数」与「幸存者偏差」的回测关键字段
量化回测最容易犯两个致命错误:
- 一是把财季结束日(
date)当成财报可用日,在回测里提前一个月“偷看”了还没发布的季报; - 二是拿今天的标普 500 成分股名单去跑过去 10 年的回测,漏掉了中途退市或被剔除的股票。
FMP 在每条财报记录里都同时返回报告期末日(date)、SEC 申报日(filingDate)和精确到秒的 SEC 系统接收时间戳(acceptedDate);同时在指数数据分类下提供标普 500 历史成分股变更记录以及独立的退市公司名单接口,让你能还原历史任意一天的真实股票池。
4. 提供现成的财报电话会文字稿与可验算的公式库
现在很多团队用大模型提炼管理层业绩指引(Guidance),FMP 的财报电话会文字稿接口可以按股票代码、年份和季度直接返回完整的 CEO/CFO 陈述与华尔街分析师问答全文。而对于 66 个常见财务比率、Piotroski 9 项健康打分、巴菲特股东盈余等衍生指标,本站的财务计算公式库把底层算式与字段映射全部拆开列清,拒绝黑盒。
一眼看懂 /stable/ 调用规律(附 /api/v3/ 老代码迁移提醒)
如果你在网上搜 FMP 的旧教程,十篇里有八篇还在写 /api/v3/income-statement/AAPL 这种把股票代码拼在路径里的写法。这里特别提醒一句:FMP 官方已将现行标准接口全面收敛到 /stable/ 路径前缀下(旧版 v3/v4 对新账户已逐步废弃停用)。
现行 /stable/ 接口遵循三条非常统一的工程规范:
- 股票代码一律走 Query 参数(
?symbol=AAPL),不再拼进 URL 路径:以前 v3 里有的接口用/AAPL、有的用?symbol=AAPL,写客户端封装很痛苦;现在/stable/下所有单股接口统一传?symbol=AAPL。 - 周期与分页参数全站通用:查财报或指标时,
period=annual代表年报、period=quarter代表季报;limit=4控制返回期数;查历史日线或 SEC 文件时用 from=2026-01-01&to=2026-10-20 限定时间窗。 - 返回体统一为顶层 JSON 数组:正常响应永远是
[{...}, {...}],没有任何多余的外层包装,直接丢进pandas.DataFrame(data)就能变成二维表。
例如,获取苹果公司最近 4 个季度的利润表,标准 HTTP 请求如下:
GET https://quote-fmp.com/stable/income-statement?symbol=AAPL&period=quarter&limit=4&apikey=YOUR_API_KEY
一段代码跑通:拉取 AAPL 最新季报并检查「报告期 vs 披露时间」
下面这段 Python 代码既展示了 FMP 利润表接口的真实字段,也顺手演示了回测预处理中最关键的一步——计算财报期末日(date)与 SEC 申报日(filingDate)之间的滞后天数。代码中内嵌了我们实盘拉取的苹果(AAPL)2025Q4 ~ 2026Q3 四个季度真实数据,哪怕你手头还没有 API Key,直接复制进本地终端也能立刻运行看到结果:
import json
import os
import unicodedata
import urllib.parse
import urllib.request
from datetime import datetime
# 内嵌 FMP /stable/income-statement?symbol=AAPL&period=quarter&limit=4 实盘返回样本(免 Key 零依赖直接可跑)
SAMPLE_DATA = [
{
"date": "2026-06-27",
"symbol": "AAPL",
"reportedCurrency": "USD",
"cik": "0000320193",
"filingDate": "2026-07-31",
"acceptedDate": "2026-07-31 06:01:02",
"fiscalYear": "2026",
"period": "Q3",
"revenue": 109417000000,
"grossProfit": 54770000000,
"operatingIncome": 35695000000,
"netIncome": 29789000000,
"eps": 2.04,
"epsDiluted": 2.03,
"weightedAverageShsOut": 14692515000,
"weightedAverageShsOutDil": 14750302000,
},
{
"date": "2026-03-28",
"symbol": "AAPL",
"reportedCurrency": "USD",
"cik": "0000320193",
"filingDate": "2026-05-01",
"acceptedDate": "2026-05-01 10:01:00",
"fiscalYear": "2026",
"period": "Q2",
"revenue": 111184000000,
"grossProfit": 54781000000,
"operatingIncome": 35885000000,
"netIncome": 29578000000,
"eps": 2.02,
"epsDiluted": 2.01,
"weightedAverageShsOut": 14710718000,
"weightedAverageShsOutDil": 14768115000,
},
{
"date": "2025-12-27",
"symbol": "AAPL",
"reportedCurrency": "USD",
"cik": "0000320193",
"filingDate": "2026-01-30",
"acceptedDate": "2026-01-30 06:01:32",
"fiscalYear": "2026",
"period": "Q1",
"revenue": 143756000000,
"grossProfit": 69231000000,
"operatingIncome": 48342000000,
"netIncome": 42097000000,
"eps": 2.85,
"epsDiluted": 2.84,
"weightedAverageShsOut": 14773260000,
"weightedAverageShsOutDil": 14823400000,
},
{
"date": "2025-09-27",
"symbol": "AAPL",
"reportedCurrency": "USD",
"cik": "0000320193",
"filingDate": "2025-10-31",
"acceptedDate": "2025-10-31 06:01:26",
"fiscalYear": "2025",
"period": "Q4",
"revenue": 102466000000,
"grossProfit": 47290000000,
"operatingIncome": 31860000000,
"netIncome": 27466000000,
"eps": 1.85,
"epsDiluted": 1.85,
"weightedAverageShsOut": 14840390000,
"weightedAverageShsOutDil": 14876350000,
},
]
def load_income_statement(symbol="AAPL"):
api_key = os.getenv("FMP_API_KEY")
if not api_key:
print("[提示] 未检测到环境变量 FMP_API_KEY,使用内嵌 AAPL 2025Q4~2026Q3 实盘样本演示:\n")
return SAMPLE_DATA
# 使用本站国内直连网关地址,路径与参数与 FMP 官方 /stable/ 原样一致
qs = urllib.parse.urlencode({"symbol": symbol, "period": "quarter", "limit": 4, "apikey": api_key})
url = f"https://quote-fmp.com/stable/income-statement?{qs}"
with urllib.request.urlopen(url, timeout=10) as resp:
return json.loads(resp.read().decode("utf-8"))
def dwidth(s):
"""中文在等宽终端里占 2 列,按显示宽度算长度才排得齐。"""
return sum(2 if unicodedata.east_asian_width(c) in "WF" else 1 for c in str(s))
def pad(s, width, right=False):
gap = " " * max(width - dwidth(s), 0)
return gap + str(s) if right else str(s) + gap
if __name__ == "__main__":
rows = load_income_statement("AAPL")
cols = [("财季", 9), ("报告期末(date)", 14), ("SEC接收时间(acceptedDate)", 25), ("滞后", 6), ("营收(亿美元)", 14), ("稀释EPS", 9)]
header = " | ".join(pad(name, w) for name, w in cols)
print(header)
print("-" * dwidth(header))
for r in rows:
d_end = datetime.strptime(r["date"], "%Y-%m-%d")
d_file = datetime.strptime(r["filingDate"], "%Y-%m-%d")
cells = [
f"{r.get('fiscalYear')}-{r.get('period')}",
r.get("date"),
r.get("acceptedDate"),
f"{(d_file - d_end).days}天",
f"{(r.get('revenue') or 0) / 1e8:.2f}",
f"{r.get('epsDiluted'):.2f}",
]
print(" | ".join(pad(c, w, right=(i >= 4)) for i, (c, (_, w)) in enumerate(zip(cells, cols))))
运行输出如下:
[提示] 未检测到环境变量 FMP_API_KEY,使用内嵌 AAPL 2025Q4~2026Q3 实盘样本演示:
财季 | 报告期末(date) | SEC接收时间(acceptedDate) | 滞后 | 营收(亿美元) | 稀释EPS
--------------------------------------------------------------------------------------------
2026-Q3 | 2026-06-27 | 2026-07-31 06:01:02 | 34天 | 1094.17 | 2.03
2026-Q2 | 2026-03-28 | 2026-05-01 10:01:00 | 34天 | 1111.84 | 2.01
2026-Q1 | 2025-12-27 | 2026-01-30 06:01:32 | 34天 | 1437.56 | 2.84
2025-Q4 | 2025-09-27 | 2025-10-31 06:01:26 | 34天 | 1024.66 | 1.85
你看,苹果最近四个季度的财报期末日(date)和正式向 SEC 递交 10-Q/10-K 的申报日(filingDate;acceptedDate 与它同一天,只是多了时分秒)全部相差 34 天,而且把这四期营收加起来(1094.17 + 1111.84 + 1437.56 + 1024.66 = 4668.23 亿美元),正好就是苹果截至 2026Q3 的 TTM 滚动总营收。如果在回测代码里误拿 date 对齐基本面因子,回测曲线等于在每季财报公布前整整偷跑了 34 天。
把丑话说在前面:哪些事 FMP 做不到(或者有套餐限制)?
选数据源最忌讳买完才发现缺了关键拼图。在决定把项目建在 FMP 上之前,有两条硬边界必须先看清楚:
1. 数据类型的硬边界:无逐笔成交、无盘口明细、无期权链
FMP 虽然有实时报价(Quote)、有 1 分钟到日线的股票历史行情,也提供WebSocket 实时流,但它的行情定位于“看盘展示与中低频量价回测”。在它的公开标准 API 中:
- 没有股票常规交易时段的逐笔成交查询(Trades)与成交条件码;
- 没有历史全美最优买卖报价明细(NBBO Quotes);
- 没有任何期权合约、期权链快照或 Greeks 接口;
- 日线里的
vwap字段只是基于单根日 K 价格算出的简单均值(历史已结算日线统一为四价 (O+H+L+C)/4,仅当日未定盘快照为三价 (H+L+C)/3),不是全天逐笔成交量加权出来的真 VWAP。
如果你的策略依赖盘口订单流、滑点测算、日内真 VWAP 或期权波动率曲面,FMP 无论升到哪个档位都给不了。这类需求请直接去查我方整理的 Massive(原 Polygon.io)中文文档站(massivequote.com),也可以先读本站那篇《FMP vs Massive:做美股研究,应该怎么选?》看两家实盘返回数据的逐字段对比。
2. 官方套餐的分档门槛:核心深度材料锁在顶配档
FMP 官方个人订阅按综合套餐分档,升级档位会同时解锁历史年限、市场范围和高阶接口(以下依据 2026 年 10 月核对的官方公示价,实际以官网最新展示为准):
| FMP 官方套餐 | 年付折算月价(一次付清全年) | 按月单买标价 | 调用限额与 30 天流量上限 | 关键能力边界 |
|---|---|---|---|---|
| Starter | 19 美元/月(228 美元/年) | 29 美元/月 | 300 次/分 · 20 GB | 仅限美股市场、最长 5 年历史;不含季度细分、电话会、13F 与 Bulk |
| Premium | 49 美元/月(588 美元/年) | 69 美元/月 | 750 次/分 · 50 GB | 开放 30 年历史、美/英/加市场、季度财报、盘中分钟线与 Custom DCF |
| Ultimate | 99 美元/月(1188 美元/年) | 139 美元/月 | 3000 次/分 · 150 GB | 开放全球市场、全历史、财报电话会文字稿、13F 机构持仓、ETF 持仓与 Bulk 批量接口 |
算账时留意两点:一是官网大字展示的 19 / 49 / 99 美元是按年一次性付清折算出来的月均价,如果只想按月订购,实际扣款是 29 / 69 / 139 美元/月;二是像财报电话会文字稿、13F 机构持仓、1 分钟级盘中历史和 Bulk 全市场批量接口,官方要到顶配的 Ultimate 档才解锁。
国内开发者用 FMP 最头疼的三件事,本站怎么解决?
直接去接 FMP 官方英文站,国内开发者通常会卡在三个地方:
- 英文会计科目与衍生公式难对齐:比如分不清
eps与epsDiluted的股本分母、netDebt扣没扣短期投资、或者不知道台积电(TSM)财报里reportedCurrency: "TWD"和美元股价怎么换算。本站把全部 283 个接口翻译成了自然中文,配套整理了 1,429 个字段的中文释义和 66 个核心财务公式详解,每个接口页底部都列出了完整的全量返回字段字典。 - 跨境直连抖动与超时:FMP 源站位于海外,国内机器批量拉取历史日线或几千家公司财报时,容易遇到 TLS 握手超时或断连中断。本站部署了专线加速与多级缓存网关(数据面域名
https://quote-fmp.com),国内服务器与本地终端直连稳定得多。 - 官方顶配门槛高、外币卡支付不便:很多个人研究者或小团队需要用电话会文字稿、13F 持仓和全历史财报,但一上来直接付 139 美元/月(或 1,188 美元/年)成本偏高。
通过本站 FMP数据源中文站(fmpquote.com) 接入,你不需要改任何业务代码逻辑——只要把请求域名换成 https://quote-fmp.com,带上本站下发的 API Key,所有的 /stable/* REST 接口路径、查询参数和返回的 JSON 结构与官方 Ultimate 档原样一致,同时支持微信扫码登录与人民币按月订阅(按每分钟请求数 RPM 与滚动 30 天流量划分档位,详见定价与会员说明)。
下一步:按你手头的任务挑一条路径直接跑通
不用从头把 30 个分类看一遍,按你手头最急的任务挑两三个接口试跑即可:
- 路径 A · 做个股财报与估值深挖:先调三大财务报表拿历史总量 → 再调分产品营收与分地区营收拆业务结构 → 最后调财报电话会文字稿和DCF 估值做定性与定量交叉验证。
- 路径 B · 做量化多因子与历史回测:先用股票历史行情里的分红调整价格接口或不复权价格接口拉取日线 → 结合标普 500 历史成分股与退市公司名单构建无幸存者偏差的股票池 → 用批量数据(Bulk)高效同步全市场历史财务指标。
- 路径 C · 跟踪机构与内部人动向:直接查阅机构持仓 13F 看对冲基金季度调仓 → 配合内部人交易与美国国会交易监控高管及议员的最新买卖披露。
现在就可以先检查一下你手头的脚本:拉取美股财报时有没有区分 date(报告期末)和 filingDate(SEC 申报日)?有没有检查 reportedCurrency?如果想马上在真实终端里跑通上面的代码,可以直接前往接口目录查阅文档,或先注册登录领取 1 个月试用 Key 开始实测。