Python で Narwhal API から為替レートなどを取得する

Python と Narwhal で、1つの API キーを使って祝日、公開日、経済データ、コモディティのスポット価格、為替レート、予測市場のオッズを取得できます。requests で JSON レスポンスを読み、cron でスクリプトをスケジュールして毎日取得します。

セットアップする内容

requests を入れた Python 3 で、Narwhal の REST API を呼び出し、データ領域ごとにレスポンスのフィールドを読むスクリプトを作れます。共通のリクエストヘルパー、領域ごとのサンプル、毎日の cron エントリが手に入ります。Narwhal はデータ API 全体で1つのアカウントと1つの API キーを使い、REST と MCP でキーを共有します。例ではベース URL に https://api.narwhalapi.com を使い、Authorization: Bearer YOUR_KEY を送ります。パスでデータ領域を選び、各呼び出しは JSON レスポンスから対応するフィールドを読みます。

APIキーを設定

  1. 無料キーを作成する narwhalapi.com/signup で無料のキーを作成してください。同じキーを各リクエストの Authorization ヘッダーに入れるので、スクリプト全体で使えます。
  2. キーをシェルの環境変数に保存する curl と Python を使うシェルで NARWHAL_API_KEY を設定し、プレースホルダーをご自身のキーに置き換えます。Python のヘルパーは、Bearer ヘッダーを作るときにこの環境変数を読みます。
    APIキー
    export NARWHAL_API_KEY=...
  3. Python 3 用の requests をインストールする Python スクリプトのために requests をインストールします。PyPI には narwhalapi SDK もあり、pip install narwhalapi で入手できます。
    requests のインストール
    pip install requests

Python を書く前にデータを取得する

  1. 祝日の JSON をリクエストする シェルで設定した環境変数を使って curl を実行します。このリクエストは、祝日のエンドポイントに Bearer ヘッダーを送り、Python コードを書く前に JSON を表示します。
    祝日のリクエスト
    curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
      "https://api.narwhalapi.com/v1/calendars/holidays/USA/2026"
  2. 祝日の行を読む 返された行は holidays にあります。各行に date と name があり、Python のサンプルは行数を数えたあと、これらのフィールドで最初の祝日を表示します。

コードでデータを取得する

6つのリクエストすべてで、共通の get ヘルパーを使います。API のベース URL とパスを結合し、ヘッダーを送り、クエリパラメーターを渡して、raise_for_status() のあとで JSON を読みます。そのあと各呼び出しが領域ごとのレスポンスフィールドを選ぶので、print 文では祝日の行、公開日、観測値、スポット価格、為替レート、会合の確率を扱えます。

クエリパラメーターは個々の呼び出しに残します。公開日のリクエストには国、日付の範囲、上限が入り、為替のリクエストには通貨が入ります。ヘルパーはそれらを params で送り、解析済みのレスポンスを返します。各サンプルが get、API、HEADERS を使えるように、ヘルパーは領域ごとのサンプルより上に置いてください。以下の各サンプルは、それぞれのパスとレスポンスフィールドでこのヘルパーを再利用します。

Python、6つの領域すべて
import os
import requests

API = "https://api.narwhalapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}


def get(path, **params):
    r = requests.get(API + path, params=params, headers=HEADERS, timeout=10)
    r.raise_for_status()
    return r.json()


holidays = get("/v1/calendars/holidays/USA/2026")["holidays"]
releases = get(
    "/v1/economics/calendar",
    countries="USA",
    start_date="2026-11-01",
    end_date="2026-11-30",
    limit=100,
)["releases"]
cpi = get("/v1/economics/USA/cpi/observations", start="2025-09")["observations"]
brent = get("/v1/commodities/spot/BRENT/USD")["price"]
fx = get("/v1/fx/rates/USD", currencies="EUR,IDR")["rates"]
fed = get("/v1/predictions/policy-paths/federal-reserve")["meetings"]

print(len(holidays), holidays[0]["date"], holidays[0]["name"])
print(len(releases), releases[0]["period"], releases[0].get("at"))
print(cpi[-1]["period"], cpi[-1]["value"])
print("Brent", brent)
print({r["currency"]: r["rate"] for r in fx})
print(fed[0]["resolves_at"][:10], fed[0]["p_hold"])

スケジュールで実行する

cron エントリで、スクリプトを1日1回実行できます。用意したエントリを、スクリプトの /path/pull.py とともに使います。/usr/bin/python3 を呼び出し、出力を pull.log に追記します。スクリプトは1日6回呼び出すだけで、リクエスト数は少なく済みます。

毎日の cron エントリ
0 7 * * * /usr/bin/python3 /path/pull.py >> pull.log

