Excel Power Query로 엑셀 API 연동하기

Excel Power Query와 Narwhal을 쓰면 공휴일, 발표일, 경제 데이터, 원자재 현물 가격, 환율, 예측 시장 확률을 통합 문서로 가져올 수 있습니다. Narwhal 계정과 API 키는 이 데이터 API들에 모두 쓰이며, Excel은 통합 문서가 열려 있는 동안 쿼리를 새로 고칠 수 있습니다.

설정할 내용

Power Query는 Excel에서 API 요청을 보내고 JSON 응답을 읽는 방법입니다. 통합 문서에 공휴일 표나 Brent 현물 가격처럼 원하는 데이터의 쿼리가 만들어집니다. 실제로는 영역마다 쿼리를 하나씩 만듭니다. 예제는 모두 같은 기본 URL과 Authorization 헤더를 쓰고, 경로와 응답 필드만 영역마다 다릅니다. Narwhal은 CPI, 인플레이션, GDP, 수익률 같은 경제 데이터에도 같은 계정을 씁니다.

API 키 설정

  1. 무료 키 만들기 Narwhal 가입에서 무료 키를 만드세요. 여기서 쓰는 데이터 API는 하나의 계정과 하나의 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 가격을 숫자로 바꿉니다. 원하는 영역의 응답 필드 선택은 호출에 그대로 붙여 두세요.

여섯 영역 전체의 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에서 원자재 현물 가격 조회하기

price에서 USD 기준 Brent 현물 가격을 읽습니다. 이 응답 필드는 가격이며, 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가 자격 증명을 요구하는 이유는 무엇인가요?

웹 원본의 인증은 익명을 선택하세요. Power Query는 익명 인증에서만 Authorization 헤더를 허용합니다. 그래도 요청은 M 코드의 헤더로 Narwhal 키를 보냅니다. 웹 원본 자격 증명으로 고르는 것은 익명입니다.

결과를 NETWORKDAYS와 함께 쓸 수 있나요?

네. NETWORKDAYS의 공휴일 인수가 Holidays 테이블의 date 열을 가리키게 하세요. 이 인수에는 쿼리가 반환한 공휴일 날짜를 쓰고, name 열에는 공휴일 이름이 들어 있습니다. 미국 공휴일 예제는 2026년을 요청하므로 그 날짜는 해당 연도의 공휴일입니다. 이 공휴일 날짜가 필요한 계산에 이 결과를 쓰세요.

에 게시되었습니다.

다음 단계