把过去的预算和合同金额折算成当前价格

如果报告要把过去的预算或合同金额与当前金额作比较,就必须把它们折算到同一个月的价格水平。选定基期月份,写明所用的价格指数,并为结果加上标注。Narwhal 会返回任意月份的居民消费价格指数以及最新发布的一期,所以每笔金额都乘以最新指数,再除以它所属月份的指数。

每份折算报告都要做出的三项选择

把几年前签订的租约和今年的预算放在一起的报告,比较的是价值不同的钱。财务规划人员和合同负责人的做法,是把每笔金额折算到同一个月的价格水平,而结果是否站得住脚,取决于三项选择。基期月份是所有金额折算到的那个月。指数是在月份之间换算时使用的价格序列。标注是告诉读者这两点的那句话。API 提供指数数值,报告负责写明这些选择。

观测值端点按月返回一个国家的总体居民消费价格指数。这个请求读取的是 2012 年 3 月的指数,也就是一份办公室租约所在的月份。

curl,租约定价当月的指数
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,最新指数
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 是发布日期。折算后的金额以该月的价格表示,而不是以运行报告当天的价格表示,请在报告中写明这一点。

一次性折算一批合同和预算

  1. 列出每笔金额及其定价月份 要用价格适用的月份,对合同来说通常是签约月份或指数调整月份,而不是报告所属的年份。
  2. 只读取一次序列 一次观测值请求就能覆盖全部月份。脚本请求 2012-01 至 2024-12,把 limit 设为 1000,并按 period 建立字典。
  3. 用 Decimal 做乘除 每笔金额乘以基期月份的指数,再除以它所属月份的指数。只在最后做一次四舍五入到分。
  4. 把标注和表格一起打印 输出的第一行写明基期月份、国家和指数基期,因此表格离开这行说明就无法被单独解读。
    Python,折算后的金额表
    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 作为基期月份,并在标注中说明。

发布于。

后续步骤