FMP vs Massive(原 Polygon.io):做美股研究,应该怎么选?

找美股数据接口时,很多人会在 FMP(Financial Modeling Prep)和 Massive(原 Polygon.io)之间纠结。其实只要把你手头要写的代码摊开看,这两家的分工非常清楚:一个长于公司财报与基本面深挖,一个强在盘中逐笔行情与期权期货。

不想看长文的,可以先记住三条硬边界:

下面结合截至 2026 年 10 月以苹果(AAPL)为样本实测拉取的接口返回数据与公开定价,把这几个实际场景从代码和字段层面拆开聊聊(注:文中对比均基于两家公开标准 API 与个人套餐,价格与权益划分如有变动以官网最新公示为准)。

一张表看清:哪些数据只有其中一家有?

选型最怕代码写了一半,才发现某个核心数据在当前平台根本没有接口。先看几项直接决定去留的硬差异:

数据或能力FMPMassive(原 Polygon.io)
三大报表与财务比率有,另带增长率、TTM、原始申报(As Reported)等衍生接口有,由 Financials & Ratios 提供标准报表与比率
按产品 / 按地区营收拆解有(/stable/revenue-product-segmentation 等)无对应分部拆解接口
财报电话会文字稿有(/stable/earning-call-transcript)无对应文字稿 API
DCF 估值接口有(/stable/discounted-cash-flow 等)无对应 DCF 接口
股票逐笔成交、成交条件码无有(/v3/trades/{stockTicker})
股票历史买卖报价明细(NBBO)无有(/v3/quotes/{stockTicker})
期权合约、期权链与期货行情无有(Options / Futures 独立产品线)
历史股票日线(OHLCV)有(分轻量、完整、不复权、分红复权 4 条路径)有(/v2/aggs/ticker/.../range/1/day/...)

这几条边界在两家的文档目录里写得很明白——你可以直接对照 FMP 接口目录 与 Massive 股票接口概览、Massive 期权接口概览。

表格里的“无”是没法靠升档解决的:把 FMP 升级到最高档,也不会多出期权链;反过来,买最贵的 Massive 股票套餐,也拿不到财报电话会全文。


场景一:做公司基本面研究,FMP 的材料更顺手

假设你在研究苹果(AAPL)的业绩变化。光看利润表和现金流量表的总数,只能知道总营收涨了还是跌了;要想搞清楚“是 iPhone 卖得好还是服务业务(Services)涨得快”“大中华区有没有拖后腿”“管理层在电话会上怎么解释毛利率变化”,光有三大报表就不够了。

FMP 的优势在于把整条公司研究链路的材料都做好了现成的结构化接口,省掉了自己去扒 SEC 10-K 附注表格的功夫。

1. 实测 FMP 分产品营收与电话会文字稿返回数据

比如我们直接调用 FMP 的分产品营收接口和电话会文字稿接口拉取 AAPL 数据(代码中 quote-fmp.com 为本站国内直连网关,路径与参数同 FMP 官方 /stable/,FMP_KEY 由开通订阅后下发):

import os
import requests

API_KEY = os.environ["FMP_KEY"]  # 读取开通后下发的 API Key
BASE_URL = "https://quote-fmp.com/stable"

# 1. 拉取 AAPL 按产品线拆分的年度营收
seg_resp = requests.get(
    f"{BASE_URL}/revenue-product-segmentation",
    params={"symbol": "AAPL", "period": "annual", "apikey": API_KEY},
    timeout=10,
).json()

# 2. 拉取 AAPL 2025 财年 Q3 财报电话会文字稿
transcript_resp = requests.get(
    f"{BASE_URL}/earning-call-transcript",
    params={"symbol": "AAPL", "year": 2025, "quarter": 3, "apikey": API_KEY},
    timeout=10,
).json()

FMP 返回的 JSON 结构非常直观——分产品营收直接把 iPhone、Service、Mac、iPad 拆成 data 字典里的键值对(单位:美元),连清洗正则表达式都省了:

