市場オッズを入力シグナルとして使い、予想変動幅の変化を測る

市場オッズを入力として使うには、政策金利パスを定期的に読み取り、後の予想変動幅から前の予想変動幅を引きます。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 とともに会合1件につき1行で保存し、4つの確率と変動のフィールドは Decimal 値のまま保持してください。

過去の日の同じパスを読む

履歴エンドポイントは1日につき1つのスナップショットを返します。start と end はどちらも必須で、日時の値なので、2026-10-26 だけでは拒否され、2026-10-26T00:00:00Z なら受け付けられます。期間は最大366日です。このリクエストは2026年10月26日から11月2日までを取得し、以下のレスポンスは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 には日付ごとに1件のエントリがあり、各エントリにはその日にまだ開催前だった会合が、ライブのパスと同じ確率フィールドとともに入っています。meeting_dates は各会合の resolves_at を1回ずつ示します。

2回の読み取りの間の変化を計算する

予想変動幅の変化は、同じ会合について、後の expected_change_bps から前の expected_change_bps を引いたものです。読み取りは位置ではなく event_id で対応づけてください。2026年10月26日の最初の行は10月の会合 usa-fed-2026-10 ですが、2026年11月2日までにその会合は決定済みなので、最初の行は12月の会合になります。スクリプトは Decimal で引き算を行い、続けて2回のライブポーリングの間でも同じ計算を繰り返します。

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

2分間隔で行った2回のライブポーリングでは、両方の会合で +0.0 bps と出力されました。変化がゼロというのも有効な読み取り結果です。これは、このフィールドが持つ小数第1位では気配値が動かなかったことを意味します。変化が負なら予想される動きが利下げ方向に、正なら利上げ方向にずれたことを示します。フィールドの値自体が0を下回っている場合、市場はその会合での利下げを見込んでいます。

数値を使う前に確認すること

  • 会合ごとの値どうしを比較してください。12月の会合について、10月26日から11月2日までの累積変化は -2.7 bps ですが、会合ごとの変化は -1.0 bps です。その間に10月の会合が決定され、その 1.7 bps が累計から外れたためです。
  • expected_change_bps は小数第1位まで持つため、0.1 bps より小さい変化は現れません。
  • 各読み取りの as_of を確認してください。as_of が同じ2つの読み取りは、同じ取引所の確認から得られたものです。
  • 価格が付いた会合がない中央銀行では、meetings リストが空で返ります。
  • これらの数値は市場の気配値です。その変化が何かを予測するかどうかについて Narwhal は何も述べておらず、このページもそうだとは主張しません。

ポーリングの代わりにアラートを受け取れますか。

はい。予測市場の確率が動いたときにアラートを受け取るガイドでその方法を説明しています。上のように定期実行しているスクリプトにはポーリングが向き、通知を受けたいしきい値がある場合にはアラートが向いています。

過去の読み取り結果をストアに初期投入するにはどうしますか。

履歴エンドポイントを最大366日ずつの期間で呼び出し、days の各エントリを、その date の日付を持つ読み取りとして読み込みます。続いて、政策金利パスからのライブポーリングを追加します。2つのソースは同じ確率と変動のフィールドを持つので、つなぎ目をまたいで比較できます。日次スナップショットは日付ごとに1つなので、2つのスナップショットの間に行ったポーリングには、比較できる履歴の行がありません。

2日間で最初の会合が変わったのはなぜですか。

パスには、まだ開催前の会合だけが並びます。連邦準備制度が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 にも応答します。1つの会合を詳しく読む方法は、中央銀行の金利決定の確率を参照してください。

公開。

次のステップ