SPB Git forge

spb/wp23_uqo

Public
6commits 1branches 0releases
32.7 MBsize
maindefault branch
40 min agolast push
TeX 62.3% Python 37.6%
8.1 KB

# 📈 Beyond Hedonic Models: Spatiotemporal, Hierarchical and Probabilistic Architectures for Residential Real Estate Price Forecasting

UQO Working Paper No. 23 — A pseudo-real-time evaluation on 632,000 Quebec transactions and 82 local market indices, 2021–2026

Paper Python Data Reproducible Institution Author

TL;DR — Three forecasting tasks on the WP22 Quebec registry data in a strict forward-chaining design: (A) the price of a dwelling sold 1–12 months after the origin, (B) the 1/3/6/12-month change of municipal, regional and provincial quality-adjusted indices (predictors = WP22 real-time vintages only), (C) calibrated predictive distributions. Five candidate architectures (HSHN, DSGFN, RAREF, BHPF, QANSS) and an integrated stack (QREFA) against ~25 benchmarks (naive, AR, local linear trend, ridge, LightGBM, XGBoost, random forest, SVR, MLP, LSTM/GRU/TCN/TFT-lite). Inference: Diebold–Mariano (HAC), Giacomini–White, model confidence sets, stationary bootstrap; simulation study with known latent dynamics (random walk, momentum, regimes, spillovers, sparse). Verified bibliography (152 entries).


# 📌 Status

Item Value
Version 1.1 (October 2026) — extended analyses and completed appendices
SSRN not yet submitted
Journal —
Code & data reproducible from scripts/; inputs are WP22 artefacts (read-only)

# 🎯 What this paper does

Tests, on the same transaction-level data, whether spatial, hierarchical, regime-adaptive, Bayesian and state-space forecasting mechanisms beat strong conventional forecasts, and when. Every architecture is classified against the verified literature (application / adaptation / new combination); none is claimed unprecedented.

# 🏆 Headline results

Object Estimate
Task A, 1–3 months: MAE (log ×100) LightGBM / HSHN partial / hedonic OLS / naive municipal median 21.21 / 22.36 / 23.24 / 34.96
Task A, 7–12 months: LightGBM MAE / bias of all models 22.70 / −4 to −9 log pts (market not extrapolated)
Task B, h = 3: MASE vs no change — LightGBM panel / QREFA / QANSS / ridge / AR(2) / DSGFN 0.75 / 0.82 / 0.83 / 0.84 / 0.90 / 0.88
Task B, h = 12: best = AR(2) MASE 0.63; pooled models worse than no change (bias +6 to +11 log pts) —
90 % coverage at h = 3: QANSS / BHPF / ridge / LightGBM / DSGFN / TFT-lite 97 / 90 / 90 / 76 / 73 / 73 %
Ablations (municipal, h = 6): DSGFN without graph vs full / equal-weight combo vs QREFA / ridge without momentum -0.59 / -0.38 / +0.53 log pts
Seed variability (h = 3): DSGFN 3.76–4.05, TFT-lite 4.33–4.83, QANSS 3.75–3.96 —
Simulation (municipal, h = 3, MAE / no change): regimes AR(2) 0.78 · momentum ridge 1.53 · spillover DSGFN 1.29 · rw QANSS 2.04 —
Task B, h = 3, by ex-post provincial regime: LightGBM MASE rising windows (17 origins) / flat (13) 0.63 / 1.00 (the gain is the forecastability of spring upswings)
Task B, h = 3, Holm-adjusted DM p-value vs no change: LightGBM / QANSS (unadjusted 0.007 / 0.037) 0.11 / 0.59 — no improvement survives a 10 % family-wise rate
Task B, h = 3, directional accuracy all / at turning points: DSGFN / QREFA / LightGBM 77 / 76 / 75 % overall; 65 / 66 / 65 % at turning points
Task C, h = 3, Brier skill of P(decline) vs climatology: QREFA / LightGBM / QANSS / no change +0.17 / +0.15 / +0.07 / -0.02
Task B, h = 3, 192 municipal cells: share where LightGBM / QANSS / ridge beats no change; LightGBM median MASE 91 / 83 / 72 %; 0.74
Equal-weight combinations (h = 3): LightGBM alone / LightGBM + QANSS / four models / QREFA stack 0.754 / 0.760 / 0.765 / 0.816
Task A, 1–3 months, median absolute dollar error LightGBM vs municipal median: house / condo / plex $61,102 vs $92,750 / $32,005 vs $127,000 / $80,115 vs $135,000

