過去の予算や契約額を現在のものと比べる報告書では、すべてを1つの月の価格水準に換算する必要があります。基準月を選び、物価指数を明示し、結果に注記を付けます。Narwhalは任意の月と最新公表分の消費者物価指数を返すので、各金額に最新の指数を掛け、その金額の月の指数で割ります。
換算した報告書で必ず決めるべき3つの選択
数年前に結んだリース契約を今年の予算と並べる報告書は、価値の異なるお金を比べています。財務企画や契約の担当者は、すべての金額を1つの月の価格水準に換算してこれを解決します。結果を説明できるかどうかは、3つの選択で決まります。基準月は、すべての金額を換算する先の月です。指数は、月どうしを行き来するのに使う物価系列です。注記は、その両方を読者に伝える一文です。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 は指数系列の基準期間を示します。同じ系列の2つの月の比には影響しません。
最新の公表月を基準月に使う
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 は公表日です。換算後の金額は、報告書を実行した日の価格水準ではなく、その月の価格水準で表されます。報告書にその旨を明記してください。
契約と予算の一覧を一度に換算する
- 各金額を、価格が決まった月とともに一覧にする 報告された年ではなく、その価格が適用された月を使います。契約であれば、通常は締結月か物価スライドの月です。
- 系列を一度だけ読み取る 観測値のリクエスト1回で、対象の全期間をカバーできます。スクリプトは
limitを 1000 にして 2012-01 から 2024-12 までを取得し、periodをキーにした辞書を作ります。 - Decimal で掛け算と割り算をする 各金額に基準月の指数を掛け、その金額の月の指数で割ります。セント単位への丸めは、最後に1回だけ行います。
- 表と一緒に注記を出力する 出力の1行目に基準月、国、指数の基準を明記するので、表だけが単独で読まれることはありません。
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 |
| 元の月 | 元の各金額の価格が決まった月を、換算後の列の隣の列に表示する |
| 丸め | 最後にセント単位へ1回だけ丸め、その旨を明記する |
元の金額と換算後の金額を並べて残しておきます。そうすれば、レビューする人は掛け算1回でどの行も検算できます。
年間予算には、1つに決まる価格の月がありません。その年の中から、予算が承認された月など1つの月を選んでその予算の全行に適用し、注記にその月を明記します。代わりに、その年の12か月分の観測値の平均を使う方法もあり、報告書はどちらを使うかを明記すべきです。
契約にはどの物価指数を使うべきですか?
契約が指定している指数を使ってください。APIが返すのは、ある国の総合消費者物価指数です。リース契約や供給契約がコア指数、地域別指数、業種別指数に連動している場合、換算後の数値は契約上の数値と異なるため、報告書を出す前に指数を確認してください。
1つの報告書で複数の国の金額を換算できますか?
換算は1か国ずつ行ってください。各系列には独自の基準があり、ある国の指数の値は別の国の物価について何も示さないためです。結果を1つの通貨で示すには、日付を明示した為替レートで、換算後の金額を別の手順として両替してください。
必要な月がまだ公表されていない場合はどうなりますか?
公表値のない期間をリクエストすると、コード series_not_found の 404 エラーレスポンスが返ります。米国の場合、執筆時点で2026年10月を指定するとそうなります。CPIエンドポイントの period を基準月に使い、注記にその旨を書いてください。
公開。