美股财报 API 避坑指南:如何对齐错位财年,计算滚动市盈率(PE)和市销率(PS)?
用程序批量拉取美股财报并构建滚动估值因子(TTM PE / TTM PS)时,很多量化脚本代码完全不报错,算出来的横向估值排名却严重失真。最常见的故障集中在三个底层数据口径环节:
- 财年日历错位与披露时间边界:美股允许企业自定财年结账月,若直接按接口字段
fiscalYear与period筛选同一财季,会把结账日相隔逾 11 个月的季报硬凑在同一截面;若直接按报告期末日date更新滚动分母,则会在回测中引入 30 至 45 天的未来函数。 - 单季比率接口的“半截年化”陷阱:在 FMP 的单季比率接口中,单季市盈率(
priceToEarningsRatio)已将单季每股收益乘以 4 年化,而单季市销率(priceToSalesRatio)却直接用季末市值除以单季营收(未乘以 4),仅因分母少算三个季度就会让单季 PS 比同分子的四季滚动 PS 放大约 3 至 4 倍。 - 多类别股本分母与跨币种 ADR 裸除:美股行情一律按美元(USD)报价,但部分非美发行人(如台积电 TSM)的利润表以本币(新台币 TWD)申报;若不核对
reportedCurrency直接用美元股价除以原币每股收益,算出的 PE 会缩小三十余倍。
本文基于 quote-fmp.com 网关拉取的 Statements(财务报表接口) 与 Quote(实时行情接口) 实盘数据(统一数据快照时刻:北京时间 2026-11-04 23:48:22),逐一拆解上述三类陷阱的底层机制、勾稽等式与 Python 自动化清洗代码。
一、 避坑一:为什么按 fiscalYear + period 硬筛会把相差 11 个月的财报混为一谈?
与 A 股强制要求以自然年 12 月 31 日作为财年结账日不同,美国 SEC 允许上市公司根据行业经营周期自由设定财年结束月(Fiscal Year-End):零售与消费电子巨头常在节假日旺季或 9 月底结账,软件与云厂商常在 6 月底或 1 月底结账。
1. 四大科技巨头错位财年实盘对拍:同名 2026 Q3 首尾相差 339 天
如果我们调用 Income Statement(利润表接口,/stable/income-statement?period=quarter),在代码中机械执行 fiscalYear == "2026" and period == "Q3" 进行横截面对比,拉出来的四家科技巨头季报实际覆盖的经营时间窗口如下:
| 标的与财年结账规则 | 接口筛选条件 (fiscalYear / period) | 季报结账日 (date) | 接口返回 acceptedDate (ET) | date - 45天 按经营期中点近似归桶 |
|---|---|---|---|---|
| GOOGL(12 月底结账) | 2026 / Q3 | 2026-09-30 | 2026-10-28 20:29:06 | 2026Q3(涵盖 2026 年 7–9 月) |
| AAPL(9 月底最后一个周六) | 2026 / Q3 | 2026-06-27 | 2026-07-31 06:01:02 | 2026Q2(涵盖 2026 年 4–6 月) |
| MSFT(6 月 30 日结账) | 2026 / Q3 | 2026-03-31 | 2026-04-29 16:06:24 | 2026Q1(涵盖 2026 年 1–3 月) |
| NVDA(1 月底最后一个周日) | 2026 / Q3 | 2025-10-26 | 2025-11-19 16:36:17 | 2025Q3(涵盖 2025 年 8–10 月) |
可以看到,同样顶着 2026 Q3 标签,谷歌(GOOGL)反映的是 2026 年三季度业绩,而英伟达(NVDA)反映的却是 2025 年 8 至 10 月的业绩,两者结账日首尾相差整整 339 天。而在真实物理时间 2026 年三季度(自然季 2026Q3)附近,微软(MSFT)截至 2026-09-30 的季报在官方口径中早已进入 FY2027 Q1,苹果(AAPL)截至 2026-09-26 的季报为 FY2026 Q4,英伟达截至 2026-07-26 的最新季报则是 FY2027 Q2。
2. 工程对齐双准则:date - 45 天 经营期中点近似归桶 vs 披露时间边界
要在跨公司横截面比较中对齐财季,同时搞清回测时间字段的真实边界,需要将「经营季度近似归桶」与「披露时间校验」分开处理:
- 横截面基本面对齐(
date - 45 days按经营期中点近似归桶):单季季报覆盖约 90 天经营期,将接口返回的报告期末日date往前推 45 天,可按该季度经营中心日落入的自然日历季度做跨公司季度级近似归桶。例如:
- MSFT 的 FY2027 Q1(
date为 2026-09-30,减 45 天为 2026-08-16)、AAPL 的 FY2026 Q4(date为 2026-09-26,减 45 天为 2026-08-12)与 GOOGL 的 FY2026 Q3(date为 2026-09-30)均归入 2026Q3 桶; - NVDA 的 FY2026 Q3(
date为 2025-10-26,涵盖 8–10 月,减 45 天为 2025-09-11)近似归入 2025Q3 桶(FY2027 Q2 结账日 2026-07-26 近似归入 2026Q2 桶)。需注意该规则仅为跨公司季度级近似对齐,NVDA 的 8–10 月经营期并不能当成完整的 7–9 月与其他公司做逐月对齐。
- 披露时间字段边界(
acceptedDate能规避期末日偷看,但不能无条件等同于秒级回测可用时刻):在 FMP 利润表返回的三个日期字段中:
date是会计期末结账日,当时财报尚未编制完成;用acceptedDate替代date可规避“把期末结账日当成披露日(提前 30 至 45 天引入未来函数)”的粗粒度错误(如 AAPL 结账日为 2026-09-26,直到 2026-11-03 08:05:15 才完成年报签收,相隔 38 天;GOOGL 于美东 2026-10-28 20:29:06 盘后过 17:30 归档线提交,SEC 将filingDate顺延记为 2026-10-29);- 但接口返回的
acceptedDate不能直接作为所有标的历史回测的秒级可用时刻:以本文样本中的台积电(TSM)2026Q3 季报(结账日 2026-09-30)为例,网关利润表返回的acceptedDate为 2026-10-15 20:00:00,而核查 SEC EDGAR 原始归档记录(Accession No. 0001046179-26-000726)可知,台积电该份三季度业绩 Form 6-K 实际于美东时间当天盘前 06:40:56 签收。若策略按美股 09:30 开盘调仓,盘前 06:40:56 披露可在 10 月 15 日开盘即刻调仓,而按 20:00:00 则会延后到 10 月 16 日,足以改变回测结果(关于历史成分股与退市时点处理,可参阅 消除美股回测幸存者偏差实战)。
二、 避坑二:为什么单季比率接口的 PS 比 TTM 高出约 4 倍,而 PE 却可能失真暴跌?
搞清楚时间轴后,第二个高频踩坑点出现在估值接口的选型上。FMP 在 Statements(财务报表接口) 分类下同时提供了按季度/年度切片的 Financial Ratios(财务比率接口,/stable/ratios?period=quarter)与预聚合的 Financial Ratios TTM(TTM 财务比率接口,/stable/ratios-ttm)。很多开发者拉取 period=quarter 的历史序列去画 PE/PS 估值分位带,结果发现画出来的 PS 曲线整体高出正常水平 3 至 4 倍。
1. 单季 /stable/ratios?period=quarter 的“不对称年化”实盘验算
对上述 5 家公司最近 2 个季度(共 10 个单季样本,完整明细已留档于配套实测证据文件)的单季比率报文做反向勾稽验算,可以证实:在本次核验的 10 个单季样本中,FMP 对单季 priceToEarningsRatio 与单季 priceToSalesRatio 采用了不对称的年化处理:
- 单季
priceToEarningsRatio(已乘 4 简单年化):底层公式为结账日股价 ÷ (4 × 当季基本 eps),等价于将单季净利润简单乘以 4 作为全年利润预估; - 单季
priceToSalesRatio(未乘 4 年化,分母仅含 1 个季度营收):底层公式为结账日基本市值 ÷ 当季单季 revenue(即结账日股价 ÷ (当季 revenue / weightedAverageShsOut)),分母并未乘以 4!
为了剔除跨月股价波动的干扰、纯粹检验“分母少算三个季度”的放大效应,我们以微软(MSFT)最新结账季 FY2027 Q1(date 为 2026-09-30)为例,严格固定同一个 2026-09-30 季末市值分子进行对比:
- 固定季末分子:2026-09-30 收盘价为 512.90 美元,乘以当季加权基本股本
weightedAverageShsOut(74.26 亿股),得到季末基本市值 38,087.95 亿美元; - 单季 PE 复算(分母已乘 4):当季基本
eps为 4.93 美元,512.90 ÷ (4 × 4.93) = 512.90 ÷ 19.72 ≈ 26.0091 倍(与单季接口返回的 26.009128 完全相等); - 单季 PS 复算(分母仅单季营收 922.79 亿美元):
38,087.95 亿 ÷ 922.79 亿 ≈ 41.2748 倍(与单季接口返回的 41.274780 完全相等); - 同分子下的四季滚动 PS(分母取截至该季的四季累计营收 3,464.45 亿美元):
38,087.95 亿 ÷ 3,464.45 亿 ≈ 10.9939 倍(即 10.99 倍)。在完全相同的季末市值分子下,仅因单季接口分母未年化(少了前三个季度营收),单季 PS(41.27 倍)就比同分子的四季滚动 PS(10.99 倍)整整放大了 3.75 倍;而到了 2026-11-04,随微软股价从 512.90 美元升至约 554 美元,/stable/ratios-ttm快照的priceToSalesRatioTTM才进一步升至 11.87 倍。
我们将 5 家公司最新结账季在固定季末同一分子下的单季接口值、同分子四季营收 PS,以及 2026-11-04 的 TTM 接口快照并列对比如下:
| 标的 (最新财季 / 结账日) | 单季接口 pe_q (季末价 ÷ 4×eps) | 单季接口 ps_q (季末市值 ÷ 单季营收) | 同季末市值 ÷ 四季营收 (纯分母还原) | 11 月 4 日接口快照 (peTTM / psTTM) |
|---|---|---|---|---|
| MSFT (FY27 Q1 · 2026-09-30) | 26.01 倍 | 41.27 倍(放大 3.75 倍) | 10.99 倍 | 28.85 倍 / 11.87 倍 |
| NVDA (FY27 Q2 · 2026-07-26) | 19.89 倍 | 49.40 倍(放大 3.15 倍) | 15.69 倍 | 25.60 倍 / 16.19 倍 |
| AAPL (FY26 Q4 · 2026-09-26) | 40.41 倍 | 43.41 倍(放大 4.18 倍) | 10.38 倍 | 39.22 倍 / 10.77 倍 |
| GOOGL (FY26 Q3 · 2026-09-30) | 39.81 倍(上季仅 9.57 倍) | 32.73 倍(放大 3.69 倍) | 8.86 倍 | 14.98 倍 / 7.56 倍 |
| TSM (FY26 Q3 · 2026-09-30) | 24.70 倍 | 50.49 倍(放大 3.31 倍) | 15.25 倍 | 23.00 倍 / 11.85 倍(TWD 原币口径) |
除了单季 PS 未年化之外,单季 PE 采用的「单季利润 × 4」还会放大单季非经常性损益脉冲:例如 GOOGL 在 2026Q2(结账日 2026-06-30)单季净利润高达 1,121.93 亿美元(单季 eps 达 9.23 美元),单季接口直接 × 4 年化算出的 priceToEarningsRatio 骤降至 9.57 倍,而到了 2026Q3 单季净利润回落至 264.68 亿美元(单季 eps 为 2.14 美元)时,单季 PE 又跳升至 39.81 倍。因此做估值监控与回测时,绝不能直接拿单季接口的 priceToEarningsRatio 与 priceToSalesRatio 充当滚动估值。
2. TTM 接口的真实合成规则:4 季流量直加 vs 基本/稀释股本分母选择
那么调用 Income Statements TTM(TTM 利润表接口,/stable/income-statement-ttm)与 Financial Ratios TTM(TTM 财务比率接口,/stable/ratios-ttm)时,底层数字又是如何合成的?通过比对最近 4 期单季季报(period=quarter&limit=4)与 TTM 报文,可确认以下三条硬核规则(更多比率定义可对照本站 财务指标计算公式全集):
// GET https://quote-fmp.com/stable/income-statement-ttm?symbol=AAPL&limit=1 核心字段节选
[{"symbol": "AAPL", "date": "2026-09-26", "reportedCurrency": "USD", "revenue": 478834000000,
"netIncome": 132175000000, "eps": 9.01, "epsDiluted": 8.97,
"weightedAverageShsOut": 14570195000, "weightedAverageShsOutDil": 14630318000}]
- 流量科目与每股收益严格等于最近 4 个连续单季相加(零误差):
- 在全部 5 家核验标的中,
income-statement-ttm的revenue、netIncome、eps、epsDiluted与最近 4 期单季季报对应字段直接求和的差值均为 0(千万不要把已经汇总好的 TTM 流量科目再乘以 4;只有单季存货周转率等比率年化时才乘 4,详见 AI 算力硬件周期监控实战)。
income-statement-ttm的股本字段直接取最新一季单季股本,导致回购股上「4 季 EPS 直加」与「总利润 ÷ 最新股本」存在微小偏差:
- 以苹果(AAPL)为例,其最近 4 个季度(FY26 Q1 至 FY26 Q4)因持续股票回购,加权稀释股本
weightedAverageShsOutDil从 148.10 亿股逐季降至 146.30 亿股; - 4 个季度的单季
epsDiluted(2.84 + 2.01 + 2.02 + 2.10)直接相加等于 8.97 美元,而用 4 季总净利润(1,321.75 亿美元)除以最新一季稀释股本(146.30 亿股)则等于 9.03 美元。
- FMP
/stable/ratios-ttm的priceToEarningsRatioTTM默认以基本eps为分母,且与/stable/quote存在盘中缓存刷新微差:
- 实盘反推证实,FMP 的
priceToEarningsRatioTTM采用接口计价基准 ÷ 四季基本 eps 之和:由peTTM × epsTTM反推的接口隐含股价在 AAPL 上为39.2231 × 9.01 = 353.40 美元、在 MSFT 上为28.8526 × 19.20 = 553.97 美元(与同一批次/stable/quote盘中快照价 352.57 美元、551.98 美元存在数秒至数分钟的盘中刷新时差); - 而在机构量化回测中,若要兼顾期权/RSU 稀释效应与多类别股权结构(如 Alphabet 同时存在 GOOGL A 类股、GOOG C 类股及未上市 B 类股,Key Metrics TTM(TTM 关键指标接口) 返回的
marketCap3.562 万亿美元已合并全类别总市值),建议统一使用总市值 marketCap ÷ netIncomeTTM(或单类股股价 price ÷ epsDilutedTTM)并列校验(关于 FMP 采用财报加权平均股本与 Massive 采用价格日时点流通股本的跨源差异,可参阅 FMP vs Massive 选型对比)。
三、 避坑三:跨币种美股 ADR 的“汇率裸除”陷阱(以台积电 TSM 为例)
第三个致命暗坑发生在用日线价格序列(Stock Price and Volume Data(日线完整行情接口) 或 Stock Quote(股票报价接口))与季度利润表自行拼接 TTM PE/PS 时:美股二级市场报价与市值一律是美元(USD),但部分非美上市公司的 SEC 20-F/6-K 财报却按母国本币(reportedCurrency)记录!
以晶圆代工龙头台积电美股 ADR(TSM,截至 2026-09-30 的 FY2026 Q3 季报)为例,其数据存在双重折算关系:
- ADR 股数折算(FMP 利润表已自动处理):1 份美股 TSM ADR 对应 5 股台湾证券交易所挂牌的台积电普通股(2330.TW)。FMP 的 TSM 利润表已将加权稀释股本按 ADR 份数折算为 51.864 亿份(对应台股约 259.32 亿股普通股),最近 4 季归母净利润合计
netIncomeTTM为 25,271.54 亿新台币,折合每份 ADR 的滚动收益epsDilutedTTM为 491.30 新台币(4 季营收合计revenueTTM为 49,440.00 亿新台币)。 - 币种汇率折算(自行拼接时必须显式换算):TSM 利润表的
reportedCurrency为"TWD"(新台币),而/stable/quote?symbol=TSM(北京时间 2026-11-04 23:48:22 快照)返回的股价 398.74 与市值 2.068 万亿均为"USD"(美元)。
如果代码未检查 reportedCurrency 是否等于行情币种,直接相除就会算出“台积电只有 0.81 倍 PE”的异常结果。我们将同一快照时刻(2026-11-04 23:48:22)下 TSM 的三种计算口径实盘对账如下:
| 估值计算口径 | 分子(价格 / 市值) | 分母(TTM 收益 / 营收) | 算出的 TTM PE / TTM PS 结果 |
|---|---|---|---|
| 错误裸除(USD 除 TWD) | 美股股价 398.74 美元 · 市值 20,680.57 亿美元 | 每 ADR 收益 491.30 新台币 · 营收 49,440.00 亿新台币 | PE 0.81 倍 · PS 0.42 倍(漏乘约 32.88 汇率,彻底失真) |
FMP /stable/ratios-ttm 原币口径 | 反推隐含价 11,300 新台币 · 接口市值 58.61 万亿新台币 | 每 ADR 收益 491.30 新台币 · 营收 49,440.00 亿新台币 | PE 23.00 倍 · PS 11.85 倍(与台股 2330.TW 收盘价折算结果一致) |
| 按即期汇率折算的 ADR 估值 | 美股股价 398.74 美元 · 市值 20,680.57 亿美元 | 按 USDTWD = 32.876 折算:每 ADR 收益 14.94 美元 · 营收 1,503.83 亿美元 | 稀释 PE 26.68 倍(总市值 PE 26.90 倍) · PS 13.75 倍 |
核验上表第二行与第三行可以明确区分已验证事实与计算口径边界:
- 关于接口 23.00 倍的核验事实:由
/stable/ratios-ttm?symbol=TSM的priceToEarningsRatioTTM(23.000204)乘以epsTTM(491.30 新台币)反推,分子恰好为 11,300.00 新台币,与当日台湾证券交易所 2330.TW 收盘价(2,260 新台币 × 5 股 = 11,300 新台币)折算结果完全一致(同批次/stable/key-metrics-ttm返回的marketCap为 58.61 万亿新台币)。我们在实盘中仅记录“本次接口返回值与按台股收盘价折算的平价结果一致”,不据此推断供应商内部在所有时点均固定采用该逻辑。 - 关于按即期汇率折算的 ADR 估值:由于美股 TSM ADR 较台股原股存在跨市场溢价,调用 Forex Quote(外汇实时报价接口,
/stable/quote?symbol=USDTWD,快照汇率 32.876)将新台币财报折算为美元后,按美股 398.74 美元算出的稀释 PE 为 26.68 倍(398.74 ÷ (491.30 ÷ 32.876)),按美元总市值算出的 PS 为 13.75 倍。
四、 Python 实盘复算脚本:错位财年对齐、汇率折算与双口径 TTM PE/PS 核验
下面给出仅依赖 Python 标准库的完整核验脚本。脚本通过网关(https://quote-fmp.com/stable)拉取 MSFT、NVDA、AAPL、GOOGL、TSM 五家公司的最新报价、最近 4 期单季利润表与比率接口,内置四期财季唯一性与严格递减排序校验、相邻结账日 80 <= gap <= 100 天连续四季断言、四期 reportedCurrency 同币种断言、亏损/零利润防除零保护,并输出按即期汇率折算后的稀释股本 PE 与总市值 PE/PS 对账结果。
运行前请先在终端设置环境变量 export FMP_KEY="你的密钥"(Windows PowerShell 使用 $env:FMP_KEY="你的密钥"):
import json, os, time, urllib.request
from datetime import datetime
BASE_URL, API_KEY = "https://quote-fmp.com/stable", os.environ["FMP_KEY"]
def fmp_get(path: str, **params) -> list[dict]:
params["apikey"] = API_KEY
url = f"{BASE_URL}/{path}?" + "&".join(f"{k}={v}" for k, v in params.items())
for attempt in range(3):
try:
req = urllib.request.Request(url, headers={"User-Agent": "fmpquote-ttm/1.0"})
with urllib.request.urlopen(req, timeout=20) as resp:
return json.loads(resp.read().decode("utf-8"))
except Exception:
if attempt == 2: raise
time.sleep(1.5 * (attempt + 1))
def to_cal_quarter(date_str: str) -> str:
mid = datetime.fromordinal(datetime.strptime(date_str, "%Y-%m-%d").toordinal() - 45)
return f"{mid.year}Q{(mid.month - 1) // 3 + 1}"
fx_cache: dict[str, float] = {"USD": 1.0}
for sym in ["MSFT", "NVDA", "AAPL", "GOOGL", "TSM"]:
q = fmp_get("quote", symbol=sym)[0]
inc = sorted(fmp_get("income-statement", symbol=sym, period="quarter", limit=4), key=lambda x: x["date"], reverse=True)
rat_q = fmp_get("ratios", symbol=sym, period="quarter", limit=1)[0]
rat_ttm = fmp_get("ratios-ttm", symbol=sym)[0]
assert len(inc) == 4 and len({(r["fiscalYear"], r["period"]) for r in inc}) == 4, f"{sym} 季报不足4期或财季重复"
assert len({r["reportedCurrency"] for r in inc}) == 1, f"{sym} 四季财报币种不一致"
for cur, prev in zip(inc[:-1], inc[1:]):
gap = (datetime.strptime(cur["date"], "%Y-%m-%d") - datetime.strptime(prev["date"], "%Y-%m-%d")).days
assert 80 <= gap <= 100, f"非连续相邻财季:{sym} {prev['date']}->{cur['date']} ({gap}d)"
rep_ccy = inc[0]["reportedCurrency"]
if rep_ccy not in fx_cache:
fx_cache[rep_ccy] = fmp_get("quote", symbol=f"USD{rep_ccy}")[0]["price"]
fx = fx_cache[rep_ccy]
rev_ttm_usd = sum(r["revenue"] for r in inc) / fx
ni_ttm_usd = sum(r["netIncome"] for r in inc) / fx
eps_dil_ttm_usd = sum(r["epsDiluted"] for r in inc) / fx
pe_dil_str = f"{q['price'] / eps_dil_ttm_usd:5.2f}x" if eps_dil_ttm_usd > 0 else "N/A(亏损)"
pe_mcap_str = f"{q['marketCap'] / ni_ttm_usd:5.2f}x" if ni_ttm_usd > 0 else "N/A(亏损)"
ps_mcap_self = q["marketCap"] / rev_ttm_usd
r0 = inc[0]
print(f"{sym:5s} | 近似归桶:{to_cal_quarter(r0['date'])} ({r0['fiscalYear']}{r0['period']} {r0['date']}) | "
f"API_accepted:{r0['acceptedDate']} | Ccy:{rep_ccy}(fx={fx:.3f}) | "
f"PE_Dil:{pe_dil_str} (MCap_PE:{pe_mcap_str}, API_TTM:{rat_ttm['priceToEarningsRatioTTM']:5.2f}x) | "
f"PS_TTM:{ps_mcap_self:5.2f}x (单季PS未年化:{rat_q['priceToSalesRatio']:5.2f}x)")
基于本文统一留档快照(北京时间 2026-11-04 23:48:22)运行上述逻辑的终端输出如下(与第三节表格数值完全对齐;若在美股盘中不同分钟重跑,PE_Dil 与 PS_TTM 会随实时股价微动):
MSFT | 近似归桶:2026Q3 (2027Q1 2026-09-30) | API_accepted:2026-10-28 16:07:39 | Ccy:USD(fx=1.000) | PE_Dil:28.82x (MCap_PE:28.74x, API_TTM:28.85x) | PS_TTM:11.83x (单季PS未年化:41.27x)
NVDA | 近似归桶:2026Q2 (2027Q2 2026-07-26) | API_accepted:2026-08-26 16:36:00 | Ccy:USD(fx=1.000) | PE_Dil:25.68x (MCap_PE:25.38x, API_TTM:25.60x) | PS_TTM:16.16x (单季PS未年化:49.40x)
AAPL | 近似归桶:2026Q3 (2026Q4 2026-09-26) | API_accepted:2026-11-03 08:05:15 | Ccy:USD(fx=1.000) | PE_Dil:39.31x (MCap_PE:38.93x, API_TTM:39.22x) | PS_TTM:10.75x (单季PS未年化:43.41x)
GOOGL | 近似归桶:2026Q3 (2026Q3 2026-09-30) | API_accepted:2026-10-28 20:29:06 | Ccy:USD(fx=1.000) | PE_Dil:15.25x (MCap_PE:15.11x, API_TTM:14.98x) | PS_TTM: 7.56x (单季PS未年化:32.73x)
TSM | 近似归桶:2026Q3 (2026Q3 2026-09-30) | API_accepted:2026-10-15 20:00:00 | Ccy:TWD(fx=32.876) | PE_Dil:26.68x (MCap_PE:26.90x, API_TTM:23.00x) | PS_TTM:13.75x (单季PS未年化:50.49x)
注意上述脚本面向的是最新截面估值快照。若要构建过去 5 至 10 年的历史逐日回测估值序列,不能仅把 quote 简单替换为 Historical Market Cap(历史市值查询接口)或 Stock Price and Volume Data(日线完整行情接口),还必须同时锁定三项历史状态:① 固定策略每日决策截点(结合 SEC 原始签收时刻判断盘前或盘后生效);② 使用当时已公开且未经事后会计重述(Restatement)覆盖的财报版本;③ 对跨币种标的匹配估值日 t 当天的历史即期汇率(全站接口参数与响应结构可参阅 FMP 数据 API 全面测评)。
五、 常见问答(FAQ)
1. 如果公司发生拆股(Stock Split),历史单季 epsDiluted 可以直接相加算 TTM 吗?
在 FMP 的标准化 Income Statement(利润表接口)中,当公司实施股票拆分(可通过 Stock Split Details(公司拆合股明细接口) 查询拆股生效日与比例)后,历史各季度的 eps、epsDiluted 及 weightedAverageShsOutDil 均已按最新股本口径做了追溯复权对齐,因此连续 4 季的 epsDiluted 可以直接相加并与当前复权股价匹配。但若调用的是保留 SEC 申报原貌的 As Reported Income Statements(原始申报利润表接口),其历史季报保留了拆股前的原始每股收益,此时应改用不受拆股比例影响的 总市值 marketCap ÷ 最近 4 季 netIncome 之和 计算滚动市盈率。
2. 当滚动 4 个季度净利润之和(netIncomeTTM)为负数或零时,量化选股因子该如何处理 TTM PE?
当 netIncomeTTM == 0 时,市盈率公式分母为零无定义;当 netIncomeTTM < 0 时,市盈率变为负数且排序方向完全错乱:例如同为 100 亿美元市值,微亏 1 亿美元的公司 PE = -100,巨亏 10 亿美元的公司 PE = -10——若在选股器中按 PE 从小到大升序排列,微亏股(-100)会排在最前面、巨亏股(-10)次之,且所有亏损股都会排在正常盈利股(PE > 0)之前。工程上通用解法是改用它的倒数——盈利收益率(Earnings Yield)以保持从高盈利到深亏损的连续单调性,或改用企业价值倍销率 evToSalesTTM(该字段与 earningsYieldTTM 均包含在 Key Metrics TTM(TTM 关键指标接口) 中,历史按季企业价值明细则可查 Enterprise Values(企业价值查询接口))。注意 FMP 接口的 earningsYieldTTM 为 epsTTM / 股价(如 TSM 接口返回 4.3481%,对应 491.30 ÷ 11,300),而用 netIncomeTTM / marketCap 算得为 4.3120%(25,271.54 亿 ÷ 586,072.24 亿),若策略严格定义为总利润除以总市值,建议在代码中显式自行相除。需要自己动手验证上述多表勾稽的开发者,可前往本站 快速接入指南 免费申领 15 天 Ultimate 全接口试用 Key(20 RPM / 0.3 GiB)直接跑通文中脚本。