// GET /stable/revenue-product-segmentation?symbol=AAPL&period=annual 实测返回(节选前 2 期)
[
  {
    "symbol": "AAPL",
    "fiscalYear": 2025,
    "period": "FY",
    "reportedCurrency": "USD",
    "date": "2025-09-27",
    "data": {
      "Mac": 33708000000,
      "Service": 109158000000,
      "Wearables, Home and Accessories": 35686000000,
      "iPad": 28023000000,
      "iPhone": 209586000000
    }
  },
  {
    "symbol": "AAPL",
    "fiscalYear": 2024,
    "period": "FY",
    "reportedCurrency": "USD",
    "date": "2024-09-28",
    "data": {
      "Mac": 29984000000,
      "Service": 96169000000,
      "Wearables, Home and Accessories": 37005000000,
      "iPad": 26694000000,
      "iPhone": 201183000000
    }
  }
]

而电话会文字稿接口返回的 content 字段则是完整的发言人逐字记录,拿来做关键词检索或直接喂给本地大模型做纪要提炼都很顺手:

// GET /stable/earning-call-transcript?symbol=AAPL&year=2025&quarter=3 实测返回(节选)
[
  {
    "symbol": "AAPL",
    "period": "Q3",
    "year": 2025,
    "date": "2025-07-31",
    "content": "Suhasini Chandramouli: Good afternoon, and welcome to the Apple Q3 Fiscal Year 2025 Earnings Conference Call. My name is Suhasini Chandramouli, Director of Investor Relations. Today's call is being recorded. Speaking first today is Apple's CEO, Tim Cook, and he'll be followed by CFO, Kevan Parekh..."
  }
]

此外,如果你需要快速算个基准估值,FMP 有现成的 DCF 估值接口;想核对 SEC 财报原文不经标准化的科目,还能直接调原始申报报表(As Reported)。如果你的研究流程离不开电话会纪要、分部拆解或现成估值接口,选 FMP 省事得多。

2. FMP 财报自带「三日时间轴」,天然防回测未来函数

做基本面量化回测时,最怕踩“未来函数”的坑——比如苹果 FY2025 年报的报告期结束日(date)是 2025-09-27,但这份 10-K 真正交到 SEC 公之于众是在一个月后的 2025-10-31。如果你在回测里把年报数据对齐在 2025-09-27,就等于提前一个月“偷看”了财报。

看一眼 FMP 利润表接口(/stable/income-statement)对 AAPL 的实测返回前几行:

// GET /stable/income-statement?symbol=AAPL&limit=1 实测返回(节选头部与每股指标)
[
  {
    "date": "2025-09-27",
    "symbol": "AAPL",
    "reportedCurrency": "USD",
    "cik": "0000320193",
    "filingDate": "2025-10-31",
    "acceptedDate": "2025-10-31 06:01:26",
    "fiscalYear": "2025",
    "period": "FY",
    "revenue": 416161000000,
    "grossProfit": 195201000000,
    "operatingIncome": 133050000000,
    "netIncome": 112010000000,
    "eps": 7.49,
    "epsDiluted": 7.46,
    "weightedAverageShsOut": 14948500000,
    "weightedAverageShsOutDil": 15004697000
  }
]

FMP 在每张报表里都同时给出了 date(报告期末日)、filingDate(SEC 申报日)和精确到秒的 acceptedDate(2025-10-31 06:01:26 美东时间 SEC 系统接收时间戳)。写特征对齐代码时,直接用 acceptedDate 作生效时间截断,就能干净利落地杜绝前视偏差(Look-ahead Bias)。

不过也要给 Massive 说句公道话:它并不是“只有行情、没有基本面”。Massive 提供了标准财务报表,它的财务比率(Ratios)接口也能直接拉出 PE、PB、ROE、EV/EBITDA 等常用指标。如果你的选股器只用到标准三大报表和基础估值比率,而且本来就在用 Massive 拉行情,顺手用它的财务数据就够了,不必为了几张基础报表专门再接一套 API。


场景二:盯盘中微观行情与期权,该用 Massive

很多刚接触行情接口的朋友容易把“最新报价”“1 分钟 K 线”和“逐笔成交”混为一谈:

