Excel Power Query API で Narwhal のデータを取得する

Excel の Power Query と Narwhal を使うと、祝日、発表日、経済データ、コモディティのスポット価格、為替レート、予測市場の確率をブックに取り込めます。Narwhal のアカウントとAPIキーはこれらのデータ API 全体で使え、Excel はブックを開いている間、クエリを更新できます。

セットアップする内容

Power Query は、Excel から API にリクエストを送り、JSON レスポンスを読み取るための仕組みです。ブックに、祝日の表や Brent のスポット価格など、必要なデータのクエリができあがります。実際には、領域ごとに 1 つのクエリを作ります。例ではどれも同じベース URL と Authorization ヘッダーを使い、パスとレスポンスのフィールドだけが領域ごとに違います。Narwhal は、CPI、インフレ、GDP、利回りといった経済データにも同じアカウントを使います。

APIキーを設定

  1. 無料キーを作成する Narwhal のサインアップ で無料のキーを作成します。ここで使うデータ API は、1 つのアカウントと 1 つのAPIキーでまとめて利用できます。REST と MCP は同じキーを共有しており、Excel の例ではそれを REST リクエストに付けて送ります。
  2. キーを環境変数に保管する キーを NARWHAL_API_KEY という環境変数に保存します。Power Query の M コードの例では、Authorization ヘッダーの YOUR_KEY を自分のキーに置き換えてください。ヘッダーの値は Bearer で始まり、そのあとにキーが続きます。
  3. ブックを非公開に保つ Authorization ヘッダーは M コードの中にあるため、Power Query はキーをブックの中に保存します。ブック用には無料のキーを使い、ファイルは共有しないでください。これらの例では、環境変数がキーの値の代わりになることはありません。

空のクエリを開く

  1. [データの取得] を開く [データ] タブから [データの取得] を開きます。[その他のデータ ソースから]、[空のクエリ] の順に選びます。これらが、リクエストを始めるための Power Query のコントロールです。
  2. 詳細エディターを開く 空のクエリを詳細エディターで開き、次のセクションの M コードを貼り付けます。クエリを更新する前に、ヘッダーに自分のキーを入れてください。
  3. 返す結果を選ぶ in の後ろの式が、そのクエリの結果を決めます。完全版の例では Holidays を返します。表なら Releases、Cpi、Fx、Fed、スポット価格なら Brent を返すようにします。取得したい領域ごとに、別々のクエリを使ってください。

Power Query M でデータを取得する

Web.Contents では https://api.narwhalapi.com を固定したままにします。エンドポイントのパスは RelativePath、パラメーターは Query に入れてください。そうすると更新が正しく動きます。Narwhal ヘルパーが JSON レスポンスを読み取り、各式が領域ごとのフィールドを選びます。発表日の式は出力する列の名前を指定し、MissingField.UseNull を使います。

ヘルパーは、パスと、省略可能なクエリパラメーターのレコードを受け取ります。クエリのレコードを渡さないときは、空のレコードを使います。Table.FromRecords はレコードの集まりをテーブルにして返し、Number.FromText は Brent の価格を数値にします。取得したい領域のレスポンスフィールドの選択は、呼び出しにつなげたままにしてください。

6 つの領域すべての Power Query M
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ])),
    Holidays = Table.FromRecords(Narwhal("v1/calendars/holidays/USA/2026")[holidays]),
    Releases = Table.FromRecords(
        Narwhal(
            "v1/economics/calendar",
            [countries = "USA", start_date = "2026-11-01",
             end_date = "2026-11-30", limit = "100"]
        )[releases],
        {"at", "period", "topic", "status"}, MissingField.UseNull),
    Cpi = Table.FromRecords(
        Narwhal("v1/economics/USA/cpi/observations", [start = "2025-09"])[observations]
    ),
    Brent = Number.FromText(Narwhal("v1/commodities/spot/BRENT/USD")[price]),
    Fx = Table.FromRecords(Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates]),
    Fed = Table.FromRecords(
        Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings]
    )
in
    // return Releases, Cpi, Fx or Fed the same way;
    // each area is its own query in practice
    Holidays

ブックをスケジュールで更新する

クエリを更新するには、[データ] タブの [すべて更新] を使います。クエリのプロパティで、ファイルを開くときに更新する設定と、開いている間は N 分ごとに更新する設定ができます。これらの設定は開いているブックにだけ適用されるため、間隔ごとの更新を使うならブックを開いたままにしてください。

