HDB resale registrations via data.gov.sg · 2025 cross-section · 6 of 6

Longer leases usually sit higher—not on one common curve

In 2025, the median controlled price/m² association per extra remaining-lease year is +1.20% across eligible historical mature-town segments versus +0.69% across historical non-mature segments. Restricting both groups to 4-room flats gives +1.20% versus +0.67%. These are unweighted segment medians of cross-sectional associations, not a national pooled estimate, a causal lease curve or an individual flat's annual depreciation rate.

25,084 · 129
valid 2025 transactions · town × flat-type segments; latest complete past calendar year, not partial 2026
62 · 22,048
eligible controlled models · observations used; 67 segments withheld, not assigned zero coefficients
+1.198% / +0.689%
historical mature / non-mature all-type segment medians per extra lease year; 29 / 33 eligible cells
+1.197% / +0.675%
4-room historical-group medians; 12 / 11 eligible towns. Different locations, vintages and support still remain
2025 four-room five-year lease-band medians in Sengkang, Tampines, Woodlands and Yishun show higher prices with longer leases and local reversals
Primary comparison: same town × flat type × year; five-year bands with n≥30. Dots sit at median remaining lease; whiskers are transaction IQR, not confidence intervals. Panel n is all valid 2025 sales in that town × 4-room cell, including bands hidden for n<30. It is not the town total. The four largest usable 4-room segments were selected by count/support, not outcome; missing bands are not connected. Full-size light · dark.

More views

All 23 eligible four-room town coefficients, alphabetically ordered, with approximate unclustered HC3 intervals; Serangoon's negative interval crosses zero
All eligible 4-room towns, alphabetically ordered; parentheses show transaction n. Shapes distinguish historical groups. The approximate 95% HC3 intervals are neither causal nor clustered; common-block dependence can make them too narrow. Full-size light · dark.
Sengkang raw prices and band medians beside partial regression after storey, area and month effects are removed from both axes
Largest usable 4-room cell: Sengkang, n=940. Controlled association +0.782% per extra lease year (approximate interval +0.710% to +0.854%), supported over 72.17–95.25 remaining years. The line fits residual log price, not a predicted flat price. Full-size light · dark.

Method: bands first, guarded associations second

  1. Validate and preserve the raw ledger. Independently acquire the official HDB 2017-onward file; validate shape/history and byte hashes before replacement. Retain repeat-looking transactions because there is no unique unit or transaction ID. The reviewed snapshot has 241,920 rows: 241,919 retained and one inconsistent lease excluded, January 2017–partial October 2026. Byte receipt · audit.
  2. Parse the precision the source actually has. Convert reported years/months to months; valid range 1–1,188. Compare with a January-start 99-year lease expectation; retain offsets −12 through +18 months because commencement month and source precision differ. This is an analyst QC screen, not an official maximum reporting lag. The one −179-month mismatch is excluded, not corrected or proved erroneous. Strict 0–12 sensitivity is separate. SQL staging.
  3. Compare within one complete year. Use 2025 with all 12 registration months; form town × type × year five-year-band medians/IQR. Display only n≥30: 235 of 639 bands, 20,766 plotted-support observations; 404 thin bands / 4,318 observations are suppressed only from display and can still enter eligible models. Bucket ledger.
  4. Fit guarded secondary OLS models. Separately by town × type: log(price/m²) on lease years, storey midpoint, floor area and registration-month indicators; centered continuous predictors, earliest observed month as reference (15 parameters with 12 months). Require n≥100, ≥10-year lease span, ≥6 months, full rank, residual df≥30, ≥0.5 years residual lease SD, scaled condition≤1e8 and no unit leverage. Convert β with 100×(exp(β)−1). HC3 normal-approximation intervals transform β±1.96×SE; not exact, simultaneous, clustered or prediction intervals. Coefficients, support and diagnostics.
  5. Compare historical groups, without a universal group effect. Fix the lookup to HDB's 20 August 2023 Annex A; no planning-area inference. Tengah is non-mature on Annex A and is in the lookup. This resale file has no Tengah rows, so no slope is estimated. The later Standard/Plus/Prime framework is project/location-level, not this town map. Compare unweighted eligible-segment medians and ranges, with a 4-room check for type composition. Month controls leave between-flat/vintage variation, not aging of one flat; vintage/block controls would largely absorb lease. Lookup · full rules and method.

Sensitivity and limits—what this report cannot say

The historical group-median ordering persists at model n=50/100/200, lease spans 5/10/15 years, in 2024 and under stricter lease screening. Membership changes: a stable median does not validate individual estimates or equalize support. All-type ranges overlap (historical mature −0.392% to +1.749%; non-mature +0.070% to +1.406%). Sensitivity tables and interpretation.

Do not multiply these slopes by years to forecast a flat's future price. Storey/area/month controls do not remove micro-location, block vintage, flat model, renovation/condition, buyer characteristics or selective resale. Observed resale transactions are not every flat or a repeated-unit panel. HC3 omits shared-block dependence and may understate uncertainty. No causal decay rate, historical-group cause, current-classification premium, loan/policy effect or individual value is established. Local bends remain: Sengkang's 80–<85-year band is above its 90–<95 band. No price estimator, causal curve or significance ranking is offered.

Reproduce

git clone https://github.com/faizsaifulnizam/hdb-lease-slope
cd hdb-lease-slope
uv venv --python 3.12.10
if [ -f .venv/Scripts/activate ]; then
  source .venv/Scripts/activate
else
  source .venv/bin/activate
fi
uv pip install -r requirements.txt
python src/download.py
python src/build_dataset.py
python src/analysis.py
python src/figures.py
python -m unittest discover -s tests -p 'test_*.py' -v
python tests/smoke_test.py
python src/verify.py
# Local dependency-backed figure mirror/rollback check:
python tests/check_figure_publish.py

If uv is missing: pip install uv. Then rerun from uv venv.

Pinned environment: Python 3.12.10 / DuckDB 1.5.6 / NumPy 2.5.3 / matplotlib 3.11.2, bundled fonts. Spot-check group_summaries.csv: 2025 all-type medians 1.1984156885 / 0.6892626164; 4-room 1.1967679273 / 0.6745169870, absolute tolerance 1e-9. OLS text can differ in the last digits across operating systems; cross-OS PNG byte equality is not required. Sengkang 70–<75: n=152 / S$6,112.86 per m².

A live source revision changes the snapshot; it is not an identity claim. Unchanged input bytes and metadata preserve the reviewed committed receipt time while the ignored pull manifest records actual acquisition time. CSV/PNG repeats were verified in the same pinned environment, not cross-platform pixel equality. Figure generation stages both reports/figures and docs/img in the existing rollback batch; ordinary swap failures, not whole-pipeline crash safety. One writer required. CI covers committed-artifact smoke, focused offline tests and a Linux live-download/full-refit job including src/verify.py. The refit requires the reviewed source SHA-256; official revisions require review. Dated verification scope distinguishes the old private-archive receipt from the public repository and its reproduction checks.

Read more