FMP 有实时报价接口、有盘中分钟级历史行情接口和 WebSocket 推送,但它没有公开标准的股票逐笔成交查询、历史买卖报价明细和成交条件码接口。

1. 字段级对比:FMP 的 1 分钟 K 线 vs Massive 的逐笔与 NBBO 盘口

把两边实际返回的数据放一起,一眼就能看出它们的设计重心完全不同。

FMP 的 1 分钟 K 线接口(/stable/historical-chart/1min)返回的是标准 OHLCV 结构,键名全部是易读的英文全称,适合直接塞进 Pandas 画图或算盘中均线(以下为指定 2025-10-16 历史日期的样本节选;若不传起止日期则默认返回最新交易日如 2026-10-20 15:59:00 收盘 339.55 的分钟序列):

// FMP: GET /stable/historical-chart/1min?symbol=AAPL&from=2025-10-16&to=2025-10-16(2025 年样本节选)
[
  {
    "date": "2025-10-16 15:59:00",
    "open": 247.34,
    "low": 247.22,
    "high": 247.56,
    "close": 247.45,
    "volume": 704507
  },
  {
    "date": "2025-10-16 15:58:00",
    "open": 247.27,
    "low": 247.27,
    "high": 247.38,
    "close": 247.32,
    "volume": 354396
  }
]

再看 Massive。在 Massive 这边,成交流(Trades)、报价流(Quotes)和分钟/秒级聚合流是严格拆开的:

  1. Massive 逐笔成交(GET /v3/trades/{stockTicker}):每一笔撮合都有独立的 sequence_number(序列号)、exchange(交易所代码,如 11)、tape(挂牌交易带,3 代表 Tape C 纳斯达克)、conditions(成交条件码数组,用来识别盘前盘后、零股或跨市场扫单),以及精确到纳秒(Nanosecond)的交易所撮合时间戳 participant_timestamp 与 SIP 汇总时间戳 sip_timestamp:
// Massive: GET /v3/trades/AAPL 官方文档返回结构示例
{
  "status": "OK",
  "request_id": "a47d1beb8c11b6ae897ab76cdbbf35a3",
  "next_url": "https://api.massive.com/v3/trades/AAPL?cursor=YWN0aXZlPXRydWU...",
  "results": [
    {
      "id": "1",
      "price": 171.55,
      "size": 100,
      "decimal_size": "100.0",
      "exchange": 11,
      "tape": 3,
      "conditions": [12, 41],
      "sequence_number": 1063,
      "participant_timestamp": 1517562000015577000,
      "sip_timestamp": 1517562000016036600
    }
  ]
}
  1. Massive 实时/历史 NBBO 盘口(Quotes 与 WebSocket Q. 频道):保留全美最优买卖一档报价(Top-of-Book NBBO)。在我们对 AAPL 实时 NBBO 快照(2026-10-20 19:59:44 美东盘后收盘时刻)的实测中,可以看到它明确区分了最后成交价(price: 338.0)与当时的买卖一档挂单(bid_price1: 338.0 挂 400 股 vs ask_price1: 338.18 挂 80 股);而在 WebSocket 实时流中,为了压榨高频传输延迟,字段会进一步压缩为单字母/双字母缩写(ev: "Q", bp/bs 代表买一价/量,ap/as 代表卖一价/量,t 为毫秒时间戳)。

所以结论很干脆:如果你只是做个看盘面板、画 K 线图,FMP 完全够用;但如果你想算买卖价差(Bid-Ask Spread)、做订单流分析、盘口回放、滑点测算,或者策略里用到了期权链,就必须选 Massive。

2. 新手常踩的坑:「1 分钟 K 线」不等于「实时数据」

1 分钟指的是 K 线的聚合粒度,而实时(Real-time)还是延迟 15 分钟(Delayed)指的是交付时效。比如 Massive 的自定义 K 线接口(Custom Bars)在 Starter($29/月)和 Developer($79/月)两档个人套餐里照样能拉 1 分钟 K 线,但数据是 15 分钟延迟的;只有升到 Advanced($199/月)档,拿到的才是实时流。跑盘中策略前,看接口文档的同时一定要核对套餐的时效表。


