下限と上限つきの CPI 連動の賃料改定を計算する

賃料を CPI に連動させて改定する賃貸借契約では、基準となる 2 つの月の指数を比べ、その変化率を下限と上限の範囲内で適用します。Narwhal は各国の月次 CPI 指数を提供し、残りは短いスクリプトが計算します。

各基準月の指数を取得する

CPI 連動条項は、基準となる 2 つの月の指数を比較します。通常は 1 年違いの同じ暦月です。この例では 9 月と英国を使います。1 回のリクエストで 2022年9月から2026年9月までの毎月の指数が返り、以下のレスポンスでは最初と最後だけを残しています。

curl、賃貸借契約の基準月の CPI
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 に適用率を足した値を掛けたものです。

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)

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 回、セント単位です。そのため、先に率を丸める契約や、賃料を別の方法で丸める契約では、数セントの差が出ます。

年指数の変化適用率賃料
2023123.8 から 132.0、6.62%5.00%(上限適用)2,100.00
2024132.0 から 134.2、1.67%2.00%(下限適用)2,142.00
2025134.2 から 139.3、3.80%3.80%2,223.40
2026139.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 の前年比を計算する方法のガイドにさらに詳しい説明があります。

公開。

次のステップ