⚖️ The Assessment Gap in Quebec
UQO Working Paper No. 10 — Vertical and Horizontal Inequity in Municipal Property Valuation: Evidence from 522,769 Sales Matched to the Assessment Roll
TL;DR — Matching 522,769 Quebec residential sales (2021–2026) to the triennial assessment rolls that tax them, this paper delivers the first province-wide audit of property-assessment equity in Canada. Within the same municipality × roll × year, the elasticity of the assessment ratio w.r.t. price is −0.34 (Cheng FE) and still −0.08 under Clapp's measurement-error-robust IV. 99% of municipalities fail the IAAO uniformity standard, 95% fail its vertical-equity standard — Montréal is the lone progressive large market. The median dwelling in the bottom local price decile pays ~65% more property tax than uniform assessment would imply; the top decile pays ~5% less.
📖 Table of contents
- What this paper does
- Headline results
- Repository layout
- Quick start
- The pipeline, step by step
- Data
- Methodology
- Figures & tables inventory
- Limitations
- Citation
- Author & contact
🎯 What this paper does
Quebec taxes every dwelling in proportion to its assessed value, redrawn on a triennial roll whose values must, by statute (art. 46 LFM), reflect market conditions at a single reference date. If assessments are regressive — cheap homes overvalued relative to expensive ones — the effective tax rate falls with wealth, silently. This project measures that gap at province scale:
ln AV_i = α_c(i) + β · ln SP_i + ε_i (c = municipality × roll × sale-year)- γ = β − 1 is the elasticity of the assessment ratio w.r.t. price (γ < 0 ⇒ regressive), identified within 2,884 market-timing cells;
- the Clapp (1990) rank IV purges the attenuation bias that pushes naïve ratio studies toward spurious regressivity;
- the full IAAO ratio-study battery (median ratio, COD, PRD, PRB) with bootstrap CIs is computed for every municipality with ≥ 100 usable sales;
- quantile profiles, subgroup elasticities, horizontal-dispersion regressions and an exact intra-municipal tax-shift calculation complete the audit.
🏆 Headline results
| Object | Estimate |
|---|---|
| Cheng elasticity, pooled OLS | β = 0.812 (0.029) |
| Cheng elasticity, cell FE | β = 0.656 (0.029) → γ = −0.344 |
| Clapp rank-IV (error-robust) | β = 0.917 (0.021) → γ = −0.083 |
| Quantile profile β(τ), τ = .10 → .90 | 0.87 → 0.49 (failure concentrated at the top) |
| Province-wide PRB (2021 / 2024) | −0.104 / −0.002 (staleness mechanism) |
| Municipalities with PRB < 0 | 99% (95% below IAAO band) |
| Median municipality COD | 26 (IAAO ceiling: 15) |
| Excess tax, bottom ↔ top local decile | +65% ↔ −5% (median) |
| The exception | Montréal: PRB +0.07, progressive in all 6 years |
Sub-group anatomy: condos γ = −0.12 vs single-family −0.45 / plex −0.49; land share > 0.4 → −0.50; age > 60 y → −0.43; large markets (>10k sales) −0.27.
🗂 Repository layout
wp10_uqo/
├── data/
│ ├── raw/ # matched sales–roll snapshot (see data/raw/README.md)
│ └── processed/ # analysis.parquet (built by step 01)
├── src/wp10/ # reusable package
│ ├── config.py # paths, thresholds, constants
│ ├── sample.py # sample construction & variable definitions
│ ├── iaao.py # COD / PRD / PRB + bootstrap CIs
│ ├── models.py # Cheng FE, Clapp IV, quantiles, horizontal, tax shift
│ └── plotstyle.py # journal-calibre matplotlib style (validated palette)
├── scripts/ # the pipeline, in order
│ ├── 01_build_sample.py
│ ├── 02_iaao_stats.py
│ ├── 03_estimate_regressions.py
│ ├── 04_make_figures.py
│ └── 05_make_tables.py
├── results/
│ ├── reproduced/ # every CSV the scripts emit
│ └── tables/ # LaTeX tables input by the paper
├── figures/ # 10 publication figures (PNG, 300 dpi)
└── paper/ # main.tex + sections/ + references.bib → main.pdf🚀 Quick start
cd wp10_uqo
python3 -m pip install -r requirements.txt
# place the parquet snapshot in data/raw/ (see data/raw/README.md), then:
python3 scripts/01_build_sample.py # 745,119 → 522,769 sales
python3 scripts/02_iaao_stats.py # IAAO diagnostics + bootstrap
python3 scripts/03_estimate_regressions.py # FE / IV / quantile / heterogeneity / tax shift
python3 scripts/04_make_figures.py # 10 figures
python3 scripts/05_make_tables.py # 10 LaTeX tables
cd paper && make # compile main.pdf (latexmk)Total runtime ≈ 5 minutes on an Apple-silicon laptop; peak RAM ≈ 6 GB.
🗃 Data
745,119 residential-market transactions (Jan 2021 – Jul 2026) matched at the parcel level to the assessment roll in force at the sale date (median match distance 0.6 m; every retained sale reproduces the roll value exactly). From the roll: total/land/building assessed values, lot & floor areas, year built, unit count, CUBF use code, roll vintage and the statutory market-condition date. Sample cascade (details in the paper, §4): residential CUBF → match quality → valid AV/SP → 1/99% ratio trim within roll vintage → cells ≥ 20 sales ⇒ 522,769 sales, 625 municipalities, 2,884 cells.
🔬 Methodology
- IAAO diagnostics (Standard on Ratio Studies, 2013) within
municipality × sale-year blocks, aggregated by median — COD, PRD, PRB with
percentile-bootstrap CIs (
src/wp10/iaao.py). - Cheng (1974) log-log regression with 2,884 absorbed fixed effects
(linearmodels
AbsorbingLS), SEs clustered on 625 municipalities. - Clapp (1990) rank IV — Z ∈ {−1,0,+1} from within-cell rank agreement of
ln AV and ln SP, 2SLS on demeaned data (
IV2SLS) — the conservative bound. - Quantile regressions on within-cell demeaned data (τ = .10….90).
- Heterogeneity: separate FE estimates by class, age, land share, roll lag, municipality size, sale year.
- Horizontal inequity: |ln r − cell median| regressed on characteristics.
- Tax shift: r / cell-median − 1 by within-cell price decile — exact % over/under-payment under Quebec's exemption-free ad valorem rule.
🖼 Figures & tables inventory
| Figure | Content |
|---|---|
fig_ratio_dist |
ratio distribution + by roll lag (Panels A/B) |
fig_time |
median ratio by month × roll vintage (staleness drift) |
fig_binscatter |
within-cell ln ratio vs ln price, 20 bins — the core fact |
fig_quantile |
β(τ) profile with FE/IV benchmarks |
fig_heterogeneity |
forest plot of subgroup γ |
fig_prb_muni, fig_cod |
municipal PRB / COD distributions vs IAAO bands |
fig_map |
province map of municipal PRB (Montréal exception) |
fig_taxshift |
excess tax burden by local price decile |
fig_robustness |
γ_FE vs γ_IV across 10 sample variants |
Tables (results/tables/*.tex): summary stats, IAAO province-wide, ten largest
markets, vertical regressions, quantiles, heterogeneity, horizontal, tax shift,
robustness, Paglin–Fogarty.
⚠️ Limitations
- Sales < $50k absent from the source registry; residual non-arm's-length transfers may survive screens (bottom-decile shift = upper bound).
- 2021–2026 is an unusually turbulent market — levels statistics are period-specific (the within-market elasticity is not).
- No appeals, renovations, or owner demographics observed.
- Montréal's progressivity may partly reflect borough-level composition.
📝 Citation
@techreport{boucher2026assessmentgap,
author = {Boucher, Simon-Pierre},
title = {The Assessment Gap in Quebec: Vertical and Horizontal Inequity
in Municipal Property Valuation},
institution = {Universit\'e du Qu\'ebec en Outaouais,
D\'epartement des sciences administratives},
type = {Working Paper},
number = {10},
year = {2026},
month = {August}
}👤 Author & contact
Simon-Pierre Boucher — Département des sciences administratives, Université du Québec en Outaouais (UQO), Gatineau, QC. 📧 contact@spboucher.ai