QVeris

金融与市场数据

FMP 股票市场 API

通过结构检查、重试、来源时间与授权审查接入 FMP 端点,上线前验证返回结果。

发布日期:2026年4月21日 · QVeris团队制作

分析人员核对金融图表与来源数据
分析人员核对金融图表与来源数据
分析人员核对金融图表与来源数据

核心摘要

结论:如果一个 API 需要覆盖 Quote、Historical Price、Company Fundamentals、News、Calendar 与相关市场数据,FMP 值得进入候选清单。但采购决策应基于任务真正需要的 Endpoint、更新频率、地区、历史范围、调用限制、带宽、许可与复权规则,而不是营销页面上的 Endpoint 数量。

适合

研究、分析、投资组合监控、原型,以及希望通过统一 API 获取广泛金融数据的产品。

采购前验证

Symbol 覆盖、实时权限、公司行动处理、Point-in-time 行为、限流与商业展示许可。

无法单独解决

AI Agent 仍需要身份、策略、标准化、证据、审批、重试、可观测性和验收测试。

选择 FMP 前,可在免费股票 API 对比中把它与另外七种方案并列评估。

这份 FMP API 评估适合谁

正在替换零散市场数据脚本的开发者

希望用一个受维护的 API 契约覆盖 Quote、History、Fundamentals、News、Calendar 与 Reference Data。

需要可追溯金融证据的 AI 团队

模型需要标准化记录,并包含来源时间、检索时间、复权模式、验证状态与 Provenance。

比较免费与付费方案的采购者

需要把每日/每分钟调用、历史范围、覆盖、带宽与许可换算成每个验收任务的成本。

先从当前 Stable API 契约开始

FMP 当前 Quickstart 将 https://financialmodelingprep.com/stable/ 作为 Base URL,并说明 API Key 认证、100 多个 Endpoint,以及常见的 403、429、500。应把 Base URL、认证方式、Timeout 与套餐限制放进配置,而不是散落在 Notebook 与 Prompt 中。

Stable base URLVersion the provider adapter, not every caller.
API keyKeep it server-side and out of model context.
403 / 429 / 500Classify auth, quota, and provider failures separately.
Plan contractEndpoint access is not the same as display rights.

FMP 股票市场 API 数据覆盖图

需求Stable Endpoint 示例生产前验证
单个 Quote/quote?symbol=AAPL市场状态、时间戳、币种、交易所与权限
批量 Quote/batch-quote?symbols=AAPL,MSFT批量上限、部分失败、排序与缺失 Symbol
历史 EOD/historical-price-eod/full?symbol=AAPL复权模式、VWAP、修订与日期边界
分钟 Bar/historical-chart/1min?symbol=AAPL套餐权限、交易时段、时区、延迟与保留期
基本面/income-statement?symbol=AAPL期间、申报日、接受日、币种与重述
事件与新闻Calendar 与 News Endpoint来源、发布时间、去重与更新周期

免费层、付费限制与许可现实

FMP 当前公开 Pricing 页面区分 Personal 与 Commercial Use,并按套餐列出不同的调用频率、历史范围、地区覆盖、带宽与数据集。价格与包装会变化,所以本文不把价格写成长期采购报价;评估当天应保存实际数值和适用协议。

问题为什么会影响架构需要保存的证据
每日还是每分钟调用?决定 Batch、Cache、Concurrency 与 Backoff。套餐截图、Dashboard Quota 与测试结果
历史范围多长?影响回测、预热任务、存储与迁移。按 Dataset 与 Symbol 记录最早可用数据
哪些地区和资产?美国市场原型无法证明全球生产覆盖。包含交易所、币种和缺失率的 Symbol 清单
能否展示或再分发?API 访问本身不等于产品使用权。签署协议与产品用途映射

代码:用 cURL 调用 FMP Stable API

cURL · historical EOD
curl --fail-with-body \
  --connect-timeout 5 \
  --max-time 30 \
  -H "apikey: ${FMP_API_KEY}" \
  "https://financialmodelingprep.com/stable/historical-price-eod/full?symbol=AAPL"