Excel にはバックグラウンドのスケジューラーがありません。無人で実行するには、Power Automate か Excel 外のスクリプトを使います。ファイルを開いたときに更新する設定のクエリは、ファイルを再び開いたときにデータを取得できます。一定間隔の更新は、ブックが開いたままであることが前提です。データを更新したいクエリには、それぞれ更新のプロパティを設定してください。

Excel で祝日を調べる

holidays フィールドから、2026年のアメリカの祝日を読み取ります。各祝日には date と name があり、Table.FromRecords がレコードをテーブルにします。このサンプルは、完全版の例と同じヘルパーとヘッダーを使って、祝日のテーブルをそのまま返します。独立したクエリとして使う前に、キーを置き換えてください。

アメリカの祝日テーブル
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ]))
in Table.FromRecords(Narwhal("v1/calendars/holidays/USA/2026")[holidays])

Excel で発表日を調べる

releases から、2026年11月のアメリカの経済指標の発表日を取得します。返るフィールドは at、period、topic、status です。国と日付のパラメーターは Query レコードに入れたままにします。このリクエストは発表カレンダー用です。CPI の観測期間と値が必要なときは、経済データのクエリを使ってください。

アメリカの発表カレンダー
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ]))
in Table.FromRecords(
    Narwhal(
        "v1/economics/calendar",
        [countries = "USA", start_date = "2026-11-01",
         end_date = "2026-11-30", limit = "100"]
    )[releases],
    {"at", "period", "topic", "status"},
    MissingField.UseNull
)

Excel で経済データを調べる

開始パラメーターを 2025年9月にして、アメリカの CPI 観測値をリクエストします。observations を読み取ると、period と value のフィールドがテーブルになります。結果をブックで使うときは、期間を観測値と組にしておいてください。開始パラメーターは、完全版の例と同じく Query に入れておきます。

アメリカの CPI 観測値
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ]))
in Table.FromRecords(
    Narwhal("v1/economics/USA/cpi/observations", [start = "2025-09"])[observations]
)

Excel でコモディティのスポット価格を調べる

Brent の USD 建てスポット価格を price から読み取ります。このレスポンスフィールドは価格で、M の式は Number.FromText を使って数値として返します。コモディティのスポットコードには、たとえば XAU、XAG、XPT、XPD、XCU、BRENT、WTI があります。このサンプルでは BRENT を使います。

USD 建ての Brent スポット価格
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ]))
in Number.FromText(Narwhal("v1/commodities/spot/BRENT/USD")[price])

Excel で為替レートを調べる

基準通貨に USD を使い、currencies パラメーターに EUR と IDR を指定します。レスポンスから rates を選び、レコードをテーブルにします。各レコードには currency と rate があるため、クエリ結果でも通貨がレートの隣に残ります。

USD の為替レート
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ]))
in Table.FromRecords(Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates])

Excel で予測市場の確率を調べる

連邦準備制度の政策パスを取得し、レスポンスから meetings を読み取ります。各会合には resolves_at、p_cut、p_hold、p_hike があります。このサンプルは会合をテーブルとして返し、確定時刻と政策確率がフィールドとして使えます。これらの確率をブックで使いたいときは、独立したクエリとして使ってください。

連邦準備制度の政策パス
let
    Narwhal = (path as text, optional query as record) =>
        Json.Document(Web.Contents("https://api.narwhalapi.com", [
            RelativePath = path,
            Query = if query = null then [] else query,
            Headers = [Authorization = "Bearer YOUR_KEY"]
        ]))
in Table.FromRecords(Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings])

Power Query が認証情報を求めるのはなぜですか?

Web ソースの認証には [匿名] を選びます。Power Query は、Authorization ヘッダーを匿名認証でのみ許可します。それでもリクエストは、M コードに書いたヘッダーで Narwhal のキーを送ります。Web ソースの資格情報として選ぶのは匿名です。

結果を NETWORKDAYS で使えますか?

はい。NETWORKDAYS の祝日の引数に、Holidays テーブルの date 列を指定します。この引数には、クエリが返した祝日の日付を使い、name 列には祝日の名前が入っています。アメリカの祝日の例は 2026年をリクエストしているため、その日付は 2026年の祝日です。その日付が必要な計算に、この結果を使ってください。

公開。

次のステップ