Every number is a generated macro (paper/tables/numbers.tex).

# 🗂 Repository layout

text
forecasting-architectures-quebec/
├── CLAUDE.md                  # protocol (as received; truncated section completed)
├── src/wp23/                  # config, data (Task A), data_b (Task B), evaluation, models_a(+_torch), models_b(+_torch)
├── scripts/                   # 10 task A · 20 task B · 30 evaluate · 35 interpret · 36/37 ablation · 38 robustness · 39 extra analyses · 40/41 simulation · 50 tables · 60 figures
├── tests/
├── data/processed/            # task_b_panel.parquet (built from WP22 vintages; not committed)
├── results/                   # task_a, task_b, eval_a, eval_b, ablation_b, robustness_b, simulation, interpret, extra (time/regime/direction/decline/combination/municipal/cost/dollar/selection)
├── docs/                      # PLAN, decision_log, leakage_audit, limitations, literature/ (152 verified refs, novelty scan)
└── paper/                     # main.tex, sections/, appendix/, tables/ (generated), references.bib

# 🚀 Quick start

bash
# WP22 must be present as ../sharp-hpi-quebec with its processed layers and index_vintages.parquet
python3 -c "import sys; sys.path.insert(0,'src'); from wp23 import data_b; data_b.build_panel().write_parquet('data/processed/task_b_panel.parquet')"
python3 scripts/10_task_a.py --family trees; python3 scripts/10_task_a.py --family torch     # separate processes (OpenMP conflict on macOS)
python3 scripts/20_task_b.py --family classic; python3 scripts/20_task_b.py --family trees; python3 scripts/20_task_b.py --family torch
python3 scripts/30_evaluate.py a; python3 scripts/30_evaluate.py b
python3 scripts/35_interpret.py; python3 scripts/36_ablation.py; python3 scripts/37_ablation_summary.py; python3 scripts/38_robustness.py
python3 scripts/40_simulation.py --build --reps 10; for f in classic trees torch; do python3 scripts/40_simulation.py --reps 10 --family $f; done; python3 scripts/41_sim_summary.py
python3 scripts/50_tables.py; python3 scripts/60_figures.py; cd paper && latexmk -pdf main.tex

Heavy runs were executed on a 32-core Mac Studio (M3U96b) with the same code.

# 🗃 Data

WP22 (../sharp-hpi-quebec): headline sample of 632,006 sales (2021-01 → 2026-10-07), real-time SHARP-HPI vintages (publication dates July 2022 → October 2026, filtered and smoothed modes), retrospective panel (targets only), SDA boundaries. No listing, bedroom/bathroom, condition or image data exist in this source.

# 🔬 Methodology

See paper/sections/{targets,architectures,benchmarks,framework}.tex and docs/leakage_audit.md.

# ⚠️ Limitations

See docs/limitations.md and the paper's final section.

# 📝 Citation

bibtex
@techreport{boucher2026forecasting,
  author      = {Boucher, Simon-Pierre},
  title       = {Beyond Hedonic Models: Spatiotemporal, Hierarchical and Probabilistic Architectures for Residential Real Estate Price Forecasting},
  institution = {Universit\'e du Qu\'ebec en Outaouais, D\'epartement des sciences administratives},
  type        = {Working Paper},
  number      = {23},
  year        = {2026},
  month       = {October}
}

# 👤 Author & contact

Simon-Pierre Boucher — Département des sciences administratives, Université du Québec en Outaouais (UQO), Gatineau, QC. 📧 simon-pierre.boucher@uqo.ca

# 🗒 Notes

  • Follows Recherche-UQO/HARMONISATION.md. The pasted protocol ended at section 17 ("11. Prob…"); the remaining sections were completed from the series conventions (see CLAUDE.md).