使用环境变量,并避免在 Shell History 或截图中暴露 Key。FMP 文档支持 Header 与 Query Parameter 认证;使用 Header 可以避免 Secret 进入 URL。

Python:重试、标准化并保存证据

Python · bounded provider adapter
import hashlib, json, os, random, time
from datetime import datetime, timezone
import requests

BASE_URL = "https://financialmodelingprep.com/stable"
API_KEY = os.environ["FMP_API_KEY"]

def get_eod(symbol: str, attempts: int = 4) -> dict:
    url = f"{BASE_URL}/historical-price-eod/full"
    headers = {"apikey": API_KEY}
    params = {"symbol": symbol}

    for attempt in range(attempts):
        response = requests.get(
            url, headers=headers, params=params, timeout=(5, 25)
        )
        if response.status_code == 403:
            raise RuntimeError("FMP authentication or entitlement rejected")
        if response.status_code not in {429, 500, 502, 503, 504}:
            response.raise_for_status()
            break
        if attempt == attempts - 1:
            response.raise_for_status()
        time.sleep(min(8, 0.5 * (2 ** attempt)) + random.random() / 4)

    raw = response.content
    rows = response.json()
    normalized = [{
        "symbol": symbol,
        "date": row["date"],
        "open": row["open"],
        "high": row["high"],
        "low": row["low"],
        "close": row["close"],
        "volume": row["volume"],
        "provider": "fmp",
        "dataset": "historical_price_eod_full",
    } for row in rows]

    return {
        "records": normalized,
        "evidence": {
            "retrieved_at": datetime.now(timezone.utc).isoformat(),
            "request": {"endpoint": "/historical-price-eod/full", "symbol": symbol},
            "status": response.status_code,
            "sha256": hashlib.sha256(raw).hexdigest(),
        },
    }

复权价格、时间戳与 Point-in-time 真相

FMP 提供 Full、Non-split-adjusted 与 Dividend-adjusted 历史价格 Endpoint,它们回答不同问题。每个数据集都要记录 Endpoint 与复权模式,不能把复权 Close 与未复权 High/Low 静默拼接。

序列适合混用风险
完整历史 EOD验证字段语义后的通用 OHLCV 分析未测试就假设复权行为
未拆股复权观察拆股事件前后的原始价格公司行动附近出现虚假收益跳变
股息复权方法一致时的总回报分析重复计算现金股息或回测口径不一致
  • 分别保存事件时间、供应商来源时间、检索时间和处理时间。
  • 测试盘前、常规交易、盘后、周末、节假日与夏令时边界。
  • 检测重复、区间反转、负成交量、缺失交易日与不可能的 OHLC 关系。
  • 保存 Dataset Version 或原始响应 Hash,使 Agent 答案可复现。

数据质量验收契约

YAML · release gate
dataset: fmp_historical_eod
symbols: 100
window: 2025-01-01..2026-06-30
contract:
  required_fields: [symbol, date, open, high, low, close, volume]
  adjustment_mode: documented
  currency_and_exchange: resolved
  duplicate_keys: 0
  impossible_ohlc_rows: 0
  missing_expected_sessions_pct: "<= 0.25"
  stale_quote_rate_pct: "<= 0.50"
  p95_latency_ms: "<= 2500"
  unsafe_secret_logs: 0
evidence:
  raw_hash: required
  retrieved_at: required
  provider_endpoint: required
  validation_result: required

阈值应根据工作负载与交易日历确定;上面的数字只是示例,不是通用保证。上线前必须重放冻结的 Symbol/Date 样本,并抽样与权威来源核对。

FMP 数据的生产架构

1. 解析身份

映射 Issuer、Security、Exchange、Currency、Ticker、CIK 与有效日期,不能只用模糊展示 Symbol 关联。

2. 通过 Provider Adapter 获取

集中管理 Base URL、Auth、Timeout、Concurrency、Quota、Retry Class 与请求元数据。

3. 保存原始证据

