Macro Edge Research

Kuwait House Price Index — Methodology & Findings

A constant-quality residential price index from Ministry of Justice transaction records — estimator selection, adversarial audit, and the hardened production index

Last updated: 2026-06-30 Database snapshot: 150,161 transactions, July 2005 → June 2026 Scope: Private-residential houses (property_category='خاص' AND property_status='بيت')

⚠️ Current standard → see §14. Sections 0–13 document the original three-method comparison (OLS time-dummy hedonic). A 10-reviewer adversarial audit (June 2026) unanimously kept the hedonic family but rejected the as-is OLS implementation. The production headline is now the hardened robust index in hedonic_index.py (median/quantile regression, non-revising rolling splice, bootstrap + dispersion bands). Headline moved from −15.1% (OLS) to −12.8% (robust). Where §0–§13 disagree with §14, §14 governs. The "<2%" cap-sensitivity claim in §12 was wrong and is corrected in place.


0. TL;DR

Method Q1 2026 (KWD/sqm) YoY Peak Decline from peak
Pooled median (existing report) 758 ▲ 1.0% 833 (Q4 2022) −9.1%
Stratified median (mix-controlled) 798 ▼ 8.1% 955 (Q3 2023) −16.5%
Hedonic regression (recommended headline) 748 ▼ 1.6% 881 (Q3 2022) −15.1%

Headline narrative: Kuwait house prices are down ~15% from the 2022 peak (hedonic). Robustness range across methods: −9% to −17%. Not the 20-30% "crash" sometimes claimed in popular discussion — those numbers come from cherry-picking the worst-affected peripheral areas.


1. Context

The existing report (report_generator_psqm.py) headlines a pooled median price/sqm. This is the simplest possible aggregate and is biased because it lets high-volume cheap areas dominate the headline. The OECD/Eurostat/IMF Handbook on Residential Property Price Indices explicitly recommends against pooled median for headline indices.

This document records the methodology work done to build a more defensible price index for Kuwait MOJ transaction data, the alternatives we tested, what works, what doesn't, and the empirical results.


2. Dataset

2.1 Source

Kuwait Ministry of Justice (MOJ) real-estate transaction database, scraped monthly. - Database: Current/data/moj_realestate.db - Update script: Current/data/download_all_moj.py --update - Refresh cadence: monthly (re-downloads last month + any new months)

2.2 Schema (transactions table)

Column Type Notes
governorate TEXT Arabic name; 6 valid + "غير معرف"
area TEXT Arabic area/zone name; ~122 unique for houses
block TEXT Block number within area; ~946 (area,block) tuples for houses
property_category TEXT Filter to خاص (Private) for houses
property_status TEXT Filter to بيت (House)
transaction_date TEXT Format: DD/MM/YYYY
property_size REAL sqm
price REAL KWD

Critical missing columns (limit how deep we can go): - ❌ Property identifier / parcel ID (would enable Case-Shiller repeat-sales) - ❌ Year built / age - ❌ Number of bedrooms / floors - ❌ Quality / condition rating - ❌ Tax appraisal value (would enable SPAR index) - ❌ Lot frontage, corner status, view, etc.

2.3 Sample sizes (houses, after standard filters)

2.4 Filtering decisions

Filter Used by Rationale
property_category='خاص' AND property_status='بيت' All methods Houses (private residential plots), the dominant category and what "house prices" usually means
price > 1000 KWD Stratified, Hedonic Drops nominal transfers (gifts, family swaps)
price > 0, size > 0 Pooled (existing) Minimum needed to compute price/sqm
psqm ∈ [100, 3000] KWD/sqm Stratified, Hedonic Sanity cap; drops data-entry errors that distort area-level medians
Governorate whitelist (6 official) All methods Drops "غير معرف" (Unknown) — only 9 records

Note on the psqm cap: without it, area medians get distorted by single transactions at 30 KWD/sqm or 5,000 KWD/sqm (data entry errors). Median is robust to outliers in large samples but not in small ones, and per-area stratification means small samples per cell.


3. Stratification Feasibility (was it even worth doing?)

Before building the stratified index, we profiled cell sizes to confirm we have enough data per area for a stable estimate.

3.1 Coverage at different thresholds

Whole period (44,720 transactions):

