美股财报超预期(Earnings Surprise)怎么量化?用 FMP Analyst Estimates 接口构建 SUE 指标
2026 年 10 月 21 日盘后,Meta Platforms(META)交出 FY26 Q3 财报:在 FMP 财报接口记录的分析师可比口径下,实际每股收益(epsActual)录得 7.40 美元,较 25 位卖方分析师的一致预期均值 6.54 美元(epsAvg = 6.53861)高出 +0.86 美元,表面超预期幅度达 +13.15%;单季营收录得 646.01 亿美元,同样高出一致预期 633.43 亿美元(+1.99%)。然而次一交易日(10 月 22 日),META 复权开盘价报 676.35 美元(较前收盘 697.52 美元跳空低开 -3.04%),全天复权收盘价跌至 648.85 美元,单日收盘跌幅达 -6.98%。反观英伟达(NVDA)在 2026 年 8 月 26 日发布的 FY27 Q2 财报,其 epsActual(2.22 美元)较一致预期(2.09 美元)仅高出 +0.13 美元(表面超预期幅度 +6.22%,尚不及 META 的一半),次日复权开盘价却报 222.62 美元(较前收盘 209.43 美元跳空高开 +6.30%),全天复权收盘拉升至 227.73 美元,单日收盘大涨 +8.74%。
为什么表面超预期 +13.15% 的股票次日大跌近 7%,而表面超预期 +6.22% 的股票却大幅走高?
在量化事件驱动与盈余公告后漂移(PEAD,Post-Earnings Announcement Drift)研究中,直接用百分比超预期 (epsActual - epsEstimated) / abs(epsEstimated) 解释或筛选标的,往往会忽略三个关键的定量观察维度:第一,公司历史盈余惊喜的波动率基数(即标准化意外盈余 SUE 的分母 sigma_eps)与历史均值偏差;第二,单季实际 EPS 是否突破了卖方分析师预测区间的上限(epsHigh);第三,财报接口中的标准化可比 EPS(epsActual)与利润表法定 GAAP 稀释每股收益(epsDiluted)之间的口径差额。
本文将基于 FMP(Financial Modeling Prep)旗下的 Analyst(分析师数据接口)、Calendar(市场日历接口)与 Bulk(批量数据接口)三大模块,调取 2026 年 11 月 7 日实盘网关快照,对 6 家美股科技龙头的最新季报与 2024—2026 三年全市场 196,381 条财报超预期记录做逐字段对账,手把手拆解双维 SUE(Standardized Unexpected Earnings)因子的工程化构建流程与实盘排雷要点。
一、 为什么百分比超预期会失真?6 家美股科技巨头 SUE 与次日收益实盘对账
在机构多因子体系中,衡量财报超预期通常不只看百分比偏离,而是将单季盈余惊喜按过去 K 个季度(常取 K=8,即滚动两年)的惊喜标准差做归一化,构建分析师预期型 SUE(标准化意外盈余):
- 单季盈余惊喜:
e_eps = epsActual - epsEstimated - 含当季 8 季标准差 SUE(本文主口径):
SUE_eps = e_eps / stdev(e_eps_0..7) - 事前 7 季标准差 SUE(不含当季):
SUE_eps_ex0 = e_eps / stdev(e_eps_1..7) - 去均值 SUE(扣除 8 季平均惊喜偏差):
SUE_eps_demeaned = (e_eps - mean(e_eps_0..7)) / stdev(e_eps_0..7)
其中 stdev 采用样本标准差(ddof=1)。分母 sigma_eps 度量了卖方分析师对该公司盈利预测的历史误差离散度:若一家公司过去 8 季的预测误差常年在 ±2.50 美元之间剧烈摆动,当季 +0.86 美元的超预期仅处于历史常规波动带内;反之,若另一家公司过去 8 季的预测误差高度收敛在 +0.04~+0.13 美元之间,当季 +0.13 美元的惊喜就代表显著偏离基准。
关于 SUE 分子与分母的三种常见口径说明:
1. 是否减历史均值(信号符号翻转现象):未去均值的分析师预期型 SUE 以一致预期本身为基准(e_eps / sigma_eps);而去均值口径SUE_eps_demeaned(采用同一 8 季窗口mean(e_eps_0..7))衡量当季惊喜相对过去八季平均水平的偏离。需要特别注意:当样本期内存在正向平均差额时,去均值可能直接改变信号符号——在表 1 的 6 家巨头中,NVDA(8 季惊喜均值 +0.0719 美元,当季 +0.13 美元)、AMD(均值 +0.0659 美元,当季 +0.14 美元)与 META(均值 +0.2925 美元,当季 +0.86 美元)在扣除均值后SUE_eps_demeaned仍保持正值(分别为 +1.72、+1.00、+0.21);但 MSFT(8 季惊喜均值 +0.2725 美元,高于当季 +0.17 美元)与 AAPL(8 季均值 +0.0925 美元,高于当季 +0.06 美元)当季虽高于一致预期,却低于各自八季平均惊喜,因此符号转负,分别由主口径的 +1.20、+1.09 翻转为 -0.72 与 -0.59(AMZN 则因 8 季均值 +0.7913 美元 叠加当季 -0.08 美元,由 -0.06 变为 -0.66)。回测与实盘可根据研究目标(衡量“相对一致预期的超预期幅度”还是“相对自身近期平均惊喜的边际偏离”)明确锁定分子定义。
2. 分母是否包含当季自身:包含当季(e_eps_0..7)会使当季异常值同时影响分子和分母,可能压低极端惊喜的标准化比值。例如 NVDA 当季 +0.13 美元为 8 季最高值,含当季 8 季样本标准差为 0.0337 美元(SUE_eps = +3.85),而改用事前 7 季(不含当季,e_eps_1..7)样本标准差 0.0262 美元时,SUE_eps_ex0升至 +4.97(高出 29%)。因此表 1 同时列出含当季(ddof=1与ddof=0)、不含当季(ex0)以及去均值(demeaned)四组数值供完整对照。
我们通过 FMP 的 Earnings Report(公司财报数据接口,/stable/earnings)、Financial Estimates(分析师预期查询接口,/stable/analyst-estimates)、Income Statement(利润表接口,/stable/income-statement)以及 Dividend Adjusted Price Chart(分红复权日K线接口,/stable/historical-price-eod/dividend-adjusted),提取 NVDA、MSFT、AMD、AAPL、META、AMZN 截至 2026 年 11 月 7 日查询快照下的最新已披露财季与过去 8 季滚动数据。表中依次列出财报公告日(earnings.date)与对应财季截止日(estimates.date)、快照实际与预期 EPS(epsActual / epsEstimated)、表面 EPS 超预期(e_eps)与利润表法定 GAAP 稀释 EPS(epsDiluted)、8 季惊喜标准差 sigma_eps(ddof=1 含当季 / 不含当季 ex0)、四口径 SUE_eps(ddof=1 / ddof=0 / ex0 / demeaned)、双口径 SUE_rev(ddof=1 / ex0)、分析师 EPS 预测区间 [epsLow, epsHigh](含预测人数 numAnalystsEps)与是否高于区间上限(beat_high),以及公告次日 T+1 价格反应对照如下:
表 1:基于 FMP 当前快照(2026-11-07)的 6 家美股科技龙头标准化 EPS 差额、双维 SUE 与 T+1 价格反应对照
| 股票代码 | 财报公告日 / 对应财季截止日 | 实际 vs 预期 EPS · 差额 (e_eps) · 法定 GAAP | 8 季标准差 sigma_eps (含当季 / ex0) | SUE_eps (ddof=1 / ddof=0 / ex0 / 去均值) | SUE_rev (含当季 / ex0) | 分析师预测区间 [Low, High] (人数) · 破上限 | 公告次日 T+1 收盘涨跌 (开盘跳空) |
|---|---|---|---|---|---|---|---|
| NVDA | 2026-08-26 / 2026-07-26 (FY27 Q2) | 2.22 / 2.09 (+0.13, +6.22%) · GAAP 2.46 | 0.0337 / 0.0262 | +3.85 (+4.12 / +4.97 / +1.72) | +3.46 (+4.48) | [2.05357, 2.13371] (26人) · 是 (2.22>2.13) | +8.74% (209.43 → 227.73;开盘 +6.30%) |
| MSFT | 2026-10-28 / 2026-09-30 (FY27 Q1) | 4.89 / 4.72 (+0.17, +3.60%) · GAAP 4.92 | 0.1417 / 0.1464 | +1.20 (+1.28 / +1.16 / -0.72) | +2.60 (+2.41) | [4.62955, 4.85001] (19人) · 是 (4.89>4.85) | -0.16% (531.01 → 530.14;开盘 +1.73%) |
| AMD | 2026-11-03 / 2026-09-26 (FY26 Q3) | 2.09 / 1.95 (+0.14, +7.18%) · GAAP 1.46 | 0.0739 / 0.0729 | +1.90 (+2.03 / +1.92 / +1.00) | +1.86 (+1.74) | [1.7277, 2.1094] (26人) · 否 (2.09<2.11) | +1.01% (483.90 → 488.78;开盘 +0.28%) |
| AAPL | 2026-11-02 / 2026-09-26 (FY26 Q4) | 2.05 / 1.99 (+0.06, +3.02%) · GAAP 2.10 | 0.0552 / 0.0579 | +1.09 (+1.16 / +1.04 / -0.59) | +0.53 (+0.49) | [1.96927, 2.00945] (16人) · 是 (2.05>2.01) | -1.90% (338.32 → 331.90;开盘 -3.77%) |
| META | 2026-10-21 / 2026-09-30 (FY26 Q3) | 7.40 / 6.54 (+0.86, +13.15%) · GAAP 3.83 | 2.7341 / 2.9428 | +0.31 (+0.34 / +0.29 / +0.21) | +1.89 (+1.75) | [4.9466, 8.39595] (25人) · 否 (7.40<8.40) | -6.98% (697.52 → 648.85;开盘 -3.04%) |
| AMZN | 2026-10-29 / 2026-09-30 (FY26 Q3) | 1.89 / 1.97 (-0.08, -4.06%) · GAAP 1.89 | 1.3223 / 1.3767 | -0.06 (-0.06 / -0.06 / -0.66) | -0.13 (-0.14) | [1.83278, 2.18561] (30人) · 否 (1.89<2.19) | -1.41% (243.79 → 240.35;开盘 -4.61%) |
实测口径与快照时间边界说明:表 1 所有数据均取自 2026-11-07 的 FMP 接口查询快照(历史回测时需注意:
/stable/analyst-estimates返回的epsAvg、epsHigh、numAnalystsEps以及/stable/earnings的lastUpdated反映当前快照状态,不能直接替代财报发布前最后一刻的 Point-in-Time 预期快照;构建无前视偏差的回测库需在每季公告前定时归档预期快照)。表 1 最后一列主数字为公告当日(T0)至次一交易日(T+1)的分红复权收盘价adjClose收益率,括号内为 T+1 复权开盘价adjOpen相对 T0 复权收盘价的隔夜开盘跳空幅度。
对比表 1 的 6 个样本案例,我们可以观察到相近或悬殊的百分比超预期背后截然不同的多维指标形态:
- META 表面超预期 +13.15% 与次日下跌 -6.98% 的多维拆解:
查看 META 过去 8 个已披露财季(2025-01-29 至 2026-10-21)的盈余惊喜序列 e_eps:[+0.86, -1.01, +3.74, +0.69, -5.67, +1.26, +1.20, +1.27](单位:美元)。由于历史单季误差曾出现 -5.67 美元与 +3.74 美元的大幅波动,其 8 季滚动样本标准差 sigma_eps 高达 2.7341 美元(不含当季的 7 季标准差更高达 2.9428 美元)。将当季 +0.86 美元除以 2.7341 美元后,其 SUE_eps 仅为 +0.31(不含当季 ex0 为 +0.29,去均值口径为 +0.21),远低于量化研究中常设的待检验筛选阈值(如 SUE_eps >= 1.5 或 SUE_eps >= 2.0)。同时,在当前快照记录的 25 位分析师预测区间 [4.9466, 8.39595] 中,实际值 7.40 美元未达到预测上限 epsHigh(beat_high = False),且当季利润表法定 GAAP epsDiluted(3.83 美元)较 epsActual(7.40 美元)低了 -3.57 美元(对实际值差额 -48.24%)。
- NVDA 表面超预期 +6.22% 与次日上涨 +8.74% 的指标特征:
NVDA 过去 8 个已披露财季(2024-11-20 至 2026-08-26,均已按 10 拆 1 拆股复权对齐)的盈余惊喜序列为 [+0.13, +0.11, +0.08, +0.04, +0.04, +0.073, +0.042, +0.06]。由于历史惊喜波动极小,含当季 8 季标准差 sigma_eps 仅为 0.0337 美元(不含当季 7 季标准差仅 0.0262 美元)。当季 +0.13 美元的惊喜折算为 SUE_eps 达 +3.85(ddof=0 下为 +4.12,不含当季 ex0 下达 +4.97,去均值口径下仍达 +1.72);同时单季营收超预期 +39.50 亿美元(962.21 亿 vs 922.71 亿美元,8 季营收惊喜标准差 11.43 亿美元),对应营收端 SUE_rev 达 +3.46(不含当季 ex0 为 +4.48),且快照中实际 EPS 2.22 美元高于 26 位分析师的预测上限 2.13371 美元(beat_high = True)。
- 单腿超预期(AAPL)与公告后漂移窗口(MSFT)的案例观察:
再看苹果(AAPL,2026-11-02 披露 FY26 Q4),其主口径 SUE_eps 虽为 +1.09 且高于 16 位分析师的预测上限 2.00945 美元,但当季 +0.06 美元低于其过去 8 季平均惊喜(+0.0925 美元,致去均值 SUE_eps_demeaned 为 -0.59),且营收仅超预期 +10.73 亿美元(1,144.77 亿 vs 1,134.04 亿美元),相对于过去 8 季 20.32 亿美元 的营收惊喜标准差,SUE_rev 仅为 +0.53(不含当季 ex0 仅 +0.49),次日开盘跳空 -3.77%、收盘回调 -1.90%。而微软(MSFT,2026-10-28 披露 FY27 Q1,主口径 SUE_eps = +1.20、SUE_rev = +2.60,去均值 SUE_eps_demeaned = -0.72)在 T+1 当日(2026-10-29)开盘跳空高开 +1.73%(adjOpen = 540.22 美元)后日内回落收于 530.14 美元(较 T0 收盘 531.01 美元微跌 -0.16%),但从 T+1 收盘(2026-10-29,530.14 美元)至 T+5 收盘(2026-11-04,555.80 美元)的四个交易日内走出了 +4.84% 的向上漂移(而在上一财季 2026-07-29 披露 FY26 Q4 4.74 vs 4.24 美元时,T0 收盘 389.81 美元 → T+1 2026-07-30 收盘 450.25 美元单日大涨 +15.50%,随后至 T+20 2026-08-26 收盘 496.37 美元继续漂移 +10.24%;两段完整日线序列已收录于配套证据 JSON 的 msft_pead_drift_windows 节点)。
二、 FMP 财报预期与实绩接口的数值对应关系与三大工程陷阱
在动手编写 Python 代码拼装 SUE 因子之前,量化开发者需要先理清 FMP 三个核心接口之间的字段映射关系与口径边界。
1. /stable/earnings 与 /stable/analyst-estimates 的快照数值核验
我们先对比英伟达(NVDA)在 FY27 Q2 财季(财季截止日 2026-07-26,财报公告日 2026-08-26)来自三个接口的 JSON 报文(完整未裁剪报文已存盘于配套证据文件 raw_earnings_unfiltered_nvda_top5 及 six_stocks_sue_audit.NVDA):
// 接口 1:GET https://quote-fmp.com/stable/earnings?symbol=NVDA&limit=5
// 节选:仅展示返回数组的前 2 条记录(全部 6 个原始字段完整保留);下标 [0] 为未披露预约行,下标 [1] 为最新已披露季
[
{
"symbol": "NVDA",
"date": "2026-11-17",
"epsActual": null,
"epsEstimated": 2.47,
"revenueActual": null,
"revenueEstimated": 108801500000,
"lastUpdated": "2026-11-07"
},
{
"symbol": "NVDA",
"date": "2026-08-26",
"epsActual": 2.22,
"epsEstimated": 2.09,
"revenueActual": 96221000000,
"revenueEstimated": 92270940000,
"lastUpdated": "2026-11-07"
}
]
再看同一财季 Financial Estimates(分析师预期查询接口,/stable/analyst-estimates?symbol=NVDA&period=quarter)与 Income Statement(利润表接口,/stable/income-statement?symbol=NVDA&period=quarter)返回的对应节点:
// 接口 2:GET https://quote-fmp.com/stable/analyst-estimates?symbol=NVDA&period=quarter&limit=5
// 节选:仅展示 2026-07-26 财季单条记录中本文用到的 13 个核心字段(原始返回共 22 个字段)
{
"symbol": "NVDA",
"date": "2026-07-26",
"revenueLow": 90713833126,
"revenueHigh": 93496527674,
"revenueAvg": 92270936574,
"ebitdaAvg": 56894883102,
"ebitAvg": 55767883102,
"netIncomeAvg": 50844047402,
"epsAvg": 2.09364,
"epsHigh": 2.13371,
"epsLow": 2.05357,
"numAnalystsRevenue": 27,
"numAnalystsEps": 26
}
// 接口 3:GET https://quote-fmp.com/stable/income-statement?symbol=NVDA&period=quarter&limit=5
// 节选:仅展示 2026-07-26 财季单条记录中本文用到的 10 个核心字段(原始返回共 39 个字段)
{
"date": "2026-07-26",
"symbol": "NVDA",
"filingDate": "2026-08-26",
"acceptedDate": "2026-08-26 16:36:00",
"fiscalYear": "2027",
"period": "Q2",
"revenue": 96221000000,
"netIncome": 59688000000,
"eps": 2.47,
"epsDiluted": 2.46
}
通过对表 1 中全部 6 家公司最新已披露财季的逐一核验,在本次抽样的全部 6 家样本上,earnings.epsEstimated == round(analyst_estimates.epsAvg, 2) 无一例外成立:
- NVDA(2026-07-26 季):
epsAvg = 2.09364四舍五入至两位小数等于epsEstimated = 2.09;revenueAvg = 92,270,936,574按万位(10,000 美元)四舍五入后等于revenueEstimated = 92,270,940,000; - MSFT(2026-09-30 季):
epsAvg = 4.71974四舍五入后等于epsEstimated = 4.72; - AMD(2026-09-26 季):
epsAvg = 1.94868四舍五入后等于epsEstimated = 1.95; - AAPL(2026-09-26 季):
epsAvg = 1.98936四舍五入后等于epsEstimated = 1.99; - META(2026-09-30 季):
epsAvg = 6.53861四舍五入后等于epsEstimated = 6.54; - AMZN(2026-09-30 季):
epsAvg = 1.96999四舍五入后等于epsEstimated = 1.97。
这表明:在当前快照中,/stable/earnings 提供了已汇总的预期均值 epsEstimated 与实际值 epsActual,而 /stable/analyst-estimates 则补充了预测最高值 epsHigh、预测最低值 epsLow 以及参与预测的分析师人数 numAnalystsEps。
2. 实盘拼接必须绕开的三大工程陷阱
在将上述三个接口接入量化管线时,必须妥善处理以下三个底层机制问题:
陷阱一:/stable/earnings 首行(甚至前数行)是 epsActual: null 的未披露预约行
如上方 NVDA 报文所示,/stable/earnings 按日期倒序排列时,下标 [0] 是将于 2026-11-17 披露的 FY27 Q3 预约记录,其 epsEstimated = 2.47,但 epsActual 与 revenueActual 均为 null(部分小盘股还会出现有 EPS 但 revenueActual: null 的情形)。如果代码不做全字段非空校验就直接切片,不仅会把未发布财季混入窗口,还会触发 Python TypeError。正确做法:计算双维 SUE 前,必须同时过滤 epsActual、epsEstimated、revenueActual、revenueEstimated 四个字段均不为 None(且 date <= SNAP_DATE)的记录,并校验过滤后有效季度数 len(earn) >= 8。
陷阱二:date 字段在两个接口中代表完全不同的时间坐标系
- 在 Earnings Report(公司财报数据接口,
/stable/earnings)与 Earnings Calendar(财报日历接口,/stable/earnings-calendar)中,date是财报公开发布日(Announcement Date),例如 NVDA 的 2026-08-26、AAPL 的 2026-11-02。它是行情对齐(查找 T0 与 T+1 K 线)的时间锚点。 - 在 Financial Estimates(分析师预期查询接口,
/stable/analyst-estimates)与 Income Statement(利润表接口,/stable/income-statement)中,date是会计财季截止日(Fiscal Period End Date),例如 NVDA 的 2026-07-26、AAPL 的 2026-09-26(关于跨公司错位财年与自然日历的对齐方法,可参阅《美股财报错位财年对齐与 TTM 市盈率计算实战》)。 - 跨表关联准则:绝不能用
earnings.date == analyst_estimates.date相等关联,也不能让预期表与利润表各自独立取max(date <= ann_date)(否则当某张表缺失最新季记录时,会静默匹配到上一财季造成错位)!常规情况下美股季报(10-Q)与年报(10-K)多在财季截止日后 15~75 天内披露,跨表匹配时应同时限定0 < (ann_date - fpe_date).days <= 75,并强制要求选中的分析师预期财季截止日与利润表财季截止日严格相等(est_q0["date"] == inc_q0["date"]);若候选窗口内缺失记录或截止日不一致,则立即跳过并告警。
陷阱三:切勿将利润表的法定 GAAP epsDiluted 与分析师 epsEstimated 直接跨表相减
华尔街卖方分析师提交一致预期(epsAvg / epsEstimated)时,通常采用调整后口径(Normalized / Non-GAAP EPS,常剔除股权激励费用、并购无形资产摊销、非经常性重组或投资损益等项目),而 /stable/income-statement 中的 epsDiluted 则是严格遵循美国通用会计准则(US GAAP)的法定报表值。同时需注意,第三方数据商在归集历史 epsActual 时,个别标的或历史季度可能存在 GAAP 与 Non-GAAP 口径混用的情况(实盘高精度归因建议结合公司 8-K 业绩新闻稿中的 GAAP-to-Non-GAAP 调节表逐季复核)。
在本次 6 家科技巨头的最新季报快照中,若不区分接口口径、直接用 income_statement.epsDiluted - analyst_estimates.epsAvg 跨表相减,会产生如下显著偏差:
- META(FY26 Q3):
/stable/earnings口径下为 7.40 vs 6.54 美元(差额 +0.86 美元 / +13.15%);而利润表法定 GAAPepsDiluted为 3.83 美元(对epsActual差额为 -3.57 美元)。若直接拿 GAAPepsDiluted(3.83 美元)减去epsEstimated(6.54 美元),会得出 -2.71 美元(-41.44%) 的负向差额,符号与/stable/earnings完全相反! - AMD(FY26 Q3):
/stable/earnings口径下为 2.09 vs 1.95 美元(差额 +0.14 美元 / +7.18%);而利润表 GAAPepsDiluted为 1.46 美元(对epsActual差额为 -0.63 美元)。若误用 GAAP 减去预期 1.95 美元,会得出 -0.49 美元(-25.13%)。 - NVDA(FY27 Q2,反向差额案例):与 META、AMD 方向相反,NVDA 的利润表法定 GAAP
epsDiluted(2.46 美元)反而高于/stable/earnings的epsActual(2.22 美元,差额 +0.24 美元)。若直接拿 GAAP 2.46 美元减去预期 2.09 美元,表面超预期会被算成 +0.37 美元(+17.70%),接近/stable/earnings口径(+0.13 美元)的 2.85 倍。
因此,计算标准化 EPS 差额 e_eps 与营收差额 e_rev 时,应保持在 /stable/earnings(或批量接口 /stable/earnings-surprises-bulk)内部相减;利润表 /stable/income-statement 的 epsDiluted 则可作为监测“GAAP 与可比口径差额(epsDiluted - epsActual)”的辅助基本面体检维度(更多财务报表健康度检验方法可参考 Piotroski F-Score 9 分选股法实战)。
三、 全市场横截面扫描:/stable/earnings-surprises-bulk 三年 19.6 万条数据清洗实战
如果我们需要在盘前对全市场数千只标的做横截面 SUE_eps 初筛,逐只股票循环调用 /stable/earnings?symbol=... 会消耗数千次 HTTP 请求。此时可先调用 FMP 的 Earnings Surprises Bulk(批量财报超预期接口,/stable/earnings-surprises-bulk?year=YYYY,批量流式入库架构可参阅 FMP Bulk 批量接口建库实战)。
需要注意该批量接口的字段边界:/stable/earnings-surprises-bulk 以 CSV 流格式按年度一次性返回全市场记录,仅包含 5 个字段:symbol,date,epsActual,epsEstimated,lastUpdated,不包含营业收入(revenueActual / revenueEstimated)字段。因此,全市场 Bulk 扫描仅能用于构建单维盈利 SUE_eps 初筛池;若策略需要叠加营收端 SUE_rev 做双维共振,正确工程架构是“先用 Bulk 接口筛选出 SUE_eps 达标的候选池,再仅对候选池标的调用 /stable/earnings 补齐 SUE_rev”。
我们对 2024、2025、2026(截至 2026-11-07) 三个年度(year)的 Bulk 全量返回包进行了逐行实测统计,分别核查返回总行数、有效数值行数、空值缺失行数、含非美股 . 交易所后缀行数、超预期行数(epsActual > epsEstimated)、持平行数(epsActual == epsEstimated)、不及预期行数(epsActual < epsEstimated)及零预期极值行数(epsEstimated == 0),数据分布如下表:
表 2:/stable/earnings-surprises-bulk 2024—2026 三年全市场返回包结构与脏数据实测体检(快照日:2026-11-07)
年度 (year) | 返回总行数 | 有效数值行数 (空值缺失) | 含非美股 . 后缀行数 | 超预期行数 (占比) | 持平行数 (占比) | 不及预期行数 (占比) | 零预期极值行数 |
|---|---|---|---|---|---|---|---|
| 2024 | 68,551 | 68,541 (缺失 10 行,如 FTEK/MNKD) | 36,438 (53.15%) | 33,933 (49.51%) | 2,816 (4.11%) | 31,792 (46.38%) | 1 (FNNNF) |
| 2025 | 67,022 | 67,022 (缺失 0 行) | 35,740 (53.33%) | 34,593 (51.61%) | 2,883 (4.30%) | 29,546 (44.08%) | 1 (AKCCF) |
| 2026(至 11-07) | 60,808 | 60,806 (缺失 2 行,CMPO/CMPOW) | 33,207 (54.61%) | 32,595 (53.60%) | 3,036 (4.99%) | 25,175 (41.40%) | 0 |
| 三年合计 | 196,381 | 196,369 (缺失 12 行) | 105,385 (53.66%) | 101,121 (51.50%) | 8,735 (4.45%) | 86,513 (44.06%) | 2 |
在基于这 196,381 行真实数据构建横截面 SUE_eps 因子池时,有四条必须写进数据清洗层的硬经验:
- 为什么算 8 季滚动 SUE 必须拉取 3 个年度(2024+2025+2026),而不能只拉 2 个年度?
许多开发者直觉认为“8 个季度 = 2 年”,于是只拉取 year=2025 与 year=2026。实测显示:由于美股大量采用跨自然年财年(如 NVDA 1 月底结账,2026 年第 4 次季报要到 2026-11-17 才发布),截至 2026-11-07,NVDA 在 2026 年仅有 3 条披露记录(02-25、05-20、08-26),加上 2025 年的 4 条合计仅 7 个季度!如果只拉 2025+2026,全市场满足至少 8 条有效记录的唯一代码数只有 7,382 只,连 NVDA 都会因差 1 个季度而被静默漏筛。而将 year=2024 并入后,满足至少 8 条有效记录的全球代码数增至 1.90 倍(达 14,020 只,其中不含 . 交易所后缀的代码共 6,805 只),NVDA 的第 8 个季度(2024-11-20,epsActual = 0.81, epsEstimated = 0.75)得以完整拼合(注:生产环境中对 8 条记录还应校验相邻记录日期间隔是否在约 60~120 天之间,以确保对应 8 个连续且不同的财季)。
- 剔除 53.66% 的全球多市场后缀代码与 12 行空字符串记录:
Bulk 接口默认包含全球各交易所标的(如 .TO 多伦多、.L 伦敦、.HK 香港、.SS/.SZ 沪深等,三年合计占 53.66%),且三年共存在 12 行 空字符串缺失记录:其中 2024 年有 10 行(含 FTEK、MNKD、ITI、AGS 等 4 行无后缀代码及 GUD.TO、KITS.TO、600516.SS、ROK.V、ENVI.AS 等 5 行多市场标的的 epsEstimated 为空字符串,外加 600136.SS 在 2024-04-29 的 epsActual 为空字符串;全部 10 行明细已收录于配套证据 JSON 的 missing_rows_2024_examples),2026 年有 2 行(2026-03-12 的 CMPO 与 CMPOW,epsEstimated 分别为 0.2962 和 0.2608,但 epsActual 为空字符串)。代码格式初筛可先过滤 symbol.find(".") == -1 并校验字段非空(若需严格限定美股普通股范围,还应结合股票列表接口进一步核对交易所 exchange、证券类型 type 与在市状态)。
- 防范零方差退化分母(
sigma_eps == 0)与零预期除零异常:
在满足至少 8 条有效记录的 6,805 只无点号代码样本中,实测有 6,804 只满足 sigma_eps > 0,但存在 1 只极端零方差退化样本——安博伊夫(ABEV):其最近 8 期(2025-02-26 至 2026-10-29)的 (epsActual, epsEstimated) 序列依次为 (0.05, 0.05)、(0.04, 0.04)、(0.05, 0.05)、(0.05, 0.05)、(0.04, 0.04)、(0.03, 0.03)、(0.04, 0.04)、(0.05, 0.05),8 期误差恒为 0.00,导致 sigma_eps = 0.0!同样地,若计算百分比超预期,2024 年 2024-02-14 的 FNNNF(epsActual = 0.287, epsEstimated = 0)与 2025 年 2025-07-15 的 AKCCF(epsActual = -0.04161, epsEstimated = 0)共 2 行 会触发除零异常。代码中必须对 8 季标准差 sigma_eps 与事前 7 季标准差 sigma_eps_ex0 分别做 <= 1e-8 的防除零保护。
- 6,804 只无点号有效样本的最新截面
SUE_eps分布基准:
在完成清洗的 6,804 只具备 8 期非零方差的无点号代码样本中,最新一期 SUE_eps >= 1.0 的样本有 1,714 只(占 25.19%),SUE_eps >= 2.0 的高 SUE 样本有 715 只(占 10.51%),而 SUE_eps <= -1.0 的负向惊喜样本有 890 只(占 13.08%)。
四、 Python 实战:43 行代码构建双维 SUE 因子与 T+1 反应对账表
下面给出完整、零伪代码、可直接运行的 Python 实盘脚本。脚本按 SOP 规范通过环境变量 FMP_KEY 读取密钥,以 SNAP_DATE = "2026-11-07" 固定财报事件与行情截止日(本文输出依据保存的 2026-11-07 快照复现,未来在线查询可能因分析师预期或历史数据更新而发生变动),并严格落实了四字段非空校验、75 天财季截止日窗口约束、est_q0["date"] == inc_q0["date"] 跨表日期对齐校验、以及 sig_eps 与 sig_eps_ex0 独立零方差保护:
import datetime as dt, os, statistics, requests
# Linux/macOS: export FMP_KEY=your_api_key_here
# Windows PowerShell: $env:FMP_KEY="your_api_key_here"
API_KEY, BASE = os.environ["FMP_KEY"], "https://quote-fmp.com/stable"
SNAP_DATE, SYMBOLS = "2026-11-07", ["NVDA", "MSFT", "AMD", "AAPL", "META", "AMZN"]
from_date = (dt.date.fromisoformat(SNAP_DATE) - dt.timedelta(days=100)).isoformat()
def get_json(path, **params):
r = requests.get(f"{BASE}/{path}", params={**params, "apikey": API_KEY}, timeout=20)
r.raise_for_status()
return r.json()
for sym in SYMBOLS:
earn = [x for x in get_json("earnings", symbol=sym, limit=20)
if x.get("date", "9") <= SNAP_DATE and x.get("epsActual") is not None and x.get("epsEstimated") is not None
and x.get("revenueActual") is not None and x.get("revenueEstimated") is not None][:8]
if len(earn) < 8:
continue
ests = get_json("analyst-estimates", symbol=sym, period="quarter", limit=24)
inc = get_json("income-statement", symbol=sym, period="quarter", limit=12)
px = sorted(get_json("historical-price-eod/dividend-adjusted", symbol=sym, **{"from": from_date, "to": SNAP_DATE}), key=lambda x: x["date"])
q0, ann_d = earn[0], dt.date.fromisoformat(earn[0]["date"])
e_eps = [x["epsActual"] - x["epsEstimated"] for x in earn]
e_rev = [x["revenueActual"] - x["revenueEstimated"] for x in earn]
sig_eps, sig_rev, sig_ex0 = statistics.stdev(e_eps), statistics.stdev(e_rev), statistics.stdev(e_eps[1:])
est_c = [x for x in ests if 0 < (ann_d - dt.date.fromisoformat(x["date"])).days <= 75]
inc_c = [x for x in inc if 0 < (ann_d - dt.date.fromisoformat(x["date"])).days <= 75]
idx = next((i for i, d in enumerate(px) if d["date"] >= q0["date"]), None)
if sig_eps <= 1e-8 or sig_rev <= 1e-8 or not est_c or not inc_c or idx is None or idx + 1 >= len(px):
continue
est_q0, inc_q0 = max(est_c, key=lambda x: x["date"]), max(inc_c, key=lambda x: x["date"])
if est_q0["date"] != inc_q0["date"]:
continue
print({
"symbol": sym, "ann_date": q0["date"], "fpe_date": est_q0["date"],
"eps_act": q0["epsActual"], "eps_est": q0["epsEstimated"], "gaap_eps": inc_q0["epsDiluted"],
"sigma_eps": round(sig_eps, 4), "sue_eps": round(e_eps[0] / sig_eps, 2),
"sue_eps_ex0": round(e_eps[0] / sig_ex0, 2) if sig_ex0 > 1e-8 else None,
"sue_eps_dem": round((e_eps[0] - statistics.mean(e_eps)) / sig_eps, 2),
"sue_rev": round(e_rev[0] / sig_rev, 2), "beat_high": q0["epsActual"] > est_q0["epsHigh"],
"t1_ret_pct": round((px[idx + 1]["adjClose"] / px[idx]["adjClose"] - 1.0) * 100.0, 2),
})
在本地终端配置好 FMP_KEY 后执行该脚本,标准输出(stdout)直接复现表 1 中的公告日 ann_date、财季截止日 fpe_date、实际与预期 EPS、法定 GAAP EPS、8 季标准差 sigma_eps、含当季 sue_eps、不含当季 sue_eps_ex0、去均值 sue_eps_dem、营收 sue_rev、beat_high 及 t1_ret_pct 核心列(表 1 中其余展示项如 ddof=0 口径、预测区间上下限及开盘跳空幅度亦由同一批报文直接导出):
{'symbol': 'NVDA', 'ann_date': '2026-08-26', 'fpe_date': '2026-07-26', 'eps_act': 2.22, 'eps_est': 2.09, 'gaap_eps': 2.46, 'sigma_eps': 0.0337, 'sue_eps': 3.85, 'sue_eps_ex0': 4.97, 'sue_eps_dem': 1.72, 'sue_rev': 3.46, 'beat_high': True, 't1_ret_pct': 8.74}
{'symbol': 'MSFT', 'ann_date': '2026-10-28', 'fpe_date': '2026-09-30', 'eps_act': 4.89, 'eps_est': 4.72, 'gaap_eps': 4.92, 'sigma_eps': 0.1417, 'sue_eps': 1.2, 'sue_eps_ex0': 1.16, 'sue_eps_dem': -0.72, 'sue_rev': 2.6, 'beat_high': True, 't1_ret_pct': -0.16}
{'symbol': 'AMD', 'ann_date': '2026-11-03', 'fpe_date': '2026-09-26', 'eps_act': 2.09, 'eps_est': 1.95, 'gaap_eps': 1.46, 'sigma_eps': 0.0739, 'sue_eps': 1.9, 'sue_eps_ex0': 1.92, 'sue_eps_dem': 1.0, 'sue_rev': 1.86, 'beat_high': False, 't1_ret_pct': 1.01}
{'symbol': 'AAPL', 'ann_date': '2026-11-02', 'fpe_date': '2026-09-26', 'eps_act': 2.05, 'eps_est': 1.99, 'gaap_eps': 2.1, 'sigma_eps': 0.0552, 'sue_eps': 1.09, 'sue_eps_ex0': 1.04, 'sue_eps_dem': -0.59, 'sue_rev': 0.53, 'beat_high': True, 't1_ret_pct': -1.9}
{'symbol': 'META', 'ann_date': '2026-10-21', 'fpe_date': '2026-09-30', 'eps_act': 7.4, 'eps_est': 6.54, 'gaap_eps': 3.83, 'sigma_eps': 2.7341, 'sue_eps': 0.31, 'sue_eps_ex0': 0.29, 'sue_eps_dem': 0.21, 'sue_rev': 1.89, 'beat_high': False, 't1_ret_pct': -6.98}
{'symbol': 'AMZN', 'ann_date': '2026-10-29', 'fpe_date': '2026-09-30', 'eps_act': 1.89, 'eps_est': 1.97, 'gaap_eps': 1.89, 'sigma_eps': 1.3223, 'sue_eps': -0.06, 'sue_eps_ex0': -0.06, 'sue_eps_dem': -0.66, 'sue_rev': -0.13, 'beat_high': False, 't1_ret_pct': -1.41}
从单因子 SUE 到多维 PEAD 策略的研究假设扩展方向
在实际量化投研建模中,拿到基础的 SUE_eps 与 SUE_rev 后,研究团队还可以结合 FMP 的配套接口重点检验以下三类组合过滤假设:
- 双维共振与预测上限突破筛选假设:测试同时满足
SUE_eps >= 1.5、SUE_rev >= 1.5且epsActual > epsHigh(并要求覆盖分析师人数numAnalystsEps >= 10)的子样本,观察其相较单维百分比超预期能否更有效分离出像 AAPL(营收SUE_rev仅 0.53、去均值SUE_eps_dem为 -0.59)或 META(高波动分母下SUE_eps仅 0.31)这类分歧样本。 - 管理层电话会业绩指引(Guidance)文本与供应链景气度交叉验证:静态财报反映的是过去一个季度的结账结果,而盘后电话会管理层对下一季度的资本开支(CapEx)、毛利率与存货周转指引往往影响后续 T+1..T+20 的价格漂移方向。可联动 Earnings Transcript(业绩电话会纪要检索接口,
/stable/earning-call-transcript)提取管理层 Q&A 文本特征,并结合上下游财务指标交叉验证,具体实现可参考站内专栏《AI 美股投研 Agent 实战:基于财报电话会纪要接口提取管理层业绩指引》与《AI 算力硬件周期怎么盯?基于英伟达与美光毛利率、存货周转天数的量化监控实战》。 - 财报后卖方目标价修订与机构调仓跟踪:财报发布后卖方分析师是否同步上调目标价与评级,是检验业绩惊喜能否转化为中期趋势的常见辅助假设。可结合 Price Target Consensus(目标价共识接口,
/stable/price-target-consensus)与 Stock Grades(股票评级变动接口,/stable/grades)跟踪卖方共识的边际变化。
五、 常见问题解答(FAQ)
1. 股票发生拆股(如 NVDA 10 拆 1)后,/stable/earnings 和 /stable/earnings-surprises-bulk 里的历史 EPS 会自动复权吗?
会自动按当前最新股本基数做拆股复权对齐(Split-Adjusted)。 以 2024 年 6 月完成 10 拆 1 的英伟达(NVDA)为例,我们实测 /stable/earnings-surprises-bulk?year=2024 中拆股前披露的 2024-02-21(epsActual = 0.52, epsEstimated = 0.46)与 2024-05-22(epsActual = 0.61, epsEstimated = 0.56)两季数据,均已自动除以 10 折算为拆股后口径,与拆股后的 2024-08-28(0.68 vs 0.645)和 2024-11-20(0.81 vs 0.75)处于完全相同的量纲下。因此直接计算 8 季滚动标准差 sigma_eps 不会因拆股产生断层跳变;与之配套拉取日线行情时,也必须同步使用 Dividend Adjusted Price Chart(分红复权日K线接口,/stable/historical-price-eod/dividend-adjusted)以保证股价与每股收益同处复权坐标系。
2. 为什么 /stable/earnings 没有直接提供 BMO(盘前)/ AMC(盘后)发布时间字段?如何准确判定事件反应窗口 T0 与 T+1?
在 FMP 的 stable 架构中,/stable/earnings、/stable/earnings-calendar 与 /stable/earnings-surprises-bulk 统一提供精确到日的 date 字段。在高频事件研究或回测中判定盘前(BMO,T0 当日反应)与盘后(AMC,次一交易日 T+1 反应)时,必须注意 /stable/income-statement 中的 acceptedDate 是 10-Q/10-K 法定报表向 SEC 提交并被受理的时间,不等于财报新闻稿(Earnings Release)的首次公开发布时间:
- 实盘反例与 10-K 年报跨日背景(以 AAPL 为例):在表 1 的 6 家公司中,NVDA(16:36:00)、MSFT(16:07:39)、AMD(18:00:17)、META(20:00:08)、AMZN(18:20:46)五家的
acceptedDate均落在 16:00:00 之后,与“盘后发稿、当晚同步提交 10-Q 季报”的模式一致(可作旁证,非直接证明);唯独苹果(AAPL)的earnings.date为 2026-11-02,而利润表filingDate为 2026-11-03、acceptedDate为 2026-11-03 08:05:15。若机械照搬acceptedDate < "09:30:00"的规则,就会把 AAPL 误判为“11 月 3 日盘前发布”;同样地,AAPL 在 T0(11-02)与 T+1(11-03)的成交量相对前 20 日均量放大倍数分别为 1.60 倍与 1.56 倍,仅凭单日放量倍数也无法 100% 区分盘前与盘后。核对 SEC EDGAR 原始披露可见,AAPL 在 2026-11-02 先行提交了披露 FY26 Q4 业绩公告的 Form 8-K(Item 2.02),次日(2026-11-03 08:05:15)才提交对应 2026-09-26 财年末的 Form 10-K 法定年报(年报涉及全年审计报告与内控签署等法定流程,业绩公告与法定报表受理之间存在时间差,事件窗口应按首次公开发布时间确定)。 - 工程判定准则:严谨的事件窗口校准应优先以公司 IR 业绩新闻稿或 SEC Form 8-K(Item 2.02)的披露时间戳为准;在仅使用日频行情与财务接口做批量处理时,可结合隔夜开盘跳空幅度(例如表 1 中 AAPL 在 T+1 开盘跳空 -3.77%、NVDA 在 T+1 开盘跳空 +6.30%、META 在 T+1 开盘跳空 -3.04%)与成交量放量特征做交叉检验。当
acceptedDate与earnings.date同日且落在盘后时可作为当晚提交 10-Q 的旁证;一旦出现跨日,应优先核查该季是否为 10-K 年报季(period == "Q4"/"FY")或 20-F 境外发行人年报并标记待核。
3. 如果某只股票在过去 8 个季度内出现过单季极值,导致 sigma_eps 异常膨胀怎么办?
表 1 中的亚马逊(AMZN)与 META 就是典型案例:AMZN 在 2026-07-30(FY26 Q2)曾录得 epsActual = 5.75、epsEstimated = 1.82(单季惊喜高达 +3.93 美元),单凭这一个极值点就把过去 8 季的样本标准差 sigma_eps 从剔除该季后其余 7 季的 0.4043 美元(约 0.40 美元)拉高到了 1.3223 美元。在量化生产环境中,通常采取两种稳健化处理:
- 双维 SUE 交叉确认:即便某季 EPS 因非经常性项目或税项调整出现极值,营业收入(Revenue)通常不受非经常性损益干扰,因此同时结合
SUE_rev可以有效降低单一盈利指标波动带来的误判; - 中位数绝对偏差(MAD)或去极值缩尾(Winsorization):在 8~12 个季度的滚动窗口内,将最大和最小的 1 个极端误差点按第 2 大/第 2 小值缩尾后再计算
sigma_eps,或者改用1.4826 * MAD替代样本标准差。
如需在本地跑通上述双维 SUE 因子与财报超预期对账脚本,可前往 快速接入指南 免费申领 Ultimate 全接口试用密钥。