賃料を CPI に連動させて改定する賃貸借契約では、基準となる 2 つの月の指数を比べ、その変化率を下限と上限の範囲内で適用します。Narwhal は各国の月次 CPI 指数を提供し、残りは短いスクリプトが計算します。
各基準月の指数を取得する
CPI 連動条項は、基準となる 2 つの月の指数を比較します。通常は 1 年違いの同じ暦月です。この例では 9 月と英国を使います。1 回のリクエストで 2022年9月から2026年9月までの毎月の指数が返り、以下のレスポンスでは最初と最後だけを残しています。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/economics/GBR/cpi/observations?start=2022-09&end=2026-09&limit=100"{
"country": "GBR",
"as_of": "2026-10-21T00:00:00Z",
"index_base": "2015=100",
"observations": [
{
"period": "2022-09",
"value": "123.8"
},
{
"period": "2026-09",
"value": "144.1"
}
],
"next_cursor": null
}observations は各 period を value とともに古い順に並べます。英国の index_base は 2015=100 ですが、変化率の計算には影響しません。as_of は系列が反映している日付です。リクエストは 49 か月分の値を返すので、すべて 1 ページに収まり、next_cursor は null です。
下限と上限を適用して改定額を計算する
1 年分の改定率は、新しい指数を古い指数で割って 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)
def escalate(rent, cpi_old, cpi_new, floor, cap):
change = cpi_new / cpi_old - 1
applied = min(max(change, floor), cap)
return (rent * (1 + applied)).quantize(Decimal("0.01"), ROUND_HALF_UP), change, applied
data = get("/v1/economics/GBR/cpi/observations?start=2022-09&end=2026-09&limit=100")
cpi = {o["period"]: Decimal(o["value"]) for o in data["observations"]}
rent, floor, cap = Decimal("2000.00"), Decimal("0.02"), Decimal("0.05")
for year in (2023, 2024, 2025, 2026):
old, new = cpi[f"{year - 1}-09"], cpi[f"{year}-09"]
rent, change, applied = escalate(rent, old, new, floor, cap)
print(f"{year}: CPI {old} -> {new}, change {change:.2%}, applied {applied:.2%}, rent {rent}")
この例の賃貸借契約は月額 2,000.00 から始まり、下限は 2 パーセント、上限は 5 パーセントです。毎年の記念日に、9 月を前年の 9 月と比べます。スクリプトは年ごとに 1 行を出力します。たとえば 2023: CPI 123.8 -> 132.0, change 6.62%, applied 5.00%, rent 2100.00 です。計算は一貫して Decimal で行い、賃料の丸めは 1 年に 1 回、セント単位です。そのため、先に率を丸める契約や、賃料を別の方法で丸める契約では、数セントの差が出ます。
| 年 | 指数の変化 | 適用率 | 賃料 |
|---|---|---|---|
| 2023 | 123.8 から 132.0、6.62% | 5.00%(上限適用) | 2,100.00 |
| 2024 | 132.0 から 134.2、1.67% | 2.00%(下限適用) | 2,142.00 |
| 2025 | 134.2 から 139.3、3.80% | 3.80% | 2,223.40 |
| 2026 | 139.3 から 144.1、3.45% | 3.45% | 2,300.01 |
初年度を手計算で確かめます。132.0 を 123.8 で割ると 1.0662 なので、指数は 6.62 パーセント上昇しました。これは上限を超えているため、適用率は 5 パーセントで、2,000.00 に 1.05 を掛けると 2,100.00 です。2024年は、134.2 を 132.0 で割ると 1.0167 で、下限の 2 パーセントを下回るため、賃料は 2 パーセント上がって 2,142.00 になります。
2023年は上限が効き、2024年は下限が押し上げ、その後の 2 年は指数に従います。賃料は複利で増えます。毎年、前の年の賃料から始まるためです。各年の率を最初の賃料に適用し、複利にしない契約では、最初の賃料を別の変数に保持しておく必要があります。
API が提供するものと、契約が定めるもの
| 項目 | 出典 |
|---|---|
| 各月の指数の値 | Narwhal の CPI 観測値 |
| 契約がどの指数を指定しているか | 契約 |
| 基準月 | 契約 |
| 下限と上限 | 契約 |
| 丸めと複利 | 契約 |
Narwhal が提供するのは、各国の総合消費者物価指数です。契約がコア指数、地域別指数、別の発表機関の指数など別の指数を指定している場合、ここの数値は契約で使うものと一致しないことがあります。スクリプトを実行する前に条項を読んでください。
賃料改定にはどの月の指数を使いますか?
契約で指定された月です。この例では、契約が 9 月を前年の 9 月と比べる条項で、英国の最新の指数は 2026年9月のものなので、9 月を使っています。2 つの月は start と end で取得するか、過去の 1 か月は /v1/economics/{country}/cpi?period=YYYY-MM で取得します。
記念日に新しい月がまだ公表されていない場合は?
公表値のない月を要求すると、コード series_not_found の 404 問題レスポンスが返ります。period なしの CPI エンドポイントは、最新の月とその released_on の日付を返します。基準月が公表される前に記念日が来た場合は、賃料を据え置き、その月が出てからスクリプトを再実行するか、契約が定める代替の方法に従ってください。
物価が下がった場合はどうなりますか?
変化率はマイナスになり、結果は範囲への収め方で決まります。下限が 0 パーセントなら適用率は 0 パーセントで、賃料は変わりません。上のように下限が 2 パーセントなら、賃料はそれでも 2 パーセント上がります。下限のない契約では、賃料は変化率の分だけ下がり、同じ関数が下限 -1 でそのケースも処理します。
他の国でも同じ確認ができますか?
パスの国コードを変えてください。エンドポイントはその国の総合指数を返すので、条項もその指数を指定している必要があります。start と end は YYYY、YYYY-MM、YYYY-QN を受け付け、レスポンスの period の文字列の形から、系列が月次か四半期かが分かります。百分率の変化については、CPI の前年比を計算する方法のガイドにさらに詳しい説明があります。
公開。