Aggregation Cells (n≥10) Coverage of total rows
Area 95 / 123 (77%) 99.8%
Area + Block 519 / 949 (55%) 97.7%

Last 2 years (4,534 transactions):

Aggregation Cells (n≥10) Coverage
Area 82 / 105 (78%) 98.3%
Area + Block 146 / 587 (25%) 62.7%

Last quarter (Q1 2026) (435 transactions):

Aggregation Cells (n≥10) Coverage
Area 9 / 77 (12%) ~60%
Area + Block 5 / 230 (2%) ~15%

3.2 Conclusion on granularity

3.3 Within-area block dispersion

For 26 areas with ≥50 obs and ≥2 well-sampled blocks (last 2y):

Quartile Block-median spread within area (max/min−1)
p10 7%
p25 11%
p50 20%
p75 28%
p90 60%

Some areas are wildly heterogeneous internally: - جليب الشيوخ (Farwaniya): area median 159 KWD/sqm hides block medians 126→658 (4× spread, mixed labour-housing + residential) - خيطان (Farwaniya): 92% block spread - سلوى (Hawalli): 61% block spread

Other areas are uniform: - المطلاع (Jahra): 2% block spread - مدينة صباح الأحمد السكنية (Ahmadi): 7% block spread

→ Block-level matters for ~25-30% of areas. The headline index doesn't need it; a "drill-down" report could use it for those specific areas.


4. Methods Tested

4.1 Method A — Pooled median (existing report)

Spec:

median_psqm(t) = median { price_i / size_i : transaction i in quarter t }

Strengths: Simple, transparent, fast to compute.

Weaknesses: - No mix control. If 266 deals come from cheap المطلاع area (750 KWD/sqm) and 35 from expensive بيان (1,033 KWD/sqm), pooled gives the cheap area 7.6× the influence. - Conflates mix changes with price changes. - The OECD/Eurostat handbook explicitly deprecates this for headline indices.

Implementation: Current/Template/report_generator_psqm.py (existing report)

Q1 2026 value: 758 KWD/sqm Peak: 833 in Q4 2022 Decline from peak: −9.1%

4.2 Method B — Stratified median (Laspeyres-style)

Spec:

For each quarter t:
  1. Take trailing 4 quarters of transactions.
  2. Drop transactions with psqm outside [100, 3000].
  3. For each area a with n_a >= 10 in this window, compute median_psqm_a.
  4. stratified(t) = sum(n_a * median_psqm_a) / sum(n_a)
                    over areas with n_a >= 10

Strengths: - Controls for area mix. - Standard professional method (Reserve Bank of Australia, ABS, CoreLogic use variants). - Transparent — non-technical audience can follow it. - 90-97% coverage across all quarters with the 4Q window.

Weaknesses: - Doesn't control for size mix within an area. If 2025 deals in a given area happened to be larger houses (lower psqm by elasticity), this reads as a price drop. - 4Q window adds smoothing — less responsive to genuine quarterly turning points. - Requires arbitrary thresholds (n≥10, psqm cap).

Implementation: Current/data/stratified_psqm_report.py Output: Current/Reports/kuwait_realestate_quarterly_Houses_Q1_2026_en_stratified_*.pdf

Q1 2026 value: 798 KWD/sqm (63 areas qualify, 93% coverage) Peak: 955 in Q3 2023 Decline from peak: −16.5%

Spec:

log(price_i) = β0 + β1 * log(size_i) + Σ_a γ_a * I(area_i = a)
                 + Σ_t δ_t * I(quarter_i = t) + ε_i

Sample: 2020-Q1 onward, areas with >=30 obs in window.
Estimator: OLS.
Index: hedonic_psqm(t) = base_psqm * exp(δ_t)
       (anchor: pooled median in base quarter Q1 2020)
95% CI: ± 1.96 * SE(δ_t)

Strengths: - Controls for both area mix and size mix (the two biggest drivers we can observe). - Industry standard (Eurostat, ONS, ABS, RBA, BLS use hedonic for residential indices). - Tight 95% CI on the index (~±5-10%) despite per-transaction RMSE of ±57% on price level — averaging across thousands of transactions per quarter pins down the central tendency. - Area FE ladder can be reused as a constant-quality price map.

