向客戶與交易員顯示降息、維持與升息的機率

利率機率的顯示需要三樣東西:每次會議降息、不變、升息的百分比,這些價格形成的時間,以及客戶能正確理解的措辭。Narwhal 依會議回傳機率,並附上 as_of 時間,本頁說明顯示規則。

請求一次路徑,並顯示定價時間

顯示利率機率的產品,在著手設計之前就有兩個問題。數字會變動,載入時正確的畫面,一小時後可能就不對了。一次請求即可回傳某家央行所有已定價的會議,以及報價的取得時間。這裡請求的是聯準會,並只保留前兩次會議。

curl,聯準會政策利率路徑
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/predictions/policy-paths/federal-reserve"
回應,前兩次會議
{
  "as_of": "2026-11-03T03:12:00Z",
  "meetings": [
    {
      "event_id": "usa-fed-2026-12",
      "p_cut": "0.0096",
      "p_hold": "0.2533",
      "p_hike": "0.7371",
      "expected_change_bps": "18.6",
      "cumulative_change_bps": "18.6",
      "resolves_at": "2026-12-09T19:00:00Z"
    },
    {
      "event_id": "usa-fed-2027-01",
      "p_cut": "0.0280",
      "p_hold": "0.7055",
      "p_hike": "0.2665",
      "expected_change_bps": "6.0",
      "cumulative_change_bps": "24.6",
      "resolves_at": "2027-01-27T19:00:00Z"
    }
  ]
}

p_cut、p_hold 和 p_hike 是介於 0 和 1 之間的十進位字串,每次會議三者加總為 1。resolves_at 是決議時間。as_of 是報價時間,也就是應該顯示在畫面上的時間,而不是你的伺服器發出請求的時間。

把欄位變成客戶能正確理解的句子

像 73.71% 這樣的數字讀起來像預測。有四條規則可以讓畫面維持誠實。四捨五入到整數百分比。讓三個數字加總為 100。稱其為交易者所定價的機率。在旁邊印出時間。腳本套用了前兩條規則並產生這一行文字。直接使用 round 會讓 1 月 27 日的會議顯示 27%、71% 和 3%,總和為 101,因此腳本把多出的一個百分點分給小數部分最大的數字。

python,接下來幾次會議的顯示行
import json, os, urllib.request
from datetime import datetime, timezone
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 whole_percent(odds):
    """Round to whole percents that add up to 100 (largest remainder)."""
    raw = {k: v * 100 for k, v in odds.items()}
    out = {k: int(v) for k, v in raw.items()}
    for k in sorted(raw, key=lambda k: raw[k] - out[k], reverse=True)[:100 - sum(out.values())]:
        out[k] += 1
    return out

path = get("/v1/predictions/policy-paths/federal-reserve")
as_of = datetime.fromisoformat(path["as_of"].replace("Z", "+00:00"))
age = int((datetime.now(timezone.utc) - as_of).total_seconds() // 60)
for m in path["meetings"][:3]:
    day = datetime.fromisoformat(m["resolves_at"].replace("Z", "+00:00"))
    p = whole_percent({k: Decimal(m["p_" + k]) for k in ("cut", "hold", "hike")})
    print(f"{day.day} {day:%B}: {p['hike']}% rise, {p['hold']}% no change, {p['cut']}% cut")
print(f"Market prices as of {as_of:%H:%M} UTC, {age} min old")
產出
9 December: 74% rise, 25% no change, 1% cut
27 January: 27% rise, 70% no change, 3% cut
17 March: 50% rise, 44% no change, 6% cut
Market prices as of 03:12 UTC, 0 min old
欄位面向客戶的措辭
p_hike升息的可能性
p_hold利率維持不變的可能性
p_cut降息的可能性
as_of價格時間,依客戶所在時區顯示
expected_change_bps面向交易室:市場定價的平均變動幅度,單位為基點

這些是合約價格,所以要寫明這是市場機率。避免使用「聯準會將會」之類的措辭。對於交易室,expected_change_bps 和 cumulative_change_bps 以基點給出每次會議的平均變動幅度和累計總和。

依你選擇的頻率更新顯示

Narwhal 在被請求時才回答,因此由產品決定多久請求一次。依你自己的間隔取得,把最近一次成功的回應放進快取,讓每次頁面瀏覽都讀取快取。繪製前先把 as_of 與目前時間比較。腳本會印出以分鐘計的時間差,當時間差超過業務設定的上限時,產品可以顯示提示或隱藏卡片。

政策路徑只帶有 as_of。對於單次會議,GET /v1/predictions/scalar/{event_id} 還會提供 status 和 stale 旗標,確認步驟可以藉此檢查卡片是否仍然有效。請捨棄 resolves_at 已經過去的資料列。

請快取回應,避免使用者流量直接打到 API。關於重試規則,請參閱指南快取回應並處理 429 錯誤。

為什麼四捨五入後的機率有時加起來是 99 或 101?

因為每個數字是單獨四捨五入的。在 1 月 27 日的會議上,四捨五入前的機率是升息 26.65、維持 70.55、降息 2.80。分別四捨五入得到 27、71 和 3,總和是 101。腳本中的最大餘數步驟會把缺少的點數加到餘數最大的數字上,得到 27、70 和 3。

畫面上可以稱之為預測嗎?

這些機率是 Kalshi 和 Polymarket 上交易的合約價格,以機率形式顯示。Narwhal 不做預測。請把卡片措辭為市場機率,顯示時間,並註明合約的來源。受監管產品的措辭是否需要審查,由公司自行決定。

這個顯示可以涵蓋哪些央行?

請求 GET /v1/predictions/topics?group=central_banks 取得決議市場。清單為每家銀行提供一個主題,例如聯準會、澳洲儲備銀行、日本央行和印尼銀行,並帶有下一次會議的 next_event_id。venues 欄位依主題而異。印尼銀行只列出 Kalshi,而聯準會列出 Kalshi 和 Polymarket。政策路徑支援 federal-reserve、european-central-bank、bank-of-japan、bank-of-canada、reserve-bank-of-australia、bank-of-england 和 bank-indonesia。

路徑包含多少次會議?

在上面的執行中,聯準會路徑包含從 2026 年 12 月到 2027 年的八次會議,每一列都有自己的 resolves_at。腳本顯示了三次。較長的圖表可以繪製所有資料列,cumulative_change_bps 給出平均變動幅度的累計總和。指南如何解讀聯準會利率機率說明了每個欄位。

發布於 。

後續步驟