要把市场概率用作输入,需要按计划读取政策利率路径,并用较晚的预期变动减去较早的预期变动。Narwhal 为每次会议提供 expected_change_bps,既有实时数据,也有每日历史。
轮询政策利率路径
这里的信号是市场所隐含的央行政策利率变动。政策利率路径会为每一次即将召开的会议返回该值。下面的请求读取美联储,并只保留第一次会议。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/predictions/policy-paths/federal-reserve"{
"as_of": "2026-11-03T02:28:00Z",
"meetings": [
{
"event_id": "usa-fed-2026-12",
"p_cut": "0.0097",
"p_hold": "0.2534",
"p_hike": "0.7369",
"expected_change_bps": "18.6",
"cumulative_change_bps": "18.6",
"resolves_at": "2026-12-09T19:00:00Z"
}
]
}expected_change_bps 是该次会议上政策利率变动经概率加权后的值,单位为基点。它表示的是变动量,绝不是当前利率。cumulative_change_bps 按顺序累加列表中的各次会议。p_cut、p_hold 和 p_hike 是其背后的概率,as_of 是报价的时间。请轮询该端点,并连同 as_of 存储每次读数,每次会议一行,四个概率与变动字段保存为 Decimal 值。
读取过去几天的同一路径
历史端点每天返回一份快照。start 和 end 都是必填项,且为日期时间值,所以只写 2026-10-26 会被拒绝,而 2026-10-26T00:00:00Z 则被接受。时间窗口最长为 366 天。下面的请求查询 2026 年 10 月 26 日至 11 月 2 日,下方响应只保留其中两天以及每天的第一次会议。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/predictions/policy-paths/federal-reserve/history?start=2026-10-26T00:00:00Z&end=2026-11-03T00:00:00Z"{
"meeting_dates": [
{
"event_id": "usa-fed-2026-10",
"resolves_at": "2026-10-28T18:00:00Z"
},
{
"event_id": "usa-fed-2026-12",
"resolves_at": "2026-12-09T19:00:00Z"
}
],
"days": [
{
"date": "2026-11-01",
"meetings": [
{
"event_id": "usa-fed-2026-12",
"p_cut": "0.0093",
"p_hold": "0.2766",
"p_hike": "0.7141",
"expected_change_bps": "17.9",
"cumulative_change_bps": "17.9"
}
]
},
{
"date": "2026-11-02",
"meetings": [
{
"event_id": "usa-fed-2026-12",
"p_cut": "0.0098",
"p_hold": "0.2535",
"p_hike": "0.7367",
"expected_change_bps": "18.5",
"cumulative_change_bps": "18.5"
}
]
}
]
}days 中每个日期对应一个条目,每个条目包含当天仍未结束的会议,概率字段与实时路径相同。meeting_dates 只给出每次会议的 resolves_at 一次。
计算两次读数之间的变化
预期变动的变化量,就是同一次会议较晚的 expected_change_bps 减去较早的 expected_change_bps。请按 event_id 而不是按位置来匹配读数。2026 年 10 月 26 日的第一行是 10 月会议 usa-fed-2026-10,而到 2026 年 11 月 2 日,这次会议已经有了结果,所以第一行变成了 12 月会议。脚本用 Decimal 做减法,然后在两次实时轮询之间重复同样的计算。
import json
import os
import time
import urllib.request
from decimal import Decimal
def get(path):
req = urllib.request.Request(
"https://api.narwhalapi.com" + path,
headers={"Authorization": "Bearer " + os.environ["NARWHAL_API_KEY"]},
)
with urllib.request.urlopen(req, timeout=30) as r:
return json.load(r)
def reading(meetings):
return {m["event_id"]: (Decimal(m["expected_change_bps"]), Decimal(m["cumulative_change_bps"]))
for m in meetings}
def change(before, after):
# Match meetings by event_id: the first row is a different meeting once a decision has passed.
return {e: (after[e][0] - before[e][0], after[e][1] - before[e][1])
for e in before if e in after}
path = "/v1/predictions/policy-paths/federal-reserve/history"
days = get(path + "?start=2026-10-26T00:00:00Z&end=2026-11-03T00:00:00Z")["days"]
first, last = days[0], days[-1]
print(first["date"], "->", last["date"])
for event_id, (move, cumulative) in list(change(reading(first["meetings"]),
reading(last["meetings"])).items())[:4]:
print(event_id, f"{move:+} bps at the meeting, {cumulative:+} bps cumulative")
# Polling: take a reading, wait, take another and run the same comparison.
def poll():
return reading(get("/v1/predictions/policy-paths/federal-reserve")["meetings"])
previous = poll()
time.sleep(120)
for event_id, (move, _) in list(change(previous, poll()).items())[:2]:
print(event_id, f"{move:+} bps since the last poll")
| 会议 | 2026 年 10 月 26 日 | 2026 年 11 月 2 日 | 预期变动的变化 |
|---|---|---|---|
usa-fed-2026-12 | 19.5 bps | 18.5 bps | -1.0 bps |
usa-fed-2027-01 | 7.3 bps | 6.1 bps | -1.2 bps |
相隔两分钟进行的两次实时轮询,对两次会议都输出了 +0.0 bps。变化为零也是有效的读数,它表示报价在该字段所保留的一位小数上没有变动。变化为负,表示预期变动向降息方向移动;变化为正,表示向加息方向移动。如果字段值本身小于零,则表示市场预期该次会议降息。
使用该数值前要检查什么
- 请拿各次会议自己的值相互比较。对 12 月会议来说,从 10 月 26 日到 11 月 2 日的累计变化是 -2.7 bps,而单次会议的变化是 -1.0 bps。这是因为 10 月会议在此期间已有结果,它的 1.7 bps 从累计值中去掉了。
expected_change_bps保留一位小数,所以小于 0.1 bps 的变化不会出现。- 请检查每次读数的
as_of。as_of相同的两次读数来自同一次交易场所检查。 - 没有定价会议的央行会返回空的
meetings列表。 - 这些数字是市场报价。Narwhal 不对这些数字的变化是否预示任何结果作出说明,本页也不作此类主张。
可以用提醒代替轮询吗?
可以。预测概率变动时获取提醒这篇指南介绍了该选项。轮询适合像上面这样已按计划运行的脚本,提醒则适合你希望在越过某个阈值时被告知的场景。
如何用过去的读数为存储库预填数据?
以最长 366 天为一个窗口调用历史端点,把 days 中的每个条目作为日期为其 date 的读数载入。然后再加入来自政策利率路径的实时轮询。两个来源带有相同的概率和变动字段,因此比较可以跨越衔接处。每日快照每个日期只有一份,所以两份快照之间的一次轮询没有可供比较的历史行。
为什么两天之间第一次会议变了?
路径只列出仍未结束的会议。美联储在 2026 年 10 月 28 日作出决定后,10 月会议就从列表中移除,12 月会议升到了第一行。在历史响应中,10 月 28 日的条目仍把 10 月会议列在最前,而 10 月 29 日的条目则以 12 月会议开头。
该路径覆盖哪些央行?
该路径支持 federal-reserve,同一个端点也支持 european-central-bank、bank-of-japan、bank-of-canada 和 reserve-bank-of-australia。想详细了解如何解读某一次会议,请参阅央行利率决策概率。
发布于。