把市場機率用作輸入訊號,並衡量預期變動的變化

要把市場機率用作輸入,需要按排程讀取政策利率路徑,並用較晚的預期變動減去較早的預期變動。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。想詳細了解如何解讀某一次會議,請參閱央行利率決策機率。

發布於 。

後續步驟