把市场概率用作输入信号,并衡量预期变动的变化

要把市场概率用作输入,需要按计划读取政策利率路径,并用较晚的预期变动减去较早的预期变动。Narwhal 为每次会议提供 expected_change_bps,既有实时数据,也有每日历史。

轮询政策利率路径

这里的信号是市场所隐含的央行政策利率变动。政策利率路径会为每一次即将召开的会议返回该值。下面的请求读取美联储,并只保留第一次会议。

curl,当前的政策利率路径
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,政策利率路径的每日历史
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 做减法,然后在两次实时轮询之间重复同样的计算。

Python,预期变动的变化
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-1219.5 bps18.5 bps-1.0 bps
usa-fed-2027-017.3 bps6.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。想详细了解如何解读某一次会议,请参阅央行利率决策概率。

发布于。

后续步骤