利率機率的顯示需要三樣東西:每次會議降息、不變、升息的百分比,這些價格形成的時間,以及客戶能正確理解的措辭。Narwhal 依會議回傳機率,並附上 as_of 時間,本頁說明顯示規則。
請求一次路徑,並顯示定價時間
顯示利率機率的產品,在著手設計之前就有兩個問題。數字會變動,載入時正確的畫面,一小時後可能就不對了。一次請求即可回傳某家央行所有已定價的會議,以及報價的取得時間。這裡請求的是聯準會,並只保留前兩次會議。
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,因此腳本把多出的一個百分點分給小數部分最大的數字。
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 給出平均變動幅度的累計總和。指南如何解讀聯準會利率機率說明了每個欄位。
發布於 。