转换前记录 Endpoint、安全参数、Status、Retrieval Time、Content Hash、套餐上下文与响应元数据。

4. 标准化并验证

转换为 Canonical Schema,附加单位与复权模式,然后拒绝或隔离无效记录。

5. 提供验收数据

按 Dataset Freshness 缓存、暴露 Evidence Reference,只让 Agent 使用通过验收的记录。

排查 FMP API 故障

现象可能类别安全处理
403Key 缺失、无效或无权限不要盲目重试;检查 Secret 与套餐权限。
429频率或 Quota 限制带 Jitter 回退、降低并发、缓存、批量,并在 Deadline 停止。
500供应商侧故障限制重试、保存请求证据、降级或切换供应商。
200 但结果为空Symbol、Exchange、Plan、Date 或 Dataset 不匹配把空结果作为类型化结果而不是零;检查身份与覆盖。
价格断层拆股、股息、币种、Symbol 变化或复权混用隔离记录、检查公司行动,并按统一策略重算。

用一个统一任务比较 FMP

维度FMPPolygonAlpha VantageTwelve Data
测试任务100 个 Symbol:Quote + 12 个月 EOD + 最新基本面 + 公司行动核对
记录验收率、字段缺失、过期数据、复权不一致、P50/P95、重试、总成本与许可适配
决策根据任务结果与运维负担选择,不宣布通用赢家。

Endpoint 或供应商变更的迁移清单

  • 盘点所有 Endpoint、Caller、Key 位置、Quota、Cache Key、Schema、复权假设与下游消费者。
  • 修改 Adapter 前冻结代表性响应与预期标准化记录。
  • 以只读 Shadow 模式并行运行新旧路径,对比数值、日期、缺失率、延迟与成本。
  • 先对一个低风险 Dataset 做 Canary,保留回滚;证据不完整时阻止写入或 Agent 结论。
  • 切换前更新 Runbook、Dashboard、许可记录、Secret Rotation 与数据保留控制。

QVeris 模式:发现、检查、调用,然后验证

当现有 Agent 需要能力层,而不是硬编码供应商 Endpoint 时,QVeris 更合适。Agent 可按意图发现金融能力,检查参数与运行信号,调用所选能力,再把通过验证的证据交给模型推理。

保持边界明确:QVeris 不替代市场数据许可、事实来源、身份策略、验证规则、投资组合逻辑或审批权威。它负责路由能力;业务真相仍由应用负责。

FMP 股票市场 API 常见问题

FMP 股票市场 API 免费吗?

FMP 提供用于测试的免费 Basic Plan,并有每日调用与带宽限制。应按实际套餐确认 Endpoint、历史、实时覆盖、商业权利与再分发规则。

当前 FMP Base URL 是什么?

当前 Quickstart 使用 https://financialmodelingprep.com/stable/。应把它放进配置,避免供应商变化扩散到产品代码。

API Key 应如何保存?

使用服务端 Secret Manager,不要把 Key 放入浏览器代码、Prompt、Log、截图或提交的 Notebook。

复权与未复权价格有什么区别?

它们回答不同问题。记录 Endpoint 与复权模式,不能在同一收益计算中混用不同序列。

如何处理 429?

使用带 Jitter 的有限指数退避、降低并发、缓存稳定数据、适当批量,并在 Deadline 停止。

FMP 数据可以再分发吗?

不能从 API Access 推断许可。应确认产品、用户、地区与存储周期对应的展示和再分发条款。

FMP 足以支持 AI Agent 吗?

它提供数据,但 Agent 仍需要身份、策略、标准化、验证、证据、重试与可观测性。

QVeris 放在哪一层?

QVeris 可路由可发现的金融能力,应用继续负责业务策略、权威记录与验收测试。

官方资料与更新策略

Endpoint、价格、更新频率与许可信息于 2026 年 7 月 31 日根据官方资料核验。采购或上线前应重新检查当前套餐与协议。

档案链接有效不代表已获访问权限、字段可用、价格确定或当前调用成功;执行前须检查当前契约。

FMP 股票市场 API | QVeris Guides