顧客とディーラーに利下げ・据え置き・利上げの確率を表示する

金利確率の表示に必要なのは3つです。各会合の利下げ・据え置き・利上げの確率(%)、その価格が付いた時刻、顧客が正しく読み取れる表現です。Narwhal は会合ごとの確率を as_of の時刻付きで返します。このページでは表示のルールを説明します。

パスを一度取得し、価格が付いた時刻を表示する

金利確率を表示するプロダクトには、デザイン以前に2つの問題があります。数字は動くため、読み込み時点で正しかった画面が1時間後には誤りになりえます。1回のリクエストで、ある中央銀行について価格が付いた全会合と、気配を取得した時刻が返ります。この例では連邦準備制度を指定し、最初の2会合だけを残します。

curl、連邦準備制度の政策金利パス
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/predictions/policy-paths/federal-reserve"
レスポンス、最初の2会合
{
  "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になるため、スクリプトは余りの点を端数が最大のものに配分します。

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ディーリングルーム向け:市場が織り込む平均的な変動幅(ベーシスポイント)

これらは契約の価格なので、市場の確率であると明記してください。「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 金利確率の読み方 のガイドで説明しています。

公開。

次のステップ