非农与 CPI 公布时刻怎么回测?FMP 经济日历(Economic Calendar)与美债利率(Treasury Rates)实战
在跨资产宏观量化与事件驱动回测中,非农就业人口(Nonfarm Payrolls,简称 NFP)、消费者物价指数(CPI)以及美联储联邦公开市场委员会(FOMC)利率决议,是影响美债收益率曲线陡峭化或倒挂、伴随标普 500 指数 ETF(SPY)与 20 年期以上美债 ETF(TLT)剧烈重定价的核心宏观事件。然而,大量量化策略在回测宏观因子时表现优异、一上实盘却迅速失效,根源往往不在于阿尔法模型本身,而在于底层宏观数据的时间戳对齐错位。实测 2026 年 1 月 1 日至 11 月 7 日的美国宏观数据可以发现两类典型失真:其一,若直接将宏观经济指标序列的统计归属月首日(如 2026 年 10 月非农对应的 2026-10-01,或 2026 年 9 月 CPI 对应的 2026-09-01)与日线行情按日期拼接,会把真实发布时刻(分别为 2026-11-06 与 2026-10-14)凭空前移 36 至 43 个自然日,并在不知不觉中引入劳工统计局(BLS)事后修正终值(例如 2026 年 7 月非农初值公布为 -23.00K,一个月后修正为 +21.00K);其二,若忽略无时区后缀的协调世界时(UTC)在北美冬令时(EST,UTC-5)与夏令时(EDT,UTC-4)之间的 1 小时偏移,或者未处理耶稣受难日(如 2026-04-03)劳工部照常发非农、美债接口仍有记录而美股休市的跨市场日历差异,分钟级与日频回测都会产生系统性偏差。
本文将基于 FMP Economics(宏观经济接口)分类下的 Economic Data Releases Calendar(经济数据日历接口,/stable/economic-calendar)、Treasury Rates(美国国债收益率接口,/stable/treasury-rates)、Economics Indicators(经济指标数据接口,/stable/economic-indicators)与 Market Risk Premium(市场风险溢价接口,/stable/market-risk-premium),配合 Chart(股票行情接口)分类下的 Stock Price and Volume Data(日线完整行情接口,/stable/historical-price-eod/full)及 5 Min Interval Stock Chart(个股分时5分钟线接口,/stable/historical-chart/5min),完整还原 2026 年截至 11 月 7 日共 28 场美国重磅宏观事件的时点对齐(Point-in-Time,简称 PIT)工程标准(全文实盘数据拉取快照日为 2026-11-07,接口基座为 /stable)。
一、宏观回测的四大时间轴陷阱:未来函数、初值修正、冬夏令时与休市错位
在搭建自上而下(Top-Down)的宏观量化回测管线前,必须先把宏观指标序列与事件发布日历在数据结构上的底层差异拆解清楚。对 2026 年截至 11 月 7 日实盘接口返回值的交叉对账显示,以下四处工程细节直接决定了回测结果是否可信:
- 统计归属月首日(
date)与真实发布时点的 36~43 天未来函数:在/stable/economic-indicators接口中,当传入name=totalNonfarmPayroll或name=unemploymentRate查询美国非农总就业人口与失业率时,最新一条记录的date为 2026-10-01(对应非农总就业人口value为 159,293 千人,较 2026-09-01 的 159,128 千人增加 165 千人;失业率value为 4.1%)。但 2026-10-01 仅代表该指标的统计归属月份为 2026 年 10 月,美国劳工统计局实际向全市场公布这份报告的时刻是 36 天后的 2026-11-06 13:30:00 UTC(美东标准时间 08:30:00 EST)。同理,name=CPI最新记录的date为 2026-09-01(value为 336.298),而 2026 年 9 月 CPI 报告的实际发布时刻是 43 天后的 2026-10-14 12:30:00 UTC。如果回测代码直接用/stable/economic-indicators的date字段与股票或国债日线做左连接(Left Join),相当于在月初就提前一个多月“预知”了当月就业与通胀结果。 - 事后修正值(Revised Value)覆盖发布初值(Initial Release):宏观经济数据具有显著的多次修正特征。
/stable/economic-indicators保存的是经劳工统计局后续月份滚动修订后的最新历史序列,而市场在发布瞬间交易的是初值与市场预期之差(即预期差actual - estimate)。以 2026 年 7 月非农(Non Farm Payrolls (Jul))为例:在 2026-08-07 12:30:00 UTC 发布日,/stable/economic-calendar记录的actual为 -23.00K(与美国劳工统计局首发新闻稿初值一致),大幅低于 FMP 日历收录的分析师预期值estimate(80.00K),预期差达 -103.00K,当日 2 年期美债收益率(year2)下行 6.0 个基点(bps)至 4.19%、10 年期美债收益率(year10)下行 4.0bp 至 4.65%;然而一个月后(2026-09-04 公布 8 月非农时),7 月非农前值previous被劳工统计局大幅上修 44.00K 至 +21.00K(由负转正)。同样,2026-10-02 公布的 9 月非农初值actual为 29.00K(低于预期 90.00K 达 -61.00K),一个月后在 2026-11-06 公布的 10 月非农日历记录中,其对应的前值字段previous已上修为 60.00K;2026-03-06 公布的 2 月非农初值actual为 -92.00K,次月在 3 月非农报告中其previous被进一步下修至 -133.00K。在当前 2026 年核验样本中,/stable/economic-calendar的actual均与官方首发初值相符,但由于历史日历接口本身不提供字段级的修改审计日志,在生产级严格时点(PIT)回测中,建议在每个宏观事件公布前定时冻结最后一次estimate快照,并在公布后记录首次接收到actual的到达时间戳。 - 无后缀 UTC 时间戳与北美冬夏令时切换(EST vs EDT):
/stable/economic-calendar返回的date字段采用年-月-日与时:分:秒格式,底层固定为 UTC(零时区)且不带时区后缀;而/stable/historical-chart/5min等分钟级股票行情接口的时间戳则固定采用美东时间(America/New_York)且仅覆盖美股常规交易时段(RTH,09:30:00 至 15:55:00 ET,每日 78 根 5 分钟 K 线)。美国劳工统计局发布非农与 CPI 的时刻恒定为美东时间 08:30:00(美股开盘前 60 分钟),美联储公布 FOMC 利率决议的时刻恒定为美东时间 14:00:00(美股盘中)。由于 2026 年北美夏令时(EDT,UTC-4)起止于 2026-03-08 至 2026-11-01,夏令时期间(如 2026-03-11 的 2 月 CPI 至 2026-10-14 的 9 月 CPI)盘前 08:30 发布在日历接口中显示为 12:30:00 UTC,盘中 14:00 的 FOMC 决议显示为 18:00:00 UTC;而在冬令时期间(EST,UTC-5,如 2026-01-09、2026-02-11、2026-03-06 以及夏令时结束后的 2026-11-06 10 月非农),盘前 08:30 发布则变为 13:30:00 UTC,1 月 28 日 FOMC 决议则为 19:00:00 UTC。若在代码中硬编码减 4 小时或直接按字符串匹配分钟线,不仅会在冬夏令时切换周错位 1 小时,还会把盘前 08:30 ET 发布的非农错误对齐到盘中 12:30 或 13:30 ET 的分钟线上。 - 耶稣受难日(Good Friday)跨市场日历差异与接口行为:2026 年 4 月 3 日(周五)恰逢西方耶稣受难日。由于耶稣受难日并非美国联邦政府法定假日,美国劳工统计局于当日 12:30:00 UTC(08:30 EDT)照常发布了 2026 年 3 月非农就业报告(
actual为 178.00K,estimate为 60.00K,预期差 +118.00K)。尽管按美国证券业及金融市场协会(SIFMA)惯例耶稣受难日美债现货休市或仅安排极短交易,但/stable/treasury-rates接口在 2026-04-03 当日仍返回了一条独立于前一日(2026-04-02)的收益率记录(year2由 3.79% 变为 3.84%,上行 5.0bp;year10由 4.31% 变为 4.35%,上行 4.0bp)。反观美股市场,纽约证券交易所与纳斯达克当日全天休市,SPY 与 TLT 并无 2026-04-03 的日线或分钟线记录,其节后首个美股常规交易日为下周一(2026-04-06)。这一现象恰好构成了一条关键工程排雷准则:绝不能把美债收益率接口的日期序列直接当作美股交易日历使用;若回测脚本简单按event_date == price_date做内连接,2026-04-03 这场超预期 +118.00K 的重磅非农事件会在股票与 ETF 回测中被静默丢弃。
二、2026 年非农、CPI 与 FOMC 公布时刻事件日市场表现对账
为了直观展示“UTC 转美东时区 + 债股双日历各自向后取首个交易日(bisect_left)”的对齐效果,我们对 2026 年 1 月 1 日至 11 月 7 日期间 /stable/economic-calendar 收录的全部 28 场美国核心宏观事件(11 场 Non Farm Payrolls、10 场 Inflation Rate YoY、7 场 Fed Interest Rate Decision)进行了全量对齐。
下表完整列出了 2026 年下半年(2026-07-01 至 2026-11-06)全部 12 场核心宏观事件,以及上半年出现债股休市日历差异的 2026-04-03 耶稣受难日 3 月非农(合计 13 场)的事件日市场表现。表中 actual(实际值)、estimate(分析师预期值)及预期差(actual - estimate)均直接取自 /stable/economic-calendar;美债 year2(2 年期)、year10(10 年期)到期收益率、单日基点变动(较前一个美债观测日变动,1% = 100bp)及 2s10s 期限利差(year10 - year2)取自 /stable/treasury-rates;SPY 与 TLT 的开盘跳空(open_T / close_{T-1} - 1)与全天涨跌幅(close_T / close_{T-1} - 1)取自 /stable/historical-price-eod/full。
| 事件简称 | 发布时刻(UTC / 美东) | 日历事件名(event) | 实际 / 预期 / 预期差 | 美债 year2 / year10 / 2s10s | SPY 跳空 / 全天 / TLT 全天 |
|---|---|---|---|---|---|
| 04-03 3月非农 | 2026-04-03 12:30 / 08:30 EDT | Non Farm Payrolls (Mar) | 178.00 / 60.00 / +118.00K | 3.84% (+5.0bp) / 4.35% (+4.0bp) / +51.0bp | +0.00% / +0.47% / -0.16%(04-06) |
| 07-02 6月非农 | 2026-07-02 12:30 / 08:30 EDT | Non Farm Payrolls (Jun) | 57.00 / 110.00 / -53.00K | 4.14% (-3.0bp) / 4.49% (+1.0bp) / +35.0bp | +0.22% / -0.13% / -0.01% |
| 07-14 6月CPI | 2026-07-14 12:30 / 08:30 EDT | Inflation Rate YoY (Jun) | 3.50 / 3.80 / -0.30% | 4.18% (-8.0bp) / 4.58% (-4.0bp) / +40.0bp | +0.23% / +0.36% / +0.13% |
| 07-29 7月FOMC | 2026-07-29 18:00 / 14:00 EDT | Fed Interest Rate Decision | 3.75 / 3.75 / +0.00% | 4.22% (-4.0bp) / 4.67% (+6.0bp) / +45.0bp | -0.12% / -1.54% / -1.65% |
| 08-07 7月非农 | 2026-08-07 12:30 / 08:30 EDT | Non Farm Payrolls (Jul) | -23.00 / 80.00 / -103.00K | 4.19% (-6.0bp) / 4.65% (-4.0bp) / +46.0bp | +0.32% / +0.61% / +0.29% |
| 08-12 7月CPI | 2026-08-12 12:30 / 08:30 EDT | Inflation Rate YoY (Jul) | 3.40 / 3.40 / +0.00% | 4.20% (-2.0bp) / 4.68% (-2.0bp) / +48.0bp | +0.54% / +0.25% / -0.10% |
| 09-04 8月非农 | 2026-09-04 12:30 / 08:30 EDT | Non Farm Payrolls (Aug) | 162.00 / 56.00 / +106.00K | 4.37% (+3.0bp) / 4.78% (+1.0bp) / +41.0bp | -0.15% / -0.39% / +0.17% |
| 09-11 8月CPI | 2026-09-11 12:30 / 08:30 EDT | Inflation Rate YoY (Aug) | 3.40 / 3.40 / +0.00% | 4.63% (+7.0bp) / 4.96% (+1.0bp) / +33.0bp | +0.91% / +0.85% / +0.11% |
| 09-16 9月FOMC | 2026-09-16 18:00 / 14:00 EDT | Fed Interest Rate Decision | 4.00 / 4.00 / +0.00% | 4.74% (+7.0bp) / 5.01% (+1.0bp) / +27.0bp | +0.28% / -0.44% / +0.21% |
| 10-02 9月非农 | 2026-10-02 12:30 / 08:30 EDT | Non Farm Payrolls (Sep) | 29.00 / 90.00 / -61.00K | 4.83% (+5.0bp) / 5.28% (+4.0bp) / +45.0bp | +0.86% / +0.74% / -0.30% |
| 10-14 9月CPI | 2026-10-14 12:30 / 08:30 EDT | Inflation Rate YoY (Sep) | 3.70 / 3.60 / +0.10% | 4.82% (+3.0bp) / 5.19% (-2.0bp) / +37.0bp | -0.40% / -1.08% / +0.66% |
| 10-28 10月FOMC | 2026-10-28 18:00 / 14:00 EDT | Fed Interest Rate Decision | 4.00 / 4.00 / +0.00% | 4.67% (-3.0bp) / 5.05% (+6.0bp) / +38.0bp | +0.23% / +0.34% / -0.78% |
| 11-06 10月非农 | 2026-11-06 13:30 / 08:30 EST | Non Farm Payrolls (Oct) | 165.00 / 65.00 / +100.00K | 4.51% (+5.0bp) / 4.86% (+2.0bp) / +35.0bp | +0.25% / +0.31% / -0.01% |
结合上表与 2026 年截至 11 月 7 日的实盘归档数据,可以提炼出四项关键的跨资产定价与回测特征:
- 多数事件中短端 2 年期美债(
year2)对非农与通胀预期差的变动幅度大于长端 10 年期(year10):在 2026 年截至 11 月 7 日的 21 场非农与 CPI 事件中,有 16 场满足year2当日绝对基点变动严格大于year10(另有 2 场持平,合计 18 场大于或等于year10)。例如在 2026-07-02 公布的 6 月非农(Non Farm Payrolls (Jun))中,实际值 57.00K 低于预期 110.00K(预期差 -53.00K),对照前一日(2026-07-01)的year24.17% 与year104.48%,当日year2下行 -3.0bp 至 4.14%,而year10微升 +1.0bp 至 4.49%;在 2026-07-14 公布的 6 月 CPI(Inflation Rate YoY (Jun))中,实际值 3.50% 低于预期 3.80%(预期差为 -0.30 个百分点),year2单日回落 -8.0bp 至 4.18%,year10回落 -4.0bp 至 4.58%,2s10s 期限利差走阔 +4.0bp 至 +40.0bp,SPY 当日跳空高开 +0.23% 并收涨 +0.36%。反之,在 2026-11-06 公布的 10 月非农(Non Farm Payrolls (Oct))中,实际新增就业 165.00K 高于预期 65.00K(预期差 +100.00K),同日公布的 10 月失业率(Unemployment Rate (Oct))降至 4.1%(低于预期 4.2%),当日year2上行 +5.0bp 至 4.51%,year10上行 +2.0bp 至 4.86%,2s10s 利差收窄 3.0bp 至 +35.0bp;而在上半年 2026-06-05 公布的 5 月非农(实际 172.00K 对比预期 85.00K,预期差 +87.00K)中,year2单日上行 +12.0bp 至 4.17%,year10上行 +8.0bp 至 4.55%,同日 SPY 开盘跳空低开 -0.63%、全天收跌 -2.58%。 - 区分“事件日整体表现”与“信号公布后可捕获收益”:表一展示的是事件日市场表现,但在回测交易信号时,必须严格区分盘前发布(08:30 ET)与盘中发布(14:00 ET)的可交易窗口。对于美东 08:30 发布的非农与 CPI,09:30 的开盘跳空(
open_T / close_{T-1} - 1)发生在美股常规交易时段开盘之前:以 2026-03-06 公布的 2 月非农(初值 -92.00K 对比预期 59.00K,预期差 -151.00K)为例,SPY 前收盘为 681.31 美元、当日 09:30 开盘为 673.41 美元、收盘为 672.38 美元,其中 -1.16% 是前收到开盘的隔夜跳空;若策略在 08:30 读到非农数据后,等到 09:30 常规交易时段开盘才按开盘价买入或做空,按当日开收盘价(close_T / open_T - 1)计算,日内常规时段价格变动仅为 -0.15%(若要捕获 08:30 至 09:30 之间的瞬时脉冲,回测必须接入盘前延长时段报价或股指/国债期货)。相反,对于美东 14:00(盘中) 发布的 FOMC 利率决议,同日 09:30 的开盘跳空发生在决议公布前 4.5 小时,全天涨跌幅也包含了会前早盘行情,决议落地后的真实交易收益必须用 14:00 之后的日内分钟线单独切分。 - 5 分钟 K 线(
/stable/historical-chart/5min)精准切分 14:00 ET 美联储决议公布后走势:以 2026-09-16 的 9 月 FOMC 会议为例,美联储于当日 18:00:00 UTC(14:00:00 EDT)宣布将联邦基金利率目标区间上调 25bp 至 3.75%–4.00%,日历接口actual= 4.00 记录的是目标区间上限(当次estimate亦为 4.00,previous为 3.75),当日 2 年期美债收益率升至 4.74%(+7.0bp),10 年期美债收益率突破 5.00% 关口至 5.01%(+1.0bp),2s10s 利差压缩至年内事件样本低位 +27.0bp。调取/stable/historical-chart/5min的日内切片可见:SPY 在决议前最后一根 5 分钟线(2026-09-16 13:55:00 K 线)收盘于 760.28 美元,单根 K 线成交量仅 24.48 万股(精确值 244,780 股);在 2026-09-16 14:00:00(对应 14:00 至 14:05 窗口)决议落地瞬间,单根 5 分钟成交量放大 7.16 倍至 175.32 万股(TLT 同根 14:00:00 K 线成交量也从 99.52 万股放大 4.34 倍至 432.06 万股);随后经过 14:00 决议声明与 14:30 美联储新闻发布会(Press Conference)两个阶段,SPY 从决议前 13:55:00 收盘的 760.28 美元一路回落至 15:55:00 常规收盘的 754.07 美元(决议公布后至收盘的价格变动为 -0.82%),将早盘 +0.28% 的跳空高开完全回吐并转为全天收跌 -0.44%。 - 耶稣受难日(2026-04-03)节后首个常规交易日对齐说明:在表一首行 04-03 3月非农中,日历发布日期为 2026-04-03(周五),
/stable/treasury-rates返回的当日收益率反应日tr_date为 2026-04-03(较前一日 2026-04-02 的year23.79%、year104.31% 分别变动 +5.0bp 与 +4.0bp);而股票 ETF 的反应日eq_date则通过二分查找自动映射至节后首个美股常规交易日 2026-04-06(周一),当日 SPY 较周四(2026-04-02)收盘价 655.83 美元微幅高开于 655.86 美元(跳空 +0.0046%,四舍五入为 +0.00%),全天收于 658.93 美元(+0.47%),TLT 则跳空低开 -0.33%(从 86.79 美元跌至 86.50 美元)、全天收跌 -0.16%。此外,表一中 SPY 与 TLT 的单日跳空与涨跌幅均基于/stable/historical-price-eod/full的未复权open与close计算,用于刻画事件落地当日的盘面价格表现;如需跨月长周期持有总回报归因,可参阅站内 美股分红复权行情与总回报率计算实战。
三、Python 实战:严格 90 天分片拉取与跨市场时间轴对齐脚本
在编写自动化拉取代码前,必须高度警惕 /stable/economic-calendar 与 /stable/treasury-rates 两个接口共同存在的单次请求 to - from <= 90 天(含首尾最多 91 个自然日)窗口上限。实测显示:
- 若直接单次请求
/stable/treasury-rates?from=2026-01-01&to=2026-11-07(跨度 310 天),接口不会报错,但会按自然日从to向前静默截断 90 天,仅返回 2026-08-10 至 2026-11-06 期间的 63 个交易日记录(/stable/economic-calendar同样只返回 2026-08-10 起的 1,116 条记录)。 - 更隐蔽的坑在于按自然季度习惯分片:如果直接按自然季度切分为
("2026-07-01", "2026-09-30"),由于 7 月与 8 月各有 31 天,该窗口端点差值达到了 91 天(含首尾共 92 个自然日),恰好超出上限 1 天!接口会静默截掉首日 2026-07-01(当日美债真实记录为year2= 4.17%、year10= 4.48%,且当日有 25 条美国宏观日历事件),进而导致次日 2026-07-02(6 月非农) 在查找前一日美债基线tr_dates[ti - 1]时误取到 2026-06-30(year2= 4.14%、year10= 4.44%),把 2026-07-02 当天真实的year2-3.0bp、10Y +1.0bp 变动算错为 +0.0bp 与 +5.0bp! - 因此,工程上必须严格按
结束日 = min(起始日 + 89 天, 总结束日)(即单窗含首尾不超过 90 个自然日)生成分片窗口。对/stable/treasury-rates按date去重、对/stable/economic-calendar按(date, country, event)复合键去重后,即可无损拿齐 2026 年截至 11 月 7 日的全部 214 个美债交易日(加上脚本中 2025-12-20 至 2025-12-31 的 7 个交易日基线共 221 个交易日)以及 3,901 条美国宏观日历流水。
以下完整可运行的 Python 脚本(共 45 行)采用严格的 89 天步长分片,使用 Python 标准库 zoneinfo 自动处理 UTC 到 America/New_York(自适应 EST/EDT 冬夏令时)的时区转换,并利用 bisect_left 将每场事件分别对齐至美债与美股各自的首个可交易日(同时输出前一美债观测日 prev 以供核验),运行输出与表一的 13 行数据逐项完全吻合:
import bisect
import datetime
import json
import os
import urllib.parse
import urllib.request
from zoneinfo import ZoneInfo
BASE_URL = "https://quote-fmp.com/stable"
API_KEY = os.environ["FMP_KEY"]
# 严格按 结束日 = min(起始日 + 89天, 总结束日) 步进,确保单窗含首尾不超过 90 天
CHUNKS = [("2026-01-01", "2026-03-31"), ("2026-04-01", "2026-06-29"), ("2026-06-30", "2026-09-27"), ("2026-09-28", "2026-11-07")]
def fetch_json(endpoint: str, params: dict) -> list:
q = urllib.parse.urlencode({**params, "apikey": API_KEY})
req = urllib.request.Request(f"{BASE_URL}/{endpoint}?{q}", headers={"User-Agent": "Mozilla/5.0"})
with urllib.request.urlopen(req, timeout=20) as resp:
return json.loads(resp.read().decode("utf-8"))
us_cal = list({(r["date"], r["country"], r["event"]): r for f, t in CHUNKS for r in fetch_json("economic-calendar", {"country": "US", "from": f, "to": t}) if r.get("country") == "US"}.values())
tr_map = {r["date"]: r for f, t in [("2025-12-20", "2025-12-31")] + CHUNKS for r in fetch_json("treasury-rates", {"from": f, "to": t})}
spy_map = {r["date"]: r for r in fetch_json("historical-price-eod/full", {"symbol": "SPY", "from": "2025-12-20", "to": "2026-11-07"})}
tlt_map = {r["date"]: r for r in fetch_json("historical-price-eod/full", {"symbol": "TLT", "from": "2025-12-20", "to": "2026-11-07"})}
tr_dates, eq_dates = sorted(tr_map), sorted(spy_map)
utc_tz, ny_tz = ZoneInfo("UTC"), ZoneInfo("America/New_York")
events = sorted(
[r for r in us_cal if r.get("actual") is not None and r.get("estimate") is not None and (
r.get("event", "").startswith(("Non Farm Payrolls (", "Inflation Rate YoY (")) or r.get("event") == "Fed Interest Rate Decision"
)],
key=lambda x: (x["date"], x["event"]),
)
for ev in events:
dt_ny = datetime.datetime.strptime(ev["date"], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc_tz).astimezone(ny_tz)
cal_dt, ny_hm, tz_name = dt_ny.strftime("%Y-%m-%d"), dt_ny.strftime("%H:%M"), dt_ny.tzname()
ti, ei = bisect.bisect_left(tr_dates, cal_dt), bisect.bisect_left(eq_dates, cal_dt)
tr_dt, tr_prev, eq_dt = tr_dates[ti], tr_dates[ti - 1], eq_dates[ei]
if cal_dt < "2026-07-01" and cal_dt == eq_dt:
continue
tc, tp = tr_map[tr_dt], tr_map[tr_prev]
sc, sp, bc, bp = spy_map[eq_dt], spy_map[eq_dates[ei - 1]], tlt_map[eq_dt], tlt_map[eq_dates[ei - 1]]
d2y, d10y = (tc["year2"] - tp["year2"]) * 100, (tc["year10"] - tp["year10"]) * 100
sp_2s10s, surp = (tc["year10"] - tc["year2"]) * 100, float(ev["actual"]) - float(ev["estimate"])
spy_gap, spy_day, tlt_day = (sc["open"] / sp["close"] - 1) * 100, (sc["close"] / sp["close"] - 1) * 100, (bc["close"] / bp["close"] - 1) * 100
print(f"{ev['date']} UTC ({cal_dt} {ny_hm} {tz_name}) | {ev['event']:26s} | act={float(ev['actual']):6.2f} est={float(ev['estimate']):6.2f} surp={surp:+7.2f}{ev.get('unit','')} | tr={tr_dt}(prev={tr_prev}) 2Y={tc['year2']:.2f}%({d2y:+.1f}bp) 10Y={tc['year10']:.2f}%({d10y:+.1f}bp) 2s10s={sp_2s10s:+.1f}bp | eq={eq_dt} SPY_gap={spy_gap:+.2f}% SPY={spy_day:+.2f}% TLT={tlt_day:+.2f}%")
运行脚本前,请先通过环境变量注入密钥(Linux/macOS 使用 export FMP_KEY=your_api_key,Windows PowerShell 使用 $env:FMP_KEY="your_api_key";若在 Windows 环境下遇到 ModuleNotFoundError: No module named 'tzdata',请先执行 pip install tzdata 补齐 IANA 时区数据包)。若将第 38~39 行的 if cal_dt < "2026-07-01" and cal_dt == eq_dt: continue 过滤条件移除,脚本将直接打印 2026 年截至 11 月 7 日全部 28 场美国非农、CPI 与 FOMC 事件的完整对齐明细。
四、FMP 宏观经济与美债利率四大核心接口架构与参数速查
在实际搭建宏观数据库(Macro DB)与跨资产估值体系时,/stable/economic-calendar、/stable/treasury-rates、/stable/economic-indicators 与 /stable/market-risk-premium 四个接口各司其职。下表汇总了这组接口加上行情对齐接口的请求路径、必选/可选查询参数、核心响应字段(附站内官方中文名)及回测调用边界:
| 接口简称 | 请求路径与核心参数 | 核心响应字段(官方中文名) | 窗口限制与工程调用边界 |
|---|---|---|---|
| 经济数据日历 | /stable/economic-calendar;可选 country(如 US)、from、to | date(日期,UTC 精确到秒)、country(国家/地区)、event(事件名称)、previous(上一期数值)、estimate(分析师预期值)、actual(实际值)、change(涨跌额)、impact(影响:High / Medium / Low)、changePercentage(涨跌幅(%))、unit(单位) | 单次 to - from 跨度上限 90 个自然日;country=US 支持服务端过滤,建议客户端再做一次 r["country"] == "US" 断言;按 (date, country, event) 复合键去重;本次样本 actual 与官方首发初值相符 |
| 美国国债收益率 | /stable/treasury-rates;可选 from、to | date(日期)、month1(1 月期)、month2(2 月期)、month3(3 月期)、month6(6 月期)、year1(1 年期)、year2(2 年期)、year3(3 年期)、year5(5 年期)、year7(7 年期)、year10(10 年期)、year20(20 年期)、year30(30 年期) | 单次 to - from 跨度上限 90 个自然日(超限将从 to 向前按自然日静默截断 90 天);按 date 去重;单条记录集齐 12 个期限点位(如 2026-11-06 最新 month3 = 4.19%、year2 = 4.51%、year10 = 4.86%、year30 = 5.26%) |
| 经济指标序列 | /stable/economic-indicators;必选 name,可选 from、to | name(名称)、date(日期,统计归属期首日或日频观测日)、value(数值) | name 须严格传入 24 个标准枚举名称(如非农必须传 totalNonfarmPayroll 而非 nonFarmPayrolls);月度/季度序列的 date 为统计归属期且含事后修正,仅适合宏观周期象限划分,不可直接按 date 做交易回测 |
| 市场风险溢价 | /stable/market-risk-premium;无需参数 | country(国家/地区)、continent(所属大洲)、countryRiskPremium(国家风险溢价)、totalEquityRiskPremium(总股权风险溢价) | 一次返回全球各国最新股权风险溢价(如美国 United States 当前 countryRiskPremium = 0.23%、totalEquityRiskPremium = 4.46%),常与 year10 组合用于 CAPM 与 WACC 贴现率建模 |
| 日线与5分钟行情 | /stable/historical-price-eod/full 与 /stable/historical-chart/5min;必选 symbol | date(日期或美东分钟时间戳)、open(开盘价)、high(最高价)、low(最低价)、close(收盘价)、volume(成交量) | 5 分钟线仅覆盖美股常规交易时段(09:30:00 至 15:55:00 ET,每日 78 根 K 线);盘前 08:30 ET 非农/CPI 冲击需区分 09:30 开盘跳空与盘中涨跌,盘中 14:00 ET 利率决议则直接对齐 14:00:00 K 线 |
在调用 /stable/economic-indicators 时,还有两项高频易错细节值得特别提醒:
- 严格校验 24 个官方
name枚举值:该接口对name参数执行严格匹配,传入未收录的名称(如nonFarmPayrolls)会直接返回空响应。官方支持的 24 个标准指标名称包括:GDP、realGDP(如 2026-07-01 对应 2026Q3 实际 GDP 为 24,611.077 十亿美元)、nominalPotentialGDP、realGDPPerCapita、federalFunds(月度有效联邦基金利率,2026-10-01 为 3.88%)、CPI(月度消费者物价指数定基水平,2026-09-01 为 336.298)、inflationRate、inflation、retailSales、consumerSentiment、durableGoods、unemploymentRate、totalNonfarmPayroll、initialClaims、industrialProductionTotalIndex、newPrivatelyOwnedHousingUnitsStartedTotalUnits、totalVehicleSales、retailMoneyFunds、smoothedUSRecessionProbabilities(平滑美国衰退概率,2026-09-01 为 0.4%)、3MonthOr90DayRatesAndYieldsCertificatesOfDeposit、commercialBankInterestRateOnCreditCardPlansAllAccounts、30YearFixedRateMortgageAverage、15YearFixedRateMortgageAverage以及tradeBalanceGoodsAndServices。 - 区分
CPI、inflationRate与日历 Inflation Rate YoY 的物理口径:在/stable/economic-indicators中,name=CPI返回的是美国城市消费者物价指数的月度定基绝对水平(如 2026-09-01 为 336.298,2026-08-01 为 334.131);而name=inflationRate返回的是日频通胀预期序列,2026 年截至 11 月 6 日已更新 214 个交易日(日期集合与 214 个美债交易日完全一致,2026-11-06 最新值为 2.23%)。若需要获取每月新闻头条播报的“美国 CPI 同比增速(如 2026 年 9 月同比 +3.70%)”与“核心 CPI 同比增速(Core Inflation Rate YoY (Sep),2026 年 9 月为 +2.60%,预期 2.50%,前值 2.40%)”,应从/stable/economic-calendar中按事件名称过滤提取。至于如何将/stable/treasury-rates的year10无风险利率与/stable/market-risk-premium的totalEquityRiskPremium(美国为 4.46%)动态注入企业贴现现金流与加权平均资本成本(WACC)模型,可进一步调用 Custom DCF Advanced(自定义DCF高级估值接口,/stable/custom-discounted-cash-flow)完成估值敏感度测算。
五、常见问题(FAQ)
1. 为什么在 /stable/economic-calendar 中,美国非农和 CPI 的发布时间有时是 12:30:00,有时却是 13:30:00?
这是因为 /stable/economic-calendar 的 date 字段统一使用 UTC(零时区) 记录,而美国劳工统计局(BLS)发布非农就业与 CPI 的时间固定为美东时间(America/New_York)早晨 08:30:00。在每年 3 月第二个周日至 11 月第一个周日的北美夏令时(EDT,UTC-4)期间,08:30 EDT 对应 12:30:00 UTC(如 2026-03-11 至 2026-10-14 的各次发布);而在北美冬令时(EST,UTC-5)期间,08:30 EST 则对应 13:30:00 UTC(如 2026-01-09、2026-02-11、2026-03-06 以及夏令时结束后的 2026-11-06)。在 Python 回测脚本中使用 ZoneInfo("UTC") 转 ZoneInfo("America/New_York"),即可将全年所有非农与 CPI 发布时刻自动还原为美东时间 08:30:00。
2. 回测非农或 CPI 交易策略时,为什么不能直接用 /stable/economic-indicators 的 date 字段对齐日线行情?
主要有两个原因:第一是严重的未来函数(Look-Ahead Bias),/stable/economic-indicators 中月度指标的 date 标注的是统计归属月首日(例如 2026 年 10 月非农标注为 2026-10-01,2026 年 9 月 CPI 标注为 2026-09-01),比真实发布日(分别为 2026-11-06 与 2026-10-14)早了 36 至 43 天;第二是事后修正覆盖,指标序列接口保存的是后续月份修订后的最新值(如 2026 年 7 月非农初值为 -23.00K,次月被修正为 +21.00K),会抹平发布当日真实的预期差(actual - estimate)。因此,事件驱动回测应以 /stable/economic-calendar 的发布时间戳与初值 actual 为准,并在实盘管线中持久化保存每次公布前后的预期快照与实际到达时间。
3. 调用 /stable/treasury-rates 或 /stable/economic-calendar 拉取全年或多年历史数据时,为什么连按自然季度分片都会丢数据?该如何正确分片与去重?
这两个接口的单次请求窗口上限均为 to - from <= 90 天(含首尾最多 91 个自然日)。当传入超过上限的区间时,服务端不会报错,而是从 to 向前截取 90 天返回:如果简单按自然季度传入 from=2026-07-01&to=2026-09-30(7 月和 8 月均为 31 天,首尾跨度达 92 个自然日、差值 91 天),首日 2026-07-01 就会被静默截断,进而导致 2026-07-02 非农当日的美债收益率变动算错基线!正确做法是按 结束日 = min(起始日 + 89 天, 总结束日) 循环生成窗口,下一段从结束日次日开始。此外,两个接口的去重主键截然不同:/stable/treasury-rates 每个交易日仅一行,直接按 date 去重即可;而 /stable/economic-calendar 在同一秒(如 2026-11-06 13:30:00)会同时发布非农就业、失业率、U-6 失业率与平均时薪等多条记录,必须按 (date, country, event) 复合键去重,切勿仅按 date 去重以免丢失同秒并发事件。
你可以直接访问 接口目录 查阅 Economic Data Releases Calendar(经济数据日历接口)、Treasury Rates(美国国债收益率接口)与 Economics Indicators(经济指标数据接口)的完整字段说明与在线调试示例;如需在本地实测上述宏观经济日历与美债收益率对齐脚本,可前往 快速接入指南 获取测试密钥运行文中代码。