新興市場的涵蓋並不均衡,所以比較之前需要先做涵蓋測試。Narwhal 為印尼和巴西回傳月度通膨、政策利率與 GDP 成長,對於月度路由沒有資料的國家,則回傳 World Bank 的年度序列。
請求一個新興市場的通膨資料
curl -s "https://api.narwhalapi.com/v1/economics/IDN/inflation" \
-H "Authorization: Bearer $NARWHAL_API_KEY"{
"country": "IDN",
"period": "2026-09",
"year_over_year": "3.28",
"month_over_month": "0.3",
"released_on": "2026-10-29",
"source": {
"publisher": "Statistics Indonesia (BPS)",
"distributor": "OECD"
}
}year_over_year 和 month_over_month 是百分比,period 是涵蓋的月份,released_on 是公布日期。在統計機構已知時,source 會註明發布方和散布方。政策利率路由對每個國家的結構都一樣:GET /v1/economics/{country}/central-bank/policy-rate 為印尼回傳 rate 5.75(instrument 為 bi_rate),為巴西回傳 13.75(instrument 為 selic_target)。成長資料來自 GET /v1/economics/{country}/gdp-growth。
測試哪些國家有資料
涵蓋範圍因國家和序列而異,所以不要假設資料齊全,要逐一組合測試。以下是六個大型新興市場的 HTTP 結果。
| 國家 | 通膨 | 政策利率 | GDP 成長率 | 失業率 |
|---|---|---|---|---|
| 印尼 (IDN) | 200 | 200 | 200 | 404 |
| 巴西 (BRA) | 200 | 200 | 200 | 404 |
| 墨西哥 (MEX) | 200 | 404 | 200 | 200 |
| 印度 (IND) | 404 | 404 | 200 | 200 |
| 南非 (ZAF) | 404 | 404 | 200 | 200 |
| 土耳其 (TUR) | 404 | 404 | 404 | 404 |
404 會帶有問題代碼 series_not_found。它表示該路由沒有這個國家的已公布序列,把它當作資料缺口,繼續往下處理即可。在設計版面之前,請對你需要的其他國家代碼執行同樣的迴圈,因為一次執行就能看出表格裡哪些儲存格可以由月度路由填入,哪些需要年度備援。
讀取同一批國家的成長資料
GET /v1/economics/{country}/gdp-growth 回傳 year_over_year、quarter_over_quarter、period 和 released_on。各國的公布日期差別很大,所以請把 released_on 印在數字旁邊。
| 國家 | 期間 | 年增率 | 季增率 | 發布日期 |
|---|---|---|---|---|
| 印度尼西亞 | 2026-Q2 | 5.3 | 1.3 | 2026-10-30 |
| 巴西 | 2026-Q2 | 1.9 | 0.5 | 2026-10-30 |
| 墨西哥 | 2026-Q2 | 1.9 | 1.4 | 2026-08-24 |
| 南非 | 2026-Q2 | 0.9 | -0.2 | 2026-09-08 |
南非的回應帶有 year_over_year_not_seasonally_adjusted,印度的回應帶有 not_seasonally_adjusted。把兩個國家放進同一張圖表之前,請先看這些標記。
用 World Bank 年度資料填補缺口
即使月度路由沒有序列,目錄裡仍可能有年度序列。GET /v1/economics/catalogue 依 q 和 source 搜尋。在 wdi 來源中搜尋通膨,會回傳帶有 {country} 佔位的 id_template。把佔位替換成小寫的三字母代碼即可,例如印度為 wdi:fp.cpi.totl.zg/ind。
curl -s "https://api.narwhalapi.com/v1/economics/catalogue?source=wdi&q=inflation&limit=1" \
-H "Authorization: Bearer $NARWHAL_API_KEY"{
"results": [
{
"id_template": "wdi:fp.cpi.totl.zg/{country}",
"source": "wdi",
"title": "Inflation, consumer prices (annual %)",
"frequency": "annual",
"unit_label": "Inflation, consumer prices (annual %)"
}
]
}用 GET /v1/economics/catalogue/series/observations?id=... 讀取觀測值,年度序列的 start 和 end 填年份。每個回應都會重複給出 attribution 和 licence_url,請把它們放在圖表旁邊。土耳其是個很好的測試對象,因為月度路由裡沒有它的資料。
curl -s "https://api.narwhalapi.com/v1/economics/catalogue/series/observations?id=wdi:fp.cpi.totl.zg/tur&start=2024&end=2025" \
-H "Authorization: Bearer $NARWHAL_API_KEY"{
"id": "wdi:fp.cpi.totl.zg/tur",
"title": "Inflation, consumer prices (annual %), Turkiye",
"country": "TUR",
"frequency": "annual",
"unit_label": "Inflation, consumer prices (annual %)",
"attribution": "World Bank, World Development Indicators, CC BY 4.0. Values normalised by Narwhal.",
"observations": [
{
"period": "2024",
"value": "58.5064492168435"
},
{
"period": "2025",
"value": "34.8811700293777"
}
]
}把各國並排比較
- 先請求月度資料 腳本對每個國家請求通膨與政策利率。遇到 404 時回傳
None。 - 退回到年度序列 如果缺少月度通膨,就讀取 2025 年的 World Bank 年度序列,並把這一行標註為年度。遇到 503 時重試一次。
- 計算差距 當通膨和政策利率都存在時,輸出政策利率減去通膨的差距,單位為百分點。
import os import time import requests BASE = "https://api.narwhalapi.com" HEAD = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"} def get(path, **params): for _ in range(2): r = requests.get(BASE + path, params=params, headers=HEAD, timeout=15) if r.status_code != 503: break time.sleep(3) if r.status_code == 404: return None r.raise_for_status() return r.json() for c in ("IDN", "BRA", "MEX", "IND", "ZAF", "TUR"): infl = get(f"/v1/economics/{c}/inflation") rate = get(f"/v1/economics/{c}/central-bank/policy-rate") if infl: line = f"{c} inflation {infl['year_over_year']}% ({infl['period']})" else: wb = get("/v1/economics/catalogue/series/observations", id=f"wdi:fp.cpi.totl.zg/{c.lower()}", start="2025", end="2025") v = wb["observations"][0] line = f"{c} inflation {float(v['value']):.2f}% (annual {v['period']}, World Bank)" if rate: line += f" | policy rate {rate['rate']}%" if infl: line += f" | gap {float(rate['rate']) - float(infl['year_over_year']):.2f}" else: line += " | no policy rate" print(line)
執行後輸出如下。
| 國家 | 通膨 | 基準 | 政策利率 | 政策利率減通膨 |
|---|---|---|---|---|
| IDN | 3.28% | 月度,2026-09 | 5.75% | 2.47 |
| BRA | 4.58% | 月度,2026-09 | 13.75% | 9.17 |
| MEX | 3.45% | 月度,2026-09 | 無 | 無 |
| IND | 2.40% | 年度,2025 | 無 | 無 |
| ZAF | 3.21% | 年度,2025 | 無 | 無 |
| TUR | 34.88% | 年度,2025 | 無 | 無 |
不要把年度列和月度列放在一起排名。某一個月的年增率與全年數值涵蓋的區間不同,所以每個數字旁邊都要放 Basis 欄。
為什麼巴西的利差比印尼大得多?
這個差距是政策利率減去年增通膨,巴西為 13.75 減 4.58,印尼為 5.75 減 3.28。它只是兩個已公布數字的簡單相減。若要用 1 加利率除以 1 加通膨的精確算法,請看如何計算實質利率。
換一個路由,就能拿到沒有序列的國家的資料嗎?
月度路由並未涵蓋所有國家。請像土耳其的例子那樣,在目錄裡搜尋意義相同的序列,並在與月度數字比較之前先看它的 frequency。
為什麼目錄呼叫回傳了 503?
尚未讀取過的 World Bank 序列,可能會回傳 503,代碼為 upstream_busy。對測試過的序列,幾秒後第二次呼叫成功了,所以腳本會等待並重試一次。目錄搜尋本身每次都回傳 200,503 出現在讀取序列時。
發布於 。