场景三:拉历史日线建本地库,实测复权、成交量与 VWAP 的底层差异

股票历史日线是两家的重合区。两边都能拉 OHLCV,但当我们用代码同时拉取 AAPL 在 2026 年 10 月 16 日、10 月 19 日、10 月 20 日 连续三个交易日的日线数据做逐字段对拍时,几个只看宣传页绝对发现不了的工程细节立刻浮出水面。

1. 同标的、同交易日实盘数据对拍(AAPL,2026-10-16 ~ 2026-10-20)

先看两边实际返回的原始数据对比(以 2026-10-19 与 2026-10-20 为例):

// 【FMP 完整日线】GET /stable/historical-price-eod/full?symbol=AAPL&from=2026-10-16&to=2026-10-20
[
  {
    "symbol": "AAPL",
    "date": "2026-10-20",
    "open": 339.608,
    "high": 343.06,
    "low": 338.7,
    "close": 339.5,
    "volume": 35678066,
    "change": -0.108,
    "changePercent": -0.03180137,
    "vwap": 340.42
  },
  {
    "symbol": "AAPL",
    "date": "2026-10-19",
    "open": 340.78,
    "high": 346,
    "low": 340.12,
    "close": 342.94,
    "volume": 34573200,
    "change": 2.17,
    "changePercent": 0.63384,
    "vwap": 342.46
  }
]
// 【Massive 日线聚合口径】GET /v2/aggs/ticker/AAPL/range/1/day/2026-10-16/2026-10-20
// (注:Massive 原生 aggs 用单字母键 o/h/l/c/v/vw/n,下为同日实测值)
{
  "ticker": "AAPL",
  "adjusted": true,
  "results": [
    {
      "t": 1792468800000,       // 对应交易日 2026-10-20
      "o": 339.86,              // open
      "h": 343.06,              // high
      "l": 338.7,               // low
      "c": 339.5,               // close
      "v": 35851382.759126,     // volume(含碎股成交的长尾浮点数)
      "vw": 340.1415,           // 真实逐笔成交额加权均价 (VWAP)
      "n": 613407               // 当日汇总成交笔数 (transactions)
    },
    {
      "t": 1792382400000,       // 对应交易日 2026-10-19
      "o": 340.775,
      "h": 346.0,
      "l": 340.115,
      "c": 342.94,
      "v": 34573181.500186,
      "vw": 343.0361,
      "n": 670892
    }
  ]
}

把 2026-10-16、2026-10-19、2026-10-20 连续三个交易日的实测数字列成一张对账表,差异一目了然:

交易日(AAPL)指标FMP(/stable/historical-price-eod/full)Massive(massive_rest 日线聚合)为什么会不一样?(工程内幕)
2026-10-16四价(O/H/L/C)346.09 / 347.82 / 340.46 / 343.46346.085 / 347.82 / 340.46 / 343.46最高、最低、收盘完全一致;open 仅差 0.005 美元
2026-10-16volume / vwap59,946,400 / 344.457559,946,368.51(914,809 笔)/ 344.1277FMP 的 vwap = (346.09+347.82+340.46+343.46)/4 = 344.4575;Massive 为总成交额 $206.29 亿 ÷ 总股数
2026-10-19四价(O/H/L/C)340.78 / 346.0 / 340.12 / 342.94340.775 / 346.0 / 340.115 / 342.94最高、收盘完全一致;open/low 仅半美分精度差
2026-10-19volume / vwap34,573,200 / 342.4634,573,181.50(670,892 笔)/ 343.0361FMP 的 vwap = (340.78+346.0+340.12+342.94)/4 = 342.46;Massive 为总成交额 $118.60 亿 ÷ 总股数
2026-10-20四价(O/H/L/C)339.608 / 343.06 / 338.7 / 339.5339.86 / 343.06 / 338.7 / 339.5最高、最低、收盘完全一致;当日 FMP open 偏离略大
2026-10-20volume / vwap35,678,066 / 340.4235,851,382.76(613,407 笔)/ 340.1415当日 FMP 比 Massive 少 17.33 万股(-0.48%),且该日 FMP vwap 退化为三价均值 (H+L+C)/3 = 340.42

