하한과 상한을 둔 CPI 임대료 인상률 계산하기

CPI에 연동해 임대료를 올리는 임대차 계약은 기준이 되는 두 달의 지수를 비교한 뒤, 그 변화율을 하한과 상한 범위 안에서 적용합니다. Narwhal은 국가별 월간 CPI 지수를 제공하고, 나머지는 짧은 스크립트가 계산합니다.

각 기준 월의 지수 가져오기

CPI 연동 조항은 기준이 되는 두 달의 지수를 비교하며, 보통 1년 간격의 같은 달력 월입니다. 이 예시는 9월과 영국을 사용합니다. 한 번의 요청으로 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개의 월간 값을 반환하므로 모두 한 페이지에 담기고 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월과 비교합니다. 스크립트는 연도마다 한 줄을 출력하며, 예를 들어 2023: CPI 123.8 -> 132.0, change 6.62%, applied 5.00%, rent 2100.00입니다. 계산은 내내 Decimal로 하고 임대료는 해마다 한 번 센트 단위로 반올림하므로, 비율을 먼저 반올림하거나 임대료를 다른 방식으로 반올림하는 계약과는 몇 센트 차이가 날 수 있습니다.

연도지수 변화적용률임대료
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년에는 하한이 끌어올리며, 이후 두 해는 지수를 그대로 따릅니다. 임대료는 복리로 늘어나는데, 해마다 전년도 임대료에서 출발하기 때문입니다. 각 연도의 비율을 최초 임대료에 적용하는 복리가 아닌 계약이라면, 최초 임대료를 별도 변수에 보관해 두어야 합니다.

API가 제공하는 것과 계약이 정하는 것

항목출처
각 월의 지수 값Narwhal CPI 관측값
계약이 어떤 지수를 지정하는지계약
기준 월계약
하한과 상한계약
반올림과 복리계약

Narwhal은 각 국가의 종합 소비자물가지수를 제공합니다. 계약이 근원지수, 지역별 지수, 다른 발표 기관의 지수처럼 다른 지수를 지정한다면, 여기의 수치는 계약에서 쓰는 수치와 다를 수 있습니다. 스크립트를 실행하기 전에 조항을 읽어 보세요.

임대료 인상에는 어느 달의 지수를 써야 하나요?

계약에서 지정한 달입니다. 이 예시에서는 계약 조항이 9월을 전년 9월과 비교하고 영국의 최신 지수가 2026년 9월 것이어서 9월을 씁니다. 두 달은 start와 end로 요청하거나, 과거 한 달은 /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 전년 대비 계산하기 가이드에 더 자세히 나와 있습니다.

에 게시되었습니다.

다음 단계