Weaknesses: - R² = 0.47 — only half the price variance is explained. The other 53% is unobserved property quality (year built, condition, # bedrooms, view, etc.). - Assumes the hedonic relationship is stable over time (no area×time interactions in the basic spec). - Requires statistical software / training to interpret coefficients.

Implementation: Current/data/three_method_report.py Output: Current/Reports/kuwait_realestate_quarterly_Houses_Q1_2026_en_three_methods_*.pdf

Model fit (estimated 2026-05-10): - n = 14,545 transactions - 83 areas (≥30 obs each in trend window) - 26 quarters (Q1 2020 → Q2 2026) - R² = 0.471, Adj R² = 0.467 - Size elasticity = 0.691 (1% larger house → 0.69% higher price → larger houses cost less per sqm) - log_size standard error: tight, p-value ≈ 0

Q1 2026 value: 748 KWD/sqm (95% CI: [705, 794]) Peak: 881 in Q3 2022 Decline from peak: −15.1%


5. What Doesn't Work

5.1 Quasi-repeat-sales via fingerprinting

Idea: Without a property ID, try to match transactions on (area, block, size) tuples. If two sales share a fingerprint, treat them as repeat sales of the same property and compute the price change between them. This is the closest possible workaround for Case-Shiller methodology.

Why it fails for Kuwait: Modern Kuwaiti developments are master-planned with standardized plot sizes. Many different houses share the exact same (area, block, size) tuple.

Match rate observed: 95% of transactions share a fingerprint with at least one other. (Real Case-Shiller studies typically find 10-20% — anything higher means false matches.)

Concrete examples: | Fingerprint | "Sales" found | Reality | |---|---|---| | مدينة صباح الأحمد البحرية, Block 0, 543 sqm | 26 sales over 12 years | ~26 different houses on a development grid | | الفنيطيس, Block 2, 400 sqm | 25 sales over 13 years | Same — different houses, same dimensions | | المسايل, Block 3, 500 sqm | 10 sales over 11 years | Same | | الجابرية, Block 5, 741 sqm | 3 sales SAME DAY same price | Data duplicates, not real repeats |

Verdict: the fingerprint approach has too high a false-positive rate to produce a defensible index. Tried filtering to fingerprints with exactly 2 sales and "unusual" sizes (rare combos less likely to be standardized plots) — sample halved, noise barely shrank. Not a usable methodology with current data.

5.2 Other rejected methods

Method Why rejected
Repeat-sales (Case-Shiller) No property ID in MOJ data
SPAR (sale-price-appraisal-ratio) No tax appraisal data
Hybrid models Need property IDs
Hedonic imputation Marginal variant of time-dummy hedonic; same data, similar result
Block-level stratification Per-quarter cells too sparse (only 5-6 cells with n≥10 per quarter); works only for ≥4y windows

6. Comparative Results

6.1 Per-quarter time series (2020-Q1 → 2026-Q1)

Quarter Pooled Stratified Hedonic
Q1 2020 650 692 680
Q2 2020 667 699 658
Q3 2020 634 707 675
Q4 2020 633 722 666
Q1 2021 700 752 715
Q2 2021 671 765 740
Q3 2021 716 777 766
Q4 2021 775 814 783
Q1 2022 783 845 830
Q2 2022 830 881 862
Q3 2022 826 917 881 ← H peak
Q4 2022 833 ← P peak 941 818
Q1 2023 832 953 852
Q2 2023 826 944 849
Q3 2023 822 955 ← S peak 820
Q4 2023 788 918 786
Q1 2024 813 914 787
Q2 2024 790 913 799
Q3 2024 750 885 774
Q4 2024 774 883 787
Q1 2025 750 868 760
Q2 2025 745 831 750
Q3 2025 739 824 793
Q4 2025 750 823 779
Q1 2026 758 798 748

6.2 Decline from peak

Method Peak Current (Q1 2026) Decline Trough (post-peak)
Pooled 833 (Q4 2022) 758 −9.1% 739 (Q3 2025) → −11.3%
Stratified 955 (Q3 2023) 798 −16.5% 798 (Q1 2026) — current is trough
Hedonic 881 (Q3 2022) 748 −15.1% 748 (Q1 2026) — current is trough

6.3 YoY change (Q1 2025 → Q1 2026)

Method Q1 2025 Q1 2026 YoY
Pooled 753 758 +1.0%
Stratified 868 798 −8.1%
Hedonic 760 748 −1.6%

6.4 Why the methods diverge


7. By-Area Decline Analysis

To answer "is the market crashing 20-30% as people claim?", we look at area-level changes between the 2022 peak year and the trailing 4 quarters ending Q1 2026.

Sample: Only areas with ≥30 transactions in BOTH periods (20 areas qualify).

7.1 Distribution of area-level changes (2022 → last 4Q)

Quartile % change
p10 −20.4%
p25 −14.2%
p50 (median area) −7.8%
p75 −5.0%
p90 −1.2%
Mean −8.9%
Bucket # areas (of 20)
Down ≥20% 3
Down 10-20% 4
Roughly flat (−10% to +10%) 13
Up ≥10% 0

7.2 Top 10 area declines

Area Governorate 2022 KWD/sqm Last 4Q % change
مدينة صباح الأحمد البحرية Ahmadi 867 674 −22%
أبو فطيرة Mubarak Al-Kabeer 1,445 1,125 −22%
الأندلس Farwaniya 853 680 −20%
سلوى Hawalli 877 738 −16%
الفردوس Farwaniya 781 664 −15%
الرقة Ahmadi 718 618 −14%
الوفرة السكنية Ahmadi 400 360 −10%
الواحة Jahra 667 607 −9%
العارضية Farwaniya 857 783 −9%
مدينة صباح الأحمد السكنية Ahmadi 492 450 −8%

7.3 Most stable areas (premium urban)

Area Governorate 2022 KWD/sqm Last 4Q % change
المنقف Ahmadi 880 950 +8%
الرميثية Hawalli 940 929 −1%
م.جابر الأحمد السكنية Capital 1,050 1,038 −1%
بيان Hawalli 1,067 1,033 −3%
الجابرية Hawalli 1,067 1,021 −4%
ض.صباح السالم Mubarak Al-Kabeer 933 883 −5%
م. سعد العبدالله Jahra 849 795 −6%

7.4 Geographic interpretation


8. Hedonic Area Fixed-Effects (Constant-Quality Price Ladder)

The hedonic model produces an area FE for each of 83 areas. After shifting so the cheapest area = 0%, the top 20 areas by price level (holding size constant, holding quarter constant):

Rank Area Governorate Premium above cheapest
1 ض.الصديق Hawalli +425%
2 ض. عبد الله السالم Capital +376%
3 المنصورية Capital +370%
4 النزهة Capital +353%
5 المسايل Mubarak Al-Kabeer +332%
6 الشامية Capital +327%
7 ض. مبارك العبدالله الصباح Hawalli +317%
8 ض. السلام Hawalli +314%
9 الخالدية Capital +312%
10 الفيحاء Capital +309%
11 الفنيطيس Mubarak Al-Kabeer +299%
12 العديلية Capital +297%
13 أبو فطيرة Mubarak Al-Kabeer +280%
14 ض. الشهداء Hawalli +275%
15 الروضة Capital +265%
16 كيفان Capital +254%
17 ض. الزهراء Hawalli +253%
18 اليرموك Capital +244%
19 ض. حطين Hawalli +239%
20 جنوب عبدالله المبارك السكني Farwaniya +235%

Validation: This ladder matches the known geography of high-end Kuwait housing — ضواحي (suburbs) of Hawalli, premium Capital neighborhoods, master-planned Mubarak Al-Kabeer developments. The model is identifying real signal, not noise.

Range: ~5× from cheapest to most expensive area, holding house size and time constant.


9. Recommendations

9.1 For a single headline number

Use hedonic. Quote it as: "Median price/sqm Q1 2026: 748 KWD/sqm (hedonic). Robustness range: 758 (pooled) to 798 (stratified)."

9.2 For trend / direction

All three methods agree houses are down from the 2022 peak. The bracket is −9% to −17%. Hedonic central estimate: −15%.

9.3 For talking to non-technical audiences

"Kuwait house prices are down about 15% from their 2022 peak, after controlling for which areas the deals came from and what size houses were transacted. Some peripheral areas are down 20%+; premium urban areas are roughly flat. The 'crash' headlines are mostly cherry-picking the worst-hit segments."

9.4 What NOT to do

9.5 Should we retire the existing report?

Suggest option 3 for an upcoming quarterly cycle, then settle on hedonic as the headline going forward.


10. Reference Implementations (file paths)

Component Path Notes
MOJ scraper test/moj_realstate_scraper.py Low-level CSV download
Bulk download orchestrator Current/data/download_all_moj.py Run with --update weekly
Database Current/data/moj_realestate.db SQLite
Existing pooled report Current/Template/report_generator_psqm.py Per-language quarterly/yearly PDF
Stratified report Current/data/stratified_psqm_report.py Builds 2-page PDF (pooled vs stratified)
Three-method comparison Current/data/three_method_report.py Builds 2-page PDF (pooled vs stratified vs hedonic) + area FE ranking

To regenerate Q1 2026 reports:

python Current/Template/report_generator_psqm.py quarterly 2026 1 -c house --both
python Current/data/stratified_psqm_report.py 2026 1
python Current/data/three_method_report.py 2026 1

11. Future Research Directions

11.1 Data improvements (would unlock better methods)

Wish-list field Unlocks
Persistent property/parcel ID True Case-Shiller repeat-sales index (gold standard)
Year built / age Hedonic R² jump from 0.47 → 0.65+
# bedrooms, # floors Same
Condition / quality rating Same
Lot characteristics (corner, frontage, view) Marginal R² improvement
Tax appraisal value SPAR index
Listing data (asking vs sold) Liquidity / market-tightness measures

If MOJ ever publishes deed numbers across transactions, repeat-sales becomes immediately viable and would supersede everything here.

11.2 Model extensions worth trying with current data

  1. Quadratic in log_size: log(price) ~ log(size) + log(size)^2 + ... to allow non-constant elasticity. May matter for very small or very large houses.
  2. Time × area interactions: Allow area-specific trends (some areas may be appreciating while others depreciate). Cost: many more parameters; only feasible for high-volume areas.
  3. Block fixed effects in heterogeneous areas (the 25-30% of areas with high within-area dispersion — see §3.3). Would refine the location control.
  4. Spatial autocorrelation correction (Moran's I, geographically weighted regression). Higher academic rigor but probably marginal practical value.
  5. Hedonic imputation index (vs the time-dummy approach used here). Computes the price for a fixed bundle of characteristics in each period. Slight theoretical edge; usually similar results.
  6. Generalised linear model with robust errors to reduce sensitivity to outliers. Currently using OLS on log-price.

11.3 Sub-indices worth building

11.4 Other analytical directions


12. Known limitations & honest caveats

  1. Hedonic R² of 0.47 means half the per-transaction price variance is unexplained. This is normal for stripped-down hedonics, but worth being transparent about. The index is well-identified despite this because it averages across many transactions.
  2. The psqm sanity cap [100, 3000] is NOT innocuous under OLS — this corrects an earlier claim in this section. An earlier version stated "the index moves by <2% under tighter caps [200, 2000] or looser caps [50, 5000]." That is wrong for the figures the index is actually sold on. Re-measured (2026-06): under OLS the peak→Q1-2026 decline swings from −11.3% (cap [50, 5000]) → −15.1% ([100, 3000]) → −13.2% ([200, 2000]) — a ~3.5pp band, wider than the gap between the three methods — and R² swings 0.35 → 0.63 (i.e. the fit is partly cap-manufactured, not signal). Root cause: OLS on log-price has squared-error loss and is dragged by the MOJ price tails (psqm p99.9 ≈ 609,000 KWD/sqm; bottom ~5% < 17). Fix: the hardened index (hedonic_index.py) estimates the conditional median via quantile regression, which is robust to the tails — the headline then barely moves on the upper cap, leaving only the economic low-transfer threshold as a disclosed choice. See §14.
  3. The base anchor for the hedonic index is the pooled median in Q1 2020. This is just a units conversion — it doesn't affect changes in the index, only the scale.
  4. All methods exclude commercial, investment, industrial, etc. — houses only. Trends in those segments may differ.
  5. Q2 2026 data is partial (snapshot date 2026-05-10) and shouldn't be used for headline figures. Q1 2026 is the most recent complete quarter.
  6. The "20 areas with ≥30 obs in both 2022 and last 4Q" sample for §7 is a small subset of the 122 total areas. Rural/peripheral areas with fewer transactions are underrepresented in the by-area decline picture. The aggregate methods (pooled, stratified, hedonic) cover more areas.

13. Appendix: How to interpret R² in this context

R² range Typical interpretation for hedonic price models
<0.30 Model is missing major drivers; results unreliable
0.30-0.50 Stripped-down hedonic with limited covariates; index is usable but per-transaction predictions are weak. Our model lands here (0.47).
0.50-0.70 Standard published hedonic indices with reasonable property data
0.70-0.90 Rich data: includes age, condition, # rooms, sometimes quality scores
>0.90 Very rich data + small homogeneous market (rare)

Our R² is at the lower end of "usable" but we're getting the index from a coefficient (the quarter dummy) that is itself well-estimated because it averages over thousands of transactions per period. Per-transaction prediction is noisy; index estimation is not.


14. Hardened index & adversarial audit (2026-06)

Status: this supersedes §0–§13 as the production standard. Implementation: Current/data/hedonic_index.py · published series: hedonic_index_published.csv · audit: hedonic_index_audit.md. Data: 150,161 transactions through June 2026.

14.1 Why this section exists

A 10-reviewer adversarial panel (distinct lenses: econometric spec, RPPI handbook, revision/publishability, transparency, data-quality, robustness, Kuwait domain, repeat-sales, time-series, premise-buster) pressure-tested "standardize on the OLS time-dummy hedonic": - Verdict HEDONIC_WITH_FIXES — 10/10. No vote for pooled or stratified as the standard; none for the OLS build as-is. - Average endorsement 5.6/10 (range 4–7): right family, wrong build. 9/10 wanted a fixed hedonic variant.

14.2 What the panel got right (measured, not asserted)

  1. The psqm cap was a researcher degree-of-freedom. Under OLS the peak→headline decline swings with the cap and R² is partly cap-manufactured (0.35→0.63). The "<2%" claim in §12.2 was wrong; corrected there.
  2. Revision is real but tiny (~0.5% mean, 1.4% max) — a governance defect, not a signal problem.
  3. A single number hides dispersion (−11% … −26% across governorates) and the OLS 95% CI was too narrow.

14.3 The fixes (hedonic_index.py)

Wound Fix Evidence
Discretionary cap Median (quantile) regression vs OLS — robust to the price tails (psqm p99.9 ≈ 609,000) Upper-cap span OLS 1.5pp → QuantReg 0.4pp; low-threshold swing OLS 3.3pp → QuantReg 0.9pp
Revision Rolling-window movement-splice (append-only) + frozen on-disk vintage (settled quarters never rewritten; last 2 provisional) Rebuild as-of an earlier vintage changes shared history by 0
Narrow CI Unit-clustered bootstrap (resample gov|area), peak fixed 95% CI [−20.1%, −11.8%] (n=200)

Plus a per-governorate dispersion band, optional 2Q smoothing, and an honest label ("location/size-adjusted constant-quality — better-than-pooled, NOT validated repeat-sales").

14.4 The hardened headline — Q2 2026 (last mature quarter; updated 2026-07-12)

Quantity Value
Published index (2020Q1 = 100), robust rolling chain 110.9
Constant-quality level (anchor = 2020Q1 pooled median 681) ≈ 755 KWD/sqm (2Q-smoothed 767)
Peak→Q2-2026 decline — published chain −15.5% (peak Q3 2022)
Full-sample robust cross-check QuantReg / RLM / OLS −17.0% / −17.4% / −16.6%
Bootstrap 95% CI (full-sample decline, 200 reps) [−19.9%, −13.6%]
Governorate dispersion −15.3% (Jahra) … −26.9% (Capital)

Plain-language headline: Kuwait house prices are down roughly 15–17% from their 2022 peak on a constant-quality basis (95% CI ≈ −14% to −20%). Still short of the 20–30% "crash" of popular discussion, but the gap is narrowing — Q2 2026 fell 3.1% QoQ.

Dispersion flip (Q2 2026): the geography inverted versus the Q1 vintage. Capital (−26.9%) and Hawalli (−24.5%) now lead the decline; Jahra (−15.3%) and Ahmadi (−15.6%) are mildest — the reverse of the earlier "premium held better" reading. Per-governorate estimates are noisy quarter to quarter (Hawalli moved ~9pp in one quarter on a thin per-gov sample), so treat the ordering as indicative; the robust statement is the ~12pp spread itself.

The published rolling-chain decline (−15.5%) is milder than the single full-sample robust fit (−17.0%) because the rolling window lets area/size shadow-prices drift quarter-to-quarter (the handbook-preferred behaviour). Quote the band, not a false-precision point.

Prior vintage for reference (2026-06-30, headline Q1 2026): index 114.5, level ≈779, published decline −12.8%, CI [−20.1%, −11.8%], dispersion −11.4% (Jahra) … −25.6% (Farwaniya).

14.5 Independent code verification

A separate verification pass confirmed the splice is exactly non-revising and the cluster bootstrap valid, and found 4 defects — all fixed: 1. Hardcoded headline/immature quarters → derived from the data each run (would have gone stale when Q3 2026 lands). 2. Area-name collision (one name shared by two governorates) → location key now gov|area (matches the stratified module); sample 14,892 → 14,876. 3. Latent NaN-propagation in the splice → guarded. 4. Bootstrap re-argmaxed the peak each rep (pessimistic) → peak fixed to the point estimate.

14.6 How to run

python Current/data/hedonic_index.py build                 # update non-revising series -> hedonic_index_published.csv
python Current/data/hedonic_index.py audit --bootstrap 200  # cross-checks, cap-sensitivity, non-revision, bootstrap, dispersion -> hedonic_index_audit.md

Estimator switchable via --estimator {quantreg,rlm,ols} (default quantreg). Run build after each DB --update; the published series only ever appends or refreshes the provisional tail.

14.7 Residual honest caveats

Current/data/hedonic_longrun_report.py (build / render) extends the index back to 2006Q3 — the true start of usable MOJ house data (khaas+bayt records begin Apr 2006) — using the identical frozen filters, median regression, and 13-quarter rolling movement splice (44,989 obs, 91 gov|area units). Output: hedonic_longrun.csv.

Governance: 2020Q1+ is the published non-revising series verbatim; pre-2020 is an analytical backcast, spliced at 2020Q1, revisable on re-estimation — it is not part of the frozen vintage.

Backcast↔published cross-check: over the shared 2020–26 span the two differ by a one-time level offset of ≈ +7–8 index points, built up in 2020Q2–2021Q1 — the quarters where the published chain's windows were necessarily short (its data starts 2020Q1, and 2020Q2 had n=68 under COVID lockdown). After 2021Q1 the gap is flat (no trend). Consequences are second-order: era-B trend CAGR is +1.9%/yr (published) vs +2.6%/yr (backcast variant); peak→Q2-2026 decline −15.5% vs −14.9%. The published numbers are retained (non-revision governance) and are the conservative reading of post-2020 growth.

Era findings (Q2 2026 long-run report, nominal KWD): | | 2008Q1–2019Q4 | 2020Q1–2026Q2 | |---|---|---| | Level | 407 → 658 KWD/sqm (+62%) | 680 → 755 KWD/sqm (+11%) | | Trend CAGR (log-linear fit) | +5.6%/yr (R² 0.62; ex-2008 +5.3%) | +1.9%/yr (R² 0.17; ex-2020Q2 +1.5%) | | Endpoint CAGR | +4.2%/yr | +1.7%/yr |

Slowdown = 3.7 pp/yr (3.0 pp/yr on the backcast variant). Q2 2026 is +14.7% above Q4 2019 — constant-quality prices never fell below their pre-COVID level — while sitting −15.5% off the Q3 2022 peak and ≈ −19.5% below the old-trend path compounded from the actual Q4-2019 level (−29.7% vs the fit-extended trend line, but the 2019 market already sat ~13% below that fit — quote the anchored figure first). Era-B trend fit is weak by construction (boom-bust dominates); lead with levels + both CAGRs, not the fit alone.

Section 14 added 2026-06-30 after the adversarial audit; §14.4 refreshed and §14.8 added 2026-07-12. Where §0–§13 conflict, §14 governs.


End of methodology document. Last reviewed 2026-07-12.

© 2026 Macro Edge Research · General research, not investment advice; no recommendation to deal in any security. · macroedgeresearch.com