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キーを設定
- 無料キーを作成する narwhalapi.com/signup で無料のキーを作成してください。同じキーを各リクエストの Authorization ヘッダーに入れるので、スクリプト全体で使えます。
- キーをシェルの環境変数に保存する curl と Python を使うシェルで
NARWHAL_API_KEYを設定し、プレースホルダーをご自身のキーに置き換えます。Python のヘルパーは、Bearer ヘッダーを作るときにこの環境変数を読みます。export NARWHAL_API_KEY=... - Python 3 用の requests をインストールする Python スクリプトのために
requestsをインストールします。PyPI にはnarwhalapiSDK もあり、pip install narwhalapiで入手できます。pip install requests
Python を書く前にデータを取得する
- 祝日の JSON をリクエストする シェルで設定した環境変数を使って curl を実行します。このリクエストは、祝日のエンドポイントに Bearer ヘッダーを送り、Python コードを書く前に JSON を表示します。
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \ "https://api.narwhalapi.com/v1/calendars/holidays/USA/2026" - 祝日の行を読む 返された行は
holidaysにあります。各行にdateとnameがあり、Python のサンプルは行数を数えたあと、これらのフィールドで最初の祝日を表示します。
コードでデータを取得する
6つのリクエストすべてで、共通の get ヘルパーを使います。API のベース URL とパスを結合し、ヘッダーを送り、クエリパラメーターを渡して、raise_for_status() のあとで JSON を読みます。そのあと各呼び出しが領域ごとのレスポンスフィールドを選ぶので、print 文では祝日の行、公開日、観測値、スポット価格、為替レート、会合の確率を扱えます。
クエリパラメーターは個々の呼び出しに残します。公開日のリクエストには国、日付の範囲、上限が入り、為替のリクエストには通貨が入ります。ヘルパーはそれらを params で送り、解析済みのレスポンスを返します。各サンプルが get、API、HEADERS を使えるように、ヘルパーは領域ごとのサンプルより上に置いてください。以下の各サンプルは、それぞれのパスとレスポンスフィールドでこのヘルパーを再利用します。
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回呼び出すだけで、リクエスト数は少なく済みます。
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 = 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 = 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 をまとめてリクエストします。
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 の値を表示します。
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 でレスポンスのフィールドを選んでください。
公開。