为了排除偶然性,我们进一步拉取了 AAPL 从 2026-07-01 至 2026-10-20 共 78 个交易日的 FMP 日线做全量回验,可以得出两条非常硬的工程结论:

  1. 两家日线的 vwap 字段根本不是同一个算法:
  1. 两家的成交量(volume)统计口径不同,切忌混表存储:

2. 复权口径怎么给:拆股复权 vs 现金分红复权

再看长期回测最关心的复权问题。在 Massive 的自定义 K 线接口官方文档中,对 adjusted 参数的原始定义写得很明确:“Whether or not the results are adjusted for splits. By default, results are adjusted.”——也就是说,Massive 的 adjusted=true 只做拆合股调整(Split-adjusted),不包含现金分红复权。如果你拿这套日线去算跨年度持有总收益率,需要自己另外拉分红数据做复权处理。

而在 FMP 这边,除了常规日线外,直接提供了一条独立的分红调整价格接口(/stable/historical-price-eod/dividend-adjusted)。我们实测对比 AAPL 在 2025 年 2 月 12 日(经历后续多次季度现金派息前)的两条 FMP 序列:

# 对比 AAPL 在 2025-02-12 的「常规日线」与「分红复权日线」
# 1. FMP 常规日线 (/stable/historical-price-eod/full)
#    -> {"date": "2025-02-12", "open": 231.20, "high": 236.96, "low": 230.68, "close": 236.87}
#
# 2. FMP 分红复权日线 (/stable/historical-price-eod/dividend-adjusted)
#    -> {"date": "2025-02-12", "adjOpen": 229.78, "adjHigh": 235.51, "adjLow": 229.27, "adjClose": 235.42}

可以看到,经过后续累计现金分红的前复权折算后,2025-02-12 的 adjClose(235.42)比未做分红复权的 close(236.87)低了 1.45 美元。不想自己写分红再投资复权因子的话,直接调 FMP 的 dividend-adjusted 序列会省心很多。

3. 全市场批量建库:按日 Bulk 接口 vs S3 Flat Files

建全市场日线库时,按股票代码一个个循环请求是很慢的:

另外,查历史数据别光看平台宣传的“最早可追溯年份”。比如 Massive 的自定义 K 线文档写明底层记录从 2003 年 9 月 10 日开始,但 Basic、Starter、Developer、Advanced 四档个人套餐实际开放的历史窗口分别是 2 年、5 年、10 年和全部历史。


就算两边都有同名指标,算法和 API 风格也大不相同

1. 同名指标的算法差异:以 EPS 和 PE 为例

哪怕两个平台都给某个指标,直接混用之前也得先翻翻公式定义。最典型的例子就是 EPS(每股收益)和 PE(市盈率):

对比维度FMP(利润表 / TTM 财务比率)Massive(财务比率 /stocks/financials/v1/ratios)
核心字段名eps、epsDiluted、priceToEarningsRatioTTM、priceToEarningsDilutedRatioTTMearnings_per_share、price_to_earnings
股本分母口径财报期内加权平均基本/稀释股本(weightedAverageShsOut / weightedAverageShsOutDil)价格日期当天的时点流通股数(Point-in-time shares outstanding,并假设其他类别股份全部转换)
与官方 10-K 报表是否一致与利润表披露的 GAAP 基本/稀释 EPS 完全一致(如 AAPL FY25 eps: 7.49 / epsDiluted: 7.46)官方文档明确提示:与利润表上的基本/稀释 EPS 不一致

对于像苹果(AAPL)这样常年大额回购注销股票的公司,“过去四个季度的加权平均股本”总是大于“期末最新时点的流通股本”。因此同一天去查,两边算出来的 EPS 和 PE 必然存在系统性微小偏差。中途切换数据源时,千万别只改字段名而不核对分母口径。

2. 动手写代码前的体验差异:扁平 REST vs 类 SQL 过滤 DSL

虽然这不影响“能不能拿到数据”,但直接决定你写客户端封装(Wrapper)的顺手程度:


