金利確率の表示に必要なのは3つです。各会合の利下げ・据え置き・利上げの確率(%)、その価格が付いた時刻、顧客が正しく読み取れる表現です。Narwhal は会合ごとの確率を as_of の時刻付きで返します。このページでは表示のルールを説明します。
パスを一度取得し、価格が付いた時刻を表示する
金利確率を表示するプロダクトには、デザイン以前に2つの問題があります。数字は動くため、読み込み時点で正しかった画面が1時間後には誤りになりえます。1回のリクエストで、ある中央銀行について価格が付いた全会合と、気配を取得した時刻が返ります。この例では連邦準備制度を指定し、最初の2会合だけを残します。
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の間の10進数文字列で、会合ごとに合計が1になります。resolves_at は決定の時刻です。as_of は気配を取得した時刻で、画面に出すのはこの時刻です。サーバーがリクエストを送った時刻ではありません。
各項目を、顧客が正しく読める文にする
73.71% のような数字は予測のように見えます。画面を正確に保つルールは4つです。整数のパーセントに丸める。3つの数字の合計を100にする。トレーダーが織り込んでいる確率と呼ぶ。時刻を横に表示する。スクリプトは最初の2つのルールを適用して1行の文を作ります。単純な 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 | ディーリングルーム向け:市場が織り込む平均的な変動幅(ベーシスポイント) |
これらは契約の価格なので、市場の確率であると明記してください。「Fed は〜する」のような表現は避けます。ディーリングルームには、会合ごとの平均変動幅と累計をベーシスポイントで示す 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年にかけて8会合があり、各行に固有の resolves_at があります。スクリプトは3件を表示します。長いチャートでは全行をプロットでき、cumulative_change_bps は平均変動幅の累計を示します。各フィールドについては Fed 金利確率の読み方 のガイドで説明しています。
公開。