ジョブを実行する環境で NARWHAL_API_KEY を設定します。共有マシンでは、キーを crontab に書かず、ジョブが読み込むファイルに置いてください。スケジュール実行されるスクリプトも、シェルの例と同じ変数を読み、同じ Bearer ヘッダーでリクエストします。

Python の祝日

holidays を読んで、各祝日の日付と名前を取得します。2026年10月24日のレスポンスには、2026年の US の祝日が11件あり、最初は1月1日の元日です。このサンプルは共通のヘルパーを使い、最初の行からこの2つのフィールドを表示します。完全なスクリプトでは、祝日の行数も表示します。

祝日の日付と名前
holidays = get(
    "/v1/calendars/holidays/USA/2026"
)["holidays"]
print(holidays[0]["date"], holidays[0]["name"])

Python の公開日

releases を読むと、指定した国と日付の範囲の経済指標の公開日がわかります。各公開に at、period、topic、status があります。2026年10月24日のレスポンスには、2026年11月の範囲に31件の公開が含まれます。サンプルは最初の公開の period を表示し、完全なスクリプトと同じく .get() で at フィールドを読みます。

経済指標の公開日
releases = get(
    "/v1/economics/calendar",
    countries="USA",
    start_date="2026-11-01",
    end_date="2026-11-30",
    limit=100,
)["releases"]
print(releases[0]["period"], releases[0].get("at"))

Python の経済データ

observations を読むと、CPI の期間と値がわかります。start で、ある期間以降の観測値を指定します。2026年10月24日のレスポンスでは、2026年9月の CPI 指数は 336.940 です。各観測値に period と value があり、このサンプルは最後に返された行から両方のフィールドを読みます。Narwhal の経済データには、インフレ率、GDP、利回りも含まれます。

CPI 観測値
cpi = get(
    "/v1/economics/USA/cpi/observations", start="2025-09"
)["observations"]
print(cpi[-1]["period"], cpi[-1]["value"])

Python のコモディティのスポット価格

price を読むと、USD での Brent のスポット価格がわかります。2026年10月24日のレスポンスでは、Brent は1バレルあたり 116.8809 ドルです。サンプルはそのフィールドを brent に代入し、ラベルを付けて表示します。コモディティのスポットコードには、たとえば XAU、XAG、XPT、XPD、XCU、BRENT、WTI があり、このリクエストでは BRENT を使います。

Brent のスポット価格
brent = get(
    "/v1/commodities/spot/BRENT/USD"
)["price"]
print("Brent", brent)

Python の為替レート

rates を読むと、USD に対してリクエストした通貨のレートがわかります。各行に currency と rate があり、サンプルはそれを辞書に変換します。2026年10月24日のレスポンスでは、USD/EUR が 0.89342、USD/IDR が 18107.8 で、どちらも2026年10月23日の終値です。この呼び出しは、currencies パラメーターで EUR と IDR をまとめてリクエストします。

USD の為替レート
fx = get(
    "/v1/fx/rates/USD", currencies="EUR,IDR"
)["rates"]
print({r["currency"]: r["rate"] for r in fx})

Python の予測市場のオッズ

meetings を読むと、Federal Reserve の政策金利パスがわかります。各会合に resolves_at、p_cut、p_hold、p_hike があります。2026年10月24日のレスポンスでは、2026年10月28日の会合の据え置き確率は 0.9188 です。このサンプルは、完全なスクリプトと同じフィールドを使い、resolves_at の日付部分と最初の会合の p_hold の値を表示します。

Federal Reserve の会合の確率
fed = get(
    "/v1/predictions/policy-paths/federal-reserve"
)["meetings"]
print(fed[0]["resolves_at"][:10], fed[0]["p_hold"])

401 が返るのはなぜですか。

Authorization ヘッダーがないか、環境変数が空です。bool(os.environ.get('NARWHAL_API_KEY')) で、Python が NARWHAL_API_KEY の値を持っているか確認してください。ヘルパーはこの変数からヘッダーを作るので、スクリプトを実行する環境で設定します。期待されるヘッダーは Authorization: Bearer YOUR_KEY で、キーの値は環境変数から渡されます。スケジュール実行では、変数が空になっていないか、ジョブの環境で確認してください。

行のリストをテーブルにするにはどうしますか。

テーブルにしたい行のリストを pandas.DataFrame(rows) に渡します。祝日の呼び出しではそのリストが holidays、公開日では releases です。レスポンスの行を読んだあとのテーブルの扱いは、pandas のチュートリアルを参照してください。CPI の observations、為替の rates、予測の meetings の各フィールドも行のリストです。pandas.DataFrame(rows) に渡す前に、Python でレスポンスのフィールドを選んでください。

公開。

次のステップ