如果報告要把過去的預算或合約金額與目前金額做比較,就必須把它們換算到同一個月的價格水準。選定基準月份,寫明所用的物價指數,並為結果加上標註。Narwhal 會回傳任意月份的消費者物價指數以及最新公布的一期,所以每筆金額都乘以最新指數,再除以它所屬月份的指數。
每份換算報告都要做出的三項選擇
把幾年前簽訂的租約和今年的預算放在一起的報告,比較的是價值不同的錢。財務規劃人員與合約負責人的做法,是把每筆金額換算到同一個月的價格水準,而結果是否站得住腳,取決於三項選擇。基準月份是所有金額換算到的那個月。指數是在月份之間換算時使用的價格序列。標註是告訴讀者這兩點的那句話。API 提供指數數值,報告負責寫明這些選擇。
觀測值端點按月回傳一個國家的整體消費者物價指數。這個請求讀取的是 2012 年 3 月的指數,也就是一份辦公室租約所在的月份。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/economics/USA/cpi/observations?start=2012-03&end=2012-03"{
"country": "USA",
"as_of": "2026-10-14T00:00:00Z",
"index_base": "1982-84=100",
"observations": [
{
"period": "2012-03",
"value": "229.392"
}
],
"next_cursor": null
}start 和 end 的格式為 YYYY-MM。value 是十進位字串,index_base 表示該指數序列的基期,對同一序列中兩個月份之間的比值沒有影響。
以最新公布的月份作為基準月份
不帶 period 的 CPI 端點會回傳最新公布的指數。把它的月份用作整份報告的基準月份,每一列就都會換算到同樣的價格水準。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/economics/USA/cpi"{
"country": "USA",
"period": "2026-09",
"value": "336.940",
"index_base": "1982-84=100",
"released_on": "2026-10-14"
}period 是基準月份,value 是指數,released_on 是公布日期。換算後的金額以該月的價格表示,而不是以執行報告當天的價格表示,請在報告中寫明這一點。
一次換算一批合約與預算
- 列出每筆金額及其定價月份 要用價格適用的月份,對合約來說通常是簽約月份或指數調整月份,而不是報告所屬的年度。
- 只讀取一次序列 一次觀測值請求就能涵蓋全部月份。腳本請求 2012-01 至 2024-12,把
limit設為 1000,並依period建立字典。 - 用 Decimal 做乘除 每筆金額乘以基準月份的指數,再除以它所屬月份的指數。只在最後做一次四捨五入到分。
- 把標註和表格一起列印 輸出的第一列寫明基準月份、國家和指數基期,因此表格離開這行說明就無法被單獨解讀。
import json import os import urllib.request from decimal import Decimal, ROUND_HALF_UP def get(path): req = urllib.request.Request( "https://api.narwhalapi.com" + path, headers={"Authorization": "Bearer " + os.environ["NARWHAL_API_KEY"]}, ) with urllib.request.urlopen(req, timeout=30) as r: return json.load(r) latest = get("/v1/economics/USA/cpi") base_month, cpi_base = latest["period"], Decimal(latest["value"]) series = get("/v1/economics/USA/cpi/observations?start=2012-01&end=2024-12&limit=1000") cpi = {o["period"]: Decimal(o["value"]) for o in series["observations"]} lines = [ ("Office lease", "2012-03", "480000"), ("Software contract", "2018-06", "120000"), ("Equipment purchase", "2022-01", "75000"), ] print(f"All amounts in {base_month} prices, US CPI {cpi_base}, base {latest['index_base']}") for name, month, amount in lines: restated = (Decimal(amount) * cpi_base / cpi[month]).quantize(Decimal("0.01"), ROUND_HALF_UP) print(f"{name:20} {month} {Decimal(amount):>10,} index {cpi[month]} restated {restated:>12,}")
2012 年 3 月的租約金額 480,000,按 2026 年 9 月的價格水準換算後為 705,042.90。用基準指數除以租約月份的指數得到 1.469,說明這一序列的價格在該期間上漲了 46.9%。軟體合約上漲 33.7%,設備採購上漲 19.8%。
All amounts in 2026-09 prices, US CPI 336.940, base 1982-84=100
Office lease 2012-03 480,000 index 229.392 restated 705,042.90
Software contract 2018-06 120,000 index 251.989 restated 160,454.62
Equipment purchase 2022-01 75,000 index 281.148 restated 89,883.26如何標註換算後的欄位
| 項目 | 報告中的措辭 |
|---|---|
| 基準月份 | 按 2026 年 9 月的價格計,即執行報告時已公布的最新月份 |
| 指數 | 美國消費者物價指數,整體,基期 1982-84=100 |
| 原始月份 | 在換算後那一欄的旁邊,顯示每筆原始金額的定價月份 |
| 捨入 | 最後只四捨五入到分一次,並加以說明 |
把原始金額和換算後的金額並排保留,審閱者就能用一次乘法核對任何一列。
年度預算沒有唯一的價格月份。請選該年的某一個月,例如預算核定的月份,把它用於這份預算的每一列,並在標註中寫明這個月。另一種做法是取該年十二個月觀測值的平均數,無論用哪種,報告都應當寫明。
合約應該使用哪個物價指數?
請使用合約中指明的指數。API 回傳的是一個國家的整體消費者物價指數。如果租賃或供貨合約掛鉤的是核心指數、地區指數或產業指數,換算出的數字就會與合約上的數字不同,所以在報告發出前請先確認指數。
一份報告可以換算多個國家的金額嗎?
請一次只在一個國家內部換算,因為每個序列都有自己的基期,一個國家的指數值並不能說明另一個國家的物價。如需用同一種貨幣呈現結果,請在單獨的一步中,按你指明日期的匯率轉換換算後的金額。
如果我需要的月份還沒有公布怎麼辦?
請求一個尚無已公布數值的期間,會回傳 404 問題回應,代碼為 series_not_found。對美國來說,撰寫本文時請求 2026 年 10 月就是這種情況。請使用 CPI 端點回傳的 period 作為基準月份,並在標註中說明。
發布於 。