如果报告要把过去的预算或合同金额与当前金额作比较,就必须把它们折算到同一个月的价格水平。选定基期月份,写明所用的价格指数,并为结果加上标注。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 作为基期月份,并在标注中说明。
发布于。