美股历史数据与分钟级 K 线怎么下载?解决分时回测只给 7 天的痛点:FMP 30 年日线与多周期分时建库方案(Historical & Intraday OHLCV API)
在搭建美股日内动量、开盘区间突破(ORB)或跨周期量价回测系统时,量化开发者最常撞上的数据瓶颈是免费开源库对分时历史窗口的硬性截断。以 yfinance 为例,据其公开文档参数说明及底层雅虎财经图表接口限制,1 分钟 K 线仅开放最近 7 个自然日(且单次请求跨度不得超过 7 天),5 分钟、15 分钟与 30 分钟 K 线仅开放最近 60 天。7 天的 1 分钟样本连一次完整的月度非农或财报季波动都无法覆盖,导致日内策略根本无法开展跨月度、跨牛熊周期的样本外检验。
本文基于 FMP数据源中文站 的 Chart(股票行情接口)分类体系,以英伟达(NVDA)与苹果(AAPL)截至 2026-11-06(数据快照截至 2026-11-09)的实盘定盘数据为基准,系统拆解 4 套 30 年历史日线端点与 6 档分时 K 线(1min 至 4hour)的返回结构、单次请求返回容量、vwap 与 changePercent 的底层计算口径,并提供一套防边界截断、幂等去重的 Python 逆向日期滑窗建库方案。
为什么用免费开源库拉美股历史分钟数据,做日内回测时总会卡在“只给最近 7 天”?
开源行情抓取工具并非独立的数据仓库,而是对门户网站前端图表接口的封装。为了控制匿名请求带宽,门户网站对分时序列实施了严格的滑动窗口淘汰机制:超过 7 天的 1 分钟级数据与超过 60 天的 5~30 分钟级数据无法通过常规参数回溯;同时,高频轮询多只标的极易触发 HTTP 429 封禁。
而在结构化行情 API 体系下,Chart(股票行情接口)将历史日线(End-of-Day,简称 EOD)与日内分时(Intraday Interval Chart)拆分为两组支持 from 与 to 日期区间检索的标准化端点:
- 历史日线回溯深度与单次 5,000 条截断边界:日线端点在不传日期参数时默认返回最近 1,253 个交易日(约 5 年,2021-11-10 至 2026-11-06);当显式传入
from与to时,单次 HTTP 请求最多返回 5,000 个交易日(约 19.8 年,如单次请求from=1980-01-01&to=2026-11-06会从to向前截断至 2006-12-21)。只需按日期逆向滑窗分 2~3 次请求拼接,即可完整拉齐 30 年(1996-11-06 至 2026-11-06,AAPL 合计 7,548 个交易日,1999-01-22 上市的 NVDA 合计 6,992 个交易日)乃至更早的历史日线。 - 6 档分钟级与小时级 K 线跨越 2003 年至今:分时端点覆盖
1min、5min、15min、30min、1hour与4hour六种时间粒度。实盘窄窗口探针(from=2003-09-01&to=2003-09-10及to=2003-09-12)验证表明,NVDA 与 AAPL 的全部六档分时 K 线最早均可回溯至 2003-09-10 09:30:00(逾 23 年历史深度),彻底消除了“1 分钟线只给 7 天”的回测限制。
30 年美股历史日线(EOD Full / Light / Unadjusted)怎么选?核对 vwap 与 changePercent 的真实计算口径
在构建日频基准库或计算跨周期日线指标时,FMP 在 /stable/historical-price-eod/ 路径下提供了 4 套不同复权层级与字段密度的日线端点。若不加区分地混用,或者直接读取报文中的衍生字段当作标准因子,会在回测中引入严重的系统性偏差。
以下展示 NVDA 在 2026-11-06 当天通过 Stock Price and Volume Data(日线完整行情接口,/stable/historical-price-eod/full)与 Stock Chart Light(日线行情(精简版)接口,/stable/historical-price-eod/light)返回的真实 JSON 报文对照:
// 1. GET https://quote-fmp.com/stable/historical-price-eod/full?symbol=NVDA&from=2026-11-06&to=2026-11-06
[
{
"symbol": "NVDA",
"date": "2026-11-06",
"open": 191.1,
"high": 194.9,
"low": 185.22,
"close": 186.64,
"volume": 180212285,
"change": -4.46,
"changePercent": -2.33,
"vwap": 189.465
}
]
// 2. GET https://quote-fmp.com/stable/historical-price-eod/light?symbol=NVDA&from=2026-11-06&to=2026-11-06
[
{"symbol": "NVDA", "date": "2026-11-06", "price": 186.64, "volume": 180212285}
]
结合 Unadjusted Stock Price(未复权日线行情接口,/stable/historical-price-eod/non-split-adjusted)与 Dividend Adjusted Price Chart(分红复权日K线接口,/stable/historical-price-eod/dividend-adjusted),我们对 NVDA(含 2024-06-10 生效的 1 拆 10 拆股前一日 2024-06-07 与最新定盘日 2026-11-06)及 AAPL 的四套日线接口实盘对账如下:
表 1:FMP 四套历史日线(EOD)接口的字段结构、单次返回上限与拆股复权实盘对账
| 日线接口端点 | 核心返回字段名 | 复权口径与单次请求上限 | NVDA 2024-06-07(1拆10前一日) | NVDA 2026-11-06(最新定盘日) | 适用投研与量化场景 |
|---|---|---|---|---|---|
historical-price-eod/full | open · high · low · close · volume · change · changePercent · vwap | 仅拆合股前复权;默认 1,253 条,传 from/to 单次上限 5,000 条 | 收 120.89 美元 · 量 412,386,000 · vwap 120.0925 | 收 186.64 美元 · 量 180,212,285 · vwap 189.465 | 日线与分时多周期对齐、基于盘面除权价的技术形态与均线回测 |
historical-price-eod/light | price · volume | 仅拆合股前复权(精简版);price 恒等于 full 的 close,上限 5,000 条 | 价 120.89 美元 · 量 412,386,000 | 价 186.64 美元 · 量 180,212,285 | 大规模股票池快速拉取收盘价序列、构建相关性矩阵与净值曲线 |
non-split-adjusted | adjOpen · adjHigh · adjLow · adjClose · volume | 未复权原始交易价(注意键名仍带 adj 前缀);单次上限 5,000 条 | 收 1,208.90 美元 · 量 41,238,600 | 收 186.64 美元 · 量 180,212,285 | 还原历史订单簿真实挂单价、期权历史行权价匹配与拆股前名义成交额核验 |
dividend-adjusted | adjOpen · adjHigh · adjLow · adjClose · volume | 拆合股 + 现金分红双重前复权;单次上限 5,000 条 | 收 120.55 美元 · 量 412,386,000 | 收 186.64 美元 · 量 180,212,285 | 中长期多因子选股、高股息组合总回报率(Total Return)回测(详见分红复权实战) |
在将 historical-price-eod/full 写入本地日线表前,必须核实并处理以下两项底层字段口径:
1. 日线 vwap 字段在已定盘样本中等于单根日线四价算术均值 (open + high + low + close) / 4
在本次抽样核验的 NVDA 与 AAPL 最近 11 个已定盘交易日(2026-10-23 至 2026-11-06,合计 22 根日线)以及 2024-06-06 至 2024-06-11 拆股窗口样本中,接口返回的 vwap 均等于 (open + high + low + close) / 4。例如 2026-11-06 当天,NVDA 四价算术均值为 (191.10 + 194.90 + 185.22 + 186.64) ÷ 4 = 189.465 美元(2024-06-07 为 (119.77 + 121.69 + 118.02 + 120.89) ÷ 4 = 120.0925 美元;AAPL 2026-11-06 为 (338.73 + 345.79 + 338.30 + 342.37) ÷ 4 = 341.2975 美元),均与接口 vwap 完全吻合。
而如果我们基于同日 390 根 1 分钟 K 线的典型价格(HLC3 = (high + low + close) ÷ 3)按成交量加权计算 ∑(HLC3 × volume) ÷ ∑volume,NVDA 在 2026-11-06 基于分钟 HLC3 的成交量加权均价估算值为 189.5235 美元,AAPL 则为 343.0000 美元(比日线四价均值 341.2975 美元高出 1.7025 美元)。因此,日线接口中的 vwap 仅可作为单根日线的典型价格参照,不能替代基于分钟线估算或逐笔成交汇总的成交量加权均价。
2. 日线 change 与 changePercent 衡量的是“当日日内实体涨跌”,不含隔夜跳空缺口
在 historical-price-eod/full 中,change 与 changePercent 按当日收盘相对当日开盘的日内变化计算(对应 close - open 与 (close - open) ÷ open × 100%,部分日期因底层未四舍五入原值参与运算,与展示后的 2 位小数四价直接相减存在 0.01 美元的舍入尾差,如 NVDA 在 2026-10-26 开 213.11、收 216.00 返回 change: 2.9)。以 2026-11-06 实盘数据为例:
- NVDA(高开低走,跨日真涨、日内收阴):11-05 前收盘为 181.60 美元,11-06 跳空高开于 191.10 美元并收于 186.64 美元。其相对于前一日收盘价的真实跨日收盘收益率为
(186.64 ÷ 181.60 − 1) × 100% = +2.78%(精确值 +2.7753%);但日线接口返回的change为186.64 − 191.10 = -4.46 美元,changePercent为 -2.33%(算式-4.46 ÷ 191.10 = -2.3339%)。 - AAPL(低开高走,跨日真跌、日内收阳):11-05 前收盘为 344.17 美元,11-06 低开于 338.73 美元并收于 342.37 美元。其真实跨日收盘收益率为
(342.37 ÷ 344.17 − 1) × 100% = -0.52%(精确值 -0.5230%);但日线接口返回的change为 +3.64 美元,changePercent为 +1.07%(算式+3.64 ÷ 338.73 = +1.0746%)。 - 工程准则:回测计算日频收益率时,切勿直接取
changePercent字段,必须按日期升序排列后使用close[t] / close[t-1] - 1自行计算。
1 分钟至 4 小时分时历史数据(1min ~ 4hour Interval Chart)能回溯多久?字段结构与时间戳实测
在 Chart(股票行情接口)分类下,6 个分时行情端点统一采用 /stable/historical-chart/{interval} 路由结构:
- 分钟级高频与波段端点:1 Min Interval Stock Chart(个股分时1分钟线接口,
/stable/historical-chart/1min)、5 Min Interval Stock Chart(个股分时5分钟线接口,/stable/historical-chart/5min)、15 Min Interval Stock Chart(个股分时15分钟线接口,/stable/historical-chart/15min)与 30 Min Interval Stock Chart(个股分时30分钟线接口,/stable/historical-chart/30min)。 - 小时级趋势与跨日端点:1 Hour Interval Stock Chart(个股分时1小时线接口,
/stable/historical-chart/1hour)与 4 Hour Interval Stock Chart(个股分时4小时线接口,/stable/historical-chart/4hour)。
以下展示 NVDA 在 2026-11-06 收盘与开盘时刻 /stable/historical-chart/1min 返回的真实 JSON 片段(全部分时接口均统一返回 date、open、low、high、close、volume 共 6 个字段,按时间从新到旧降序排列):
// GET https://quote-fmp.com/stable/historical-chart/1min?symbol=NVDA&from=2026-11-06&to=2026-11-06
// 节选:2026-11-06 当日共返回 390 根 1 分钟 K 线,首尾记录如下
[
{"date": "2026-11-06 15:59:00", "open": 186.99, "low": 186.59, "high": 187.0, "close": 186.63, "volume": 2180758},
{"date": "2026-11-06 09:30:00", "open": 191.1, "low": 190.66, "high": 192.18, "close": 191.93, "volume": 6562490}
]
我们对 NVDA 与 AAPL 在全部 6 个分时端点上的单日标准 K 线根数、默认不传参返回条数、传入近年宽窗口(2025-01-01 至 2026-11-06)时的单次返回条数,以及跨 27 个交易日(2026-10-01 至 2026-11-06)滑窗拉取全量对账实测汇总如下:
表 2:FMP 六档美股分时 K 线(1min ~ 4hour)单日根数、近年宽窗单次返回量与 27 个交易日滑窗实测表
| 分时接口路径 | 常规交易时段单日满额根数(起止时间戳 ET) | 不传 from/to 默认返回条数 | 近年宽区间单次返回条数 | 2026-10-01 ~ 11-06(27 个交易日)滑窗请求次数与总根数 | 实测最早可回溯日期(NVDA / AAPL) |
|---|---|---|---|---|---|
historical-chart/1min | 390 根/日(09:30:00 ~ 15:59:00) | 780 根(2 个交易日) | 1,170 根(3 个交易日) | 16 次请求 · NVDA 10,530 根 / AAPL 10,527 根 | 2003-09-10 至今(逾 23 年) |
historical-chart/5min | 78 根/日(09:30:00 ~ 15:55:00) | 702 根(9 个交易日) | 624 ~ 702 根(8 ~ 9 个交易日) | 4 次请求 · NVDA 2,106 根 / AAPL 2,104 根 | 2003-09-10 至今(逾 23 年) |
historical-chart/15min | 26 根/日(09:30:00 ~ 15:45:00) | 1,144 根(44 个交易日) | 858 ~ 1,144 根(33 ~ 44 个交易日) | 1 次请求 · NVDA 702 根 / AAPL 702 根 | 2003-09-10 至今(逾 23 年) |
historical-chart/30min | 13 根/日(09:30:00 ~ 15:30:00) | 260 根(20 个交易日) | 260 ~ 286 根(20 ~ 22 个交易日) | 2 次请求 · NVDA 351 根 / AAPL 351 根 | 2003-09-10 至今(逾 23 年) |
historical-chart/1hour | 7 根/日(09:30:00 ~ 15:30:00) | 434 根(62 个交易日) | 434 ~ 448 根(62 ~ 64 个交易日) | 1 次请求 · NVDA 189 根 / AAPL 189 根 | 2003-09-10 至今(逾 23 年) |
historical-chart/4hour | 2 根/日(09:30:00 与 13:30:00) | 246 根(123 个交易日) | 246 ~ 252 根(123 ~ 126 个交易日) | 1 次请求 · NVDA 54 根 / AAPL 54 根 | 2003-09-10 至今(逾 23 年) |
从表 2 的实盘测试数据中,可以提炼出三条关于分时 K 线的核心工程特征:
1. 时间戳以美东时间(ET)09:30 开盘为锚点,且仅包含常规交易时段(RTH)
美股每日 09:30 至 16:00 共 6.5 小时(390 分钟)。所有分时 K 线的 date 标签均代表该根 K 线周期的起始时刻(Bar Start Time):1min 最后一根标记为 15:59:00(覆盖 15:59~16:00),5min 最后一根为 15:55:00;1hour 每日共 7 根,前 6 根(09:30:00 至 14:30:00)各满 60 分钟,第 7 根 15:30:00 覆盖尾盘 15:30~16:00 的 30 分钟;4hour 每日共 2 根,分别为 09:30:00(覆盖 09:30~13:30 满 4 小时)与 13:30:00(覆盖 13:30~16:00 的 2.5 小时)。
此外,表 2 第 4 列的单次返回条数为 2025~2026 年近年宽窗口的实测值;在 2003-09-01 至 2003-09-20 这类早期历史窗口中,1min 单次返回 299~300 根(截断于 2003-09-18)、5min 返回 306 根(截断于 2003-09-11,将 to 收窄至 2003-09-10 或 2003-09-12 后即可拉到 2003-09-10 09:30:00 首根),15min、30min、1hour 与 4hour 则按区间实际根数依次返回 128、64、36 与 11 根。
2. 分时 K 线支持 nonadjusted=true 参数切换拆股复权与原始挂牌价
默认情况下,分时接口返回的 OHLCV 已完成历史拆合股调整;若策略需要还原拆股前的盘中真实挂单价,可在请求中附加 nonadjusted=true。以 NVDA 在 1 拆 10 拆股前最后一个交易日 2024-06-07 15:59:00 的 1 分钟线实测:默认请求返回拆股复权后 open: 120.93、close: 120.87、volume: 4,154,940;而传入 nonadjusted=true 后,同一分钟返回未复权原价 open: 1209.3、close: 1208.7、volume: 415,494,价格恰好相差 10 倍、成交量反比相差 10 倍。
3. 日线与分钟线、以及不同分钟粒度之间的成交量加总存在口径差异,建库时应分别核验
实盘核对 2026-11-06 当天快照可见两层差异:
- 分时加总低于日线总成交量:NVDA 的 390 根
1min成交量加总为 153,977,543.29 股(带两位小数),而日线historical-price-eod/full的volume为 180,212,285 股(AAPL 的 390 根1min加总为 29,946,786 股,日线volume为 44,703,806 股)。 - 同一常规交易时段内,不同分钟粒度的成交量加总亦不相同:同日 NVDA 的 78 根
5min成交量加总为 138,810,798 股(比1min加总少 15,166,745.29 股,相差 -9.85%),AAPL 的5min加总为 29,188,861 股(比1min加总少 757,925 股,相差 -2.53%)。
上述差异的潜在原因包括日线额外涵盖盘前盘后、收盘竞价及场外延迟申报合并修正,以及不同分时粒度在聚合规则、快照采样或历史复权折算上的差异(具体构成需结合上游供应商规则进一步确认)。工程上应分别保存各端点原始序列,对跨粒度成交量差额做记录与监控告警,避免未经核验直接混用。
跨月度与跨年度拉取 1 分钟/5 分钟 K 线时,如何用 Python 按日期滑窗自动分页拼接并去重?
如表 2 所示,当你向 /stable/historical-chart/1min 传入一个跨度 37 天的区间(如 from=2026-10-01&to=2026-11-06)时,服务端不会报错,而是从 to(最新日期)向前截取一段记录返回。为什么表 2 中拉取 27 个交易日的 1min 数据一共发起了 16 次请求(而非理论上的 27 ÷ 3 = 9 次)?核对证据文件中的 16 次请求逐页日志(step_logs)可见两个关键规律:
- 底层按自然日窗口截取,跨周末时返回天数递减:当游标
cur_to落在周三至周五(如 2026-11-06 周五或 2026-11-04 周三)时,单次请求拉满 3 个交易日(1,170 根);当游标落在周二(如 2026-11-03)时,因窗口前推触及周日,单次返回 2 个交易日(780 根);而当游标落在周一(如 2026-11-02、2026-10-26)或周日(如 2026-11-01、2026-10-25)时,因向前跨越周六日休市,单次仅返回 1 个交易日(390 根)。16 次请求返回的交易日序列依次为3+2+1+3+1+1+3+1+1+3+1+1+3+1+1+1 = 27个交易日(同理,5min的 4 次请求依次返回624+546+468+468 = 2,106根,即8+7+6+6 = 27个交易日)。 - 当标的存在早盘缺根或上游分片未对齐日界时,需防止早盘漏拉:对数据完整的交易日,
5min(624 或 468 根均为 78 的整数倍)等粒度的最老一根 K 线会整齐落在 09:30:00 日界;但当某交易日存在开盘缺根或快照不全时(例如 AAPL 在 2026-10-29 缺失了 09:30:00 首根 K 线,当日仅 389 根、最老一根停在 09:31:00),单次响应最老时间戳就会停在盘中而非 09:30:00。此时若不加确认直接将该日减 1 天跳过,或遇到oldest_dt <= start_date就立即break退出,一旦上游在某日盘中截断就会漏掉当日早盘数据!
最稳健的工程方案是采用“基于响应最老时间戳的自适应逆向滑窗算法(Adaptive Backward Sliding Window)”,其三步核心规则如下:
1. 游标初始化与字典主键幂等去重
令当前窗口右边界 cur_to = end_date,左边界固定传入 from = start_date;每次请求返回 rows 后,以精确到秒的时间戳 r["date"] 为字典主键存入 merged[r["date"]] = r,天然消除相邻滑窗重叠部分的重复记录。
2. 动态游标回退与起始日早盘完整性保护
读取本次响应最老一根 K 线的时间戳 oldest_bar = rows[-1]["date"] 及其日期部分 oldest_dt = oldest_bar[:10]:
- 当最老记录已完整覆盖当日早盘(或已重拉过该日):若
oldest_bar是日线(长度为 10),或分时 K 线恰好结束于当日开盘首根 09:30:00(说明oldest_dt当天已完整拉齐),亦或oldest_dt >= cur_to(说明本次请求就是针对cur_to单日发起的补拉,或该日 09:30:00 原本即无成交),则将下一轮cur_to设为oldest_dt的前 1 个自然日;一旦减 1 天后cur_to < start_date,主循环自然终止。 - 当最老记录停在某天盘中(
oldest_bar > 09:30:00且oldest_dt < cur_to):无论oldest_dt是中间日期还是恰好等于start_date,均不能直接结束或跳过,而是将下一轮cur_to设为oldest_dt单独补拉该日,直至把该日 09:30:00 起算的早盘 K 线全部补齐后再向前推进!
下面给出完整、零伪代码、可直接运行的 Python 建库与口径对账脚本。运行前请先在终端设置环境变量 FMP_KEY:
# Linux / macOS 终端设置环境变量
export FMP_KEY="你的密钥"
# Windows PowerShell 设置环境变量
$env:FMP_KEY="你的密钥"
完整 Python 逆向滑窗拉取与量价对账代码如下:
import os, requests
from datetime import datetime, timedelta
API_KEY = os.environ["FMP_KEY"]
BASE_URL = "https://quote-fmp.com/stable"
def fetch_json(endpoint: str, params: dict) -> list:
resp = requests.get(f"{BASE_URL}/{endpoint}", params={**params, "apikey": API_KEY}, timeout=25)
resp.raise_for_status()
return resp.json()
def fetch_sliding_bars(endpoint: str, symbol: str, start_date: str, end_date: str) -> tuple[list, int]:
merged, cur_to, calls = {}, end_date, 0
while cur_to >= start_date:
calls += 1
rows = fetch_json(endpoint, {"symbol": symbol, "from": start_date, "to": cur_to})
if not rows:
break
for r in rows:
if start_date <= r["date"][:10] <= end_date:
merged[r["date"]] = r
oldest_bar = rows[-1]["date"]
oldest_dt = oldest_bar[:10]
if len(oldest_bar) == 10 or oldest_bar.endswith("09:30:00") or oldest_dt >= cur_to:
cur_to = (datetime.strptime(oldest_dt, "%Y-%m-%d") - timedelta(days=1)).strftime("%Y-%m-%d")
else:
cur_to = oldest_dt
return [merged[k] for k in sorted(merged)], calls
for sym in ["NVDA", "AAPL"]:
eod_30y, eod_calls = fetch_sliding_bars("historical-price-eod/full", sym, "1996-11-06", "2026-11-06")
bars_1m, calls_1m = fetch_sliding_bars("historical-chart/1min", sym, "2026-10-01", "2026-11-06")
bars_5m, calls_5m = fetch_sliding_bars("historical-chart/5min", sym, "2026-10-01", "2026-11-06")
d0, d1 = eod_30y[-2], eod_30y[-1]
b_last = [b for b in bars_1m if b["date"].startswith(d1["date"])]
vol_1m = sum(b["volume"] for b in b_last)
vwap_1m = sum(((b["high"] + b["low"] + b["close"]) / 3.0) * b["volume"] for b in b_last) / vol_1m
print({
"symbol": sym,
"eod_30y_bars": f"{len(eod_30y)}({eod_calls}calls,{eod_30y[0]['date']}~{d1['date']})",
"oct_nov_1m": f"{len(bars_1m)}bars/{len({b['date'][:10] for b in bars_1m})}d({calls_1m}calls)",
"oct_nov_5m": f"{len(bars_5m)}bars/{len({b['date'][:10] for b in bars_5m})}d({calls_5m}calls)",
"1106_eod_vwap_vs_1m_vwap": f"{d1['vwap']:.4f} vs {vwap_1m:.4f}",
"1106_chgPct_vs_ccRet": f"{d1['changePercent']:.2f}% vs {(d1['close']/d0['close']-1)*100:+.2f}%",
})
实盘运行上述脚本,根据上述函数返回结果整理的标准输出(stdout)如下,与前文表 1、表 2 的核验数字完全一致:
{'symbol': 'NVDA', 'eod_30y_bars': '6992(3calls,1999-01-22~2026-11-06)', 'oct_nov_1m': '10530bars/27d(16calls)', 'oct_nov_5m': '2106bars/27d(4calls)', '1106_eod_vwap_vs_1m_vwap': '189.4650 vs 189.5235', '1106_chgPct_vs_ccRet': '-2.33% vs +2.78%'}
{'symbol': 'AAPL', 'eod_30y_bars': '7548(2calls,1996-11-06~2026-11-06)', 'oct_nov_1m': '10527bars/27d(16calls)', 'oct_nov_5m': '2104bars/27d(4calls)', '1106_eod_vwap_vs_1m_vwap': '341.2975 vs 343.0000', '1106_chgPct_vs_ccRet': '1.07% vs -0.52%'}
常见问题(FAQ):分时数据美东时区对齐、常规交易时段(09:30~16:00 ET)过滤与停牌空缺根怎么处理?
1. 为什么在 2026-10-01 至 2026-11-06(27 个交易日)中,NVDA 的 1 分钟线是整整齐齐的 27 × 390 = 10,530 根,而 AAPL 却是 10,527 根(少了 3 根)?
这是真实分时行情中的偶发零成交或上游快照缺根现象。实盘逐分钟排查可见:AAPL 在 2026-10-07 缺失了 09:31:00 与 09:32:00 两根 1 分钟 K 线(当日 388 根),在 2026-10-29 缺失了 09:30:00 首根 1 分钟 K 线(当日 389 根);其 5min 序列也在 2026-10-13 缺失了 09:30:00 与 09:40:00 两根 K 线(当日 76 根)。因此,在多股横截面分钟级回测中,切忌按数组行号 iloc 直接对齐不同股票的分钟线;应在入库后以美东标准交易日历的 390 个分钟网格为基准执行 reindex:对缺失分钟的 close 用前值填充(ffill),将 open、high、low 设为填充后的 close,将 volume 显式填为 0,并新增布尔列 is_imputed = True 保留缺失标记,以免将上游快照缺根直接等同于真实市场零成交。
2. 分时 K 线的时间戳带夏令时和冬令时偏移吗?如何与宏观日历或 UTC 时间戳对齐?
FMP 股票分时接口的 date 字段固定输出美东当地时间(America/New_York)墙上时钟(09:30:00 至 15:59:00),不带时区后缀。在北美夏令时(EDT,3 月第二个周日至 11 月第一个周日)期间对应 UTC-4,冬令时(EST,如 2026-11-02 起)期间对应 UTC-5。若需与 UTC 口径的宏观经济发布日历(如 Economic Data Releases Calendar(经济数据日历接口,/stable/economic-calendar))对齐,应在 Python 中使用 ZoneInfo("America/New_York") 先为分时时间戳绑定美东时区,再统一转换至目标时区。
3. 如果不想拉取单股日线,而是想每天收盘后一次性同步全美股的日线数据,该调哪个接口?
单股 /stable/historical-price-eod/full 适合拉取指定股票池的长周期历史序列或配合分时 K 线做多周期联动;若需每日盘后归档全市场数万只证券的日线 OHLCV 与 adjClose,建议直接调用 Bulk(批量数据接口)下的 Eod Bulk(日线行情批量接口,/stable/eod-bulk?date=YYYY-MM-DD)单次拉取全市场 CSV 快照(详见 FMP Bulk 批量接口建库实战);若需直接在分时 K 线上读取服务端预热好的 EMA、RSI 与 ADX 序列,也可配合调用 TechnicalIndicators(技术指标接口)。如需在本地跑通上述 30 年日线与多周期分时滑窗脚本,可前往 快速接入指南 免费申领 Ultimate 全接口试用密钥。