Python과 Narwhal로 API 키 하나만 있으면 공휴일, 발표일, 경제 데이터, 원자재 현물 가격, 환율, 예측시장 확률을 가져올 수 있습니다. requests로 JSON 응답을 읽고, cron으로 스크립트를 예약해 매일 가져오세요.
설정할 내용
requests가 설치된 Python 3로 Narwhal REST API를 호출하고 데이터 영역별 응답 필드를 읽는 스크립트를 만들 수 있습니다. 공유 요청 도우미, 영역별 예제, 매일 실행하는 cron 항목을 얻게 됩니다. Narwhal은 데이터 API 전반에 계정 하나와 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 예제는 행 수를 센 뒤 이 필드로 첫 번째 공휴일을 출력합니다.
코드로 데이터 가져오기
여섯 가지 요청 모두 공유 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 항목으로 스크립트를 하루에 한 번 실행할 수 있습니다. 제공된 항목을 사용하고 스크립트는 /path/pull.py에 두세요. 이 항목은 /usr/bin/python3을 호출하고 출력을 pull.log에 덧붙입니다. 스크립트는 하루에 여섯 번 호출하므로 요청 수가 적습니다.
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일 새해 첫날입니다. 이 예제는 공유 도우미를 사용해 첫 번째 행에서 이 두 필드를 출력하며, 전체 스크립트는 공휴일 행의 개수도 출력합니다.
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는 배럴당 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에서 응답 필드를 고르세요.
에 게시되었습니다.