算笔实在账:综合打包 vs 按资产线拆开买

技术上清楚该用谁之后,最后往往卡在预算和订阅规则上。这两家的收费逻辑完全不是一个路数。

1. FMP:综合套餐,按档位解锁深度与额度

FMP 的个人订阅走的是“全家桶分档”路线,升级套餐会同时放开数据类型、历史年限、市场范围和每分钟调用频次。官网日常主推的是年付折算月价:

FMP 个人套餐年付折算月价(按年付清)按月单买标价官网公示调用频次与核心解锁权益
Starter19 美元/月(年付 228 美元)29 美元/月300 次/分钟,美股市场、年度基本面与比率、5 年历史(另有服务条款级 30 天 20GB 带宽软上限)
Premium49 美元/月(年付 588 美元)69 美元/月750 次/分钟,美/英/加市场、完整季度财报与比率、盘中分钟图、Custom DCF、30 年历史(软上限 50GB/30 天)
Ultimate99 美元/月(年付 1188 美元)139 美元/月3,000 次/分钟,全球市场、全历史、电话会文字稿、13F 机构持仓、1 分钟盘中、Bulk 批量接口(软上限 150GB/30 天)

看表时注意两点:一是官网大字标的 19/49/99 美元是按年一次性付款折算出来的月均价,如果只想先付一个月试试水,实际刷卡金额是 29/69/139 美元;二是像电话会文字稿、13F 持仓和 Bulk 批量接口,要到 Ultimate 档才开放。

2. Massive:按资产线独立售卖,且严查“非专业用户”身份

Massive 把平台拆成了股票(Stocks)、期权(Options)、指数(Indices)、外汇与加密(Currencies)、期货(Futures)五条独立的产品线,各自单独订阅。买一份股票套餐,并不包含期权或期货权限。

以最常用的个人股票套餐(月付口径)为例:

Massive 股票套餐月付价格时效、历史窗口与核心权限(含 Flat Files 细分边界)
Stocks Starter29 美元/月15 分钟延迟,5 年历史;含日线/分钟线聚合及对应聚合类 Flat Files,不含逐笔成交(Trades)与报价明细(Quotes)
Stocks Developer79 美元/月15 分钟延迟,10 年历史;解锁逐笔成交(Trades API 及 Trades Flat Files),不含报价明细(Quotes)
Stocks Advanced199 美元/月实时数据,20 年以上全历史;解锁全部逐笔成交、NBBO 报价明细(Quotes API 及 Flat Files)与 Financials & Ratios

如果你只需要给现有的行情脚本补一份基础财务报表和比率,可以单独加订 29 美元/月的 Financials & Ratios 扩展包(若已买 Stocks Advanced 则直接包含在内)。但如果你要同时跑股票、期权、期货三条线的实时策略,由于 Options Advanced 和 Futures Advanced 的公开月付价也各是 199 美元,三份 Advanced 叠在一起就是 597 美元/月——当然,哪条线不需要实时和全历史,可以单独降回 Starter 或 Developer 来省钱。

更关键的一条规则是 Non-Professional(非专业个人)资格限制。Massive 的五条资产线共用一套 11 道题的合规问卷来认定身份:个人套餐只允许你本人做非商业研究使用;只要数据展示在别人能看到的屏幕上——哪怕是公司内部同事、测试人员或者内部预览环境——按合规要求都必须购买 Business 商业套餐,而商业档的价格完全是另一个量级(比如期货 Business 按交易所分开计费,公开标价是每个交易所 999 美元/月)。因此如果是团队或商业项目选型,不能直接拿个人档的 199 美元去算总账。


总结:按你手头的任务对号入座

把实测数据表现和计费规则放一起,怎么选就很清晰了:

如果你目前主要从公司财报和日常行情入手,不妨先去翻翻本站整理的三大财务报表、电话会文字稿、DCF 估值和历史行情接口中文文档,挑一只熟悉的股票把整个数据链路跑通,再决定后续要不要补入第二个数据源。

登录后可领取FMP Ultimate档1个月试用 Key,覆盖全量接口。免费试用 1 个月 →