如何批量下载全美股财报与历史收盘价?从 yfinance 429 限流排障到 FMP Bulk 批量接口建库实战

在本地搭建美股(5,000 余只主板活跃标的)基本面与日线数据库时,若用 for symbol in tickers: 逐只轮询 yfinance 或单股 REST 接口,很快会撞上三堵硬墙:一是连续请求数百次即触发 HTTP 429(YFRateLimitError)封 IP;二是 yfinance 免费季报仅返回近 4~5 期,无法支撑跨周期回测;三是即便改调商业单股端点,5,307 只标的每期三表也需发起 15,921 次 HTTP 请求。

解决全市场历史数据同步的正确范式,是将“按代码逐只轮询(N 次请求)”切换为“按财年季度或交易日整包拉取(1 次 Bulk 请求)”。本文基于 quote-fmp.com 实盘拉取的 94,205 条全球证券概况、2024 财年三大报表 165,642 条批量记录及 74,732 条全市场收盘日线流(数据快照截至 2026-11-06),拆解 Bulk(批量数据接口) 的参数模式、流量预算、CSV 清洗排雷(越界分片 HTTP 400、代码前导空格、31.79% 美股因少数股东权益导致的恒等式假性失衡)与 SQLite 多期增量建库代码。


一、 为什么建全美股本地库不能用 for 循环调 yfinance 或单股接口?

要把美股三大主板(NASDAQ、NYSE、AMEX)5,307 个活跃非基金证券代码的年度三大报表与某一交易日的全市场收盘行情同步到本地数据库,三种技术路线的网络开销与数据完整性差异如下:

评估维度yfinance 单股循环轮询FMP 常规单股 REST 轮询 (/stable/income-statement 等)FMP Bulk 批量整包同步 (/stable/*-bulk)
单期同步请求次数21,228 次请求(常在连续请求数百次后触发 HTTP 429 封 IP)21,228 次请求(5,307 只 × 4 个端点,受每分钟 RPM 配额硬约束)仅需 4 次 HTTP 请求(三表按 year+period 各 1 次 + 日线按 date 1 次)
历史纵深与字段对齐季报通常仅返回近 4~5 期,且科目命名随 Yahoo 接口改版变动30+ 年历史季报与年报,标准化字段统一30+ 年按年/季整表下载,单次返回全库 4.3 万~5.5 万行标准化 CSV
响应格式与解析方式调 Yahoo 非公开 JSON 接口(需动态 crumb/cookie 校验),多层嵌套转换标准 JSON 数组(Content-Type: application/json),单股体积数 KBCSV 文本流(Content-Type: text/csv),可直接用标准库 csv 或 pandas.read_csv 解析
单期同步实测耗时数小时(叠加退避重试与断线重连后仍常中途失败)按 300 RPM 计需连续请求约 71 分钟;按试用档 20 RPM 计需近 18 小时4 次请求传输合计 44.64 秒(三表 63.08 MiB 耗时 40.13 秒 + 日线 4.13 MiB 耗时 4.51 秒)

在工程架构选型上,单股接口(如 Statements(财务报表接口) 与 Chart(股票行情接口) 下的常规端点)适合针对特定股票池(如标普 500 成分股或自选标的)做高频查询;而当任务目标是初始化全市场基本面因子库、做横截面选股回测或每日盘后全量归档时,应切换至 Bulk(批量数据接口)。若策略还需要美股全市场历史逐笔成交(Trades)或分钟线 S3 离线归档文件(Flat Files),可参阅 FMP vs Massive 选型对比 了解双站分工边界。


二、 FMP 18 个 Bulk 批量接口怎么调?四类参数模式与实测报文体积矩阵

FMP 在 /stable/ 路径下共提供 18 个 批量数据接口。不同于常规接口统一按 symbol 传参,这 18 个端点按底层数据组织方式分为四类参数模式,且不同端点的响应字节体积相差超过 1,000 倍。我们梳理了全部 18 个端点,并在 2026-11-06 对其中 12 个核心端点的 18 组参数/分片组合进行了实盘拉取测速,完整参数模式与体积分布如下:

参数模式分类官方批量端点名称与必传查询参数实测返回行数 (美元财报行数)单次响应体积与实测耗时建库定位与流量预算要点
第一类:证券主表Company Profile Bulk(公司概况批量接口,/stable/profile-bulk) · 传 part=0..3(part=4 返回 HTTP 400)4 分片合计 94,205 行(单分片约 23,550 行 · 36 列)4 分片合计 111.56 MiB(116,978,977 B · 4 次共 64.57 秒)证券主表(低频同步):用于筛选美股主板活跃证券池;在本次快照中仅 part=0 即包含 4,732 只活跃美股(占 89.17%)
第一类:高流量预警ETF Holder Bulk(ETF持股批量查询接口,/stable/etf-holder-bulk) · 传 part=0, 1, ... 分片拉取part=0:2,715,251 行 · part=1:3,079,192 行part=0:302.48 MiB(56.15 秒) · part=1:333.41 MiB(58.31 秒)【高流量预警】 仅前 2 个分片即达 635.89 MiB;试用档(0.3 GiB)严禁轮询该接口,单只 ETF 持仓请改调单股接口
第二类:财报与增长Income Statement Bulk(利润表批量获取接口)、Balance Sheet Statement Bulk(资产负债表批量数据接口)、Cash Flow Statement Bulk(现金流量表批量数据接口) · 传 year=YYYY 与 period=FY 或 Q1..Q42024 FY:利润表 55,406 行(美元 13,672) · 资产表 55,263 行(美元 13,512) · 现金流 54,973 行(美元 13,335)2024 FY 三表合计 63.08 MiB:利润表 17.98 MiB(39 列 · 13.51 秒) · 资产表 25.92 MiB(61 列 · 14.84 秒) · 现金流 19.18 MiB(47 列 · 11.78 秒)历史财报核心底盘:按年/季整表拉取;2025 Q1 利润表实测为 43,454 行(美元 11,941 行,13.39 MiB,耗时 12.05 秒)
第三类:按日/按年Eod Bulk(日线行情批量接口,传 date=YYYY-MM-DD)、Earnings Surprises Bulk(批量财报超预期接口,传 year=YYYY)eod-bulk(2025-10-31):74,732 行(8 列)eod-bulk:4.13 MiB(4,329,440 B · 4.51 秒)每日收盘归档首选:单次请求 4.5 秒即可拿齐全球 7.47 万只证券当日开高低收、分红复权收盘价与成交量
第四类:零参数截面Key Metrics TTM Bulk(TTM 关键指标批量接口)、Ratios TTM Bulk(TTM 财务比率批量接口)、Financial Scores Bulk(财务评分批量接口)、Stock Rating Bulk(评级批量接口)、DCF Valuations Bulk(DCF 批量估值接口)、Price Target Summary Bulk(目标价汇总批量接口) · 零参数key-metrics-ttm:71,452 行(43 列) · ratios-ttm:71,456 行(62 列) · scores-bulk:62,905 行(11 列) · rating-bulk:47,361 行 · dcf-bulk:33,956 行 · price-target:5,366 行key-metrics-ttm:41.75 MiB(18.06 秒) · ratios-ttm:65.91 MiB(27.79 秒) · scores-bulk:6.37 MiB(6.48 秒) · rating-bulk:1.78 MiB(3.80 秒) · dcf-bulk:1.50 MiB(2.84 秒) · price-target:0.30 MiB(1.93 秒)横截面选股快照:无需拼凑单股接口,适合盘后一键刷新全市场估值、财务评分(Piotroski 9 分与 Altman Z-Score)及目标价截面

上表未单独展开的其余 5 个同族端点分别为:第二类下的三张报表同比变动率端点 Income Statement Growth Bulk(利润表增长批量获取接口)、Balance Sheet Statement Growth Bulk(资产负债表增长批量数据接口) 与 Cash Flow Statement Growth Bulk(现金流量表增长批量数据接口)(同样传 year 与 period);第四类零参数截面下的 Upgrades Downgrades Consensus Bulk(评级共识批量数据接口) 与 Stock Peers Bulk(同业公司批量接口)。

在规划本地建库脚本与历史回补范围时,需提前算清网关门禁与滚动 30 天流量预算:


三、 解析 Bulk CSV 流的四个工程排雷点与 10 家美股实盘勾稽对账

拿到 CSV 响应后,若不加清洗直接入库,会在解析器、分片循环、主键关联和会计校验四个环节出错。

1. 排雷一:正常响应为 text/csv 文本流,而 profile-bulk 越界分片返回 HTTP 400

与常规 /stable/income-statement 返回 JSON 数组不同,所有 Bulk 接口在 HTTP 200 下均返回标准 CSV 文本(Content-Type: text/csv),直接调用 .json() 会抛出 JSONDecodeError。以下是 /stable/income-statement-bulk?year=2024&period=FY 与 /stable/eod-bulk?date=2025-10-31 的表头及代表记录节选:

# GET /stable/income-statement-bulk?year=2024&period=FY (共 39 列,节选前 11 列与核心指标)
"date","symbol","reportedCurrency","cik","filingDate","acceptedDate","fiscalYear","period","revenue","grossProfit","netIncome","epsDiluted"
"2025-03-31"," GVT&D.NS","INR","0000000000","2025-03-31","2025-03-30 20:00:00","2024","FY",42923000000,12570800000,6083300000,23.76
"2024-09-28","AAPL","USD","0000320193","2024-11-01","2024-11-01 06:01:36","2024","FY",391035000000,180683000000,93736000000,6.08

# GET /stable/eod-bulk?date=2025-10-31 (共 8 列)
"symbol","date","open","low","high","close","adjClose","volume"
"AAPL","2025-10-31",276.99,269.16,277.32,270.37,269.37,86167123

编写 profile-bulk 分片循环(part=0, 1, 2, ...)时需注意:当 part 超出最后一个有效分片(实测有效分片为 part=0..3 共 4 片)时,请求 profile-bulk?part=4 不会返回空 CSV,而是直接返回 HTTP 400(application/json,正文 Query Error: Invalid or missing query parameter - part)。分片循环应在确认端点为 profile-bulk 且捕获 e.code == 400 时正常退出,避免误判为故障或泛化到其他端点的参数错误。

2. 排雷二:全球 94,205 条证券主表四层漏斗过滤与 symbol.strip() 前导空格清洗

观察上方 income-statement-bulk 首行 " GVT&D.NS" 可见两个细节:

  1. 全库原始分片(part=0..3):共 94,205 条;
  2. 限定美国本土公司(country == "US"):筛出 28,659 条(占 30.42%;若需纳入台积电 TSM 等非美注册 ADR,可放宽 country 并按交易所过滤);
  3. 限定三大主板(exchange in {"NASDAQ", "NYSE", "AMEX"}):筛出 19,861 条(剔除粉单 OTC);
  4. 限定当前活跃且剔除 ETF 与基金(isActivelyTrading == "true" 且 isEtf == "false" 且 isFund == "false"):得到 5,307 个美股三大主板活跃非基金证券代码(当前快照股票池;长周期回测需配合 消除美股回测幸存者偏差实战 中的退市与历史成分接口还原历史时点成员)。与 2024 财年美元记账(reportedCurrency == "USD")三表取交集,共 4,549 家三表齐全(跨币种 ADR 与错位财年对齐见 美股财报 API 避坑指南)。

3. 排雷三:为什么 31.79% 的美股不满足 totalAssets == totalLiabilities + totalStockholdersEquity?

将上述 4,549 家美股的 2024 财年三表批量入库时,若直接写 assert totalAssets == totalLiabilities + totalStockholdersEquity,实测会有 1,446 家(占比 31.79%)报错拦截,仅 3,103 家(68.21%)通过。

核查 balance-sheet-statement-bulk 的 61 个字段即可定位原因:合并资产负债表中,归属母公司股东权益(totalStockholdersEquity)与非控制性少数股东权益(minorityInterest)共同构成总权益(totalEquity = totalStockholdersEquity + minorityInterest),4,549 家美股中有 1,424 家(31.30%)的 minorityInterest 不为 0。将校验升级为 totalAssets == totalLiabilities + totalEquity(或核对 totalLiabilitiesAndTotalEquity),闭合率立即跃升至 99.01%(4,504 / 4,549)与 99.43%(4,523 / 4,549)(剩余 0.57% 需结合具体公司核对夹层权益 Mezzanine Equity 等特殊科目或缺失字段)。非金融企业的 freeCashFlow == operatingCashFlow + capitalExpenditure(1 美元误差内闭合率 97.87%,4,452 / 4,549)与 netDebt == totalDebt - cashAndCashEquivalents(闭合率 99.05%,4,506 / 4,549)也可同步校验。

4. 排雷四:eod-bulk 的 adjClose 已含现金分红复权(与单股日线接口的差异)

对比 Eod Bulk(日线行情批量接口,/stable/eod-bulk)与单股 Stock Price and Volume Data(日线完整行情接口,/stable/historical-price-eod/full):单股接口仅返回拆股调整后的 open、high、low、close、volume、change、changePercent 与 vwap(分红复权须另调 Dividend Adjusted Price Chart(分红复权日K线接口)),而 eod-bulk 直接在 8 列中同时给出拆股调整收盘价 close 与包含拆股及现金分红回溯调整的 adjClose。因拆股或派息后上游会回溯重算历史价格,本地日线库对发生除权除息的标的需定期刷新历史序列。

我们将 10 家美股标杆在 2024 财年三大报表批量流中的核心科目勾稽(含 cik 与 acceptedDate)及 2025-10-31 当日 eod-bulk 的 close 与 adjClose 实盘对账整理如下:

标的 (exchange / cik)2024 财年结账日 (date · acceptedDate)利润表:营收 / 净利 / 稀释 EPS (USD)资产表:总资产 = 总负债 + 归母权益 + 少数股东权益现金流:经营现金流 + 资本开支 = 自由现金流 · 2025-10-31 close vs adjClose
AAPL (NASDAQ / 0000320193)2024-09-28 · 2024-11-01 06:01:363,910.35 亿 / 937.36 亿 / 6.083,649.80 亿 = 3,080.30 亿 + 569.50 亿 + 01,182.54 亿 + (-94.47 亿) = 1,088.07 亿 · 270.37 vs 269.37
NVDA (NASDAQ / 0001045810)2024-01-28 · 2024-02-21 16:36:57609.22 亿 / 297.60 亿 / 1.19657.28 亿 = 227.50 亿 + 429.78 亿 + 0280.90 亿 + (-10.69 亿) = 270.21 亿 · 202.49 vs 202.01
MSFT (NASDAQ / 0000789019)2024-06-30 · 2024-07-30 16:06:222,451.22 亿 / 881.36 亿 / 11.805,121.63 亿 = 2,436.86 亿 + 2,684.77 亿 + 01,185.48 亿 + (-444.77 亿) = 740.71 亿 · 517.81 vs 513.58
GOOGL (NASDAQ / 0001652044)2024-12-31 · 2025-02-04 20:41:403,500.18 亿 / 1,001.18 亿 / 8.044,502.56 亿 = 1,251.72 亿 + 3,250.84 亿 + 01,252.99 亿 + (-525.35 亿) = 727.64 亿 · 281.19 vs 280.46
AMZN (NASDAQ / 0001018724)2024-12-31 · 2025-02-06 18:40:296,379.59 亿 / 592.48 亿 / 5.536,248.94 亿 = 3,389.24 亿 + 2,859.70 亿 + 01,158.77 亿 + (-829.99 亿) = 328.78 亿 · 244.22 vs 244.22(零派息)
META (NASDAQ / 0001326801)2024-12-31 · 2025-01-29 20:00:501,645.01 亿 / 623.60 亿 / 23.862,760.54 亿 = 934.17 亿 + 1,826.37 亿 + 0913.28 亿 + (-372.56 亿) = 540.72 亿 · 648.35 vs 646.17
TSLA (NASDAQ / 0001318605)2024-12-31 · 2025-01-29 20:42:33976.90 亿 / 71.30 亿 / 2.041,220.70 亿 = 483.90 亿 + 729.13 亿 + 7.67 亿149.23 亿 + (-113.42 亿) = 35.81 亿 · 456.56 vs 456.56(零派息)
BRK-B (NYSE / 0001067983)2024-12-31 · 2025-02-24 06:03:003,714.33 亿 / 889.95 亿 / 41.2711,538.81 亿 = 5,022.26 亿 + 6,493.68 亿 + 22.87 亿305.91 亿 + (-189.75 亿) = 116.16 亿 · 477.54 vs 477.54(零派息)
JPM (NYSE / 0000019617)2024-12-31 · 2025-02-14 16:17:072,707.89 亿 / 584.71 亿 / 19.7540,028.14 亿 = 36,580.56 亿 + 3,447.58 亿 + 0-420.12 亿 + 0.00 亿 = -420.12 亿(商业银行口径) · 311.12 vs 305.24
KO (NYSE / 0000021344)2024-12-31 · 2025-02-20 15:17:12470.61 亿 / 106.31 亿 / 2.461,005.49 亿 = 741.77 亿 + 248.56 亿 + 15.16 亿68.05 亿 + (-20.64 亿) = 47.41 亿 · 68.90 vs 67.12

以表中含少数股东权益的特斯拉(TSLA)为完整算例:其 2024 财年批量资产负债表返回 totalLiabilities = 483.90 亿美元、归母股东权益 totalStockholdersEquity = 729.13 亿美元、少数股东权益 minorityInterest = 7.67 亿美元,三项之和 483.90 + 729.13 + 7.67 = 1,220.70 亿美元,与 totalAssets(1,220.70 亿美元)及 totalLiabilitiesAndTotalEquity 双向误差为 0;现金流量表中 operatingCashFlow(149.23 亿美元)加上负数呈现的 capitalExpenditure(-113.42 亿美元)等于 freeCashFlow(149.23 − 113.42 = 35.81 亿美元)。伯克希尔(BRK-B)与可口可乐(KO)在计入 22.87 亿美元与 15.16 亿美元的 minorityInterest 后同样零误差闭合;而摩根大通(JPM)作为商业银行无常规工业资本开支(capitalExpenditure = 0),自由现金流指标仅适用于非金融企业。


四、 Python 实战代码:整包拉取 Bulk CSV 构建可增量更新的本地 SQLite 数据库

下面给出仅依赖 Python 标准库(csv、io、os、sqlite3、time、urllib)的本地美股数据库同步与对账脚本(47 行)。为支持长周期多财年与多交易日的历史数据累积,脚本采用四项工程设计:① 默认持久化落盘至本地 us_stock_bulk.db 文件,将财报表 us_financials(复合主键 (symbol, fiscal_year, period))与日线表 us_eod(复合主键 (symbol, trade_date))分表存储,多次调用导入不同财年、季度或交易日时自动按复合主键幂等累加而不覆盖历史期;② 下载并解析 CSV 时统一对 symbol 执行 .strip() 清除前导空格;③ 遍历 profile-bulk 分片时仅对该端点的 HTTP 400 响应识别为末分片结束信号(默认 max_parts=4 拉取全量 94,205 条,演示测试可传 max_parts=1);④ 针对 HTTP 429 自动退避重试,并对入库的 10 家美股标杆执行含少数股东权益的跨表 JOIN 勾稽断言。

运行前请在终端设置环境变量 export FMP_KEY="你的密钥"(Windows PowerShell 使用 $env:FMP_KEY="你的密钥"):

import csv, io, os, sqlite3, time, urllib.error, urllib.request

BASE_URL, API_KEY = "https://quote-fmp.com/stable", os.environ["FMP_KEY"]

def fetch_bulk_csv(endpoint: str, **params) -> list[dict]:
    q = "&".join(f"{k}={v}" for k, v in {**params, "apikey": API_KEY}.items())
    for attempt in range(3):
        try:
            req = urllib.request.Request(f"{BASE_URL}/{endpoint}?{q}", headers={"User-Agent": "fmpquote-bulk-db/1.0"})
            with urllib.request.urlopen(req, timeout=60) as resp:
                return list(csv.DictReader(io.StringIO(resp.read().decode("utf-8", errors="replace"))))
        except urllib.error.HTTPError as e:
            if e.code == 400 and endpoint == "profile-bulk": return []
            if e.code == 429 and attempt < 2:
                time.sleep(max(2.0, float(e.headers.get("Retry-After", "60")))); continue
            raise

def num(val: str | None) -> float: return float(val) if val not in (None, "") else 0.0

def sync_us_stock_db(db_path: str = "us_stock_bulk.db", year: int = 2024, period: str = "FY", eod_date: str = "2025-10-31", max_parts: int = 4):
    us_pool: dict[str, dict] = {}
    for part in range(max_parts):
        rows = fetch_bulk_csv("profile-bulk", part=part)
        if not rows: break
        for r in rows:
            if r.get("country") == "US" and r.get("exchange") in {"NASDAQ", "NYSE", "AMEX"} and r.get("isActivelyTrading") == "true" and r.get("isEtf") == "false" and r.get("isFund") == "false":
                us_pool[(r.get("symbol") or "").strip()] = r
    inc = {r["symbol"].strip(): r for r in fetch_bulk_csv("income-statement-bulk", year=year, period=period) if r.get("reportedCurrency") == "USD"}
    bal = {r["symbol"].strip(): r for r in fetch_bulk_csv("balance-sheet-statement-bulk", year=year, period=period) if r.get("reportedCurrency") == "USD"}
    cf = {r["symbol"].strip(): r for r in fetch_bulk_csv("cash-flow-statement-bulk", year=year, period=period) if r.get("reportedCurrency") == "USD"}
    eod = {r["symbol"].strip(): r for r in fetch_bulk_csv("eod-bulk", date=eod_date)}
    conn, fin_syms, eod_syms = sqlite3.connect(db_path), sorted(set(us_pool) & set(inc) & set(bal) & set(cf)), sorted(set(us_pool) & set(eod))
    conn.execute("CREATE TABLE IF NOT EXISTS us_financials (symbol TEXT, fiscal_year INT, period TEXT, exch TEXT, date TEXT, accepted TEXT, rev REAL, ni REAL, ta REAL, tl REAL, st_eq REAL, mi REAL, fcf REAL, PRIMARY KEY (symbol, fiscal_year, period))")
    conn.execute("CREATE TABLE IF NOT EXISTS us_eod (symbol TEXT, trade_date TEXT, close REAL, adj_close REAL, volume REAL, PRIMARY KEY (symbol, trade_date))")
    conn.executemany("INSERT OR REPLACE INTO us_financials VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", [
        (s, year, period, us_pool[s]["exchange"], inc[s]["date"], inc[s]["acceptedDate"], num(inc[s]["revenue"]), num(inc[s]["netIncome"]),
         num(bal[s]["totalAssets"]), num(bal[s]["totalLiabilities"]), num(bal[s]["totalStockholdersEquity"]), num(bal[s]["minorityInterest"]), num(cf[s]["freeCashFlow"])) for s in fin_syms])
    conn.executemany("INSERT OR REPLACE INTO us_eod VALUES (?,?,?,?,?)", [(s, eod_date, num(eod[s]["close"]), num(eod[s]["adjClose"]), num(eod[s]["volume"])) for s in eod_syms])
    conn.commit()
    return conn, len(us_pool), len(fin_syms), len(set(fin_syms) & set(eod_syms))

conn, pool_cnt, fin_cnt, joined_cnt = sync_us_stock_db()
print(f"US Active Pool: {pool_cnt} | 2024FY 3-Statements: {fin_cnt} | Joined with EOD(2025-10-31): {joined_cnt}")
for sym in ["AAPL", "NVDA", "MSFT", "GOOGL", "AMZN", "META", "TSLA", "BRK-B", "JPM", "KO"]:
    r = conn.execute("SELECT f.symbol, f.date, f.rev/1e9, f.ni/1e9, f.ta/1e9, (f.tl+f.st_eq+f.mi)/1e9, f.mi/1e9, f.fcf/1e9, e.close, e.adj_close FROM us_financials f JOIN us_eod e ON f.symbol=e.symbol WHERE f.symbol=? AND f.fiscal_year=2024 AND f.period='FY' AND e.trade_date='2025-10-31'", (sym,)).fetchone()
    assert abs(r[4] - r[5]) < 1e-4, f"Balance sheet mismatch: {sym}"
    print(f"{r[0]:5s} | FY:{r[1]} | Rev:{r[2]:6.2f}B | NI:{r[3]:6.2f}B | TA:{r[4]:7.2f}B (TL+EQ+MI:{r[5]:7.2f}B, MI:{r[6]:4.2f}B) | FCF:{r[7]:6.2f}B | EOD:{r[8]:6.2f}(adj:{r[9]:6.2f})")

根据上述函数返回结果整理如下,脚本将 4,549 家美股 2024 财年美元三表写入 us_financials、将匹配到的公开发行日线写入 us_eod(两表交集 4,387 家),10 家标杆公司全部通过含少数股东权益的资产负债表恒等式断言:

US Active Pool: 5307 | 2024FY 3-Statements: 4549 | Joined with EOD(2025-10-31): 4387
AAPL  | FY:2024-09-28 | Rev:391.04B | NI: 93.74B | TA: 364.98B (TL+EQ+MI: 364.98B, MI:0.00B) | FCF:108.81B | EOD:270.37(adj:269.37)
NVDA  | FY:2024-01-28 | Rev: 60.92B | NI: 29.76B | TA:  65.73B (TL+EQ+MI:  65.73B, MI:0.00B) | FCF: 27.02B | EOD:202.49(adj:202.01)
MSFT  | FY:2024-06-30 | Rev:245.12B | NI: 88.14B | TA: 512.16B (TL+EQ+MI: 512.16B, MI:0.00B) | FCF: 74.07B | EOD:517.81(adj:513.58)
GOOGL | FY:2024-12-31 | Rev:350.02B | NI:100.12B | TA: 450.26B (TL+EQ+MI: 450.26B, MI:0.00B) | FCF: 72.76B | EOD:281.19(adj:280.46)
AMZN  | FY:2024-12-31 | Rev:637.96B | NI: 59.25B | TA: 624.89B (TL+EQ+MI: 624.89B, MI:0.00B) | FCF: 32.88B | EOD:244.22(adj:244.22)
META  | FY:2024-12-31 | Rev:164.50B | NI: 62.36B | TA: 276.05B (TL+EQ+MI: 276.05B, MI:0.00B) | FCF: 54.07B | EOD:648.35(adj:646.17)
TSLA  | FY:2024-12-31 | Rev: 97.69B | NI:  7.13B | TA: 122.07B (TL+EQ+MI: 122.07B, MI:0.77B) | FCF:  3.58B | EOD:456.56(adj:456.56)
BRK-B | FY:2024-12-31 | Rev:371.43B | NI: 89.00B | TA:1153.88B (TL+EQ+MI:1153.88B, MI:2.29B) | FCF: 11.62B | EOD:477.54(adj:477.54)
JPM   | FY:2024-12-31 | Rev:270.79B | NI: 58.47B | TA:4002.81B (TL+EQ+MI:4002.81B, MI:0.00B) | FCF:-42.01B | EOD:311.12(adj:305.24)
KO    | FY:2024-12-31 | Rev: 47.06B | NI: 10.63B | TA: 100.55B (TL+EQ+MI: 100.55B, MI:1.52B) | FCF:  4.74B | EOD: 68.90(adj: 67.12)

五、 常见问答(FAQ)

1. 为什么 year=2024&period=FY 批量包内各公司的结账日跨度长达 338 天?增量同步时如何防止漏掉跨财年披露?

财报批量接口按公司申报的 fiscalYear 标签而非自然年切片(如包内 NVDA 结账日 date 为 2024-01-28,BRK-B 结账日为 2024-12-31 且 acceptedDate 至 2025-02-24 06:03:00)。因此入库必须同时保存 date(用于 date - 45 天 自然季归桶)与 acceptedDate(约束回测在 SEC 签收后生效,详见 美股财报 API 避坑指南);日常增量更新若需捕捉非标准财年或旧期重述,可先查最新财报披露列表再按对应 year+period 切片覆写。

2. 日常增量维护本地库时,如何规划每日与每季度的 API 流量及历史复权刷新?

日常盘后拉取单日 eod-bulk 仅消耗 4.13 MiB/日(月均 21 个交易日约 87 MiB,不计除权除息后的历史重刷流量);财报季拉取单季三表合计约 44 MiB(按 2024 FY 三表同比例折算)。如需在本地复现上述 SQLite 批量建库代码,可前往 快速接入指南 免费申领 15 天试用 Key(20 RPM / 0.3 GiB,滚动 30 天额度,支持微信扫码登录与人民币按月订阅)。

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