리스크를 줄이는 데스크, 작업을 멈추는 온콜 엔지니어, 직원에게 상황을 공유하는 교대 책임자는 발표 전에 같은 정보가 필요합니다. UTC와 현지 시각, 대상 기간, 이전 값입니다. Narwhal 경제 캘린더는 이 네 가지를 모두 반환하고, 짧은 예약 실행 스크립트가 발표마다 한 줄의 메시지로 바꿔 줍니다.
발표 전 알림에 담아야 할 내용
주요 지표 발표 전에 데스크는 리스크를 줄이고, 온콜 엔지니어는 배치 작업을 멈추고, 교대 책임자는 직원에게 상황을 공유합니다. 세 사람 모두 같은 사실에 따라 움직입니다. 발표가 언제인지, 어느 기간을 다루는지, 직전 수치가 얼마였는지입니다. 다른 도시에 있는 직원은 자기 시간대의 시각도 필요합니다. "13:30 UTC"라는 메시지로는 급한 순간에 시차 계산을 직접 해야 하기 때문입니다. GET /v1/economics/calendar는 이 사실들을 모두 반환합니다. 이 요청은 11월 10일의 미국을 요청합니다.
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/economics/calendar?countries=USA&start_date=2026-11-10&end_date=2026-11-10&limit=100"{
"releases": [
{
"release_id": "66f7f9f6-0318-4f25-8896-541c428ee07e",
"revision": 2,
"country": "USA",
"series_id": "usa-wages-and-earnings",
"name": "Wages and earnings",
"topic": "wages",
"family": "labour",
"period": "2026-10",
"status": "scheduled",
"at": "2026-11-10T13:30:00Z",
"timezone": "America/New_York",
"values": [
{
"measure": "real_average_hourly_earnings_mom",
"concept": "real_average_hourly_earnings",
"unit": "percent",
"transformation": "month_over_month",
"previous": "-0.5"
},
{
"measure": "real_average_hourly_earnings_yoy",
"concept": "real_average_hourly_earnings",
"unit": "percent",
"transformation": "year_over_year",
"previous": "-0.7"
}
]
},
{
"release_id": "f01e2289-2e17-49b3-9d64-d29118742dee",
"revision": 3,
"country": "USA",
"series_id": "usa-consumer-prices",
"name": "Consumer prices",
"topic": "consumer_prices",
"family": "prices",
"period": "2026-10",
"status": "scheduled",
"at": "2026-11-10T13:30:00Z",
"timezone": "America/New_York",
"values": [
{
"measure": "core_cpi_yoy",
"concept": "core_cpi",
"unit": "percent",
"transformation": "year_over_year",
"previous": "2.6",
"not_seasonally_adjusted": true
},
{
"measure": "cpi_mom",
"concept": "cpi",
"unit": "percent",
"transformation": "month_over_month",
"previous": "0.6"
},
{
"measure": "cpi_yoy",
"concept": "cpi",
"unit": "percent",
"transformation": "year_over_year",
"previous": "3.7",
"not_seasonally_adjusted": true
}
]
}
],
"next_cursor": null
}at은 UTC 기준 발표 시각입니다. period는 수치가 다루는 달을 나타내고, values[].previous에는 지표별로 직전에 발표된 수치가 unit과 함께 들어 있습니다. 응답에는 이전 값만 있고 전망치는 없으므로, 컨센서스 수치가 필요한 데스크는 자체 소스에서 추가합니다. status는 수치가 나올 때까지 scheduled로 유지됩니다.
발표마다 알림 한 줄 만들기
아래 스크립트는 예를 들어 매일 아침처럼 일정에 맞춰 실행하도록 만들었으며, 앞으로 24시간 안에 예정된 발표를 한 건당 한 줄로 출력합니다.
- 데스크 시간대와 국가 설정하기
DESK_TZ는 직원이 메시지를 읽는 시간대이고,COUNTRIES는 데스크가 거래하거나 의존하는 경제권 목록입니다. - 여유를 둔 날짜 범위 요청하기 날짜 필터는 각 발표 기관의 현지 날짜를 따르므로, 스크립트는 오늘 하루 전부터 이틀 뒤까지를 요청하고
at자체로 걸러 냅니다. - 앞으로 남은 발표만 남기기 발표를 남기는 조건은 상태가
scheduled이고,at시각이 있고, 그 시각이 현재부터 사전 알림 시간 사이에 있는 것입니다.NOW는 선택 변수로, 시계를 고정해 테스트할 수 있게 해 줍니다. - 시각을 변환하고 이전 값 붙이기
astimezone은 UTC 시각을 데스크 시간대로 바꿔 주므로, 어느 쪽에서든 시간 변경이 있어도 직접 만든 오프셋이 필요 없습니다. 이전 값은values에서 가져옵니다.import os from datetime import datetime, timedelta, timezone from zoneinfo import ZoneInfo import requests DESK_TZ = ZoneInfo("Europe/Zurich") COUNTRIES = ["USA", "EMU"] LEAD = timedelta(hours=24) now = datetime.fromisoformat(os.environ["NOW"]) if "NOW" in os.environ else datetime.now(timezone.utc) r = requests.get( "https://api.narwhalapi.com/v1/economics/calendar", params={ "countries": COUNTRIES, "start_date": (now - timedelta(days=1)).date().isoformat(), "end_date": (now + timedelta(days=2)).date().isoformat(), "limit": 100, }, headers={"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}, timeout=10, ) r.raise_for_status() due = [] for x in r.json()["releases"]: if x["status"] != "scheduled" or "at" not in x: continue at = datetime.fromisoformat(x["at"].replace("Z", "+00:00")) if now <= at < now + LEAD: due.append((at, x)) for at, x in sorted(due, key=lambda t: t[0]): prev = ", ".join(f"{v['measure']} {v['previous']}" for v in x["values"] if "previous" in v) print(f"{at:%H:%M} UTC / {at.astimezone(DESK_TZ):%H:%M} {DESK_TZ.key} | " f"{x['country']} {x['name']} {x.get('period', '-')} | previous: {prev or 'none listed'}")
NOW를 11월 10일 09:00 UTC로 설정하자 스크립트는 두 줄을 출력했습니다. 그 날짜에 취리히는 UTC보다 1시간 빠르므로 13:30 UTC가 14:30으로 표시됩니다. 미국 지표 두 건은 발표 시각이 같으므로, 메시지를 하나로 묶고 싶은 데스크는 at 값으로 줄을 묶을 수 있습니다.
13:30 UTC / 14:30 Europe/Zurich | USA Wages and earnings 2026-10 | previous: real_average_hourly_earnings_mom -0.5, real_average_hourly_earnings_yoy -0.7
13:30 UTC / 14:30 Europe/Zurich | USA Consumer prices 2026-10 | previous: core_cpi_yoy 2.6, cpi_mom 0.6, cpi_yoy 3.7읽는 사람에 맞게 알림 구성하기
| 읽는 사람 | 발표 전 조치 | 알림에 필요한 내용 |
|---|---|---|
| 트레이더 | 포지션을 줄이거나 헤지하기 | UTC와 현지 시각, 이전 값 |
| 온콜 엔지니어 | 해당 시각 전후로 배포나 배치 작업 멈추기 | 정확한 at 시각과, 아직 예정대로인지 확인하는 status |
| 교대 책임자 | 앞으로 있을 일을 직원에게 공유하기 | 발표 이름, period, 이전 값 |
행은 팀이 이미 보고 있는 채널로 보내세요. API는 사실을 제공하고, 전달은 팀의 채팅이나 메일 도구가 맡습니다. 스크립트는 일일 데이터 가져오기 예약에서처럼 스케줄러로, 원하는 사전 알림 시간만큼 이상으로 자주 실행하세요.
발표 일정이 바뀌어도 알림을 정확하게 유지하기
아침 목록을 보낸 뒤에 발표 시각이 바뀔 수 있습니다. 캘린더의 각 항목에는 세부 정보가 바뀔 때 올라가는 revision이 있으므로, 발표 직전에 캘린더를 다시 읽는 스크립트는 그 revision을 보낼 때의 값과 비교할 수 있습니다. 푸시 방식으로는 웹훅이 release.scheduled, release.rescheduled, release.cancelled를 알려 줍니다. 웹훅 수신하기를 참고하세요. 웹훅은 일정이 바뀔 때 도착하며 카운트다운은 포함하지 않으므로, 사전 알림 시간은 자체 타이머로 정합니다.
휴대폰 알림만 원하는 직원은 POST /v1/calendars/subscriptions로 만든 피드를 캘린더 앱에 구독할 수 있습니다. 요청에는 countries, start_date, end_date를 넣고, 응답의 url은 한 번만 반환되므로 비밀 값으로 보관하세요. 이 호출은 무언가를 생성하므로 이 페이지에서는 설명만 하고 실행하지 않습니다. 전체 요청은 캘린더 구독 문서에 있습니다.
발표에 아직 정확한 시각이 없다면?
일부 발표에는 at 대신 date, between, by가 붙습니다. 스크립트는 시계 위에 놓을 수 없으므로 이런 발표를 건너뜁니다. 별도의 아침 메모에 따로 적어, 분 단위로 정해진 시각 없이 발표될 수 있다는 점을 데스크에 알리세요.
API가 직접 알림을 보내 주나요?
시각을 지정해 보내는 알림 엔드포인트는 없습니다. 알림은 캘린더 앱, 직접 만든 예약 실행 스크립트, 또는 자체 타이머를 시작하는 웹훅 수신기에서 옵니다.
스크립트가 오늘 전후의 날짜를 요청하는 이유는 무엇인가요?
날짜 범위는 발표 기관의 현지 날짜를 따릅니다. 도쿄나 시드니의 발표는 UTC 시각과 다른 달력 날짜에 놓일 수 있으므로, 요청에 여유를 두고 무엇이 해당하는지는 at으로 판단합니다.
에 게시되었습니다.