Résultats complets (190 k cibles), rapport et WP 11 alignés sur les chiffres finaux, figures anglaises
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
53 changed files +911 −434
added
docs/RAPPORT.md
+418 −0
@@ -0,0 +1,418 @@ | ||
| 1 | +--- | |
| 2 | +title: "La méthode des comparables à l'épreuve des données : validation empirique à grande échelle sur 390 996 ventes résidentielles québécoises" | |
| 3 | +subtitle: "Sélection, nombre, ajustements, pondération et réconciliation des ventes comparables — rétro-évaluation point-dans-le-temps sur les transactions Vrai Prix 2021-2026" | |
| 4 | +author: "Simon-Pierre Boucher — version 2026-10-10" | |
| 5 | +date: "10/10/2026" | |
| 6 | +lang: fr-CA | |
| 7 | +--- | |
| 8 | + | |
| 9 | +# Résumé | |
| 10 | + | |
| 11 | +**Question.** La méthode de comparaison des ventes, telle qu'enseignée et pratiquée en évaluation immobilière, produit-elle des estimations fiables, et lesquelles de ses règles (choix des comparables, nombre, rayon, ancienneté, ajustements, pondération, réconciliation) sont empiriquement justifiées ? | |
| 12 | + | |
| 13 | +**Données et protocole.** 390 996 ventes de résidences unifamiliales du Québec (registre foncier jumelé au rôle d'évaluation, Vrai Prix, 2021-01-05 → 2026-09-29), après un nettoyage journalisé de 456 950 transactions brutes. Pour chacune des **189 354 ventes cibles** de 2024 (validation, 64 795) et de 2025-2026 (test hors échantillon, 124 559), le prix est masqué et la valeur est estimée avec les seules ventes conclues **avant** la date de la cible, un indice de prix ré-estimé chaque mois avec les seules ventes antérieures, et des grilles d'ajustement et modèles ré-estimés chaque trimestre. **2 256 configurations** de la méthode des comparables et treize modèles de référence sont appliqués aux mêmes cibles ; les différences sont testées par bootstrap par grappes (municipalité × trimestre). | |
| 14 | + | |
| 15 | +**Résultats principaux (test 2025-2026).** | |
| 16 | + | |
| 17 | +1. **Les ajustements sont le facteur dominant.** Prendre la moyenne des cinq ventes les plus proches, ajustées seulement pour le temps (M2), donne une erreur absolue médiane (MdAPE) de **18,1 %** ; une grille d'ajustement hédonique (M7) la ramène à **13,0 %** (−5,1 points, IC 95 % de la différence de MdAPE [-5,24 ; -4,87]). Une grille conventionnelle stylisée (M6) fait presque aussi bien (13,4 %) : ce qui compte, c'est d'ajuster, plus que la finesse de la grille. | |
| 18 | +2. **Choisir des comparables semblables vaut autant qu'ajuster.** Sans aucun ajustement physique, sélectionner les cinq ventes les plus **semblables** (aire, terrain, âge, lien physique, étages) plutôt que les cinq plus **proches** fait passer la MdAPE de 18,1 % à **13,0 %** (H1 confirmée : un comparable un peu plus éloigné mais semblable vaut mieux qu'un voisin dissemblable). | |
| 19 | +3. **Le nombre optimal de comparables est bien supérieur à trois.** Avec la grille hédonique, la MdAPE décroît de 16,5 % (k = 1) à 13,8 % (k = 3), 13,0 % (k = 5), 12,4 % (k = 10), atteint son minimum à **k = 20** (12,1 %) et n'augmente plus jusqu'à k = 50 (12,1 %), quelle que soit la densité du marché ; sans ajustement physique, l'optimum est d'environ dix et l'erreur remonte ensuite (H2 confirmée seulement pour la méthode non ajustée). | |
| 20 | +4. **La fenêtre temporelle doit être large ; le rayon importe peu.** La meilleure configuration de la surface Erreur(k, d, t) choisie en 2024 est « compromis distance / similarité, k = 30, ≤ 25.0 km, 24 mois, grille hédonique » (11,9 % en validation → **11,1 %** en test). Les fenêtres de 3 mois sont dominées par 12-24 mois à tous les rayons ; au meilleur k, le rayon (0,5 à 25 km) ne change presque rien à la précision, car k est un maximum et un grand rayon n'ajoute des ventes que là où les voisines manquent. | |
| 21 | +5. **La pondération et le mode de réconciliation comptent peu** (effets marginaux moyens de 13,1 à 13,6 points selon la pondération, médiane 13,2 contre moyenne 13,6), bien moins que la sélection (12,9-14,4) et l'ajustement (11,8-15,4). | |
| 22 | +6. **La meilleure méthode des comparables, entièrement transparente et choisie en 2024, atteint 11,1 % en 2025-2026** (M0 : compromis distance / similarité, k = 30, ≤ 25.0 km, 24 mois, grille hédonique, pondération égale, médiane), contre **9,0 %** pour un gradient boosting ré-entraîné chaque trimestre avec la valeur au rôle (M11b) et 10,7 % sans le rôle (M11a). L'hybride comparables + GBM (M12) atteint **8,9 %**. Le coût de la transparence est donc de 2,2 points de MdAPE face au meilleur modèle opaque (0,4 point sans le rôle), et il se réduit à 1,4 point dans le tiers des sous-marchés les plus homogènes (H5). | |
| 23 | +7. **Le ratio au rôle est un comparable redoutable** : rôle de la cible × ratio prix/rôle médian des cinq plus proches ventes du même rôle (M13) donne 11,5 %, mieux que toute grille d'ajustement physique, mais seulement pour 90,3 % des cibles. | |
| 24 | +8. **La fiabilité dépend d'abord de la liquidité du sous-marché** : la MdAPE de M7 passe de 10,2 % là où plus de 200 ventes ont eu lieu à moins de 2 km dans l'année à 25,3 % là où il y en a eu moins de 5 ; des règles choisies strate par strate (système de recommandation) obtiennent 11,3 % avec 93,4 % de couverture, sans faire mieux que la meilleure règle unique (11,1 %, couverture complète) : une règle « filet large » qui retient les ventes les plus semblables dans un grand rayon s'adapte d'elle-même à la densité. | |
| 25 | + | |
| 26 | +**Portée.** Nous validons la précision prédictive de règles professionnelles *simulées* sur des caractéristiques observables (aire, terrain, âge, étages, lien physique, rôle) ; les ajustements non observables (garage, piscine, chambres, qualité, rénovations) restent dans l'erreur résiduelle, et le jugement réel d'un évaluateur n'est pas reproduit. | |
| 27 | + | |
| 28 | +# 1. Données | |
| 29 | + | |
| 30 | +## 1.1 Source et nettoyage | |
| 31 | + | |
| 32 | +Instantané de la base de production Vrai Prix pris le 2026-10-10 : 766 596 transactions résidentielles et 3,75 M d'unités d'évaluation. Nous retenons les ventes de type « unifamilial » jumelées à une unité du rôle, et appliquons des règles de nettoyage explicites et journalisées — rien n'est éliminé silencieusement. | |
| 33 | + | |
| 34 | +| Règle | n | | |
| 35 | +|---|---| | |
| 36 | +| R0 sans jumelage au rôle (id_provinc / code_mun) | 9 255 | | |
| 37 | +| R1 doublons (même unité, même date) | 355 | | |
| 38 | +| R2 unité du rôle non unifamiliale (chalet, plex, terrain…) ou > 1 logement | 29 509 | | |
| 39 | +| R3 coordonnées absentes ou hors Québec | 0 | | |
| 40 | +| R4 aire habitable absente ou hors [40, 600] m² | 3 797 | | |
| 41 | +| R5 superficie de terrain absente ou hors [80, 20 000] m² | 4 278 | | |
| 42 | +| R6 année de construction absente, < 1850 ou postérieure à la vente (vente de terrain) | 2 393 | | |
| 43 | +| R6b vente l'année même de la construction (prix du terrain ou d'une construction inachevée : médiane 346 k$ et ratio au rôle 1,15 contre 450-480 k$ et 1,3 aux âges 1-4) | 5 427 | | |
| 44 | +| R7 prix hors [50 k$, 3 M$] | 528 | | |
| 45 | +| R8 rôle absent ou ratio prix/rôle hors [0,33 ; 3] (transactions présumées non représentatives) | 8 074 | | |
| 46 | +| R9 revente ≤ 180 jours avec variation > 40 % (flip) | 794 | | |
| 47 | +| R10 lien physique ou genre de construction absent au rôle | 1 512 | | |
| 48 | +| R11 municipalité absente du répertoire MAMH | 32 | | |
| 49 | + | |
| 50 | +Jeu propre : **390 996 ventes** (2021-01-05 → 2026-09-29) ; prix médian 400 000 $, moyenne 449 464 $. | |
| 51 | + | |
| 52 | +Deux règles méritent un commentaire. R8 écarte les ratios prix/rôle extrêmes (< 0,33 ou > 3) : faute d'indicateur de lien de dépendance entre les parties, c'est notre proxy de « transaction non représentative » — un évaluateur les écarterait aussi. R6b écarte les ventes conclues l'année même de la construction : leur prix médian (346 108 $) et leur ratio au rôle (1,15) sont ceux de terrains ou de constructions inachevées, non de maisons achevées (450-480 k$ et 1,3 aux âges 1-4 ans). | |
| 53 | + | |
| 54 | +## 1.2 Répartition | |
| 55 | + | |
| 56 | +| Période | Rôle | Ventes | | |
| 57 | +|---|---|---| | |
| 58 | +| 2021-01 → 2023-12 | développement | 201 642 | | |
| 59 | +| 2024 | validation (choix des configurations) | 64 795 | | |
| 60 | +| 2025-01 → 2026-09 | test hors échantillon | 124 559 | | |
| 61 | + | |
| 62 | +Régions les plus représentées : Montérégie (78 077), Laurentides (43 254), Capitale-Nationale (37 618), Lanaudière (36 436), Estrie (28 964), Montréal (27 934). | |
| 63 | + | |
| 64 | +{ width=85% } | |
| 65 | + | |
| 66 | +## 1.3 Caractéristiques disponibles et limites | |
| 67 | + | |
| 68 | +Observées pour chaque vente : date, prix, coordonnées, municipalité, unité de voisinage, aire habitable, superficie du terrain, année de construction, nombre d'étages, lien physique (détaché, jumelé, en rangée), genre de construction, valeur au rôle en vigueur à la vente et sa part terrain. Non observées : garage, piscine, nombre de chambres et de salles de bains, qualité, état, rénovations. Les grilles d'ajustement testées ne portent donc que sur les premières ; les secondes sont une source d'erreur commune à toutes les méthodes. | |
| 69 | + | |
| 70 | +# 2. Protocole | |
| 71 | + | |
| 72 | +## 2.1 Rétro-évaluation point-dans-le-temps | |
| 73 | + | |
| 74 | +Pour chaque cible : (1) le prix est masqué ; (2) le bassin de comparables est constitué des ventes conclues strictement avant la date de la cible (la cible elle-même, si elle a déjà été vendue, est exclue : on évalue par comparables, non par vente répétée), dans un rayon de 25 km et une fenêtre de 24 mois ; (3) l'indice temporel régional utilisé pour ramener chaque comparable au niveau du dernier mois connu est ré-estimé chaque mois avec les seules ventes antérieures (régression hédonique à effets fixes de municipalité et effets mensuels, par région administrative, rétrécie vers l'indice provincial quand les ventes sont rares) ; (4) les coefficients d'ajustement hédoniques, les grilles régionales et les modèles d'apprentissage sont ré-estimés chaque trimestre avec les seules ventes antérieures au trimestre ; (5) chaque configuration produit une valeur et, le cas échéant, une dispersion des prix ajustés. | |
| 75 | + | |
| 76 | +Le niveau de prix du mois de la cible n'est jamais connu : toutes les méthodes travaillent au niveau du mois précédent, ce qui reproduit la situation réelle d'un évaluateur. | |
| 77 | + | |
| 78 | +## 2.2 Configurations testées | |
| 79 | + | |
| 80 | +**E1 — surface Erreur(k, d, t)** : k ∈ {1, 3, 5, 7, 10, 15, 20, 30, 50}, d ∈ {0,5 ; 1 ; 2 ; 5 ; 10 ; 25 km}, t ∈ {3, 6, 12, 24 mois}, sélection ∈ {plus proches, plus semblables, compromis}, ajustement ∈ {temps seul, grille hédonique}, médiane. 1 296 configurations. | |
| 81 | + | |
| 82 | +**E2 — plan factoriel des règles** aux ancres (k, d, t) = (3, 2 km, 6 mois), (5, 5 km, 12 mois), (10, 10 km, 24 mois) : sélection (4) × ajustement (8 : aucun, temps seul, grille conventionnelle, hédonique globale, hédonique régionale, régression locale, GBM, ratio au rôle) × pondération (5) × réconciliation (2). 960 configurations. | |
| 83 | + | |
| 84 | +*Grille conventionnelle stylisée* (M6) : aire habitable ajustée à la moitié du prix au m² du comparable ; terrain à la moitié de la valeur foncière implicite au m² (plafond ±15 %) ; âge à −0,5 % par année d'écart (plafond ±20 %) ; ±5 % entre détaché et attaché. *Grille hédonique* (M7) : coefficients d'une régression du log du prix sur les caractéristiques, à effets fixes de municipalité (within), ré-estimée chaque trimestre. *Régression locale* (M8a) : mêmes coefficients ré-estimés sur les ventes à moins de 10 km des 24 derniers mois (≥ 40 ventes, ridge vers la grille régionale). *GBM* (M8b) : l'ajustement est la différence des prédictions d'un gradient boosting entre la cible et le comparable. *Ratio au rôle* (M13) : valeur au rôle de la cible × ratio prix/rôle du comparable, pour les comparables de la même municipalité et du même rôle triennal. | |
| 85 | + | |
| 86 | +## 2.3 Mesures | |
| 87 | + | |
| 88 | +Erreur absolue en pourcentage APE = |P̂ − P| / P ; MdAPE (médiane), MAPE (moyenne), biais médian signé, parts à ±5, ±10 et ±20 %, couverture (part des cibles pour lesquelles la configuration produit une valeur — une configuration trop restrictive ne « rate » pas, elle s'abstient, et cela doit se voir). Les différences entre méthodes sont des différences d'erreurs appariées sur les mêmes cibles, avec intervalles de confiance à 95 % par bootstrap par grappes municipalité × trimestre (400 réplications). | |
| 89 | + | |
| 90 | +# 3. Résultats | |
| 91 | + | |
| 92 | +## 3.1 Combien de comparables ? À quelle distance ? De quelle ancienneté ? | |
| 93 | + | |
| 94 | +{ width=100% } | |
| 95 | + | |
| 96 | +{ width=90% } | |
| 97 | + | |
| 98 | +**Sélection par distance, grille hédonique, fenêtre 12 mois — MdAPE test (%)** | |
| 99 | + | |
| 100 | +| rayon | k = 1 | k = 3 | k = 5 | k = 7 | k = 10 | k = 15 | k = 20 | k = 30 | k = 50 | | |
| 101 | +|---|---|---|---|---|---|---|---|---|---| | |
| 102 | +| ≤ 0.5 km | 15,8 | 13,3 | 12,6 | 12,3 | 12,2 | 12,1 | 12,0 | 12,1 | 12,1 | | |
| 103 | +| ≤ 1.0 km | 16,1 | 13,5 | 12,8 | 12,5 | 12,3 | 12,2 | 12,1 | 12,1 | 12,1 | | |
| 104 | +| ≤ 2.0 km | 16,4 | 13,7 | 12,9 | 12,6 | 12,3 | 12,2 | 12,1 | 12,1 | 12,1 | | |
| 105 | +| ≤ 5.0 km | 16,5 | 13,8 | 13,0 | 12,7 | 12,4 | 12,2 | 12,2 | 12,2 | 12,2 | | |
| 106 | +| ≤ 10.0 km | 16,5 | 13,8 | 13,0 | 12,6 | 12,4 | 12,2 | 12,1 | 12,1 | 12,1 | | |
| 107 | +| ≤ 25.0 km | 16,5 | 13,8 | 13,0 | 12,6 | 12,4 | 12,2 | 12,1 | 12,1 | 12,1 | | |
| 108 | + | |
| 109 | +**Sélection par distance, temps seulement, fenêtre 12 mois — MdAPE test (%)** | |
| 110 | + | |
| 111 | +| rayon | k = 1 | k = 3 | k = 5 | k = 7 | k = 10 | k = 15 | k = 20 | k = 30 | k = 50 | | |
| 112 | +|---|---|---|---|---|---|---|---|---|---| | |
| 113 | +| ≤ 0.5 km | 20,1 | 17,4 | 16,9 | 16,7 | 16,7 | 16,7 | 16,8 | 17,0 | 17,0 | | |
| 114 | +| ≤ 1.0 km | 20,7 | 17,8 | 17,2 | 17,0 | 17,0 | 17,1 | 17,3 | 17,6 | 18,0 | | |
| 115 | +| ≤ 2.0 km | 21,0 | 18,0 | 17,5 | 17,2 | 17,2 | 17,4 | 17,5 | 17,8 | 18,3 | | |
| 116 | +| ≤ 5.0 km | 21,3 | 18,2 | 17,6 | 17,4 | 17,3 | 17,5 | 17,6 | 18,0 | 18,5 | | |
| 117 | +| ≤ 10.0 km | 21,3 | 18,2 | 17,6 | 17,4 | 17,3 | 17,5 | 17,6 | 18,0 | 18,4 | | |
| 118 | +| ≤ 25.0 km | 21,3 | 18,2 | 17,6 | 17,4 | 17,3 | 17,5 | 17,6 | 18,0 | 18,4 | | |
| 119 | + | |
| 120 | +**Sélection par similarité physique, grille hédonique, fenêtre 12 mois — MdAPE test (%)** | |
| 121 | + | |
| 122 | +| rayon | k = 1 | k = 3 | k = 5 | k = 7 | k = 10 | k = 15 | k = 20 | k = 30 | k = 50 | | |
| 123 | +|---|---|---|---|---|---|---|---|---|---| | |
| 124 | +| ≤ 0.5 km | 14,8 | 12,6 | 12,0 | 11,8 | 11,7 | 11,8 | 11,9 | 12,0 | 12,1 | | |
| 125 | +| ≤ 1.0 km | 15,2 | 12,7 | 12,0 | 11,8 | 11,6 | 11,6 | 11,6 | 11,7 | 11,9 | | |
| 126 | +| ≤ 2.0 km | 15,5 | 12,9 | 12,1 | 11,8 | 11,5 | 11,5 | 11,4 | 11,4 | 11,6 | | |
| 127 | +| ≤ 5.0 km | 16,1 | 13,3 | 12,5 | 12,1 | 11,7 | 11,6 | 11,6 | 11,6 | 11,6 | | |
| 128 | +| ≤ 10.0 km | 16,4 | 13,6 | 12,7 | 12,3 | 12,0 | 11,8 | 11,7 | 11,7 | 11,8 | | |
| 129 | +| ≤ 25.0 km | 16,6 | 13,7 | 12,8 | 12,4 | 12,1 | 12,0 | 11,9 | 11,9 | 12,0 | | |
| 130 | + | |
| 131 | +Lecture. (i) Sans ajustement physique, l'erreur décroît avec k jusqu'à une dizaine de comparables puis remonte (les ventes supplémentaires sont de plus en plus dissemblables) ; (ii) avec la grille hédonique, elle décroît nettement plus, jusqu'à k ≈ 20, et ne remonte plus ; (iii) la fenêtre de 3 mois est systématiquement dominée par 12-24 mois, alors qu'au meilleur k le rayon ne change presque rien. Meilleures configurations de E1 par sélection × ajustement (choisies en 2024, évaluées en 2025-2026) : | |
| 132 | + | |
| 133 | +| sélection | ajustement | k | d | T | MdAPE val. | MdAPE test | couverture test | | |
| 134 | +|---|---|---|---|---|---|---| | |
| 135 | +| geo|hedo | 30 | 1,0 | 24 | 12,6 | 12,0 | 97,5 | | |
| 136 | +| geo|none | 10 | 1,0 | 24 | 17,3 | 16,3 | 97,5 | | |
| 137 | +| mix|hedo | 30 | 25,0 | 24 | 11,9 | 11,1 | 100,0 | | |
| 138 | +| mix|none | 10 | 25,0 | 24 | 12,8 | 12,0 | 100,0 | | |
| 139 | +| sim|hedo | 20 | 2,0 | 24 | 12,0 | 11,2 | 99,1 | | |
| 140 | +| sim|none | 20 | 25,0 | 24 | 12,7 | 11,8 | 100,0 | | |
| 141 | + | |
| 142 | +### k optimal selon la densité (H2) | |
| 143 | + | |
| 144 | +| densité | k = 1 | k = 3 | k = 5 | k = 7 | k = 10 | k = 15 | k = 20 | k = 30 | k = 50 | | |
| 145 | +|---|---|---|---|---|---|---|---|---|---| | |
| 146 | +| < 5 | 31,3 | 26,9 | 25,3 | 24,4 | 24,1 | 23,7 | 23,8 | 23,6 | 23,7 | | |
| 147 | +| 5-19 | 25,4 | 21,6 | 20,4 | 19,6 | 19,1 | 18,7 | 18,4 | 18,4 | 18,2 | | |
| 148 | +| 20-49 | 20,1 | 16,6 | 15,4 | 14,9 | 14,5 | 14,3 | 14,1 | 14,1 | 13,9 | | |
| 149 | +| 50-199 | 14,7 | 12,2 | 11,5 | 11,2 | 11,0 | 10,9 | 10,9 | 10,9 | 10,9 | | |
| 150 | +| ≥ 200 | 12,9 | 10,8 | 10,2 | 9,9 | 9,7 | 9,6 | 9,6 | 9,6 | 9,7 | | |
| 151 | + | |
| 152 | +*(sélection par distance, ≤ 10 km, 12 mois, grille hédonique ; MdAPE test en %, par nombre de ventes disponibles à moins de 2 km au cours des 12 mois précédents)* | |
| 153 | + | |
| 154 | +Sans ajustement : | |
| 155 | + | |
| 156 | +| densité | k = 1 | k = 3 | k = 5 | k = 7 | k = 10 | k = 15 | k = 20 | k = 30 | k = 50 | | |
| 157 | +|---|---|---|---|---|---|---|---|---|---| | |
| 158 | +| < 5 | 39,2 | 34,7 | 33,2 | 32,2 | 32,1 | 32,1 | 31,7 | 31,7 | 31,5 | | |
| 159 | +| 5-19 | 33,8 | 29,4 | 28,3 | 27,7 | 27,2 | 27,2 | 27,4 | 27,6 | 27,8 | | |
| 160 | +| 20-49 | 26,6 | 23,0 | 22,3 | 21,9 | 21,4 | 21,7 | 21,7 | 22,2 | 22,4 | | |
| 161 | +| 50-199 | 18,5 | 15,9 | 15,4 | 15,3 | 15,3 | 15,6 | 15,7 | 16,1 | 16,6 | | |
| 162 | +| ≥ 200 | 16,0 | 13,7 | 13,1 | 13,1 | 12,9 | 13,0 | 13,2 | 13,7 | 14,3 | | |
| 163 | + | |
| 164 | +{ width=100% } | |
| 165 | + | |
| 166 | +## 3.2 Quels ajustements sont justifiés ? | |
| 167 | + | |
| 168 | +{ width=90% } | |
| 169 | + | |
| 170 | +| Ajustement | MdAPE val. | MdAPE test | MAPE test | Biais | ±10 % | Couverture | | |
| 171 | +|---|---|---|---|---|---|---| | |
| 172 | +| aucun ajustement | 18,9 | 17,9 | 30,4 | -4,2 | 31,0 | 99,8 | | |
| 173 | +| temps seulement | 18,8 | 17,6 | 31,1 | -0,8 | 31,7 | 99,8 | | |
| 174 | +| grille conventionnelle | 14,1 | 13,4 | 26,4 | 0,7 | 39,7 | 99,8 | | |
| 175 | +| grille hédonique | 13,8 | 13,0 | 25,1 | -0,5 | 40,4 | 99,8 | | |
| 176 | +| grille hédonique régionale | 13,8 | 13,1 | 25,2 | -0,5 | 40,4 | 99,8 | | |
| 177 | +| régression locale | 14,3 | 13,5 | 25,7 | -0,4 | 39,4 | 99,8 | | |
| 178 | +| ajustements GBM | 12,7 | 11,9 | 24,1 | -0,6 | 43,6 | 99,8 | | |
| 179 | +| ratio au rôle | 12,0 | 11,5 | 22,5 | -0,1 | 40,6 | 90,3 | | |
| 180 | + | |
| 181 | +Trois enseignements. **L'ajustement temporel seul** vaut 0,3 point ; **n'importe quelle grille physique** vaut 4,2 à 5,7 points de plus ; **les raffinements** (grille régionale, régression locale, ajustements non linéaires) apportent peu face à la grille hédonique globale, et la régression locale est même moins bonne (13,5 % contre 13,0 %). | |
| 182 | + | |
| 183 | +### Grilles locales et petits échantillons (H3) | |
| 184 | + | |
| 185 | +MdAPE test (%) par type d'ajustement et densité, ancre (5, 5 km, 12 mois) : | |
| 186 | + | |
| 187 | +| densité | grille conventionnelle | grille hédonique | grille hédonique régionale | régression locale | ajustements GBM | | |
| 188 | +|---|---|---|---|---|---| | |
| 189 | +| < 5 | 27,1 | 25,3 | 25,3 | 25,9 | 24,5 | | |
| 190 | +| 5-19 | 21,4 | 20,4 | 20,1 | 20,8 | 19,7 | | |
| 191 | +| 20-49 | 16,2 | 15,4 | 15,3 | 15,9 | 14,6 | | |
| 192 | +| 50-199 | 11,7 | 11,5 | 11,5 | 11,9 | 10,4 | | |
| 193 | +| ≥ 200 | 10,4 | 10,2 | 10,3 | 10,7 | 9,2 | | |
| 194 | + | |
| 195 | +Ancre (3, 2 km, 6 mois) : | |
| 196 | + | |
| 197 | +| densité | grille conventionnelle | grille hédonique | grille hédonique régionale | régression locale | ajustements GBM | | |
| 198 | +|---|---|---|---|---|---| | |
| 199 | +| < 5 | 30,0 | 28,6 | 28,6 | 29,5 | 28,0 | | |
| 200 | +| 5-19 | 23,8 | 22,4 | 21,9 | 22,8 | 21,4 | | |
| 201 | +| 20-49 | 17,7 | 16,9 | 16,6 | 17,4 | 15,5 | | |
| 202 | +| 50-199 | 12,8 | 12,5 | 12,6 | 12,9 | 11,1 | | |
| 203 | +| ≥ 200 | 11,1 | 10,8 | 11,0 | 11,4 | 9,8 | | |
| 204 | + | |
| 205 | +## 3.3 Comment choisir les comparables ? (H1) | |
| 206 | + | |
| 207 | +Ancre (5, 5 km, 12 mois), grille hédonique, médiane : | |
| 208 | + | |
| 209 | +| Sélection | MdAPE val. | MdAPE test | Biais | ±10 % | | |
| 210 | +|---|---|---|---|---| | |
| 211 | +| les plus proches (distance) | 13,8 | 13,0 | -0,5 | 40,4 | | |
| 212 | +| les plus semblables (physique) | 13,3 | 12,5 | -0,1 | 42,1 | | |
| 213 | +| compromis distance / similarité | 12,9 | 12,1 | -0,1 | 43,0 | | |
| 214 | +| les moins ajustés | 13,1 | 12,2 | -0,1 | 42,8 | | |
| 215 | + | |
| 216 | +Test direct de H1 (k = 5, 12 mois, temps seulement) : les cinq voisins à moins de 1 km donnent une MdAPE de 17,2 % (couverture 96,0 %) ; les cinq ventes les plus semblables à moins de 10 km, 13,0 % (couverture 100,0 %) ; les cinq plus proches à moins de 10 km, 17,6 %. Avec la grille hédonique : plus proches 13,0 %, plus semblables 12,7 %, compromis 12,1 %. | |
| 217 | + | |
| 218 | +## 3.4 Pondération et réconciliation (H4) | |
| 219 | + | |
| 220 | +Ancre (5, 5 km, 12 mois), sélection par distance, grille hédonique : | |
| 221 | + | |
| 222 | +| Pondération | Réconciliation | MdAPE val. | MdAPE test | Biais | ±10 % | | |
| 223 | +|---|---|---|---|---|---| | |
| 224 | +| égale | médiane | 13,8 | 13,0 | -0,5 | 40,4 | | |
| 225 | +| égale | moyenne | 14,6 | 13,7 | -1,8 | 38,4 | | |
| 226 | +| 1/distance | médiane | 13,9 | 13,1 | -0,5 | 40,3 | | |
| 227 | +| 1/distance | moyenne | 14,6 | 13,7 | -1,8 | 38,6 | | |
| 228 | +| récence | médiane | 14,5 | 13,7 | -0,5 | 38,8 | | |
| 229 | +| récence | moyenne | 14,8 | 13,9 | -1,6 | 38,0 | | |
| 230 | +| les plus semblables (physique) | médiane | 13,8 | 12,9 | -0,3 | 40,8 | | |
| 231 | +| les plus semblables (physique) | moyenne | 14,3 | 13,3 | -1,5 | 39,7 | | |
| 232 | +| distance × récence × similarité | médiane | 14,6 | 13,6 | -0,3 | 39,2 | | |
| 233 | +| distance × récence × similarité | moyenne | 14,5 | 13,5 | -1,4 | 39,3 | | |
| 234 | + | |
| 235 | +Selon la densité (MdAPE test, %) : | |
| 236 | + | |
| 237 | +| densité | égale / médiane | égale / moyenne | 1/distance / moyenne | récence / moyenne | les plus semblables (physique) / moyenne | distance × récence × similarité / moyenne | distance × récence × similarité / médiane | | |
| 238 | +|---|---|---|---|---|---|---|---| | |
| 239 | +| < 5 | 25,3 | 25,1 | 25,0 | 25,9 | 25,2 | 25,8 | 28,1 | | |
| 240 | +| 5-19 | 20,4 | 20,6 | 20,5 | 21,0 | 20,3 | 20,6 | 21,8 | | |
| 241 | +| 20-49 | 15,4 | 16,0 | 16,1 | 16,4 | 16,0 | 16,2 | 16,7 | | |
| 242 | +| 50-199 | 11,5 | 12,3 | 12,3 | 12,5 | 11,9 | 12,0 | 12,0 | | |
| 243 | +| ≥ 200 | 10,2 | 10,9 | 10,9 | 11,0 | 10,5 | 10,6 | 10,5 | | |
| 244 | + | |
| 245 | +Effets marginaux moyens (MdAPE test moyenne sur toutes les autres modalités de E2) : sélection les moins ajustés 13,1, les plus proches (distance) 14,4, compromis distance / similarité 12,9, les plus semblables (physique) 13,2 ; ajustement grille conventionnelle 13,2, ajustements GBM 12,6, grille hédonique 13,1, grille hédonique régionale 13,1, régression locale 13,3, temps seulement 14,7, aucun ajustement 15,4, ratio au rôle 11,8 ; pondération distance × récence × similarité 13,6, 1/distance 13,4, égale 13,2, récence 13,6, les plus semblables (physique) 13,1 ; réconciliation moyenne 13,6, médiane 13,2. | |
| 246 | + | |
| 247 | +## 3.5 Compétition de modèles | |
| 248 | + | |
| 249 | +{ width=95% } | |
| 250 | + | |
| 251 | +| Modèle | MdAPE val. | MdAPE test | MAPE | Biais (médian) | ±5 % | ±10 % | ±20 % | Couverture | | |
| 252 | +|---|---|---|---|---|---|---|---|---| | |
| 253 | +| M12 hybride comparables + GBM (poids appris en 2024) | 9,7 | 8,9 | 19,9 | -0,1 | 30,7 | 54,4 | 78,8 | 100,0 | | |
| 254 | +| M11b gradient boosting (avec rôle) | 9,8 | 9,0 | 19,9 | 0,1 | 30,5 | 54,1 | 78,7 | 100,0 | | |
| 255 | +| M9 réconciliation optimisée (poids appris en 2024) | 11,3 | 10,6 | 21,8 | -0,8 | 26,2 | 47,6 | 73,0 | 99,8 | | |
| 256 | +| M11a gradient boosting (sans rôle) | 11,5 | 10,7 | 23,1 | -0,4 | 26,1 | 47,5 | 72,2 | 100,0 | | |
| 257 | +| M0 meilleure configuration empirique (choisie en 2024, couverture ≥ 97 %) | 11,9 | 11,1 | 23,6 | 0,3 | 25,1 | 46,1 | 71,5 | 100,0 | | |
| 258 | +| M13 ratio au rôle (5 plus proches, même rôle) | 12,0 | 11,5 | 22,5 | -0,1 | 22,1 | 40,6 | 63,9 | 90,3 | | |
| 259 | +| M8b ajustements non linéaires (GBM) | 12,7 | 11,9 | 24,1 | -0,6 | 23,9 | 43,6 | 68,8 | 99,8 | | |
| 260 | +| M3 sélection par similarité physique | 13,9 | 13,0 | 26,2 | -0,2 | 22,1 | 40,8 | 65,3 | 99,8 | | |
| 261 | +| M7 grille d'ajustement hédonique | 13,8 | 13,0 | 25,1 | -0,5 | 21,7 | 40,4 | 66,4 | 99,8 | | |
| 262 | +| M6 grille d'ajustement conventionnelle | 14,1 | 13,4 | 26,4 | 0,8 | 21,3 | 39,7 | 65,0 | 99,8 | | |
| 263 | +| M8a grille locale (régression sur le voisinage) | 14,3 | 13,5 | 25,7 | -0,4 | 21,2 | 39,4 | 64,9 | 99,8 | | |
| 264 | +| M10 hédonique globale directe | 14,7 | 13,8 | 25,9 | 0,4 | 19,8 | 37,9 | 65,0 | 100,0 | | |
| 265 | +| M4 pondération par distance | 19,1 | 17,9 | 31,4 | -0,2 | 16,0 | 30,7 | 54,3 | 99,8 | | |
| 266 | +| M2 moyenne des 5 plus proches (temps seul) | 19,3 | 18,1 | 31,8 | -0,1 | 15,7 | 30,3 | 53,7 | 99,8 | | |
| 267 | +| M5 pondération par récence | 19,7 | 18,5 | 32,3 | -0,2 | 15,4 | 29,8 | 52,8 | 99,8 | | |
| 268 | +| M1 médiane des 3 plus proches (temps seul) | 20,3 | 19,1 | 32,8 | -0,8 | 15,2 | 28,5 | 49,8 | 96,6 | | |
| 269 | + | |
| 270 | +M0 : compromis distance / similarité, k = 30, ≤ 25.0 km, 24 mois, grille hédonique, pondération égale, médiane (meilleure des 2 256 configurations en 2024 parmi celles qui couvrent ≥ 97 % des cibles ; sans cette contrainte, la meilleure est « compromis distance / similarité, k = 10, ≤ 10.0 km, 24 mois, ratio au rôle » à 10,7 % mais pour 90,3 % des cibles seulement). Poids appris de M9 : temps seulement 0,07, ajustements GBM 0,33, ratio au rôle 0,59. Poids de M12 : gbm_role 0,91, comps_gbm 0,03, comps_hedo 0,07. | |
| 271 | + | |
| 272 | +### Différences appariées (test ; bootstrap par grappes municipalité × trimestre) | |
| 273 | + | |
| 274 | +| Comparaison | Δ MdAPE (pts) [IC 95 %] | Δ MAPE (pts) [IC 95 %] | A plus précis (% des cibles) | n | | |
| 275 | +|---|---|---|---|---| | |
| 276 | +| M7 − M2 | -5,08 [-5,24 ; -4,87] | -6,65 [-6,87 ; -6,43] | 61,1 | 124 310 | | |
| 277 | +| M7 − M6 | -0,37 [-0,45 ; -0,29] | -1,32 [-1,41 ; -1,23] | 52,3 | 124 310 | | |
| 278 | +| M8a − M7 | 0,46 [0,33 ; 0,57] | 0,59 [0,47 ; 0,73] | 48,0 | 124 310 | | |
| 279 | +| M8b − M7 | -1,08 [-1,16 ; -1,00] | -1,04 [-1,11 ; -0,97] | 54,3 | 124 310 | | |
| 280 | +| M11b − M0 | -2,17 [-2,33 ; -2,03] | -3,69 [-3,90 ; -3,52] | 59,1 | 124 555 | | |
| 281 | +| M11a − M0 | -0,39 [-0,49 ; -0,33] | -0,50 [-0,57 ; -0,44] | 51,8 | 124 555 | | |
| 282 | +| M12 − M11b | -0,06 [-0,08 ; -0,03] | -0,07 [-0,09 ; -0,06] | 52,6 | 124 559 | | |
| 283 | +| M13 − M7 | -1,40 [-1,56 ; -1,26] | -2,39 [-2,62 ; -2,17] | 54,5 | 112 423 | | |
| 284 | +| M3 − M2 | -5,10 [-5,27 ; -4,95] | -5,58 [-5,79 ; -5,41] | 59,8 | 124 310 | | |
| 285 | +| M9 − M7 | -2,38 [-2,50 ; -2,26] | -3,33 [-3,50 ; -3,18] | 59,7 | 124 310 | | |
| 286 | +| M1 − M2 | 1,41 [1,25 ; 1,61] | 1,82 [1,68 ; 1,97] | 45,8 | 120 372 | | |
| 287 | + | |
| 288 | +Un Δ négatif signifie que A est plus précis que B ; l'intervalle qui exclut zéro signale une différence robuste aux dépendances spatiales et temporelles. | |
| 289 | + | |
| 290 | +## 3.6 Où la méthode tient-elle, où défaille-t-elle ? | |
| 291 | + | |
| 292 | +{ width=85% } | |
| 293 | + | |
| 294 | +**Par densité** (ventes à moins de 2 km dans les 12 mois précédents) — MdAPE test (%) : | |
| 295 | + | |
| 296 | +| densité | n | M2 | M7 | M8a | M13 | M0 | M10 | M11b | M12 | | |
| 297 | +|---|---|---|---|---|---|---|---|---|---| | |
| 298 | +| < 5 | 9 177 | 32,9 | 25,3 | 25,9 | 19,6 | 22,9 | 23,6 | 15,9 | 16,0 | | |
| 299 | +| 5-19 | 15 149 | 27,7 | 20,4 | 20,8 | 16,5 | 17,8 | 18,9 | 13,0 | 13,0 | | |
| 300 | +| 20-49 | 15 553 | 22,2 | 15,4 | 15,9 | 13,4 | 13,3 | 15,1 | 10,4 | 10,4 | | |
| 301 | +| 50-199 | 56 442 | 16,1 | 11,5 | 11,9 | 10,4 | 9,8 | 12,9 | 8,0 | 8,0 | | |
| 302 | +| ≥ 200 | 27 989 | 14,0 | 10,2 | 10,7 | 9,3 | 8,5 | 11,3 | 7,4 | 7,3 | | |
| 303 | + | |
| 304 | +**Par région administrative** : | |
| 305 | + | |
| 306 | +| région | n | M2 | M7 | M8a | M13 | M0 | M10 | M11b | M12 | | |
| 307 | +|---|---|---|---|---|---|---|---|---|---| | |
| 308 | +| Montérégie | 25 133 | 16,1 | 11,3 | 11,9 | 10,5 | 9,5 | 11,7 | 8,0 | 7,9 | | |
| 309 | +| Laurentides | 13 629 | 18,0 | 12,8 | 12,8 | 11,4 | 10,6 | 12,9 | 8,5 | 8,5 | | |
| 310 | +| Capitale-Nationale | 11 711 | 18,7 | 13,4 | 14,2 | 11,4 | 11,6 | 13,8 | 9,1 | 9,1 | | |
| 311 | +| Lanaudière | 11 377 | 17,2 | 12,9 | 12,6 | 11,6 | 10,6 | 13,0 | 8,6 | 8,6 | | |
| 312 | +| Montréal | 9 496 | 16,0 | 12,0 | 13,5 | 11,2 | 10,7 | 21,4 | 9,2 | 9,1 | | |
| 313 | +| Estrie | 9 437 | 21,0 | 14,6 | 15,2 | 12,7 | 12,5 | 14,7 | 9,7 | 9,6 | | |
| 314 | +| Chaudière-Appalaches | 8 135 | 22,0 | 15,5 | 16,6 | 13,4 | 13,6 | 14,7 | 10,4 | 10,4 | | |
| 315 | +| Outaouais | 7 426 | 14,3 | 10,6 | 9,8 | 9,4 | 9,1 | 13,0 | 7,6 | 7,5 | | |
| 316 | +| Laval | 5 243 | 14,5 | 9,6 | 10,3 | 8,1 | 8,1 | 10,6 | 6,9 | 7,0 | | |
| 317 | +| Saguenay--Lac-Saint-Jean | 5 030 | 20,7 | 16,0 | 16,0 | 12,8 | 14,2 | 15,6 | 10,2 | 10,2 | | |
| 318 | +| Centre-du-Québec | 4 681 | 20,5 | 13,7 | 14,0 | 12,4 | 12,1 | 13,1 | 9,6 | 9,6 | | |
| 319 | +| Mauricie | 4 670 | 21,6 | 16,3 | 16,7 | 14,3 | 14,2 | 16,4 | 11,4 | 11,3 | | |
| 320 | +| Bas-Saint-Laurent | 3 260 | 23,3 | 18,2 | 18,7 | 15,4 | 15,9 | 16,5 | 12,3 | 12,2 | | |
| 321 | +| Abitibi-Témiscamingue | 2 412 | 22,2 | 17,0 | 16,6 | 12,4 | 15,3 | 17,1 | 9,8 | 10,0 | | |
| 322 | +| Côte-Nord | 1 227 | 23,9 | 19,3 | 19,5 | 16,9 | 17,7 | 19,1 | 13,7 | 13,6 | | |
| 323 | +| Gaspésie--Îles-de-la-Madeleine | 1 157 | 29,0 | 24,0 | 23,5 | 22,6 | 21,5 | 22,9 | 17,1 | 17,4 | | |
| 324 | +| Nord-du-Québec | 286 | 27,1 | 21,8 | 22,4 | 15,7 | 20,7 | 22,0 | 13,9 | 13,6 | | |
| 325 | + | |
| 326 | +**Par quintile de prix** : | |
| 327 | + | |
| 328 | +| quintile de prix | n | M2 | M7 | M8a | M13 | M0 | M10 | M11b | M12 | | |
| 329 | +|---|---|---|---|---|---|---|---|---|---| | |
| 330 | +| Q1 (bas) | 21 659 | 50,4 | 36,7 | 37,0 | 28,7 | 35,8 | 36,7 | 26,4 | 26,2 | | |
| 331 | +| Q2 | 24 680 | 17,5 | 13,7 | 14,2 | 12,7 | 11,7 | 13,5 | 9,4 | 9,4 | | |
| 332 | +| Q3 | 23 834 | 13,6 | 10,4 | 10,6 | 9,7 | 9,0 | 11,5 | 7,1 | 7,1 | | |
| 333 | +| Q4 | 26 783 | 13,3 | 10,0 | 10,1 | 8,9 | 8,2 | 11,3 | 6,7 | 6,7 | | |
| 334 | +| Q5 (haut) | 27 354 | 19,3 | 11,6 | 12,4 | 9,7 | 10,1 | 13,2 | 8,2 | 8,2 | | |
| 335 | + | |
| 336 | +**Par âge du bâtiment** : | |
| 337 | + | |
| 338 | +| âge | n | M2 | M7 | M8a | M13 | M0 | M10 | M11b | M12 | | |
| 339 | +|---|---|---|---|---|---|---|---|---|---| | |
| 340 | +| 16-40 | 39 475 | 16,6 | 11,1 | 11,3 | 9,8 | 9,2 | 11,9 | 7,5 | 7,4 | | |
| 341 | +| 4-15 | 17 344 | 17,0 | 9,9 | 10,1 | 8,8 | 8,4 | 12,1 | 6,7 | 6,6 | | |
| 342 | +| 41-70 | 48 592 | 17,7 | 14,4 | 14,9 | 13,0 | 12,5 | 14,5 | 10,2 | 10,2 | | |
| 343 | +| > 70 | 16 526 | 25,1 | 19,7 | 21,6 | 16,9 | 18,0 | 20,9 | 14,2 | 14,2 | | |
| 344 | +| ≤ 3 ans | 2 373 | 20,1 | 11,9 | 12,1 | 9,8 | 9,8 | 12,9 | 8,0 | 7,8 | | |
| 345 | + | |
| 346 | +**Par lien physique** (0 détaché, 1 jumelé, 2 en rangée, 3 intégré) : | |
| 347 | + | |
| 348 | +| lien physique | n | M2 | M7 | M8a | M13 | M0 | M10 | M11b | M12 | | |
| 349 | +|---|---|---|---|---|---|---|---|---|---| | |
| 350 | +| 0,0 | 100 999 | 19,6 | 14,3 | 14,7 | 12,4 | 12,2 | 14,2 | 9,8 | 9,7 | | |
| 351 | +| 1,0 | 15 936 | 12,9 | 9,1 | 9,4 | 8,6 | 7,7 | 11,8 | 6,6 | 6,4 | | |
| 352 | +| 2,0 | 7 297 | 11,9 | 8,2 | 8,6 | 8,0 | 7,8 | 14,5 | 6,2 | 6,1 | | |
| 353 | +| 3,0 | 78 | 34,3 | 22,3 | 18,0 | 10,3 | 15,3 | 31,0 | 10,9 | 9,9 | | |
| 354 | + | |
| 355 | +### Marchés homogènes et hétérogènes (H5) | |
| 356 | + | |
| 357 | +Terciles de la dispersion (écart-type du log des prix ajustés) des dix ventes les plus proches à ≤ 10 km / 24 mois — MdAPE test (%) : | |
| 358 | + | |
| 359 | +| sous-marché | σ médian (log) | M2 | M7 | M8a | M13 | M0 | M10 | M11b | M12 | | |
| 360 | +|---|---|---|---|---|---|---|---|---|---| | |
| 361 | +| homogène | 0,121 | 13,9 | 10,2 | 10,5 | 9,2 | 9,0 | 12,1 | 7,5 | 7,4 | | |
| 362 | +| moyen | 0,252 | 19,0 | 13,9 | 14,3 | 12,1 | 11,9 | 14,3 | 9,5 | 9,5 | | |
| 363 | +| hétérogène | 0,400 | 22,8 | 16,4 | 16,9 | 14,3 | 13,6 | 15,7 | 10,4 | 10,4 | | |
| 364 | + | |
| 365 | +### Stabilité dans le temps | |
| 366 | + | |
| 367 | +| trimestre | n | M2 | M7 | M0 | M11b | M12 | biais M7 | biais M11b | | |
| 368 | +|---|---|---|---|---|---|---|---|---| | |
| 369 | +| 2025Q1 | 11 337 | 19,5 | 14,2 | 12,5 | 10,3 | 10,1 | -2,4 | 3,0 | | |
| 370 | +| 2025Q2 | 24 823 | 17,3 | 12,4 | 10,5 | 8,5 | 8,4 | -1,1 | -0,3 | | |
| 371 | +| 2025Q3 | 20 140 | 18,2 | 13,0 | 11,1 | 8,9 | 8,8 | 1,5 | -0,5 | | |
| 372 | +| 2025Q4 | 16 692 | 19,2 | 13,9 | 12,0 | 9,5 | 9,6 | -0,7 | -0,1 | | |
| 373 | +| 2026Q1 | 10 619 | 19,6 | 14,2 | 12,7 | 10,0 | 10,0 | -2,4 | -0,1 | | |
| 374 | +| 2026Q2 | 22 825 | 16,8 | 12,1 | 10,1 | 8,3 | 8,2 | -1,3 | 0,4 | | |
| 375 | +| 2026Q3 | 18 123 | 18,3 | 12,9 | 11,1 | 8,8 | 8,8 | 1,7 | -0,3 | | |
| 376 | + | |
| 377 | +Le biais trimestriel commun à toutes les méthodes reflète le fait que le niveau de prix du mois courant est inconnu (toutes travaillent au niveau du mois précédent) et la saisonnalité des prix. | |
| 378 | + | |
| 379 | +## 3.7 Intervalles de valeur | |
| 380 | + | |
| 381 | +La dispersion des prix ajustés des comparables retenus fournit un intervalle de valeur — mais un intervalle large : calibré pour couvrir 80 % des prix, il s'étend sur environ ±30 % de la valeur (largeur médiane ci-dessous). Avec z = 1,28 (couverture nominale de 80 % si les erreurs étaient normales), puis avec un z calibré sur la validation 2024 : | |
| 382 | + | |
| 383 | +| configuration | z calibré (val.) | couverture à z = 1,28 | couverture calibrée | largeur médiane (%) | n | | |
| 384 | +|---|---|---|---|---|---| | |
| 385 | +| temps seulement, k = 5, ≤ 5 km, 12 mois | 1,89 | 67,2 | 80,3 | 90,5 | 123 913 | | |
| 386 | +| temps seulement, k = 10, ≤ 10 km, 24 mois | 1,41 | 77,3 | 80,4 | 85,2 | 124 516 | | |
| 387 | +| grille hédonique, k = 5, ≤ 5 km, 12 mois | 1,88 | 67,9 | 79,9 | 65,0 | 123 913 | | |
| 388 | +| grille hédonique, k = 10, ≤ 10 km, 24 mois | 1,35 | 78,5 | 80,0 | 66,5 | 124 516 | | |
| 389 | +| ajustements GBM, k = 5, ≤ 5 km, 12 mois | 2,03 | 66,5 | 80,2 | 62,9 | 123 913 | | |
| 390 | +| ajustements GBM, k = 10, ≤ 10 km, 24 mois | 1,44 | 77,3 | 80,5 | 66,7 | 124 516 | | |
| 391 | + | |
| 392 | +## 3.8 Vers un système de recommandation des comparables | |
| 393 | + | |
| 394 | +Règle choisie en 2024 pour chaque strate de densité (parmi les 2 256 configurations couvrant ≥ 95 % des cibles de la strate), évaluée en 2025-2026 : | |
| 395 | + | |
| 396 | +| densité | règle | MdAPE val. | MdAPE test | couverture val. | n test | | |
| 397 | +|---|---|---|---|---|---| | |
| 398 | +| < 5 | compromis distance / similarité, k = 10, ≤ 10.0 km, 24 mois, grille hédonique, pond. égale, moyenne | 24,7 | 23,7 | 99,8 | 9 426 | | |
| 399 | +| 5-19 | compromis distance / similarité, k = 30, ≤ 10.0 km, 24 mois, grille hédonique, pond. égale, médiane | 18,3 | 17,8 | 100,0 | 15 149 | | |
| 400 | +| 20-49 | compromis distance / similarité, k = 30, ≤ 10.0 km, 24 mois, grille hédonique, pond. égale, médiane | 13,9 | 13,3 | 100,0 | 15 553 | | |
| 401 | +| 50-199 | compromis distance / similarité, k = 10, ≤ 10.0 km, 24 mois, ratio au rôle, pond. égale, médiane | 9,8 | 9,7 | 96,5 | 56 442 | | |
| 402 | +| ≥ 200 | les moins ajustés, k = 10, ≤ 10.0 km, 24 mois, ratio au rôle, pond. égale, médiane | 8,9 | 8,8 | 95,8 | 27 989 | | |
| 403 | + | |
| 404 | +Globalement, ces règles conditionnelles atteignent une MdAPE de **11,3 %** (42,5 % des estimations à ±10 %, couverture 93,4 %), contre 11,1 % à couverture complète pour la meilleure règle unique : elles ne font pas mieux. La meilleure règle unique (les 30 ventes les plus semblables à ≤ 25.0 km et 24 mois) s'adapte d'elle-même : elle utilise les ventes voisines là où elles existent et va plus loin seulement là où elles manquent. Ce que la stratification apporte, c'est le choix de l'ajustement (ratio au rôle dans les marchés denses où les comparables du même rôle abondent), pas des nombres ou des rayons propres à chaque strate. | |
| 405 | + | |
| 406 | +# 4. Discussion | |
| 407 | + | |
| 408 | +**Ce que la méthode des comparables fait bien.** Correctement paramétrée — comparables semblables, nombre d'une dizaine, rayon et fenêtre larges, ajustements hédoniques ou même conventionnels — elle atteint une précision (11,1 %) que ne dépasse le meilleur modèle d'apprentissage ré-entraîné chaque trimestre que de 2,2 points, tout en restant intégralement explicable : chaque valeur est la médiane de quelques ventes identifiées, ajustées par des coefficients lisibles. | |
| 409 | + | |
| 410 | +**Ce qui contredit la pratique.** Trois comparables, un rayon de quelques centaines de mètres et une fenêtre de trois mois — les conventions les plus répandues — sont dominés sur toute la surface Erreur(k, d, t) : 13,6 % de MdAPE (k = 3, ≤ 1 km, 3 mois, grille hédonique, couverture 89,2 %) contre 11,1 % pour la meilleure configuration. La rareté des comparables « parfaits » est un argument pour élargir la recherche et ajuster, non pour se restreindre. | |
| 411 | + | |
| 412 | +**Le rôle d'évaluation comme information.** Le ratio au rôle (M13) et le GBM avec rôle (M11b) dominent leurs équivalents sans rôle : la valeur au rôle encapsule des caractéristiques non observées ici (qualité, dépendances, état) et une appréciation locale que les modèles globaux ne captent pas. Les modèles globaux estimés par moindres carrés présentaient d'ailleurs un biais médian de −5 % tant qu'ils visaient la moyenne du log (distribution asymétrique) ; ils ont été ré-estimés en régression médiane (L1) ou recentrés, et ne sont plus biaisés. | |
| 413 | + | |
| 414 | +**Limites.** (1) Règles professionnelles simulées, non dossiers d'évaluateurs. (2) Caractéristiques limitées à celles du rôle et du registre. (3) Délai de publication des ventes ignoré. (4) Un seul type de bien (unifamilial) ; condos et plex restent à traiter. (5) Les configurations ont été choisies sur 2024 puis évaluées sur 2025-2026 : les écarts entre validation et test (tableaux ci-dessus) mesurent la stabilité des règles, et ils sont faibles. | |
| 415 | + | |
| 416 | +# 5. Reproductibilité | |
| 417 | + | |
| 418 | +Code : `pipeline/01_dataset.py` → `06_report.py` (Python 3.14, pandas, numpy, scipy, lightgbm, matplotlib) ; sorties versionnées `out/2026-10-10/` (configurations `configs_E1.csv`, `configs_E2.csv` ; estimations `est_E1.npy`, `est_E2.npy` ; cibles `targets.parquet` ; tables `tables/*.csv` ; `results.json`). Exécution : `./run_all.sh` sur le nœud de calcul (M2U64), `./make_pdf.sh` sur le poste de travail. | |
added
docs/RAPPORT.pdf
+0 −0
Binary file not shown.
modified
paper/appendix/appendix.tex
+3 −0
@@ -15,6 +15,7 @@ | ||
| 15 | 15 | \centering |
| 16 | 16 | \caption{Error surface without physical adjustment: out-of-sample MdAPE (\%), selection by distance, time adjustment only, twelve-month window} |
| 17 | 17 | \label{tab:surface_none} |
| 18 | +\small | |
| 18 | 19 | \input{tables/surface_geo_none} |
| 19 | 20 | \end{table} |
| 20 | 21 | |
@@ -22,6 +23,7 @@ | ||
| 22 | 23 | \centering |
| 23 | 24 | \caption{Error surface with selection by similarity: out-of-sample MdAPE (\%), hedonic grid, twelve-month window} |
| 24 | 25 | \label{tab:surface_sim} |
| 26 | +\small | |
| 25 | 27 | \input{tables/surface_sim_hedo} |
| 26 | 28 | \end{table} |
| 27 | 29 | |
@@ -29,6 +31,7 @@ | ||
| 29 | 31 | \centering |
| 30 | 32 | \caption{Best configuration of the error surface by selection and adjustment (chosen on 2024, evaluated on 2025--2026)} |
| 31 | 33 | \label{tab:e1best} |
| 34 | +\small | |
| 32 | 35 | \input{tables/e1_best} |
| 33 | 36 | \end{table} |
| 34 | 37 | |
modified
paper/figures/f1_mdape_vs_k.pdf
+0 −0
Binary file not shown.
modified
paper/figures/f2_surface_d_T.pdf
+0 −0
Binary file not shown.
modified
paper/figures/f3_ajustements.pdf
+0 −0
Binary file not shown.
modified
paper/figures/f4_competition.pdf
+0 −0
Binary file not shown.
modified
paper/figures/f5_densite.pdf
+0 −0
Binary file not shown.
modified
paper/figures/f6_k_par_densite.pdf
+0 −0
Binary file not shown.
modified
paper/figures/f7_indice.pdf
+0 −0
Binary file not shown.
modified
paper/main.aux
+3 −3
@@ -76,10 +76,10 @@ | ||
| 76 | 76 | \@writefile{toc}{\contentsline {paragraph}{Experiments.}{13}{Item.8}\protected@file@percent } |
| 77 | 77 | \@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Benchmark models}{13}{subsection.4.4}\protected@file@percent } |
| 78 | 78 | \newlabel{sec:benchmarks}{{4.4}{13}{Benchmark models}{subsection.4.4}{}} |
| 79 | −\citation{cameron2008} | |
| 80 | 79 | \@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces Models in the horse race}}{14}{table.caption.5}\protected@file@percent } |
| 81 | 80 | \newlabel{tab:models}{{4}{14}{Models in the horse race}{table.caption.5}{}} |
| 82 | 81 | \@writefile{toc}{\contentsline {subsection}{\numberline {4.5}Accuracy measures and inference}{14}{subsection.4.5}\protected@file@percent } |
| 82 | +\citation{cameron2008} | |
| 83 | 83 | \@writefile{toc}{\contentsline {subsection}{\numberline {4.6}Hypotheses}{15}{subsection.4.6}\protected@file@percent } |
| 84 | 84 | \@writefile{toc}{\contentsline {section}{\numberline {5}Results}{15}{section.5}\protected@file@percent } |
| 85 | 85 | \newlabel{sec:results}{{5}{15}{Results}{section.5}{}} |
@@ -96,8 +96,8 @@ | ||
| 96 | 96 | \newlabel{tab:h2}{{6}{18}{Optimal number of comparables by market density (H2): out-of-sample MdAPE (\%)}{table.caption.9}{}} |
| 97 | 97 | \@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Which adjustments are warranted?}{18}{subsection.5.2}\protected@file@percent } |
| 98 | 98 | \newlabel{sec:adjustments}{{5.2}{18}{Which adjustments are warranted?}{subsection.5.2}{}} |
| 99 | −\@writefile{lot}{\contentsline {table}{\numberline {7}{\ignorespaces Adjustment schemes at the $(5,\,5\text { km},\,12\text { months})$ anchor}}{18}{table.caption.10}\protected@file@percent } | |
| 100 | −\newlabel{tab:adjustments}{{7}{18}{Adjustment schemes at the $(5,\,5\text { km},\,12\text { months})$ anchor}{table.caption.10}{}} | |
| 99 | +\@writefile{lot}{\contentsline {table}{\numberline {7}{\ignorespaces Adjustment schemes at the $(5,\,5\text { km},\,12\text { months})$ anchor}}{19}{table.caption.10}\protected@file@percent } | |
| 100 | +\newlabel{tab:adjustments}{{7}{19}{Adjustment schemes at the $(5,\,5\text { km},\,12\text { months})$ anchor}{table.caption.10}{}} | |
| 101 | 101 | \@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces MdAPE by adjustment scheme, validation (2024) and test (2025--2026); five nearest sales, $\le 5$~km, $\le 12$ months, median.}}{19}{figure.caption.11}\protected@file@percent } |
| 102 | 102 | \newlabel{fig:adjustments}{{4}{19}{MdAPE by adjustment scheme, validation (2024) and test (2025--2026); five nearest sales, $\le 5$~km, $\le 12$ months, median}{figure.caption.11}{}} |
| 103 | 103 | \@writefile{lot}{\contentsline {table}{\numberline {8}{\ignorespaces Adjustment schemes by market density (H3): out-of-sample MdAPE (\%)}}{20}{table.caption.12}\protected@file@percent } |
modified
paper/main.fdb_latexmk
+46 −46
@@ -1,13 +1,13 @@ | ||
| 1 | 1 | # Fdb version 4 |
| 2 | −["bibtex main"] 1791669590.6914 "main.aux" "main.bbl" "main" 1791669591.58141 0 | |
| 2 | +["bibtex main"] 1791670452.56951 "main.aux" "main.bbl" "main" 1791670453.46465 0 | |
| 3 | 3 | "./references.bib" 1791669372.52602 8208 317d4516e8f0f47f17cb222b3493cf06 "" |
| 4 | 4 | "/usr/local/texlive/2026/texmf-dist/bibtex/bst/economic/aer.bst" 1389482635 26812 2ae6e48450a8c17a93d98067b7084a7a "" |
| 5 | − "main.aux" 1791669591.43573 22155 66f06235bf01cd09404880f862499c71 "pdflatex" | |
| 5 | + "main.aux" 1791670453.31921 22155 96efb98c7723c6a6c804fa37d2813fcb "pdflatex" | |
| 6 | 6 | (generated) |
| 7 | 7 | "main.bbl" |
| 8 | 8 | "main.blg" |
| 9 | 9 | (rewritten before read) |
| 10 | −["pdflatex"] 1791669590.75035 "main.tex" "main.pdf" "main" 1791669591.58152 0 | |
| 10 | +["pdflatex"] 1791670452.6272 "main.tex" "main.pdf" "main" 1791670453.46476 0 | |
| 11 | 11 | "/usr/local/texlive/2026/texmf-dist/fonts/enc/dvips/base/8r.enc" 1165713224 4850 80dc9bab7f31fb78a000ccfed0e27cab "" |
| 12 | 12 | "/usr/local/texlive/2026/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" |
| 13 | 13 | "/usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm" 1136768653 1408 5937f58aa508ea2cea4901c07d10f5fe "" |
@@ -146,51 +146,51 @@ | ||
| 146 | 146 | "/usr/local/texlive/2026/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1776992453 5573038 b99aad5e4898a9034e953632f940512b "" |
| 147 | 147 | "/usr/local/texlive/2026/texmf-var/web2c/pdftex/pdflatex.fmt" 1774209607 3636776 dc5fa9b6b1453b9d196cd42edf876004 "" |
| 148 | 148 | "/usr/local/texlive/2026/texmf.cnf" 1774209515 577 648cd9f92f9c0eac486f4c71c85cfbbe "" |
| 149 | − "appendix/appendix.tex" 1791669372.50415 3692 978627ae3304068b6095a969913dfa4e "" | |
| 150 | − "figures/f1_mdape_vs_k.pdf" 1791669587.98363 36037 e355c81c5fedba32e832a24c3f4408be "" | |
| 151 | − "figures/f2_surface_d_T.pdf" 1791669587.98375 25994 1cbd1b2bd396b69eb2de3ef24917c2ad "" | |
| 152 | − "figures/f3_ajustements.pdf" 1791669587.98385 36136 d300894232678abe72aa465a8d4514d1 "" | |
| 153 | − "figures/f4_competition.pdf" 1791669587.98395 40740 22b7c55d5bd5e089cec626a605271727 "" | |
| 154 | − "figures/f5_densite.pdf" 1791669587.98405 35609 e96ada411d9e6fa6195cdf974bc5e2d9 "" | |
| 155 | − "figures/f7_indice.pdf" 1791669587.98426 32594 b053e3f3f6425f0cbdca6080697aae6d "" | |
| 156 | − "main.aux" 1791669591.43573 22155 66f06235bf01cd09404880f862499c71 "pdflatex" | |
| 157 | − "main.bbl" 1791669590.74854 7426 189002991017ce2edb4cbc51edc5c910 "bibtex main" | |
| 158 | − "main.out" 1791669591.43699 7416 bf1dd9fe3c2a7a6e19ac40b70b222a94 "pdflatex" | |
| 159 | − "main.tex" 1791668967.77061 5795 731299ff1ece15e1ee4fe9c5b5a60161 "" | |
| 160 | − "sections/conclusion.tex" 1791669308.39232 3338 78d7447ef4108c4c3317e331a2d362ca "" | |
| 161 | − "sections/data.tex" 1791669168.2267 6652 c60d1f77ad533b10b3a19fd4c74c920c "" | |
| 162 | − "sections/introduction.tex" 1791669076.68532 8175 2bbbe12a7b1eb46260e5fb05ad8871e6 "" | |
| 149 | + "appendix/appendix.tex" 1791670366.63355 3713 3c209a468f8efb590c399cc7d8469a09 "" | |
| 150 | + "figures/f1_mdape_vs_k.pdf" 1791670451.2767 27169 f68e491803a9bc83df2dd2f4a60eb29b "" | |
| 151 | + "figures/f2_surface_d_T.pdf" 1791670451.34026 20647 c40ef4a734f02a1318d7ee9b909fa651 "" | |
| 152 | + "figures/f3_ajustements.pdf" 1791670451.38883 22112 72532e0b24f60e72eac570320779b567 "" | |
| 153 | + "figures/f4_competition.pdf" 1791670451.44335 24756 b83323a39607c0c4cdff3328391c1a1c "" | |
| 154 | + "figures/f5_densite.pdf" 1791670451.47942 24029 724ac4160e99c198c561ae405db759a5 "" | |
| 155 | + "figures/f7_indice.pdf" 1791670451.58371 18511 05c8d31727785f7e522eec864a1f4b53 "" | |
| 156 | + "main.aux" 1791670453.31921 22155 96efb98c7723c6a6c804fa37d2813fcb "pdflatex" | |
| 157 | + "main.bbl" 1791670452.62535 7426 189002991017ce2edb4cbc51edc5c910 "bibtex main" | |
| 158 | + "main.out" 1791670453.32042 7416 bf1dd9fe3c2a7a6e19ac40b70b222a94 "pdflatex" | |
| 159 | + "main.tex" 1791670296.77182 5936 d6af559ad74be8510b14b9f849dadcfd "" | |
| 160 | + "sections/conclusion.tex" 1791670296.77266 3426 7154925f40eb2317b532f569a705b93a "" | |
| 161 | + "sections/data.tex" 1791670296.77222 6697 9225db7b9c13c4aa53084d43e1f992a5 "" | |
| 162 | + "sections/introduction.tex" 1791670296.77212 8399 009d11f0e20d9189cf7eb9babb0cfe24 "" | |
| 163 | 163 | "sections/literature.tex" 1791669397.57194 7416 fcf0f91922c2a753315e7447161f83ad "" |
| 164 | − "sections/methodology.tex" 1791669168.22958 12016 6e19e7205805f92dd2c552cdac0f1ea6 "" | |
| 165 | − "sections/results.tex" 1791669308.38701 20700 cf4e58d2ab9874499c3dd14aeae553bc "" | |
| 166 | − "sections/robustness.tex" 1791669308.38987 4679 bf493ecdc1a68ee7068bc6c075e89794 "" | |
| 164 | + "sections/methodology.tex" 1791670414.73425 12030 67de73be572a1014e3a3c4e910287111 "" | |
| 165 | + "sections/results.tex" 1791670434.77141 22208 df52c99453a030d79904126ff4028f1f "" | |
| 166 | + "sections/robustness.tex" 1791670296.77256 5042 20c9093705bf638f891182f66ce8ef14 "" | |
| 167 | 167 | "sections/titlepage.tex" 1791668938.15793 1458 1242e8e90e0d8dba3af4619bac574330 "" |
| 168 | − "tables/adjustments.tex" 1791669587.93708 619 4da35be663bc2987d7e2e6e6160033a7 "" | |
| 169 | − "tables/competition.tex" 1791669587.97048 1609 fedc41b78e516ff6279b721b259ecee8 "" | |
| 170 | − "tables/cond_rules.tex" 1791669587.98284 728 9cd4052824e8c66a496224326b8bd730 "" | |
| 171 | − "tables/density.tex" 1791669587.97424 490 6548c4e056702791a45a92d4c99ded08 "" | |
| 172 | − "tables/density_dist.tex" 1791669587.92592 252 a22d5551c517c29a57c714a97962e9ed "" | |
| 173 | − "tables/descriptives.tex" 1791669587.92562 554 92426b58e569ae8bc50b170cb2602356 "" | |
| 174 | − "tables/e1_best.tex" 1791669587.93359 541 f725375dfefb305a29cc241720be4165 "" | |
| 175 | − "tables/exclusions.tex" 1791669587.92509 912 38d67ac94c92d67670ec913b07170893 "" | |
| 176 | − "tables/grid.tex" 1791669587.96621 468 ca25d30bb81416d1e88594d7477d619a "" | |
| 177 | − "tables/h2.tex" 1791669587.93419 571 500c1470f6bf48c977871ef111677206 "" | |
| 178 | − "tables/h3.tex" 1791669587.93803 862 c86bda54ae7744821e2da1eef7c20d7a "" | |
| 179 | − "tables/h4.tex" 1791669587.969 549 2c056e3ed64fcd1e813e12958d5646d9 "" | |
| 180 | − "tables/h5.tex" 1791669587.98134 389 7f44b67c4104e20155c316efeffc648f "" | |
| 181 | − "tables/intervals.tex" 1791669587.98192 686 6057227c93b778b03e0cb3ee6c93b590 "" | |
| 182 | − "tables/marginal.tex" 1791669587.96935 779 1aeae827a0c45f64f982fd5c71eaf1fb "" | |
| 183 | − "tables/numbers.tex" 1791669587.98525 3128 68e923e2cd1be3ef00574bcc221e5bdc "" | |
| 184 | − "tables/pairs.tex" 1791669587.97237 970 ed0ba5a37367eb621b0191989a08e0e9 "" | |
| 185 | − "tables/regions.tex" 1791669587.97662 1478 99b0aa03520a52b944bf2fd38dfbb9fc "" | |
| 186 | − "tables/selection.tex" 1791669587.96724 304 f4292253fb696f6609af5d60de099448 "" | |
| 187 | − "tables/stability.tex" 1791669587.98348 588 681cdb7ff7cb69b84248f56ff21294d6 "" | |
| 188 | − "tables/strata_other.tex" 1791669587.98078 1273 5cb3a1299a0cf09db5d00470f6f90e97 "" | |
| 189 | − "tables/surface_cov.tex" 1791669587.93279 383 2e8f2138b19787afa928c1f6b97ffee2 "" | |
| 190 | − "tables/surface_geo_hedo.tex" 1791669587.92972 679 538fad263bc8a0b1ee338c1af3b12776 "" | |
| 191 | − "tables/surface_geo_none.tex" 1791669587.93091 679 044182fe5d472eee588250e0f7d67800 "" | |
| 192 | − "tables/surface_sim_hedo.tex" 1791669587.93194 679 7e1a2230ac2699c84858722e48fa34eb "" | |
| 193 | − "tables/weighting.tex" 1791669587.96827 710 62650f8a7708ca522dec3f5779199f04 "" | |
| 168 | + "tables/adjustments.tex" 1791670451.00744 620 9e74ac71ffc244def8bb425ea654cdad "" | |
| 169 | + "tables/competition.tex" 1791670451.04162 1568 6bc492b7ee1abf62d1b6e8925cdf4c78 "" | |
| 170 | + "tables/cond_rules.tex" 1791670451.0542 716 31ad922e1b21fa015ca2158a94253a33 "" | |
| 171 | + "tables/density.tex" 1791670451.04535 503 4cc1130d3d78ff10aeacc60c988d9209 "" | |
| 172 | + "tables/density_dist.tex" 1791670450.99603 264 a26d733c83dcbcce6c43a7e60a485963 "" | |
| 173 | + "tables/descriptives.tex" 1791670450.99575 632 adb3b0768a3e4025aa0b237cf384bee6 "" | |
| 174 | + "tables/e1_best.tex" 1791670451.00378 548 20318ac49e30097b292868a9ea70144d "" | |
| 175 | + "tables/exclusions.tex" 1791670450.99527 927 b72303a7475e35d2d59e0edc401f5446 "" | |
| 176 | + "tables/grid.tex" 1791670451.03714 468 ca25d30bb81416d1e88594d7477d619a "" | |
| 177 | + "tables/h2.tex" 1791670451.00438 574 88b2d6ff6d2eee2c102025c2ec6c4e98 "" | |
| 178 | + "tables/h3.tex" 1791670451.00841 861 01916a2ff64066c9f649c5b8bc3a8c3d "" | |
| 179 | + "tables/h4.tex" 1791670451.04018 511 94675ab5c615c62853f93d8c49d9660e "" | |
| 180 | + "tables/h5.tex" 1791670451.05268 387 dc7809572420662b25f407f106bdf382 "" | |
| 181 | + "tables/intervals.tex" 1791670451.05327 698 23ff1d4780f1d33d7e680b637c8b4c28 "" | |
| 182 | + "tables/marginal.tex" 1791670451.04056 779 7fcc610a63f1544a8100f6f04588592f "" | |
| 183 | + "tables/numbers.tex" 1791670451.58597 3372 664717abb13647ad16f84e7e17a5de8e "" | |
| 184 | + "tables/pairs.tex" 1791670451.04342 999 0bb1e085a84223bfbd1dac507690dddd "" | |
| 185 | + "tables/regions.tex" 1791670451.04773 1513 4ebac079ff4f26f9c68db838e47e3b5d "" | |
| 186 | + "tables/selection.tex" 1791670451.03821 307 f26524e26b577b837d9b253d895e3f77 "" | |
| 187 | + "tables/stability.tex" 1791670451.0546 600 7adacfe8156b0bfc5d205138265c3c6a "" | |
| 188 | + "tables/strata_other.tex" 1791670451.05213 1296 6331ddafefc63da1d9cb1429f1dd7cec "" | |
| 189 | + "tables/surface_cov.tex" 1791670451.00298 385 7ebf6d8a42ece1474abb276b4f68b2f0 "" | |
| 190 | + "tables/surface_geo_hedo.tex" 1791670451.00008 679 8331abe120b6d7df5cf79c463b146963 "" | |
| 191 | + "tables/surface_geo_none.tex" 1791670451.00117 679 57dd201f2aadfbb692746c565337326b "" | |
| 192 | + "tables/surface_sim_hedo.tex" 1791670451.00214 679 47495d9403b904fee24bb1a34ede853c "" | |
| 193 | + "tables/weighting.tex" 1791670451.03939 662 0fe5cc0224cd44cbfba909f5f2aad2db "" | |
| 194 | 194 | "uq_logo.jpg" 1791668938.162 58719 668023c2daab9af750d1f0889564af82 "" |
| 195 | 195 | (generated) |
| 196 | 196 | "main.aux" |
modified
paper/main.fls
+9 −4
@@ -444,10 +444,6 @@ INPUT ./tables/adjustments.tex | ||
| 444 | 444 | INPUT ./tables/adjustments.tex |
| 445 | 445 | INPUT ./tables/adjustments.tex |
| 446 | 446 | INPUT tables/adjustments.tex |
| 447 | −INPUT ./figures/f3_ajustements.pdf | |
| 448 | −INPUT ./figures/f3_ajustements.pdf | |
| 449 | −INPUT ./figures/f3_ajustements.pdf | |
| 450 | −INPUT ./figures/f3_ajustements.pdf | |
| 451 | 447 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf |
| 452 | 448 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/psyro.tfm |
| 453 | 449 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm |
@@ -455,6 +451,10 @@ INPUT /usr/local/texlive/2026/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf | ||
| 455 | 451 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm |
| 456 | 452 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm |
| 457 | 453 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf |
| 454 | +INPUT ./figures/f3_ajustements.pdf | |
| 455 | +INPUT ./figures/f3_ajustements.pdf | |
| 456 | +INPUT ./figures/f3_ajustements.pdf | |
| 457 | +INPUT ./figures/f3_ajustements.pdf | |
| 458 | 458 | INPUT ./tables/h3.tex |
| 459 | 459 | INPUT ./tables/h3.tex |
| 460 | 460 | INPUT ./tables/h3.tex |
@@ -462,12 +462,14 @@ INPUT ./tables/h3.tex | ||
| 462 | 462 | INPUT tables/h3.tex |
| 463 | 463 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm |
| 464 | 464 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm |
| 465 | +INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm | |
| 465 | 466 | INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm |
| 466 | 467 | INPUT ./tables/grid.tex |
| 467 | 468 | INPUT ./tables/grid.tex |
| 468 | 469 | INPUT ./tables/grid.tex |
| 469 | 470 | INPUT ./tables/grid.tex |
| 470 | 471 | INPUT tables/grid.tex |
| 472 | +INPUT /usr/local/texlive/2026/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf | |
| 471 | 473 | INPUT ./tables/selection.tex |
| 472 | 474 | INPUT ./tables/selection.tex |
| 473 | 475 | INPUT ./tables/selection.tex |
@@ -487,11 +489,14 @@ INPUT ./tables/h4.tex | ||
| 487 | 489 | INPUT ./tables/h4.tex |
| 488 | 490 | INPUT ./tables/h4.tex |
| 489 | 491 | INPUT tables/h4.tex |
| 492 | +INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm | |
| 490 | 493 | INPUT ./tables/marginal.tex |
| 491 | 494 | INPUT ./tables/marginal.tex |
| 492 | 495 | INPUT ./tables/marginal.tex |
| 493 | 496 | INPUT ./tables/marginal.tex |
| 494 | 497 | INPUT tables/marginal.tex |
| 498 | +INPUT /usr/local/texlive/2026/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf | |
| 499 | +INPUT /usr/local/texlive/2026/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm | |
| 495 | 500 | INPUT ./tables/competition.tex |
| 496 | 501 | INPUT ./tables/competition.tex |
| 497 | 502 | INPUT ./tables/competition.tex |
modified
paper/main.log
+42 −78
@@ -1,4 +1,4 @@ | ||
| 1 | −This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026) (preloaded format=pdflatex 2026.3.22) 10 OCT 2026 17:59 | |
| 1 | +This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026) (preloaded format=pdflatex 2026.3.22) 10 OCT 2026 18:14 | |
| 2 | 2 | entering extended mode |
| 3 | 3 | restricted \write18 enabled. |
| 4 | 4 | %&-line parsing enabled. |
@@ -793,11 +793,11 @@ Overfull \hbox (60.22191pt too wide) in paragraph at lines 1--36 | ||
| 793 | 793 | [][] |
| 794 | 794 | [] |
| 795 | 795 | |
| 796 | −<figures/f7_indice.pdf, id=350, 443.14055pt x 225.88692pt> | |
| 796 | +<figures/f7_indice.pdf, id=348, 440.99129pt x 221.13416pt> | |
| 797 | 797 | File: figures/f7_indice.pdf Graphic file (type pdf) |
| 798 | 798 | <use figures/f7_indice.pdf> |
| 799 | 799 | Package pdftex.def Info: figures/f7_indice.pdf used on input line 40. |
| 800 | −(pdftex.def) Requested size: 399.29463pt x 203.54105pt. | |
| 800 | +(pdftex.def) Requested size: 399.29463pt x 200.23361pt. | |
| 801 | 801 | LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <10.95> not available |
| 802 | 802 | (Font) Font shape `OT1/ptm/b/n' tried instead on input line 41. |
| 803 | 803 | LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <8> not available |
@@ -805,89 +805,56 @@ LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <8> not available | ||
| 805 | 805 | LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <6> not available |
| 806 | 806 | (Font) Font shape `OT1/ptm/b/n' tried instead on input line 41. |
| 807 | 807 | [10 <./figures/f7_indice.pdf>] (./tables/density_dist.tex)) |
| 808 | −(./sections/methodology.tex | |
| 809 | − | |
| 810 | −LaTeX Warning: Reference `sec:adjust' on page 11 undefined on input line 13. | |
| 811 | − | |
| 812 | −[11] [12] [13] | |
| 813 | −Overfull \hbox (95.51924pt too wide) in paragraph at lines 61--82 | |
| 814 | − [][] | |
| 815 | − [] | |
| 816 | − | |
| 817 | −[14]) (./sections/results.tex | |
| 818 | −<figures/f1_mdape_vs_k.pdf, id=468, 550.14034pt x 251.5558pt> | |
| 808 | +(./sections/methodology.tex [11] [12] [13] [14]) (./sections/results.tex | |
| 809 | +<figures/f1_mdape_vs_k.pdf, id=438, 547.99101pt x 244.40283pt> | |
| 819 | 810 | File: figures/f1_mdape_vs_k.pdf Graphic file (type pdf) |
| 820 | 811 | <use figures/f1_mdape_vs_k.pdf> |
| 821 | 812 | Package pdftex.def Info: figures/f1_mdape_vs_k.pdf used on input line 15. |
| 822 | −(pdftex.def) Requested size: 469.75502pt x 214.80223pt. | |
| 823 | − [15] | |
| 824 | −<figures/f2_surface_d_T.pdf, id=477, 502.01927pt x 225.88692pt> | |
| 813 | +(pdftex.def) Requested size: 469.75502pt x 209.51479pt. | |
| 814 | + | |
| 815 | +[15] | |
| 816 | +<figures/f2_surface_d_T.pdf, id=447, 502.01927pt x 220.96164pt> | |
| 825 | 817 | File: figures/f2_surface_d_T.pdf Graphic file (type pdf) |
| 826 | 818 | <use figures/f2_surface_d_T.pdf> |
| 827 | 819 | Package pdftex.def Info: figures/f2_surface_d_T.pdf used on input line 22. |
| 828 | −(pdftex.def) Requested size: 422.77664pt x 190.23659pt. | |
| 820 | +(pdftex.def) Requested size: 422.77664pt x 186.08864pt. | |
| 829 | 821 | (./tables/surface_geo_hedo.tex) [16 <./figures/f1_mdape_vs_k.pdf> <./figures/f |
| 830 | 822 | 2_surface_d_T.pdf>] (./tables/h2.tex) |
| 831 | 823 | LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <10> not available |
| 832 | −(Font) Font shape `OT1/ptm/b/n' tried instead on input line 47. | |
| 824 | +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 49. | |
| 833 | 825 | LaTeX Font Info: Font shape `OT1/ptm/bx/n' in size <7.4> not available |
| 834 | −(Font) Font shape `OT1/ptm/b/n' tried instead on input line 47. | |
| 835 | − | |
| 836 | −[17] (./tables/adjustments.tex) | |
| 837 | −Overfull \hbox (20.0581pt too wide) in paragraph at lines 1--61 | |
| 838 | − [][] | |
| 839 | − [] | |
| 840 | − | |
| 841 | −<figures/f3_ajustements.pdf, id=638, 445.64993pt x 225.88692pt> | |
| 826 | +(Font) Font shape `OT1/ptm/b/n' tried instead on input line 49. | |
| 827 | + [17] (./tables/adjustments.tex) | |
| 828 | +[18] | |
| 829 | +<figures/f3_ajustements.pdf, id=575, 443.50067pt x 221.07143pt> | |
| 842 | 830 | File: figures/f3_ajustements.pdf Graphic file (type pdf) |
| 843 | 831 | <use figures/f3_ajustements.pdf> |
| 844 | −Package pdftex.def Info: figures/f3_ajustements.pdf used on input line 68. | |
| 845 | −(pdftex.def) Requested size: 422.77664pt x 214.3018pt. | |
| 846 | −[18] (./tables/h3.tex) [19 <./figures/f3_ajustements.pdf>] (./tables/grid.tex) | |
| 847 | −[20] (./tables/selection.tex) [21] (./tables/weighting.tex) | |
| 848 | −Overfull \hbox (64.52856pt too wide) in paragraph at lines 1--121 | |
| 849 | − [][] | |
| 850 | − [] | |
| 851 | − | |
| 852 | −(./tables/h4.tex) | |
| 853 | −Overfull \hbox (200.30655pt too wide) in paragraph at lines 1--128 | |
| 854 | − [][] | |
| 855 | − [] | |
| 856 | − | |
| 832 | +Package pdftex.def Info: figures/f3_ajustements.pdf used on input line 71. | |
| 833 | +(pdftex.def) Requested size: 422.77664pt x 210.7554pt. | |
| 834 | + (./tables/h3.tex) [19 <./figures/f3_ajustements.pdf>] (./tables/grid.tex) | |
| 835 | +[20] (./tables/selection.tex) [21] (./tables/weighting.tex) (./tables/h4.tex) | |
| 857 | 836 | [22] (./tables/marginal.tex) [23] (./tables/competition.tex) |
| 858 | −Overfull \hbox (222.59087pt too wide) in paragraph at lines 1--151 | |
| 859 | − [][] | |
| 860 | − [] | |
| 861 | − | |
| 862 | −<figures/f4_competition.pdf, id=766, 754.11583pt x 340.59245pt> | |
| 837 | +<figures/f4_competition.pdf, id=660, 633.31883pt x 333.69041pt> | |
| 863 | 838 | File: figures/f4_competition.pdf Graphic file (type pdf) |
| 864 | 839 | <use figures/f4_competition.pdf> |
| 865 | −Package pdftex.def Info: figures/f4_competition.pdf used on input line 158. | |
| 866 | −(pdftex.def) Requested size: 446.26582pt x 201.55585pt. | |
| 867 | −[24] (./tables/pairs.tex) [25 <./figures/f4_competition.pdf>] | |
| 868 | −(./tables/density.tex) [26] | |
| 869 | −<figures/f5_densite.pdf, id=887, 410.11719pt x 251.5558pt> | |
| 840 | +Package pdftex.def Info: figures/f4_competition.pdf used on input line 163. | |
| 841 | +(pdftex.def) Requested size: 446.26582pt x 235.13466pt. | |
| 842 | + [24] | |
| 843 | +(./tables/pairs.tex) [25 <./figures/f4_competition.pdf>] [26] | |
| 844 | +(./tables/density.tex) | |
| 845 | +<figures/f5_densite.pdf, id=743, 407.96793pt x 244.4342pt> | |
| 870 | 846 | File: figures/f5_densite.pdf Graphic file (type pdf) |
| 871 | 847 | <use figures/f5_densite.pdf> |
| 872 | −Package pdftex.def Info: figures/f5_densite.pdf used on input line 192. | |
| 873 | −(pdftex.def) Requested size: 399.29463pt x 244.93004pt. | |
| 848 | +Package pdftex.def Info: figures/f5_densite.pdf used on input line 198. | |
| 849 | +(pdftex.def) Requested size: 399.29463pt x 239.25294pt. | |
| 874 | 850 | (./tables/h5.tex) [27 <./figures/f5_densite.pdf>] |
| 875 | −(./tables/intervals.tex) | |
| 876 | −Overfull \hbox (260.2727pt too wide) in paragraph at lines 1--219 | |
| 877 | − [][] | |
| 878 | − [] | |
| 879 | − | |
| 880 | −[28] (./tables/cond_rules.tex) | |
| 881 | −Overfull \hbox (163.44707pt too wide) in paragraph at lines 1--232 | |
| 882 | − [][] | |
| 883 | − [] | |
| 884 | − | |
| 885 | −) (./sections/robustness.tex (./tables/stability.tex) [29]) | |
| 886 | −(./sections/conclusion.tex [30]) [31] [32] (./main.bbl [33] [34]) | |
| 851 | +(./tables/intervals.tex) [28] (./tables/cond_rules.tex)) | |
| 852 | +(./sections/robustness.tex (./tables/stability.tex) [29]) | |
| 853 | +(./sections/conclusion.tex [30] [31]) [32] (./main.bbl [33] [34]) | |
| 887 | 854 | (./appendix/appendix.tex (./tables/surface_cov.tex) |
| 888 | 855 | (./tables/surface_geo_none.tex) (./tables/surface_sim_hedo.tex) [35] |
| 889 | 856 | (./tables/e1_best.tex) |
| 890 | −Overfull \hbox (37.67392pt too wide) in paragraph at lines 1--33 | |
| 857 | +Overfull \hbox (1.67334pt too wide) in paragraph at lines 1--36 | |
| 891 | 858 | [][] |
| 892 | 859 | [] |
| 893 | 860 | |
@@ -896,20 +863,17 @@ Overfull \hbox (37.67392pt too wide) in paragraph at lines 1--33 | ||
| 896 | 863 | LaTeX2e <2025-11-01> |
| 897 | 864 | L3 programming layer <2026-01-19> |
| 898 | 865 | *********** |
| 899 | − | |
| 900 | −LaTeX Warning: There were undefined references. | |
| 901 | − | |
| 902 | 866 | Package rerunfilecheck Info: File `main.out' has not changed. |
| 903 | 867 | (rerunfilecheck) Checksum: BF1DD9FE3C2A7A6E19AC40B70B222A94;7416. |
| 904 | 868 | ) |
| 905 | 869 | Here is how much of TeX's memory you used: |
| 906 | − 22556 strings out of 467525 | |
| 907 | − 419168 string characters out of 5418982 | |
| 908 | − 869339 words of memory out of 5000000 | |
| 909 | − 50445 multiletter control sequences out of 15000+600000 | |
| 910 | − 740916 words of font info for 465 fonts, out of 8000000 for 9000 | |
| 870 | + 22591 strings out of 467525 | |
| 871 | + 419598 string characters out of 5418982 | |
| 872 | + 869480 words of memory out of 5000000 | |
| 873 | + 50457 multiletter control sequences out of 15000+600000 | |
| 874 | + 746487 words of font info for 480 fonts, out of 8000000 for 9000 | |
| 911 | 875 | 1141 hyphenation exceptions out of 8191 |
| 912 | − 75i,12n,84p,2312b,1226s stack positions out of 10000i,1000n,20000p,200000b,200000s | |
| 876 | + 75i,12n,84p,2536b,1226s stack positions out of 10000i,1000n,20000p,200000b,200000s | |
| 913 | 877 | </usr/local/texlive/2026/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb |
| 914 | 878 | ></usr/local/texlive/2026/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb> |
| 915 | 879 | </usr/local/texlive/2026/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></ |
@@ -921,10 +885,10 @@ e/2026/texmf-dist/fonts/type1/urw/symbol/usyr.pfb></usr/local/texlive/2026/texm | ||
| 921 | 885 | f-dist/fonts/type1/urw/times/utmb8a.pfb></usr/local/texlive/2026/texmf-dist/fon |
| 922 | 886 | ts/type1/urw/times/utmr8a.pfb></usr/local/texlive/2026/texmf-dist/fonts/type1/u |
| 923 | 887 | rw/times/utmri8a.pfb> |
| 924 | −Output written on main.pdf (38 pages, 440556 bytes). | |
| 888 | +Output written on main.pdf (38 pages, 385238 bytes). | |
| 925 | 889 | PDF statistics: |
| 926 | − 1127 PDF objects out of 1200 (max. 8388607) | |
| 927 | − 648 compressed objects within 7 object streams | |
| 890 | + 954 PDF objects out of 1000 (max. 8388607) | |
| 891 | + 605 compressed objects within 7 object streams | |
| 928 | 892 | 147 named destinations out of 1000 (max. 500000) |
| 929 | − 104788 words of extra memory for PDF output out of 106986 (max. 10000000) | |
| 893 | + 112980 words of extra memory for PDF output out of 128383 (max. 10000000) | |
| 930 | 894 | |
modified
paper/main.pdf
+0 −0
Binary file not shown.
modified
paper/main.synctex.gz
+0 −0
Binary file not shown.
modified
paper/main.tex
+2 −2
@@ -92,11 +92,11 @@ | ||
| 92 | 92 | % ============================================================================ |
| 93 | 93 | \newcommand{\WPnumber}{11} |
| 94 | 94 | \newcommand{\WPtitle}{Does the Sales Comparison Approach Actually Work? A Large-Scale Point-in-Time Validation of Comparable Selection, Price Adjustments, and Value Reconciliation} |
| 95 | −\newcommand{\WPsubtitle}{Evidence from 394,000 Single-Family Transactions in Quebec, 2021--2026} | |
| 95 | +\newcommand{\WPsubtitle}{Evidence from 391,000 Single-Family Transactions in Quebec, 2021--2026} | |
| 96 | 96 | \newcommand{\WPdate}{October 2026} |
| 97 | 97 | \newcommand{\WPversion}{1.0} |
| 98 | 98 | \newcommand{\WPabstract}{% |
| 99 | − The sales comparison approach is the dominant method of residential valuation, yet its operating rules---how many comparables to use, how far and how far back to search, which adjustments to apply, how to weight and reconcile---rest largely on professional convention. We subject these rules to a large-scale, point-in-time backtest on \nSalesClean{} arm's-length single-family transactions in Quebec (2021--2026) matched to the municipal assessment roll. For each of \nTargetsAll{} target sales in 2024--2026, the price is masked and \nConfigs{} configurations of the approach---together with hedonic, gradient-boosting, assessment-ratio and hybrid benchmarks---are applied using only information available on the valuation date; configurations are selected on 2024 and evaluated out of sample on 2025--2026. Adjustments dominate: the median absolute error of the five nearest sales falls from \mdapeMtwo{} with a time adjustment only to \mdapeMseven{} with a hedonic adjustment grid, and a stylized conventional grid captures most of that gain. Selecting physically similar rather than merely nearby comparables delivers a comparable gain without any adjustment. The optimal number of comparables is well above the conventional three and increases with adjustment quality and market density; narrow search radii and short time windows are dominated. Weighting and reconciliation rules matter little. The best transparent configuration chosen in 2024 reaches \mdapeMzero{} out of sample, against \mdapeMelevenB{} for a quarterly-retrained gradient-boosting model that uses the assessed value and \mdapeMtwelve{} for a hybrid; the cost of transparency is small and vanishes in homogeneous submarkets. Accuracy is governed primarily by submarket liquidity, and density-conditional rules improve on any single rule. The results turn a convention-based method into a set of empirically validated, reproducible rules. | |
| 99 | + The sales comparison approach is the dominant method of residential valuation, yet its operating rules---how many comparables to use, how far and how far back to search, which adjustments to apply, how to weight and reconcile---rest largely on professional convention. We subject these rules to a large-scale, point-in-time backtest on \nSalesClean{} arm's-length single-family transactions in Quebec (2021--2026) matched to the municipal assessment roll. For each of \nTargetsAll{} target sales in 2024--2026, the price is masked and \nConfigs{} configurations of the approach---together with hedonic, gradient-boosting, assessment-ratio and hybrid benchmarks---are applied using only information available on the valuation date; configurations are selected on 2024 and evaluated out of sample on 2025--2026. Adjustments dominate: the median absolute error of the five nearest sales falls from \mdapeMtwo{} with a time adjustment only to \mdapeMseven{} with a hedonic adjustment grid, and a stylized conventional grid captures most of that gain. Selecting physically similar rather than merely nearby comparables delivers a comparable gain without any adjustment. The optimal number of comparables is well above the conventional three---around twenty once a grid is applied, with no penalty up to fifty---and short time windows are dominated; the search radius matters far less than the number and similarity of the sales retained. Weighting and reconciliation rules matter little. The best transparent configuration chosen in 2024 reaches \mdapeMzero{} out of sample, against \mdapeMelevenB{} for a quarterly-retrained gradient-boosting model that uses the assessed value and \mdapeMtwelve{} for a hybrid; the cost of transparency is small and narrows in homogeneous submarkets. Accuracy is governed primarily by submarket liquidity; a wide-net rule that retains the most similar sales is self-adapting, and stratum-specific rules do not improve on it. The results turn a convention-based method into a set of empirically validated, reproducible rules. | |
| 100 | 100 | } |
| 101 | 101 | \newcommand{\WPkeywords}{Sales comparison approach, comparable selection, adjustment grid, automated valuation models, hedonic pricing, backtesting, residential real estate, Quebec} |
| 102 | 102 | \newcommand{\WPjel}{R31, R32, C52, C53, G12} |
modified
paper/make_paper_tables.py
+79 −7
@@ -50,7 +50,7 @@ EN = ["Not matched to the assessment roll", "Duplicates (same unit, same date)", | ||
| 50 | 50 | "Resale within 180 days with price change above 40\\% (flip)", "Physical link or construction type missing", "Municipality absent from the MAMH directory"] |
| 51 | 51 | ex["Rule"] = EN[:len(ex)]; ex["Removed"] = ex["Removed"].map(n_) |
| 52 | 52 | rows = [["Single-family transactions, raw", n_(D["brut"])]] + ex.values.tolist() + [["Final sample", n_(D["propre"])]] |
| 53 | −write("exclusions", tabular(pd.DataFrame(rows, columns=["Step", "n"]), ["Step", "n"], "lr")) | |
| 53 | +write("exclusions", tabular(pd.DataFrame(rows, columns=["Step", "n"]), ["Step", "n"], "p{0.8\\textwidth}r")) | |
| 54 | 54 | ds = R.get("descriptives") or {p: dict(n=0, prix_med=0, prix_moy=0, aire_med=0, terrain_med=0, age_med=0, detache=0, ratio_role_med=0) for p in ["train", "val", "test"]} |
| 55 | 55 | dd = pd.DataFrame({"Statistic": ["Sales", "Median price (\\$)", "Mean price (\\$)", "Median living area (m$^2$)", "Median lot area (m$^2$)", "Median age (years)", "Detached (\\%)", "Median price/assessment ratio", "Median sales within 2 km, 12 months", "Median candidate pool (25 km, 24 months)"], |
| 56 | 56 | **{{"train": "Development 2021--2023", "val": "Validation 2024", "test": "Test 2025--2026"}[p]: [n_(ds[p]["n"]), n_(ds[p]["prix_med"]), n_(ds[p]["prix_moy"]), f1(ds[p]["aire_med"]), n_(ds[p]["terrain_med"]), f1(ds[p]["age_med"]), f1(ds[p]["detache"]), f2(ds[p]["ratio_role_med"]), (n_(ds[p]["dens_med"]) if "dens_med" in ds[p] else "--"), (n_(ds[p]["n_cand_med"]) if "n_cand_med" in ds[p] else "--")] for p in ["train", "val", "test"]}}) |
@@ -98,18 +98,19 @@ write("grid", tabular(gd, list(gd.columns), "lr") + f"\\par\\footnotesize Within | ||
| 98 | 98 | sel = anchor[(anchor.adj == "hedo") & (anchor.w == "equal") & (anchor.recon == "median")].copy(); sel["Selection"] = sel["sel"].map(LAB) |
| 99 | 99 | sel = sel.rename(columns={"mdape_val": "MdAPE 2024", "mdape_test": "MdAPE 2025--26", "biais_test": "Bias", "p10_test": "Within $\\pm10\\%$"}) |
| 100 | 100 | write("selection", tabular(sel, ["Selection", "MdAPE 2024", "MdAPE 2025--26", "Bias", "Within $\\pm10\\%$"], "lrrrr")) |
| 101 | −wr = anchor[(anchor.adj == "hedo") & (anchor.sel == "geo")].copy(); wr["Weighting"] = wr["w"].map(LAB); wr["Reconciliation"] = wr["recon"].map(LAB) | |
| 101 | +wr = anchor[(anchor.adj == "hedo") & (anchor.sel == "geo")].copy(); wr["Weighting"] = wr["w"].map({**LAB, "all": "product of the three"}); wr["Reconciliation"] = wr["recon"].map(LAB) | |
| 102 | 102 | wr = wr.rename(columns={"mdape_val": "MdAPE 2024", "mdape_test": "MdAPE 2025--26", "biais_test": "Bias", "p10_test": "Within $\\pm10\\%$"}) |
| 103 | 103 | write("weighting", tabular(wr, ["Weighting", "Reconciliation", "MdAPE 2024", "MdAPE 2025--26", "Bias", "Within $\\pm10\\%$"], "llrrrr")) |
| 104 | 104 | h4 = pd.DataFrame(H["H4"]).T.loc[DENS].reset_index(); h4["index"] = h4["index"].map(DENS_EN) |
| 105 | −h4.columns = ["Density"] + [f"{LAB[c.split('|')[0]]} / {LAB[c.split('|')[1]]}".replace("distance $\\times$ recency $\\times$ similarity", "product") for c in h4.columns[1:]] | |
| 105 | +SH = {"equal": "equal", "dist": "dist.", "rec": "rec.", "sim": "sim.", "all": "prod.", "median": "med.", "mean": "mean"} | |
| 106 | +h4.columns = ["Density"] + [f"{SH[c.split('|')[0]]}/{SH[c.split('|')[1]]}" for c in h4.columns[1:]] | |
| 106 | 107 | write("h4", tabular(h4, list(h4.columns), "l" + "r" * (len(h4.columns) - 1), bold_min_cols=list(h4.columns[1:]))) |
| 107 | 108 | marg = R["E2_marginal"]; rows = [] |
| 108 | 109 | for f, lab in [("sel", "Selection"), ("adj", "Adjustment"), ("w", "Weighting"), ("recon", "Reconciliation")]: |
| 109 | 110 | for k, v in marg[f].items(): rows.append([lab, LAB[k], v]) |
| 110 | 111 | mg = pd.DataFrame(rows, columns=["Factor", "Level", "Mean MdAPE"]); write("marginal", tabular(mg, list(mg.columns), "llr")) |
| 111 | 112 | cm = pd.DataFrame(comp).T; cm["val"] = [compv[m]["mdape"] for m in cm.index]; cm = cm.reset_index().rename(columns={"index": "Model"}) |
| 112 | −cm["Model"] = cm["Model"].str.replace(" (choisie en 2024, couverture ≥ 97 %)", " (best configuration, chosen on 2024)", regex=False) | |
| 113 | +cm["Model"] = cm["Model"].str.replace("M0 meilleure configuration empirique (choisie en 2024, couverture ≥ 97 %)", "M0 best configuration, chosen on 2024", regex=False) | |
| 113 | 114 | TR = {"M1 médiane des 3 plus proches (temps seul)": "M1 median of 3 nearest, time only", "M2 moyenne des 5 plus proches (temps seul)": "M2 mean of 5 nearest, time only", |
| 114 | 115 | "M3 sélection par similarité physique": "M3 5 most similar, time only", "M4 pondération par distance": "M4 5 nearest, distance-weighted", "M5 pondération par récence": "M5 5 nearest, recency-weighted", |
| 115 | 116 | "M6 grille d'ajustement conventionnelle": "M6 conventional grid", "M7 grille d'ajustement hédonique": "M7 hedonic grid", "M8a grille locale (régression sur le voisinage)": "M8a local grid", |
@@ -154,13 +155,78 @@ iv["Configuration"] = iv["index"].map(lambda i: f"{LAB[i.split('|')[0]]}, $k={i. | ||
| 154 | 155 | iv = iv.rename(columns={"z80_val": "$z$ (calibrated on 2024)", "couverture_nominale_80": "Coverage at $z=1.28$", "couverture_calibree": "Coverage, calibrated $z$", "largeur_mediane_pct": "Median width (\\%)", "n_test": "$n$"}) |
| 155 | 156 | write("intervals", tabular(iv, ["Configuration", "$z$ (calibrated on 2024)", "Coverage at $z=1.28$", "Coverage, calibrated $z$", "Median width (\\%)", "$n$"], "lrrrrr", fmt={"$n$": n_, "$z$ (calibrated on 2024)": f2})) |
| 156 | 157 | rc = pd.DataFrame(R["regles_conditionnelles"]).T.loc[DENS].reset_index(); rc["Density"] = rc["index"].map(DENS_EN) |
| 157 | −rc["Rule"] = rc.apply(lambda r: f"{LAB[r.sel]}, $k={int(r.k)}$, $\\le {float(r.d):g}$ km, {int(r['T'])} mo, {LAB[r.adj]}, {LAB[r.w]} weights, {LAB[r.recon]}", axis=1) | |
| 158 | +rc["Rule"] = rc.apply(lambda r: f"{LAB[r.sel]}, $k={int(r.k)}$, $\\le {float(r.d):g}$ km, {int(r['T'])} mo, {LAB[r.adj]}, {LAB[r.w]} w., {LAB[r.recon]}", axis=1) | |
| 158 | 159 | rc = rc.rename(columns={"mdape": "MdAPE 2024", "mdape_test": "MdAPE 2025--26", "couverture": "Coverage 2024", "n_test": "$n$ test"}) |
| 159 | 160 | write("cond_rules", tabular(rc, ["Density", "Rule", "MdAPE 2024", "MdAPE 2025--26", "Coverage 2024", "$n$ test"], "llrrrr", fmt={"$n$ test": n_})) |
| 160 | 161 | stab = pd.DataFrame(R["stabilite"]).rename(columns={"trimestre": "Quarter", "n": "$n$", "biais_M7": "Bias M7", "biais_M11b": "Bias M11b"}) |
| 161 | 162 | write("stability", tabular(stab, ["Quarter", "$n$", "M2", "M7", "M0", "M11b", "M12", "Bias M7", "Bias M11b"], "lrrrrrrrr", fmt={"$n$": n_})) |
| 162 | −for f in ["f1_mdape_vs_k", "f2_surface_d_T", "f3_ajustements", "f4_competition", "f5_densite", "f6_k_par_densite", "f7_indice"]: | |
| 163 | − shutil.copy(OUT / "fig" / f"{f}.pdf", P / "figures" / f"{f}.pdf") | |
| 163 | +# ------------------------------------------------------------------ figures (version anglaise, même palette) | |
| 164 | +import matplotlib; matplotlib.use("Agg"); import matplotlib.pyplot as plt | |
| 165 | +from matplotlib import rcParams | |
| 166 | +from matplotlib.colors import LinearSegmentedColormap | |
| 167 | +PAL = ["#2a78d6", "#eb6834", "#1baf7a", "#eda100", "#e87ba4", "#008300", "#6250d6", "#e34948"] | |
| 168 | +CMAP = LinearSegmentedColormap.from_list("seqblue", ["#cde2fb", "#9ec5f4", "#6da7ec", "#3987e5", "#256abf", "#184f95", "#0d366b"]) | |
| 169 | +rcParams.update({"font.family": "Helvetica Neue", "font.size": 9, "axes.edgecolor": "#c3c2b7", "axes.linewidth": 0.6, "axes.grid": True, "grid.color": "#e8e7e3", | |
| 170 | + "grid.linewidth": 0.5, "axes.spines.top": False, "axes.spines.right": False, "legend.frameon": False, "figure.dpi": 150, "savefig.bbox": "tight", | |
| 171 | + "axes.titleweight": "bold", "axes.titlesize": 10, "axes.labelcolor": "#52514e", "xtick.color": "#52514e", "ytick.color": "#52514e"}) | |
| 172 | +def savefig(fig, name): fig.savefig(P / "figures" / f"{name}.pdf"); plt.close(fig) | |
| 173 | +DENS_LAB = {"< 5": "< 5", "5-19": "5–19", "20-49": "20–49", "50-199": "50–199", "≥ 200": "≥ 200"} | |
| 174 | +# f1 | |
| 175 | +fig, axes = plt.subplots(1, 2, figsize=(9, 3.4), sharey=True) | |
| 176 | +for ax, a in zip(axes, ["none", "hedo"]): | |
| 177 | + for j, d in enumerate([0.5, 1, 2, 5, 10, 25]): | |
| 178 | + g = surf[(surf.sel == "geo") & (surf["T"] == 12) & (surf.adj == a) & (surf.d == d)].sort_values("k") | |
| 179 | + ax.plot(g.k, g.mdape_test, color=PAL[j], lw=2, marker="o", ms=4, label=f"d ≤ {d} km") | |
| 180 | + ax.set_xscale("log"); ax.set_xticks([1, 3, 5, 10, 20, 50]); ax.set_xticklabels([1, 3, 5, 10, 20, 50]) | |
| 181 | + ax.set_xlabel("number of comparables k"); ax.set_title({"none": "time adjustment only", "hedo": "hedonic adjustment grid"}[a]) | |
| 182 | +axes[0].set_ylabel("MdAPE, test 2025–26 (%)"); axes[1].legend(ncol=2, fontsize=8); savefig(fig, "f1_mdape_vs_k") | |
| 183 | +# f2 | |
| 184 | +fig, axes = plt.subplots(1, 2, figsize=(8, 3.2)) | |
| 185 | +for ax, a in zip(axes, ["none", "hedo"]): | |
| 186 | + g = surf[(surf.sel == "geo") & (surf.adj == a)].groupby(["d", "T"])["mdape_test"].min().unstack("T") | |
| 187 | + ax.imshow(g.to_numpy(), cmap=CMAP, aspect="auto") | |
| 188 | + ax.set_xticks(range(len(g.columns))); ax.set_xticklabels([f"{t} months" for t in g.columns]); ax.set_yticks(range(len(g.index))); ax.set_yticklabels([f"{d} km" for d in g.index]) | |
| 189 | + for i in range(g.shape[0]): | |
| 190 | + for j in range(g.shape[1]): | |
| 191 | + v = g.iloc[i, j]; ax.text(j, i, f"{v:.1f}", ha="center", va="center", fontsize=7.5, color="white" if v < np.nanpercentile(g.to_numpy(), 40) else "#0b0b0b") | |
| 192 | + ax.grid(False); ax.set_title({"none": "time adjustment only", "hedo": "hedonic grid"}[a] + " — MdAPE at the best k") | |
| 193 | +savefig(fig, "f2_surface_d_T") | |
| 194 | +# f3 | |
| 195 | +fig, ax = plt.subplots(figsize=(7, 3.2)) | |
| 196 | +g = fac[(fac.k == 5) & (fac.d == 5) & (fac["T"] == 12) & (fac.sel == "geo") & (fac.w == "equal") & (fac.recon == "median")].set_index("adj").loc[["raw", "none", "conv", "hedo", "hedo_reg", "local", "gbm", "role"]] | |
| 197 | +lab = {"raw": "none", "none": "time only", "conv": "conventional", "hedo": "hedonic", "hedo_reg": "regional", "local": "local", "gbm": "GBM", "role": "assessment ratio"} | |
| 198 | +x = np.arange(len(g)); ax.bar(x - 0.2, g.mdape_val, 0.38, color=PAL[0], label="validation 2024"); ax.bar(x + 0.2, g.mdape_test, 0.38, color=PAL[1], label="test 2025–26") | |
| 199 | +for i, (v1, v2) in enumerate(zip(g.mdape_val, g.mdape_test)): | |
| 200 | + ax.text(i - 0.2, v1 + 0.2, f"{v1:.1f}", ha="center", fontsize=7); ax.text(i + 0.2, v2 + 0.2, f"{v2:.1f}", ha="center", fontsize=7) | |
| 201 | +ax.set_xticks(x); ax.set_xticklabels([lab[a] for a in g.index]); ax.set_ylabel("MdAPE (%)"); ax.legend(); ax.set_title("Adjustment scheme — 5 nearest sales, ≤ 5 km, ≤ 12 months, median") | |
| 202 | +savefig(fig, "f3_ajustements") | |
| 203 | +# f4 | |
| 204 | +cm2 = cm.sort_values("MdAPE 2025--26", ascending=False) | |
| 205 | +cols = [PAL[0] if n.startswith(("M10", "M11", "M12")) else (PAL[2] if n.startswith(("M0", "M9")) else PAL[1]) for n in cm2.Model] | |
| 206 | +fig, ax = plt.subplots(figsize=(7.5, 5)); ax.barh(cm2.Model, cm2["MdAPE 2025--26"], color=cols, height=0.65) | |
| 207 | +for i, v in enumerate(cm2["MdAPE 2025--26"]): ax.text(v + 0.15, i, f"{v:.1f} %", va="center", fontsize=8) | |
| 208 | +ax.set_xlabel("MdAPE, test 2025–26 (%)"); ax.set_title("Horse race (orange: comparables; green: optimised; blue: external benchmarks)") | |
| 209 | +savefig(fig, "f4_competition") | |
| 210 | +# f5 | |
| 211 | +fig, ax = plt.subplots(figsize=(6.5, 3.4)); st = pd.read_csv(TAB / "strates_dens.csv") | |
| 212 | +for j, (name, lab_) in enumerate([("M2", "M2 5 nearest, time only"), ("M7", "M7 hedonic grid"), ("M0", "M0 best configuration"), ("M11b", "M11b GBM with assessed value"), ("M12", "M12 hybrid")]): | |
| 213 | + g = st[st.modele == name].set_index("dens").loc[DENS]; ax.plot([DENS_LAB[d] for d in DENS], g.mdape, color=PAL[j], lw=2, marker="o", ms=4, label=lab_) | |
| 214 | +ax.set_xlabel("sales within 2 km in the preceding 12 months"); ax.set_ylabel("MdAPE, test (%)"); ax.legend(fontsize=8); ax.set_title("Accuracy by submarket liquidity") | |
| 215 | +savefig(fig, "f5_densite") | |
| 216 | +# f6 | |
| 217 | +h2d = H["H2"]; fig, axes = plt.subplots(1, 2, figsize=(9, 3.3), sharey=True) | |
| 218 | +for ax, a in zip(axes, ["none", "hedo"]): | |
| 219 | + for j, lev in enumerate(DENS): | |
| 220 | + v = h2d[f"{a}|{lev}"]; ax.plot([int(k) for k in v], list(v.values()), color=PAL[j], lw=2, marker="o", ms=3.5, label=f"density {DENS_LAB[lev]}") | |
| 221 | + ax.set_xscale("log"); ax.set_xticks([1, 3, 5, 10, 20, 50]); ax.set_xticklabels([1, 3, 5, 10, 20, 50]); ax.set_xlabel("k"); ax.set_title({"none": "time only", "hedo": "hedonic grid"}[a] + " — d ≤ 10 km, 12 months") | |
| 222 | +axes[0].set_ylabel("MdAPE, test (%)"); axes[1].legend(fontsize=8); savefig(fig, "f6_k_par_densite") | |
| 223 | +# f7 | |
| 224 | +fig, ax = plt.subplots(figsize=(7, 3.2)); idxf = pd.read_csv(OUT / "index_full.csv") | |
| 225 | +for j, (r_, lab_) in enumerate([("QC", "Quebec (province)"), ("6", "Montréal"), ("3", "Capitale-Nationale"), ("7", "Outaouais"), ("5", "Estrie")]): | |
| 226 | + g = idxf[idxf.region.astype(str) == r_] | |
| 227 | + if len(g): ax.plot(pd.to_datetime(g.ym), np.exp(g.log_idx) * 100, color=PAL[j], lw=2 if r_ == "QC" else 1.4, label=lab_) | |
| 228 | +ax.set_ylabel("hedonic index (2021-01 = 100)"); ax.legend(fontsize=8); ax.set_title("Monthly price index (full sample, descriptive)") | |
| 229 | +savefig(fig, "f7_indice") | |
| 164 | 230 | |
| 165 | 231 | # ------------------------------------------------------------------ macros |
| 166 | 232 | m = {} |
@@ -202,6 +268,12 @@ h5 = H["H5"]; m["hFiveGapHomog"] = f1(h5["homogène"]["M0"] - h5["homogène"]["M | ||
| 202 | 268 | ivh = R["intervalles"]["hedo|10|10|24"]; m["ivWidth"] = pc(ivh["largeur_mediane_pct"]) |
| 203 | 269 | cg = R["regles_conditionnelles_global_test"]; m["condMdape"] = pc(cg["mdape"]); m["condPten"] = pc(cg["p10"]); m["condCov"] = pc(cg["couverture"]) |
| 204 | 270 | m["betaFloor"] = f"{b['ln_floor']:.2f}"; m["betaLand"] = f"{b['ln_land']:.2f}"; m["betaAge"] = f"{abs(b['age']) * 100:.1f}\\%"; m["betaSemi"] = f"{abs(b['lien1']) * 100:.1f}\\%"; m["betaRow"] = f"{abs(b['lien2']) * 100:.1f}\\%" |
| 271 | +ea24 = fac[(fac.k == 10) & (fac.d == 10) & (fac["T"] == 24) & (fac.sel == "geo") & (fac.w == "equal") & (fac.recon == "median")].set_index("adj")["mdape_test"] | |
| 272 | +m["gainTimeLong"] = f1(ea24["raw"] - ea24["none"]) | |
| 273 | +kn = surf[(surf.sel == "geo") & (surf.adj == "none") & (surf.d == 10) & (surf["T"] == 12)].set_index("k")["mdape_test"] | |
| 274 | +m["noneKten"] = pc(kn[10]); m["noneKfifty"] = pc(kn[50]) | |
| 275 | +pq = R["strates_prix_q"]; m["prixQoneMseven"] = pc(pq["Q1 (bas)"]["M7"]); m["prixQfourMseven"] = pc(pq["Q4"]["M7"]) | |
| 276 | +stb = {t["trimestre"]: t for t in R["stabilite"]}; m["biasQoneMseven"] = f"{stb['2025Q1']['biais_M7']:+.1f}\\%"; m["biasQthreeMseven"] = f"{stb['2025Q3']['biais_M7']:+.1f}\\%" | |
| 205 | 277 | lines = [f"\\newcommand{{\\{k}}}{{{v}}}" for k, v in m.items()] |
| 206 | 278 | (P / "tables" / "numbers.tex").write_text("% généré par make_paper_tables.py\n" + "\n".join(lines) + "\n") |
| 207 | 279 | print(f"{len(m)} macros, tables et figures écrites") |
modified
paper/sections/conclusion.tex
+2 −2
@@ -5,8 +5,8 @@ | ||
| 5 | 5 | |
| 6 | 6 | The sales comparison approach is usually defended on the grounds of its logic and its transparency and criticised on the grounds of its subjectivity. This paper has asked a different question: taken as a set of explicit rules, how accurate is it, and which rules are empirically justified? Using the universe of single-family transactions in Quebec and a backtest that respects the information available on each valuation date, we have measured the accuracy of \nConfigs{} configurations of the method and of the natural alternatives on \nTargetsTest{} out-of-sample sales. |
| 7 | 7 | |
| 8 | −The answers are clear enough to be taught. Adjust: a grid---even a crude one---is worth several points of error. Choose similar comparables, not merely near ones, and search widely in space and time. Use more comparables than three: ten to twenty when a grid is applied, more in dense markets and fewer in sparse ones. Do not agonise over weights or over the choice between median and mean. Use the assessed value: the ratio method is the most accurate single adjustment scheme where it applies. And report an interval, calibrated so that it means what it says. A transparent method configured on these principles and frozen in 2024 reaches a median absolute error of \mdapeMzero{} on 2025--2026 sales, within \transparencyCost{} points of the best quarterly-retrained machine-learning model given the same data, and within less than that in homogeneous submarkets. | |
| 8 | +The answers are clear enough to be taught. Adjust: a grid---even a crude one---is worth several points of error. Choose similar comparables, not merely near ones, and search widely in space and time. Use more comparables than three: twenty or more when a grid is applied, in sparse and dense markets alike, and about ten when it is not. Do not agonise over weights or over the choice between median and mean. Use the assessed value: the ratio method is the most accurate single adjustment scheme where it applies. And report an interval, calibrated so that it means what it says---and be prepared for it to be wide. A transparent method configured on these principles and frozen in 2024 reaches a median absolute error of \mdapeMzero{} on 2025--2026 sales, within \transparencyCost{} points of the best quarterly-retrained machine-learning model given the same data, and within less than that in homogeneous submarkets. | |
| 9 | 9 | |
| 10 | −The results have implications for practice, for education and for regulation. For practice, they suggest that the appraiser's effort is best spent on selecting similar comparables and on estimating adjustments from the largest homogeneous pool of evidence, rather than on reconciling a handful of nearby sales by judgement. For education, they provide a set of validated rules that can be taught alongside the conventions, and a laboratory---the backtesting engine---in which students can test their own. For regulation and for the design of automated valuation models, they show that a comparable-based method can be made as accurate as an opaque model in most of the market while remaining fully explainable, and that density-conditional rules dominate any single rule. | |
| 10 | +The results have implications for practice, for education and for regulation. For practice, they suggest that the appraiser's effort is best spent on selecting similar comparables and on estimating adjustments from the largest homogeneous pool of evidence, rather than on reconciling a handful of nearby sales by judgement. For education, they provide a set of validated rules that can be taught alongside the conventions, and a laboratory---the backtesting engine---in which students can test their own. For regulation and for the design of automated valuation models, they show that a comparable-based method can be made as accurate as an opaque model in most of the market while remaining fully explainable, and that a wide-net rule retaining the most similar sales adapts to market density on its own. | |
| 11 | 11 | |
| 12 | 12 | Three limitations bound the conclusions. We simulate rules; we do not observe appraisers, whose files may contain information (condition, renovations, listing history) that would improve on any rule, and whose judgement may also degrade it. We observe the characteristics of the assessment roll, not those of listings or inspections, so that adjustments for garages, pools, bedrooms and quality are untested and their effects remain in the residual error. And we study single-family dwellings in one province; condominiums, income properties and other markets may yield different optima, though we expect the qualitative hierarchy---adjustment and selection first, number and radius second, weighting last---to carry over. A companion paper develops the recommendation system of Section~\ref{sec:recommend} into a transparent, empirically optimised comparable-sales algorithm and integrates it into a teaching platform. |
modified
paper/sections/data.tex
+1 −1
@@ -26,7 +26,7 @@ The most consequential rule is the exclusion of sales whose price-to-assessment | ||
| 26 | 26 | |
| 27 | 27 | The sample is partitioned chronologically. Sales from January 2021 to December 2023 (\nTrain{} observations) serve to develop the adjustment grids and benchmark models. Sales in 2024 (\nVal{} observations) are the \emph{validation} targets, on which configurations and hyperparameters are chosen. Sales from January 2025 to September 2026 (\nTest{} observations) are the \emph{test} targets, on which all results reported as out of sample are computed. Every sale in the sample, whatever its period, is eligible as a comparable for any later target; what distinguishes the periods is the role of the sale as a target. |
| 28 | 28 | |
| 29 | −Table~\ref{tab:descriptives} reports descriptive statistics by period and Figure~\ref{fig:index} shows the hedonic price index by region over the sample. The period covers the end of the pandemic boom, a correction in 2022--2023 and a renewed rise in 2024--2026 that is strongly heterogeneous across regions: prices in the Montréal region rose by roughly half as much as in Quebec City or the Montérégie over 2025--2026. This heterogeneity is a feature, not a nuisance: it is precisely the environment in which the quality of time adjustments and the locality of comparables matter. | |
| 29 | +Table~\ref{tab:descriptives} reports descriptive statistics by period and Figure~\ref{fig:index} shows the hedonic price index by region over the sample. The period covers the end of the pandemic boom, a correction in 2022--2023 and a renewed rise in 2024--2026 that is strongly heterogeneous across regions: over 2025--2026 prices in the Montréal region rose by roughly a third of the increase recorded in the Quebec City region and half of that in the Montérégie. This heterogeneity is a feature, not a nuisance: it is precisely the environment in which the quality of time adjustments and the locality of comparables matter. | |
| 30 | 30 | |
| 31 | 31 | \begin{table}[H] |
| 32 | 32 | \centering |
modified
paper/sections/introduction.tex
+1 −1
@@ -9,7 +9,7 @@ This paper provides, to our knowledge, the largest and most systematic empirical | ||
| 9 | 9 | |
| 10 | 10 | Within this engine we run \nConfigs{} configurations of the sales comparison approach. A first experiment maps the \emph{error surface} $\mathrm{Error}(k, d, t)$ over the number of comparables $k \in \{1,\dots,50\}$, the search radius $d \in \{0.5,\dots,25\}$~km and the look-back window $t \in \{3,\dots,24\}$ months, for three selection rules (nearest, most physically similar, and a compromise) and two adjustment regimes (time only, hedonic grid). A second experiment is a full factorial design over the \emph{rules} of the method at three anchor configurations: four selection criteria, eight adjustment schemes (none; time only; a stylised conventional grid; a global hedonic grid; a regional grid; a locally re-estimated grid; non-linear adjustments from a gradient-boosting model; and the assessment-ratio adjustment), five weighting schemes, and two reconciliation rules. Thirteen named models, from ``median of the three nearest sales'' to a quarterly-retrained gradient-boosting model and a hybrid, are then placed in a horse race, and five hypotheses about the trade-offs between proximity, similarity, sample size, local estimation, weighting and market liquidity are tested directly. |
| 11 | 11 | |
| 12 | −Five results stand out. First, \emph{adjustments dominate}. Averaging the five nearest time-adjusted sales yields a median absolute percentage error (MdAPE) of \mdapeMtwo{}; applying a hedonic adjustment grid to the same five sales cuts it to \mdapeMseven{}, and a stylised conventional grid---half the comparable's price per square metre for living area, half the implied land value per square metre for lot size, half a percent per year of age---captures most of that gain (\mdapeMsix{}). What matters is \emph{that} one adjusts, far more than the sophistication of the grid: regional, local and non-linear refinements add little, and the locally re-estimated grid is unstable where sales are sparse. Second, \emph{similarity beats proximity}. With no physical adjustment at all, selecting the five most similar sales within a wide radius rather than the five nearest yields \mdapeMthree{}, essentially the same accuracy as adjusting the nearest ones. A nearby but dissimilar sale is a worse comparable than a more distant but similar one. Third, \emph{three comparables is too few}. On the error surface, accuracy improves monotonically from one to roughly \kOpt{} comparables when a grid is used, and the optimum increases with the density of the local market; narrow radii and three-month windows are dominated everywhere once comparables are adjusted. Fourth, \emph{weighting and reconciliation matter little}: the choice between median and mean, or between equal, distance, recency and similarity weights, moves the MdAPE by a few tenths of a point, an order of magnitude less than selection and adjustment. Fifth, \emph{the cost of transparency is small}. The best configuration of the method chosen on 2024 data reaches \mdapeMzero{} out of sample in 2025--2026, against \mdapeMelevenB{} for a gradient-boosting model retrained every quarter with access to the assessed value, and \mdapeMtwelve{} for a hybrid that combines the two. In homogeneous submarkets the gap closes. Accuracy is, above all, a function of submarket liquidity: the same method is several times more accurate where hundreds of sales occur within two kilometres in a year than where fewer than five do, and simple density-conditional rules outperform any single rule. | |
| 12 | +Five results stand out. First, \emph{adjustments dominate}. Averaging the five nearest time-adjusted sales yields a median absolute percentage error (MdAPE) of \mdapeMtwo{}; applying a hedonic adjustment grid to the same five sales cuts it to \mdapeMseven{}, and a stylised conventional grid---half the comparable's price per square metre for living area, half the implied land value per square metre for lot size, half a percent per year of age---captures most of that gain (\mdapeMsix{}). What matters is \emph{that} one adjusts, far more than the sophistication of the grid: regional, local and non-linear refinements add little, and the locally re-estimated grid is unstable where sales are sparse. Second, \emph{similarity beats proximity}. With no physical adjustment at all, selecting the five most similar sales within a wide radius rather than the five nearest yields \mdapeMthree{}, essentially the same accuracy as adjusting the nearest ones. A nearby but dissimilar sale is a worse comparable than a more distant but similar one. Third, \emph{three comparables is too few}. Without physical adjustment, accuracy improves up to about ten comparables and then deteriorates as more distant sales are added; with a grid it improves up to roughly \kOpt{} and stays flat to fifty, in sparse and dense markets alike. Three-month windows are dominated everywhere, whereas the search radius, once enough similar sales are retained, matters little for accuracy. Fourth, \emph{weighting and reconciliation matter little}: the choice between median and mean, or between equal, distance, recency and similarity weights, moves the MdAPE by a few tenths of a point, an order of magnitude less than selection and adjustment. Fifth, \emph{the cost of transparency is small}. The best configuration of the method chosen on 2024 data reaches \mdapeMzero{} out of sample in 2025--2026, against \mdapeMelevenB{} for a gradient-boosting model retrained every quarter with access to the assessed value, and \mdapeMtwelve{} for a hybrid that combines the two. In homogeneous submarkets the gap narrows to about a point. Accuracy is, above all, a function of submarket liquidity: the same method is two and a half times more accurate where hundreds of sales occur within two kilometres in a year than where fewer than five do. A wide-net rule that retains the most similar sales within a large radius adapts to this on its own, and rules tuned stratum by stratum do not improve on it. | |
| 13 | 13 | |
| 14 | 14 | The paper contributes to three literatures. It extends the small-sample studies of comparable selection and weighting \citep{colwell1983,vandell1991,gau1992,gau1994,isakson2002} to a population-scale, out-of-sample, point-in-time setting, and resolves several of their open questions with confidence intervals rather than illustrations. It speaks to the literature comparing hedonic and grid-adjustment techniques \citep{kang1991,lentz1998,pace1998} and the more recent comparisons of machine learning with traditional valuation \citep{mccluskey2013,mayer2019,bourassa2010,pace2020}, by holding the information set fixed across methods and measuring, for the first time, the price of interpretability in a transparent method tuned to the same data. And it offers the profession and its regulators a reproducible empirical basis for rules that are currently taught as conventions. We are careful about what the evidence can and cannot say: we validate the \emph{predictive accuracy of simulated professional rules} on observable characteristics, not the judgement of actual appraisers, whose files, comparables and adjustments we do not observe. |
| 15 | 15 | |
modified
paper/sections/methodology.tex
+2 −2
@@ -58,7 +58,7 @@ Thirteen named models are compared (Table~\ref{tab:models}). M1--M8 and M13 are | ||
| 58 | 58 | \caption{Models in the horse race} |
| 59 | 59 | \label{tab:models} |
| 60 | 60 | \small |
| 61 | −\begin{tabular}{ll} | |
| 61 | +\begin{tabularx}{\textwidth}{lX} | |
| 62 | 62 | \toprule |
| 63 | 63 | Model & Definition \\ |
| 64 | 64 | \midrule |
@@ -78,7 +78,7 @@ M12 & Hybrid: NNLS combination of M11b and GBM- and hedonic-adjusted comparables | ||
| 78 | 78 | M13 & Assessment ratio: $V_i \times$ median price-to-assessment ratio of the 5 nearest same-roll sales \\ |
| 79 | 79 | M0 & Best of all \nConfigs{} configurations on 2024 (coverage $\ge 97\%$), frozen \\ |
| 80 | 80 | \bottomrule |
| 81 | −\end{tabular} | |
| 81 | +\end{tabularx} | |
| 82 | 82 | \end{table} |
| 83 | 83 | |
| 84 | 84 | \subsection{Accuracy measures and inference} |
modified
paper/sections/results.tex
+19 −13
@@ -28,20 +28,22 @@ Figure~\ref{fig:surface_k} plots the out-of-sample MdAPE against the number of c | ||
| 28 | 28 | \centering |
| 29 | 29 | \caption{Error surface $\mathrm{Error}(k,d)$: out-of-sample MdAPE (\%), selection by distance, hedonic grid, twelve-month window} |
| 30 | 30 | \label{tab:surface} |
| 31 | +\small | |
| 31 | 32 | \input{tables/surface_geo_hedo} |
| 32 | 33 | \begin{tablenotes}\footnotesize |
| 33 | 34 | \item Note: MdAPE on the 2025--2026 test targets for which the configuration returns a value. Coverage falls below 90\% for radii of 1~km and less in low-density markets; see Table~\ref{tab:surface_cov} in the Appendix. |
| 34 | 35 | \end{tablenotes} |
| 35 | 36 | \end{table} |
| 36 | 37 | |
| 37 | −Three regularities emerge. First, without adjustment, accuracy improves with $k$ only up to a handful of comparables and then flattens or deteriorates: beyond the nearest few, additional sales are increasingly dissimilar and the median of their time-adjusted prices drifts away from the subject's value. Second, with the hedonic grid the picture changes qualitatively. The error falls from \mdapeKone{} with a single comparable to \mdapeKthree{} with three, \mdapeKfive{} with five, \mdapeKten{} with ten, and reaches its minimum of \mdapeKopt{} at $k=\kOpt{}$ before rising slowly (\mdapeKfifty{} at $k=50$). Adjustment converts dissimilar sales into usable evidence, so that the variance reduction from averaging more of them dominates their heterogeneity over a much wider range. Third, the search radius and the window should be wide. The three-month window is dominated by the twelve- and twenty-four-month windows at every radius once comparables are time-adjusted, and radii of 0.5--1~km are dominated by 5--25~km once they are physically adjusted. The conventional combination---three comparables, within a kilometre, within three months---yields an MdAPE of \narrowMdape{} with the hedonic grid and returns a value for only \narrowCov{} of targets; the best configuration of the surface chosen on the 2024 validation set (\bestSel{}, $k=\bestK$, $d\le\bestD$~km, $t=\bestT$ months, \bestAdj{}) yields \bestValMdape{} on validation and \bestTestMdape{} on the test set. | |
| 38 | +Three regularities emerge. First, without physical adjustment, accuracy improves with $k$ up to about ten comparables (\noneKten{} at $k=10$ for a 10~km radius and twelve-month window) and then deteriorates (\noneKfifty{} at $k=50$): beyond the nearest few, additional sales are increasingly dissimilar and the median of their time-adjusted prices drifts away from the subject's value. Second, with the hedonic grid the picture changes qualitatively. The error falls from \mdapeKone{} with a single comparable to \mdapeKthree{} with three, \mdapeKfive{} with five, \mdapeKten{} with ten, reaches \mdapeKopt{} at $k=\kOpt{}$ and stays there to $k=50$ (\mdapeKfifty{}). Adjustment converts dissimilar sales into usable evidence, so that the variance reduction from averaging more of them is no longer offset by their heterogeneity. Third, the window matters and the radius does not. The three-month window is dominated by the twelve- and twenty-four-month windows at every radius (Figure~\ref{fig:surface_dt}); but at the best $k$ the MdAPE with a 24-month window is 11.9--12.0\% for every radius from 0.5 to 25~km, because $k$ is a maximum and a wide radius only adds sales where the nearby ones run out. The conventional combination---three comparables, within a kilometre, within three months---yields an MdAPE of \narrowMdape{} with the hedonic grid and returns a value for only \narrowCov{} of targets; the best configuration of the surface chosen on the 2024 validation set (\bestSel{}, $k=\bestK$, $d\le\bestD$~km, $t=\bestT$ months, \bestAdj{}) yields \bestValMdape{} on validation and \bestTestMdape{} on the test set. | |
| 38 | 39 | |
| 39 | −Table~\ref{tab:h2} tests H2 by stratifying the $k$-curve by market density. The optimal number of comparables rises monotonically with density: where fewer than five sales occurred within 2~km in the past year, the optimum is reached with a handful of comparables and additional ones are increasingly distant; where two hundred or more occurred, the error keeps falling well beyond twenty. The threshold at which heterogeneity starts to dominate is thus not a constant of the method but a property of the local market. | |
| 40 | +Table~\ref{tab:h2} tests H2 by stratifying the $k$-curve by market density. The threshold beyond which additional comparables hurt exists only without physical adjustment: with time adjustment alone the optimum is about ten in dense markets (where the eleventh-nearest sale is already dissimilar) and larger in sparse ones (where every sale within reach is needed). With the hedonic grid there is no threshold within the range studied: the error is minimised at twenty to fifty comparables in every density stratum. H2 is therefore confirmed for the unadjusted method and rejected for the adjusted one---adjustment, not density, determines whether more comparables help. | |
| 40 | 41 | |
| 41 | 42 | \begin{table}[H] |
| 42 | 43 | \centering |
| 43 | 44 | \caption{Optimal number of comparables by market density (H2): out-of-sample MdAPE (\%)} |
| 44 | 45 | \label{tab:h2} |
| 46 | +\small | |
| 45 | 47 | \input{tables/h2} |
| 46 | 48 | \begin{tablenotes}\footnotesize |
| 47 | 49 | \item Note: selection by distance, $d\le 10$~km, twelve-month window, hedonic grid, median. Density is the number of sample sales within 2~km in the twelve months preceding the target's date. The minimum of each row is in bold. |
@@ -51,12 +53,13 @@ Table~\ref{tab:h2} tests H2 by stratifying the $k$-curve by market density. The | ||
| 51 | 53 | \subsection{Which adjustments are warranted?} |
| 52 | 54 | \label{sec:adjustments} |
| 53 | 55 | |
| 54 | −Table~\ref{tab:adjustments} and Figure~\ref{fig:adjustments} compare the eight adjustment schemes at the $(5, 5\text{ km}, 12\text{ mo})$ anchor with selection by distance, equal weights and the median. The time adjustment alone is worth \gainTime{} points of MdAPE relative to raw prices. Any physical grid is worth a further \gainGridLo{} to \gainGridHi{} points. The stylised conventional grid---which uses no estimation whatsoever---recovers most of the gain of the hedonic grid (\convMdape{} against \mdapeMseven{}), consistent with \citet{colwell1983}'s observation that the grid is a regression with pre-set coefficients that need only be roughly right. The refinements add little: the regional grid is indistinguishable from the global one, the local grid is \localVsHedo{} (\localMdape{}), and the non-linear GBM adjustments improve on the hedonic grid by \gbmVsHedo{} points. The assessment-ratio adjustment stands apart: with \mdapeMthirteen{} it is the most accurate single scheme, but it returns a value for only \covMthirteen{} of targets because it requires comparables on the same assessment roll. | |
| 56 | +Table~\ref{tab:adjustments} and Figure~\ref{fig:adjustments} compare the eight adjustment schemes at the $(5, 5\text{ km}, 12\text{ mo})$ anchor with selection by distance, equal weights and the median. The time adjustment alone is worth only \gainTime{} points of MdAPE relative to raw prices with a twelve-month window and \gainTimeLong{} points with a 24-month window: comparables are recent, and a monthly index estimated in real time is itself noisy. Any physical grid is worth a further \gainGridLo{} to \gainGridHi{} points. The stylised conventional grid---which uses no estimation whatsoever---recovers most of the gain of the hedonic grid (\convMdape{} against \mdapeMseven{}), consistent with \citet{colwell1983}'s observation that the grid is a regression with pre-set coefficients that need only be roughly right. The refinements add little: the regional grid is indistinguishable from the global one, the local grid is \localVsHedo{} (\localMdape{}), and the non-linear GBM adjustments improve on the hedonic grid by \gbmVsHedo{} points. The assessment-ratio adjustment stands apart: with \mdapeMthirteen{} it is the most accurate single scheme, but it returns a value for only \covMthirteen{} of targets because it requires comparables on the same assessment roll. | |
| 55 | 57 | |
| 56 | 58 | \begin{table}[H] |
| 57 | 59 | \centering |
| 58 | 60 | \caption{Adjustment schemes at the $(5,\,5\text{ km},\,12\text{ months})$ anchor} |
| 59 | 61 | \label{tab:adjustments} |
| 62 | +\small | |
| 60 | 63 | \input{tables/adjustments} |
| 61 | 64 | \begin{tablenotes}\footnotesize |
| 62 | 65 | \item Note: five nearest sales, equal weights, median. MdAPE, MAPE, bias and the share within $\pm10\%$ in per cent; coverage is the share of targets for which the scheme returns a value. |
@@ -76,6 +79,7 @@ Table~\ref{tab:h3} examines H3 by crossing the adjustment schemes with market de | ||
| 76 | 79 | \centering |
| 77 | 80 | \caption{Adjustment schemes by market density (H3): out-of-sample MdAPE (\%)} |
| 78 | 81 | \label{tab:h3} |
| 82 | +\small | |
| 79 | 83 | \input{tables/h3} |
| 80 | 84 | \begin{tablenotes}\footnotesize |
| 81 | 85 | \item Note: selection by distance, equal weights, median. Upper panel: $(5, 5\text{ km}, 12\text{ mo})$; lower panel: $(3, 2\text{ km}, 6\text{ mo})$. |
@@ -97,7 +101,7 @@ The estimated hedonic grid itself is of independent interest (Table~\ref{tab:gri | ||
| 97 | 101 | \subsection{How should comparables be selected? (H1)} |
| 98 | 102 | \label{sec:selection} |
| 99 | 103 | |
| 100 | −Table~\ref{tab:selection} compares the four selection criteria at the $(5,5,12)$ anchor with the hedonic grid. Selecting by physical similarity rather than by distance lowers the MdAPE by \gainSelHedo{} points when comparables are adjusted, and the compromise criterion is close to the similarity criterion. The ``least adjusted'' criterion, which embodies the professional advice to prefer comparables needing few adjustments, performs like the similarity criterion for which it is a proxy. | |
| 104 | +Table~\ref{tab:selection} compares the four selection criteria at the $(5,5,12)$ anchor with the hedonic grid. Selecting by physical similarity rather than by distance lowers the MdAPE by \gainSelHedo{} points when comparables are adjusted, and the compromise criterion, which uses both, is the best of the four. The ``least adjusted'' criterion, which embodies the professional advice to prefer comparables needing few adjustments, performs like the similarity criterion for which it is a proxy. | |
| 101 | 105 | |
| 102 | 106 | \begin{table}[H] |
| 103 | 107 | \centering |
@@ -117,6 +121,7 @@ Table~\ref{tab:weighting} reports the ten weighting--reconciliation combinations | ||
| 117 | 121 | \centering |
| 118 | 122 | \caption{Weighting and reconciliation at the $(5,\,5\text{ km},\,12\text{ months})$ anchor, hedonic grid} |
| 119 | 123 | \label{tab:weighting} |
| 124 | +\small | |
| 120 | 125 | \input{tables/weighting} |
| 121 | 126 | \end{table} |
| 122 | 127 | |
@@ -124,6 +129,7 @@ Table~\ref{tab:weighting} reports the ten weighting--reconciliation combinations | ||
| 124 | 129 | \centering |
| 125 | 130 | \caption{Weighting by market density (H4): out-of-sample MdAPE (\%)} |
| 126 | 131 | \label{tab:h4} |
| 132 | +\footnotesize | |
| 127 | 133 | \input{tables/h4} |
| 128 | 134 | \end{table} |
| 129 | 135 | |
@@ -140,14 +146,13 @@ Table~\ref{tab:weighting} reports the ten weighting--reconciliation combinations | ||
| 140 | 146 | \subsection{The horse race} |
| 141 | 147 | \label{sec:horserace} |
| 142 | 148 | |
| 143 | −Table~\ref{tab:competition} and Figure~\ref{fig:competition} report the thirteen named models and the empirically optimised configurations. The ordering is informative at every level. The traditional practices M1--M5---a few nearest sales, time-adjusted, weighted in one way or another---cluster at \mdapeMoneRange{} of MdAPE, with fewer than a third of estimates within $\pm10\%$ of the price. Adding a grid (M6, M7) or selecting by similarity (M3) brings the error into the \mdapeGridRange{} range. The assessment ratio (M13) reaches \mdapeMthirteen{} on the targets it covers. The best single transparent configuration frozen on 2024 (M0: \mZeroDesc) reaches \mdapeMzero{} with \pTenMzero{} of estimates within $\pm10\%$, and the optimised reconciliation M9 \mdapeMnine{}. Among the external benchmarks, the direct hedonic model M10 is the least accurate (\mdapeMten{}): a global model with municipality effects cannot match the local information of comparables. The gradient-boosting model without the assessed value (M11a, \mdapeMelevenA{}) does no better than a well-configured comparables method; with the assessed value (M11b) it reaches \mdapeMelevenB{} and \pTenMelevenB{} within $\pm10\%$, and the hybrid M12 \mdapeMtwelve{}. | |
| 149 | +Table~\ref{tab:competition} and Figure~\ref{fig:competition} report the thirteen named models and the empirically optimised configurations. The ordering is informative at every level. The traditional practices M1--M5---a few nearest sales, time-adjusted, weighted in one way or another---cluster at \mdapeMoneRange{} of MdAPE, with fewer than a third of estimates within $\pm10\%$ of the price. Adding a grid (M6, M7) or selecting by similarity (M3) brings the error into the \mdapeGridRange{} range. The assessment ratio (M13) reaches \mdapeMthirteen{} on the targets it covers. The best single transparent configuration frozen on 2024 (M0: \mZeroDesc) reaches \mdapeMzero{} with \pTenMzero{} of estimates within $\pm10\%$, and the optimised reconciliation M9 \mdapeMnine{}. Among the external benchmarks, the direct hedonic model M10 is the least accurate (\mdapeMten{}): a global model with municipality effects cannot match the local information of comparables. The gradient-boosting model without the assessed value (M11a, \mdapeMelevenA{}) is only \transparencyCostNoRole{} points better than the best frozen comparables configuration; with the assessed value (M11b) it reaches \mdapeMelevenB{} and \pTenMelevenB{} within $\pm10\%$, and the hybrid M12 \mdapeMtwelve{}. | |
| 144 | 150 | |
| 145 | 151 | \begin{table}[H] |
| 146 | 152 | \centering |
| 147 | 153 | \caption{Horse race: out-of-sample accuracy, 2025--2026} |
| 148 | 154 | \label{tab:competition} |
| 149 | −\footnotesize | |
| 150 | −\input{tables/competition} | |
| 155 | +\resizebox{\textwidth}{!}{\input{tables/competition}} | |
| 151 | 156 | \begin{tablenotes}\footnotesize |
| 152 | 157 | \item Note: MdAPE, MAPE, median signed error and the shares within $\pm5$, $\pm10$ and $\pm20\%$ in per cent, on the test targets for which the model returns a value; coverage is the share of such targets. The validation column gives the MdAPE on the 2024 targets. Weights of M9 and M12 and the configuration of M0 are chosen on 2024 only. |
| 153 | 158 | \end{tablenotes} |
@@ -178,12 +183,13 @@ Two findings deserve emphasis. The first is the \emph{cost of transparency}: \tr | ||
| 178 | 183 | \subsection{Where does the method hold, and where does it fail?} |
| 179 | 184 | \label{sec:strata} |
| 180 | 185 | |
| 181 | −Table~\ref{tab:density} and Figure~\ref{fig:density} report accuracy by market density for the main models. The dependence is steep and common to all methods: the MdAPE of the hedonic-grid method M7 is \densHighMseven{} where two hundred or more sales occurred within 2~km in the past year and \densLowMseven{} where fewer than five did. The gap between the best transparent method and the best opaque one is widest in the sparsest markets, where the tree model's ability to borrow strength from a wider area is most valuable, and narrowest in the densest ones. Tables~\ref{tab:regions}--\ref{tab:price} in the Appendix report the same comparison by region, price quintile, age and physical link; accuracy is lowest in the Montréal region and for the highest price quintile, where the unobserved characteristics (quality, lot features, views) carry the largest share of value. | |
| 186 | +Table~\ref{tab:density} and Figure~\ref{fig:density} report accuracy by market density for the main models. The dependence is steep and common to all methods: the MdAPE of the hedonic-grid method M7 is \densHighMseven{} where two hundred or more sales occurred within 2~km in the past year and \densLowMseven{} where fewer than five did. The gap between the best transparent method and the best opaque one is widest in the sparsest markets, where the tree model's ability to borrow strength from a wider area is most valuable, and narrowest in the densest ones. Tables~\ref{tab:regions}--\ref{tab:price} in the Appendix report the same comparison by region, price quintile, age and physical link; accuracy is highest in the dense suburban regions (Laval, Outaouais, Montérégie) and lowest in the remote regions (Gaspésie, Nord-du-Québec, Côte-Nord), in the lowest price quintile (\prixQoneMseven{} for M7, against \prixQfourMseven{} in the fourth), for dwellings older than seventy years and for integrated dwellings---the segments where condition and unobserved characteristics carry the largest share of value. | |
| 182 | 187 | |
| 183 | 188 | \begin{table}[H] |
| 184 | 189 | \centering |
| 185 | 190 | \caption{Out-of-sample MdAPE (\%) by market density} |
| 186 | 191 | \label{tab:density} |
| 192 | +\footnotesize | |
| 187 | 193 | \input{tables/density} |
| 188 | 194 | \end{table} |
| 189 | 195 | |
@@ -200,6 +206,7 @@ Table~\ref{tab:h5} addresses H5 by splitting the test targets into terciles of s | ||
| 200 | 206 | \centering |
| 201 | 207 | \caption{Accuracy by submarket heterogeneity (H5): out-of-sample MdAPE (\%)} |
| 202 | 208 | \label{tab:h5} |
| 209 | +\footnotesize | |
| 203 | 210 | \input{tables/h5} |
| 204 | 211 | \begin{tablenotes}\footnotesize |
| 205 | 212 | \item Note: terciles of the standard deviation of the log adjusted indications of the ten nearest sales within 10~km and 24 months (hedonic grid), computed on the test targets. |
@@ -209,24 +216,23 @@ Table~\ref{tab:h5} addresses H5 by splitting the test targets into terciles of s | ||
| 209 | 216 | \subsection{Value intervals} |
| 210 | 217 | \label{sec:intervals} |
| 211 | 218 | |
| 212 | −The dispersion of the adjusted indications provides an interval of value. Table~\ref{tab:intervals} reports, for the time-only, hedonic and GBM adjustments at two anchors, the coverage of the interval $\hat P \exp(\pm z\,\hat\sigma)$ with $z=1.28$ (nominal 80\% under normality) and with $z$ calibrated on the validation targets to achieve 80\% coverage, together with the median width of the calibrated interval. The nominal intervals under-cover: the dispersion of five or ten adjusted sales understates the uncertainty of the estimate, because the comparables share unobserved characteristics with each other but not with the subject. Calibrated on 2024, the intervals achieve close to their target coverage in 2025--2026 at a median width of \ivWidth{} of value, which gives the method a usable, honest measure of its own uncertainty. | |
| 219 | +The dispersion of the adjusted indications provides an interval of value. Table~\ref{tab:intervals} reports, for the time-only, hedonic and GBM adjustments at two anchors, the coverage of the interval $\hat P \exp(\pm z\,\hat\sigma)$ with $z=1.28$ (nominal 80\% under normality) and with $z$ calibrated on the validation targets to achieve 80\% coverage, together with the median width of the calibrated interval. The nominal intervals under-cover (67--78\% for a nominal 80\%): the dispersion of five or ten adjusted sales understates the uncertainty of the estimate, because the comparables share unobserved characteristics with each other but not with the subject. Calibrated on 2024, the intervals achieve their target coverage in 2025--2026 to within half a point, but at a median width of \ivWidth{} of value: an honest 80\% interval around a comparables-based estimate spans roughly $\pm$30\%. The dispersion of the comparables is a valid but coarse measure of uncertainty, and the breadth of the calibrated interval is itself a finding about the precision the method can claim. | |
| 213 | 220 | |
| 214 | 221 | \begin{table}[H] |
| 215 | 222 | \centering |
| 216 | 223 | \caption{Coverage of value intervals derived from the dispersion of adjusted indications} |
| 217 | 224 | \label{tab:intervals} |
| 218 | −\input{tables/intervals} | |
| 225 | +\resizebox{\textwidth}{!}{\input{tables/intervals}} | |
| 219 | 226 | \end{table} |
| 220 | 227 | |
| 221 | 228 | \subsection{Towards an empirical comparable-recommendation system} |
| 222 | 229 | \label{sec:recommend} |
| 223 | 230 | |
| 224 | −The preceding results suggest that the best rule is conditional on the market. Table~\ref{tab:cond} implements the simplest version of a recommendation system: for each density stratum, the configuration (among all \nConfigs{} that return a value for at least 95\% of the stratum's validation targets) with the lowest MdAPE on 2024 is selected and applied to the 2025--2026 targets of that stratum. The recommended rules differ systematically: sparse markets call for the most similar sales over a wide radius and a long window, dense markets for more comparables over a shorter radius. Together, the density-conditional rules achieve an out-of-sample MdAPE of \condMdape{} with \condPten{} of estimates within $\pm10\%$ and \condCov{} coverage, against \mdapeMzero{} for the best single rule. | |
| 231 | +The steep dependence on density suggests that the best rule might be conditional on the market. Table~\ref{tab:cond} implements the simplest version of a recommendation system: for each density stratum, the configuration (among all \nConfigs{} that return a value for at least 95\% of the stratum's validation targets) with the lowest MdAPE on 2024 is selected and applied to the 2025--2026 targets of that stratum. The selected rules do differ---the assessment-ratio adjustment is chosen in the two densest strata, the hedonic grid elsewhere, and the compromise or least-adjusted selection everywhere---but together they achieve an out-of-sample MdAPE of \condMdape{} with \condCov{} coverage, no better than the \mdapeMzero{} of the best single rule at full coverage. The reason is that the best single rule is already self-adapting: retaining the thirty most similar sales within 25~km and 24 months uses nearby sales where they exist and reaches further only where they do not. A recommendation system therefore adds value through the choice of adjustment (assessment ratio where same-roll comparables are plentiful) rather than through stratum-specific counts and radii. | |
| 225 | 232 | |
| 226 | 233 | \begin{table}[H] |
| 227 | 234 | \centering |
| 228 | 235 | \caption{Density-conditional rules chosen on 2024 and evaluated on 2025--2026} |
| 229 | 236 | \label{tab:cond} |
| 230 | −\footnotesize | |
| 231 | −\input{tables/cond_rules} | |
| 237 | +\resizebox{\textwidth}{!}{\input{tables/cond_rules}} | |
| 232 | 238 | \end{table} |
modified
paper/sections/robustness.tex
+5 −5
@@ -5,7 +5,7 @@ | ||
| 5 | 5 | |
| 6 | 6 | \subsection{Stability over time} |
| 7 | 7 | |
| 8 | −Table~\ref{tab:stability} reports the MdAPE and bias of the main models by quarter of the test period. The rankings are stable quarter by quarter, and the validation-period (2024) and test-period (2025--2026) MdAPEs of every configuration in Tables~\ref{tab:adjustments}--\ref{tab:competition} differ by less than a point, which indicates that the rules selected on 2024 did not overfit it. All methods display a common seasonal bias: estimates are too low in the first quarter and too high in the third. This is the signature of the point-in-time constraint---every method works at the level of the previous month, and Quebec prices rise into the spring and soften after the summer---and of the fact that the price level of the valuation month is not knowable on the valuation date. It is a property of the valuation problem, not of any method, and a seasonal adjustment estimated on prior years would remove most of it. | |
| 8 | +Table~\ref{tab:stability} reports the MdAPE and bias of the main models by quarter of the test period. The rankings are stable quarter by quarter, and the validation-period (2024) and test-period (2025--2026) MdAPEs of every configuration in Tables~\ref{tab:adjustments}--\ref{tab:competition} differ by about a point in the same direction, which indicates that the rules selected on 2024 did not overfit it. The comparable-based methods display a seasonal bias: estimates are too low in the first quarter (\biasQoneMseven{} for M7) and too high in the third (\biasQthreeMseven{}). This is the signature of the point-in-time constraint---every method works at the level of the previous month, and Quebec prices rise into the spring and soften after the summer---and of the fact that the price level of the valuation month is not knowable on the valuation date. The gradient-boosting benchmark, which includes the month of sale as a feature, absorbs most of this seasonality; a seasonal adjustment estimated on prior years would do the same for the comparables method. | |
| 9 | 9 | |
| 10 | 10 | \begin{table}[H] |
| 11 | 11 | \centering |
@@ -21,16 +21,16 @@ Configurations with narrow radii or short windows abstain on a substantial share | ||
| 21 | 21 | |
| 22 | 22 | \subsection{Exclusion rules} |
| 23 | 23 | |
| 24 | −The exclusion of extreme price-to-assessment ratios (rule R8) is the only rule that removes a non-trivial share of sales on a criterion related to price. Including the excluded sales as targets (but not as comparables, as an appraiser would not use them) raises the MdAPE of every method by a similar amount and leaves the rankings unchanged; the excluded sales are, by construction, those on which no method based on market evidence can succeed. Tightening the rule to $[0.5, 2]$ lowers all MdAPEs by a few tenths of a point without affecting any comparison. | |
| 24 | +The exclusion of extreme price-to-assessment ratios (rule R8) is the only rule that removes a non-trivial share of sales on a criterion related to price. The excluded sales are, by construction, those on which no method based on market evidence can succeed, and they are excluded from the comparable pool as an appraiser would exclude them; their inclusion as targets would raise the error of every method by a similar amount without affecting the comparisons, which are all paired on the same targets. A sensitivity analysis to the bounds of R8 and to the flip rule R9 is left for the next version of this paper. | |
| 25 | 25 | |
| 26 | 26 | \subsection{Alternative accuracy measures} |
| 27 | 27 | |
| 28 | −The MdAPE is our headline measure because the distribution of valuation errors is heavy-tailed and the median is the appraiser's natural loss. Table~\ref{tab:competition} shows that the MAPE and the shares within $\pm5$, $\pm10$ and $\pm20\%$ rank the models identically; the paired bootstrap on MAPE differences in Table~\ref{tab:pairs} yields the same conclusions as on MdAPE differences. Measuring errors in logs rather than in percentages, or symmetrising the APE by dividing by the average of estimate and price, changes no ranking. | |
| 28 | +The MdAPE is our headline measure because the distribution of valuation errors is heavy-tailed and the median is the appraiser's natural loss. Table~\ref{tab:competition} shows that the MAPE and the shares within $\pm5$, $\pm10$ and $\pm20\%$ rank the models identically; the paired bootstrap on MAPE differences in Table~\ref{tab:pairs} yields the same conclusions as on MdAPE differences. The bias column shows that no comparable-based method is materially biased out of sample. | |
| 29 | 29 | |
| 30 | 30 | \subsection{Index construction} |
| 31 | 31 | |
| 32 | −The point-in-time index uses an expanding window of all prior sales and municipality fixed effects. A 36-month rolling window produces an index that is noisier in small regions and leaves the comparable-based results unchanged to the first decimal, because comparables are at most 24 months old and their time adjustments are small. Omitting the municipality fixed effects biases the index downward in 2025--2026, when the composition of sales shifted towards less expensive municipalities, and produces a negative bias in the global models (M10, M11) that the comparable-based methods, which use only recent local sales, do not share. | |
| 32 | +The point-in-time index uses an expanding window of all prior sales and municipality fixed effects. Because comparables are at most 24 months old and the time adjustment contributes only \gainTime{}--\gainTimeLong{} points of accuracy (Section~\ref{sec:adjustments}), the comparable-based results are insensitive to the details of the index. The global benchmarks are more exposed: their level in 2025--2026 is carried entirely by the index from the last training quarter to the valuation month, and we verified that an index without municipality fixed effects, which is contaminated by the shift of sales towards less expensive municipalities, lowers their level. | |
| 33 | 33 | |
| 34 | 34 | \subsection{Benchmark specification} |
| 35 | 35 | |
| 36 | −The gradient-boosting benchmarks are trained with an L1 objective so that they estimate the conditional median, which is the quantity the MdAPE rewards; the same models trained with a squared-error objective have a median bias of about $-5\%$, because the distribution of log prices conditional on characteristics is left-skewed, and a correspondingly higher MdAPE. The quarterly retraining and the month-of-sale feature matter for the level of the benchmarks over a 21-month test period but not for the rankings. The hybrid weights of M12 and the reconciliation weights of M9 are convex combinations fitted on 2024 and applied unchanged; refitting them on each quarter of the test period, which a deployed system would do, improves M12 by a few tenths of a point. | |
| 36 | +The gradient-boosting benchmarks are trained with an L1 objective so that they estimate the conditional median, which is the quantity the MdAPE rewards; the same models trained with a squared-error objective have a median bias of about $-5\%$ in-sample and out of sample, because the distribution of log prices conditional on characteristics is left-skewed, and a correspondingly higher MdAPE; the direct hedonic model M10, estimated by least squares, is for the same reason recentred on the median of its validation residuals. The number of trees chosen by early stopping on the last 10\% of the training window is floored at 300 because the final, partial months of the sample make that slice unreliable. The hybrid weights of M12 and the reconciliation weights of M9 are convex combinations fitted on 2024 and applied unchanged; M9 places most of its weight on the assessment-ratio and GBM-adjusted indications, and M12 over 90\% of its weight on M11b. | |
modified
paper/tables/adjustments.tex
+8 −8
@@ -2,13 +2,13 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Adjustment & MdAPE 2024 & MdAPE 2025--26 & MAPE & Bias & Within $\pm10\%$ & Coverage \\ |
| 4 | 4 | \midrule |
| 5 | −none & 18.6 & 18.2 & 30.8 & -4.1 & 30.2 & 99.7 \\ | |
| 6 | −time only & 18.3 & 18.2 & 31.7 & -0.7 & 29.7 & 99.7 \\ | |
| 7 | −conventional grid & 14.5 & 13.8 & 26.8 & 0.6 & 39.1 & 99.7 \\ | |
| 8 | −hedonic grid & 14.0 & 13.5 & 25.4 & -0.7 & 39.4 & 99.7 \\ | |
| 9 | −regional grid & 14.2 & 13.3 & 25.4 & -0.4 & 39.4 & 99.7 \\ | |
| 10 | −local grid & 15.1 & 14.1 & 26.3 & -0.2 & 37.0 & 99.7 \\ | |
| 11 | −GBM adjustments & 14.0 & 12.4 & 24.9 & -0.9 & 42.5 & 99.7 \\ | |
| 12 | −assessment ratio & 12.0 & 11.6 & 22.8 & 0.2 & 40.4 & 89.7 \\ | |
| 5 | +none & 18.9 & 17.9 & 30.4 & -4.2 & 31.0 & 99.8 \\ | |
| 6 | +time only & 18.8 & 17.6 & 31.1 & -0.8 & 31.7 & 99.8 \\ | |
| 7 | +conventional grid & 14.1 & 13.4 & 26.4 & 0.7 & 39.7 & 99.8 \\ | |
| 8 | +hedonic grid & 13.8 & 13.0 & 25.1 & -0.5 & 40.4 & 99.8 \\ | |
| 9 | +regional grid & 13.8 & 13.1 & 25.2 & -0.5 & 40.4 & 99.8 \\ | |
| 10 | +local grid & 14.3 & 13.5 & 25.7 & -0.4 & 39.4 & 99.8 \\ | |
| 11 | +GBM adjustments & 12.7 & 11.9 & 24.1 & -0.6 & 43.6 & 99.8 \\ | |
| 12 | +assessment ratio & 12.0 & 11.5 & 22.5 & -0.1 & 40.6 & 90.3 \\ | |
| 13 | 13 | \bottomrule |
| 14 | 14 | \end{tabular} |
modified
paper/tables/competition.tex
+16 −16
@@ -2,21 +2,21 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Model & MdAPE 2024 & MdAPE 2025--26 & MAPE & Bias & $\pm5\%$ & $\pm10\%$ & $\pm20\%$ & Coverage \\ |
| 4 | 4 | \midrule |
| 5 | −M12 hybrid comparables + GBM & 12.6 & 10.7 & 19.9 & -4.1 & 26.0 & 47.8 & 76.2 & 100.0 \\ | |
| 6 | −M11b gradient boosting, with assessed value & 13.1 & 10.7 & 19.9 & -4.7 & 24.4 & 47.4 & 75.5 & 100.0 \\ | |
| 7 | −M9 optimised reconciliation & 11.6 & 11.0 & 22.2 & -0.8 & 24.5 & 46.1 & 72.1 & 99.7 \\ | |
| 8 | −M0 meilleure configuration empirique (best configuration, chosen on 2024) & 11.6 & 11.3 & 24.1 & -0.1 & 23.1 & 45.0 & 70.2 & 99.0 \\ | |
| 9 | −M13 assessment ratio & 12.0 & 11.6 & 22.8 & 0.2 & 22.2 & 40.4 & 63.4 & 89.8 \\ | |
| 10 | −M8b GBM adjustments & 14.0 & 12.4 & 24.9 & -0.9 & 23.4 & 42.5 & 67.0 & 99.7 \\ | |
| 11 | −M3 5 most similar, time only & 14.6 & 12.9 & 27.0 & -0.2 & 21.2 & 40.9 & 64.4 & 99.7 \\ | |
| 12 | −M11a gradient boosting, no assessed value & 14.1 & 13.2 & 23.8 & -5.7 & 19.0 & 38.4 & 67.4 & 100.0 \\ | |
| 13 | −M7 hedonic grid & 14.0 & 13.5 & 25.4 & -0.7 & 21.7 & 39.4 & 66.1 & 99.7 \\ | |
| 14 | −M6 conventional grid & 14.5 & 13.8 & 26.8 & 0.6 & 20.5 & 39.0 & 64.3 & 99.7 \\ | |
| 15 | −M8a local grid & 15.1 & 14.1 & 26.2 & -0.2 & 19.9 & 37.0 & 64.1 & 99.7 \\ | |
| 16 | −M10 global hedonic model & 16.1 & 15.1 & 25.2 & -5.2 & 17.5 & 34.3 & 63.9 & 100.0 \\ | |
| 17 | −M4 5 nearest, distance-weighted & 19.3 & 18.6 & 32.0 & -0.3 & 14.9 & 29.6 & 53.0 & 99.7 \\ | |
| 18 | −M1 median of 3 nearest, time only & 20.2 & 18.8 & 33.8 & -0.6 & 15.2 & 28.4 & 50.3 & 96.5 \\ | |
| 19 | −M2 mean of 5 nearest, time only & 19.4 & 19.0 & 32.4 & -0.3 & 14.2 & 28.6 & 52.3 & 99.7 \\ | |
| 20 | −M5 5 nearest, recency-weighted & 19.3 & 19.2 & 33.0 & -0.2 & 14.2 & 27.7 & 51.1 & 99.7 \\ | |
| 5 | +M12 hybrid comparables + GBM & 9.7 & 8.9 & 19.9 & -0.1 & 30.7 & 54.4 & 78.8 & 100.0 \\ | |
| 6 | +M11b gradient boosting, with assessed value & 9.8 & 9.0 & 19.9 & 0.1 & 30.5 & 54.1 & 78.7 & 100.0 \\ | |
| 7 | +M9 optimised reconciliation & 11.3 & 10.6 & 21.8 & -0.8 & 26.2 & 47.6 & 73.0 & 99.8 \\ | |
| 8 | +M11a gradient boosting, no assessed value & 11.5 & 10.7 & 23.1 & -0.4 & 26.1 & 47.5 & 72.2 & 100.0 \\ | |
| 9 | +M0 best configuration, chosen on 2024 & 11.9 & 11.1 & 23.6 & 0.3 & 25.1 & 46.1 & 71.5 & 100.0 \\ | |
| 10 | +M13 assessment ratio & 12.0 & 11.5 & 22.5 & -0.1 & 22.1 & 40.6 & 63.9 & 90.3 \\ | |
| 11 | +M8b GBM adjustments & 12.7 & 11.9 & 24.1 & -0.6 & 23.9 & 43.6 & 68.8 & 99.8 \\ | |
| 12 | +M3 5 most similar, time only & 13.9 & 13.0 & 26.2 & -0.2 & 22.1 & 40.8 & 65.3 & 99.8 \\ | |
| 13 | +M7 hedonic grid & 13.8 & 13.0 & 25.1 & -0.5 & 21.7 & 40.4 & 66.4 & 99.8 \\ | |
| 14 | +M6 conventional grid & 14.1 & 13.4 & 26.4 & 0.8 & 21.3 & 39.7 & 65.0 & 99.8 \\ | |
| 15 | +M8a local grid & 14.3 & 13.5 & 25.7 & -0.4 & 21.2 & 39.4 & 64.9 & 99.8 \\ | |
| 16 | +M10 global hedonic model & 14.7 & 13.8 & 25.9 & 0.4 & 19.8 & 37.9 & 65.0 & 100.0 \\ | |
| 17 | +M4 5 nearest, distance-weighted & 19.1 & 17.9 & 31.4 & -0.2 & 16.0 & 30.7 & 54.3 & 99.8 \\ | |
| 18 | +M2 mean of 5 nearest, time only & 19.3 & 18.1 & 31.8 & -0.1 & 15.7 & 30.3 & 53.7 & 99.8 \\ | |
| 19 | +M5 5 nearest, recency-weighted & 19.7 & 18.5 & 32.3 & -0.2 & 15.4 & 29.8 & 52.8 & 99.8 \\ | |
| 20 | +M1 median of 3 nearest, time only & 20.3 & 19.1 & 32.8 & -0.8 & 15.2 & 28.5 & 49.8 & 96.6 \\ | |
| 21 | 21 | \bottomrule |
| 22 | 22 | \end{tabular} |
modified
paper/tables/cond_rules.tex
+5 −5
@@ -2,10 +2,10 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Density & Rule & MdAPE 2024 & MdAPE 2025--26 & Coverage 2024 & $n$ test \\ |
| 4 | 4 | \midrule |
| 5 | −$<5$ & nearest, $k=5$, $\le 10$ km, 24 mo, hedonic grid, equal weights, median & 21.9 & 29.8 & 99.2 & 212 \\ | |
| 6 | −5--19 & nearest, $k=10$, $\le 10$ km, 24 mo, regional grid, 1/distance weights, median & 15.4 & 19.1 & 100.0 & 338 \\ | |
| 7 | −20--49 & nearest, $k=10$, $\le 10$ km, 24 mo, assessment ratio, equal weights, median & 12.3 & 13.5 & 95.7 & 322 \\ | |
| 8 | −50--199 & least adjusted, $k=10$, $\le 10$ km, 24 mo, assessment ratio, equal weights, median & 9.3 & 10.1 & 96.7 & 1,123 \\ | |
| 9 | −$\ge 200$ & compromise, $k=7$, $\le 0.5$ km, 12 mo, hedonic grid, equal weights, median & 9.0 & 9.6 & 100.0 & 668 \\ | |
| 5 | +$<5$ & compromise, $k=10$, $\le 10$ km, 24 mo, hedonic grid, equal w., mean & 24.7 & 23.7 & 99.8 & 9,426 \\ | |
| 6 | +5--19 & compromise, $k=30$, $\le 10$ km, 24 mo, hedonic grid, equal w., median & 18.3 & 17.8 & 100.0 & 15,149 \\ | |
| 7 | +20--49 & compromise, $k=30$, $\le 10$ km, 24 mo, hedonic grid, equal w., median & 13.9 & 13.3 & 100.0 & 15,553 \\ | |
| 8 | +50--199 & compromise, $k=10$, $\le 10$ km, 24 mo, assessment ratio, equal w., median & 9.8 & 9.7 & 96.5 & 56,442 \\ | |
| 9 | +$\ge 200$ & least adjusted, $k=10$, $\le 10$ km, 24 mo, assessment ratio, equal w., median & 8.9 & 8.8 & 95.8 & 27,989 \\ | |
| 10 | 10 | \bottomrule |
| 11 | 11 | \end{tabular} |
modified
paper/tables/density.tex
+5 −5
@@ -2,10 +2,10 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Density & $n$ & M2 & M7 & M8a & M13 & M0 & M10 & M11b & M12 \\ |
| 4 | 4 | \midrule |
| 5 | −$<5$ & 203 & 40.0 & 29.5 & 29.2 & 20.9 & 29.2 & 26.6 & 18.4 & 20.3 \\ | |
| 6 | −5--19 & 338 & 28.9 & 20.0 & 21.0 & 16.3 & 19.1 & 19.6 & 15.4 & 15.0 \\ | |
| 7 | −20--49 & 322 & 21.9 & 16.2 & 17.6 & 12.7 & 14.1 & 16.8 & 11.9 & 11.9 \\ | |
| 8 | −50--199 & 1,123 & 16.6 & 11.3 & 11.7 & 9.9 & 9.5 & 13.7 & 9.9 & 9.5 \\ | |
| 9 | −$\ge 200$ & 668 & 14.1 & 10.8 & 11.9 & 9.8 & 9.5 & 12.0 & 9.1 & 8.9 \\ | |
| 5 | +$<5$ & 9,177 & 32.9 & 25.3 & 25.9 & 19.6 & 22.9 & 23.6 & 15.9 & 16.0 \\ | |
| 6 | +5--19 & 15,149 & 27.7 & 20.4 & 20.8 & 16.5 & 17.8 & 18.9 & 13.0 & 13.0 \\ | |
| 7 | +20--49 & 15,553 & 22.2 & 15.4 & 15.9 & 13.4 & 13.3 & 15.1 & 10.4 & 10.4 \\ | |
| 8 | +50--199 & 56,442 & 16.1 & 11.5 & 11.9 & 10.4 & 9.8 & 12.9 & 8.0 & 8.0 \\ | |
| 9 | +$\ge 200$ & 27,989 & 14.0 & 10.2 & 10.7 & 9.3 & 8.5 & 11.3 & 7.4 & 7.3 \\ | |
| 10 | 10 | \bottomrule |
| 11 | 11 | \end{tabular} |
modified
paper/tables/density_dist.tex
+5 −5
@@ -2,10 +2,10 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Density (sales within 2 km, 12 months) & Test targets & Share (\%) \\ |
| 4 | 4 | \midrule |
| 5 | −$<5$ & 212 & 8.0 \\ | |
| 6 | −5--19 & 338 & 12.7 \\ | |
| 7 | −20--49 & 322 & 12.1 \\ | |
| 8 | −50--199 & 1,123 & 42.2 \\ | |
| 9 | −$\ge 200$ & 668 & 25.1 \\ | |
| 5 | +$<5$ & 9,426 & 7.6 \\ | |
| 6 | +5--19 & 15,149 & 12.2 \\ | |
| 7 | +20--49 & 15,553 & 12.5 \\ | |
| 8 | +50--199 & 56,442 & 45.3 \\ | |
| 9 | +$\ge 200$ & 27,989 & 22.5 \\ | |
| 10 | 10 | \bottomrule |
| 11 | 11 | \end{tabular} |
modified
paper/tables/descriptives.tex
+10 −10
@@ -2,15 +2,15 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Statistic & Development 2021--2023 & Validation 2024 & Test 2025--2026 \\ |
| 4 | 4 | \midrule |
| 5 | −Sales & 0 & 0 & 0 \\ | |
| 6 | −Median price (\$) & 0 & 0 & 0 \\ | |
| 7 | −Mean price (\$) & 0 & 0 & 0 \\ | |
| 8 | −Median living area (m$^2$) & 0.0 & 0.0 & 0.0 \\ | |
| 9 | −Median lot area (m$^2$) & 0 & 0 & 0 \\ | |
| 10 | −Median age (years) & 0.0 & 0.0 & 0.0 \\ | |
| 11 | −Detached (\%) & 0.0 & 0.0 & 0.0 \\ | |
| 12 | −Median price/assessment ratio & 0.00 & 0.00 & 0.00 \\ | |
| 13 | −Median sales within 2 km, 12 months & -- & -- & -- \\ | |
| 14 | −Median candidate pool (25 km, 24 months) & -- & -- & -- \\ | |
| 5 | +Sales & 201,642 & 64,795 & 124,559 \\ | |
| 6 | +Median price (\$) & 350,000 & 415,000 & 470,000 \\ | |
| 7 | +Mean price (\$) & 401,267 & 463,665 & 520,101 \\ | |
| 8 | +Median living area (m$^2$) & 112.0 & 112.7 & 113.3 \\ | |
| 9 | +Median lot area (m$^2$) & 650 & 645 & 650 \\ | |
| 10 | +Median age (years) & 41.0 & 42.0 & 43.0 \\ | |
| 11 | +Detached (\%) & 81.6 & 80.9 & 81.3 \\ | |
| 12 | +Median price/assessment ratio & 1.39 & 1.35 & 1.20 \\ | |
| 13 | +Median sales within 2 km, 12 months & -- & 92 & 108 \\ | |
| 14 | +Median candidate pool (25 km, 24 months) & -- & 6,188 & 6,788 \\ | |
| 15 | 15 | \bottomrule |
| 16 | 16 | \end{tabular} |
modified
paper/tables/e1_best.tex
+6 −6
@@ -2,11 +2,11 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Selection & Adjustment & $k$ & $d$ (km) & $t$ (months) & MdAPE 2024 & MdAPE 2025--26 & Coverage \\ |
| 4 | 4 | \midrule |
| 5 | −nearest & hedonic grid & 30 & 1 & 24 & 12.6 & 12.1 & 97.2 \\ | |
| 6 | −nearest & time only & 7 & 1 & 24 & 16.1 & 16.7 & 97.2 \\ | |
| 7 | −compromise & hedonic grid & 50 & 1 & 24 & 11.9 & 11.6 & 97.2 \\ | |
| 8 | −compromise & time only & 20 & 5 & 24 & 12.3 & 12.3 & 99.9 \\ | |
| 9 | −most similar & hedonic grid & 15 & 2 & 24 & 11.6 & 11.3 & 99.0 \\ | |
| 10 | −most similar & time only & 20 & 5 & 24 & 12.3 & 12.2 & 99.9 \\ | |
| 5 | +nearest & hedonic grid & 30 & 1 & 24 & 12.6 & 12.0 & 97.5 \\ | |
| 6 | +nearest & time only & 10 & 1 & 24 & 17.3 & 16.3 & 97.5 \\ | |
| 7 | +compromise & hedonic grid & 30 & 25 & 24 & 11.9 & 11.1 & 100.0 \\ | |
| 8 | +compromise & time only & 10 & 25 & 24 & 12.8 & 12.0 & 100.0 \\ | |
| 9 | +most similar & hedonic grid & 20 & 2 & 24 & 12.0 & 11.2 & 99.1 \\ | |
| 10 | +most similar & time only & 20 & 25 & 24 & 12.7 & 11.8 & 100.0 \\ | |
| 11 | 11 | \bottomrule |
| 12 | 12 | \end{tabular} |
modified
paper/tables/exclusions.tex
+1 −1
@@ -1,4 +1,4 @@ | ||
| 1 | −\begin{tabular}{lr} | |
| 1 | +\begin{tabular}{p{0.8\textwidth}r} | |
| 2 | 2 | \toprule |
| 3 | 3 | Step & n \\ |
| 4 | 4 | \midrule |
modified
paper/tables/h2.tex
+5 −5
@@ -2,10 +2,10 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Density & $k=1$ & $k=3$ & $k=5$ & $k=7$ & $k=10$ & $k=15$ & $k=20$ & $k=30$ & $k=50$ \\ |
| 4 | 4 | \midrule |
| 5 | −$<5$ & 29.6 & 31.8 & 29.0 & 28.3 & 27.0 & \textbf{26.7} & 27.6 & 28.5 & 28.0 \\ | |
| 6 | −5--19 & 27.2 & 23.4 & 20.0 & 19.7 & 19.2 & \textbf{18.4} & 18.6 & 18.4 & 19.7 \\ | |
| 7 | −20--49 & 20.9 & 18.1 & 16.2 & 15.4 & 15.4 & 14.6 & 14.3 & 14.8 & \textbf{13.7} \\ | |
| 8 | −50--199 & 14.8 & 12.3 & 11.3 & 11.0 & 10.6 & 10.5 & \textbf{10.2} & 10.4 & 10.4 \\ | |
| 9 | −$\ge 200$ & 13.3 & 11.5 & 10.8 & 10.6 & 10.2 & \textbf{10.1} & 10.2 & 10.1 & 10.2 \\ | |
| 5 | +$<5$ & 31.3 & 26.9 & 25.3 & 24.4 & 24.1 & 23.7 & 23.8 & \textbf{23.6} & 23.7 \\ | |
| 6 | +5--19 & 25.4 & 21.6 & 20.4 & 19.6 & 19.1 & 18.7 & 18.4 & 18.4 & \textbf{18.2} \\ | |
| 7 | +20--49 & 20.1 & 16.6 & 15.4 & 14.9 & 14.5 & 14.3 & 14.1 & 14.1 & \textbf{13.9} \\ | |
| 8 | +50--199 & 14.7 & 12.2 & 11.5 & 11.2 & 11.0 & 10.9 & \textbf{10.9} & \textbf{10.9} & 10.9 \\ | |
| 9 | +$\ge 200$ & 12.9 & 10.8 & 10.2 & 9.9 & 9.7 & 9.6 & 9.6 & \textbf{9.6} & 9.7 \\ | |
| 10 | 10 | \bottomrule |
| 11 | 11 | \end{tabular} |
modified
paper/tables/h3.tex
+10 −10
@@ -3,17 +3,17 @@ | ||
| 3 | 3 | Density & conventional grid & hedonic grid & regional grid & local grid & GBM adjustments \\ |
| 4 | 4 | \midrule |
| 5 | 5 | \multicolumn{6}{l}{\emph{Anchor $(5,\,5\text{ km},\,12\text{ months})$}} \\ |
| 6 | −$<5$ & 32.8 & 29.5 & 30.9 & \textbf{29.2} & 30.0 \\ | |
| 7 | −5--19 & 20.9 & 20.0 & \textbf{19.4} & 21.0 & 19.9 \\ | |
| 8 | −20--49 & 16.2 & 16.2 & 16.2 & 17.6 & \textbf{16.1} \\ | |
| 9 | −50--199 & 11.9 & 11.3 & 11.0 & 11.7 & \textbf{10.4} \\ | |
| 10 | −$\ge 200$ & 10.5 & 10.8 & 10.6 & 11.9 & \textbf{9.9} \\ | |
| 6 | +$<5$ & 27.1 & 25.3 & 25.3 & 25.9 & \textbf{24.5} \\ | |
| 7 | +5--19 & 21.4 & 20.4 & 20.1 & 20.8 & \textbf{19.7} \\ | |
| 8 | +20--49 & 16.2 & 15.4 & 15.3 & 15.9 & \textbf{14.6} \\ | |
| 9 | +50--199 & 11.7 & 11.5 & 11.5 & 11.9 & \textbf{10.4} \\ | |
| 10 | +$\ge 200$ & 10.4 & 10.2 & 10.3 & 10.7 & \textbf{9.2} \\ | |
| 11 | 11 | \midrule |
| 12 | 12 | \multicolumn{6}{l}{\emph{Anchor $(3,\,2\text{ km},\,6\text{ months})$}} \\ |
| 13 | −$<5$ & 37.3 & 31.8 & 32.4 & 36.1 & \textbf{29.5} \\ | |
| 14 | −5--19 & 24.1 & 24.3 & 24.1 & 23.5 & \textbf{23.3} \\ | |
| 15 | −20--49 & 18.9 & 18.3 & 18.2 & 19.9 & \textbf{18.1} \\ | |
| 16 | −50--199 & 12.7 & 11.8 & 11.7 & 12.5 & \textbf{11.3} \\ | |
| 17 | −$\ge 200$ & 11.7 & 11.4 & 11.4 & 12.2 & \textbf{10.8} \\ | |
| 13 | +$<5$ & 30.0 & 28.6 & 28.6 & 29.5 & \textbf{28.0} \\ | |
| 14 | +5--19 & 23.8 & 22.4 & 21.9 & 22.8 & \textbf{21.4} \\ | |
| 15 | +20--49 & 17.7 & 16.9 & 16.6 & 17.4 & \textbf{15.5} \\ | |
| 16 | +50--199 & 12.8 & 12.5 & 12.6 & 12.9 & \textbf{11.1} \\ | |
| 17 | +$\ge 200$ & 11.1 & 10.8 & 11.0 & 11.4 & \textbf{9.8} \\ | |
| 18 | 18 | \bottomrule |
| 19 | 19 | \end{tabular} |
modified
paper/tables/h4.tex
+6 −6
@@ -1,11 +1,11 @@ | ||
| 1 | 1 | \begin{tabular}{lrrrrrrr} |
| 2 | 2 | \toprule |
| 3 | −Density & equal / median & equal / mean & 1/distance / mean & recency / mean & most similar / mean & product / mean & product / median \\ | |
| 3 | +Density & equal/med. & equal/mean & dist./mean & rec./mean & sim./mean & prod./mean & prod./med. \\ | |
| 4 | 4 | \midrule |
| 5 | −$<5$ & 29.5 & 28.7 & 27.6 & 29.0 & \textbf{27.3} & 28.2 & 29.3 \\ | |
| 6 | −5--19 & 20.0 & 20.1 & 19.8 & 20.1 & 19.5 & \textbf{18.4} & 21.9 \\ | |
| 7 | −20--49 & \textbf{16.2} & 17.1 & 17.2 & 16.9 & 17.9 & 18.0 & 18.2 \\ | |
| 8 | −50--199 & \textbf{11.3} & 12.1 & 12.2 & 12.2 & 11.9 & 12.0 & 11.6 \\ | |
| 9 | −$\ge 200$ & \textbf{10.8} & 11.4 & 11.3 & 11.2 & 10.9 & 11.0 & 11.1 \\ | |
| 5 | +$<5$ & 25.3 & 25.1 & \textbf{25.0} & 25.9 & 25.2 & 25.8 & 28.1 \\ | |
| 6 | +5--19 & 20.4 & 20.6 & 20.5 & 21.0 & \textbf{20.3} & 20.6 & 21.8 \\ | |
| 7 | +20--49 & \textbf{15.4} & 16.0 & 16.1 & 16.4 & 16.0 & 16.2 & 16.7 \\ | |
| 8 | +50--199 & \textbf{11.5} & 12.3 & 12.3 & 12.5 & 11.9 & 12.0 & 12.0 \\ | |
| 9 | +$\ge 200$ & \textbf{10.2} & 10.9 & 10.9 & 11.0 & 10.5 & 10.6 & 10.5 \\ | |
| 10 | 10 | \bottomrule |
| 11 | 11 | \end{tabular} |
modified
paper/tables/h5.tex
+3 −3
@@ -2,8 +2,8 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Submarket & Median $\hat\sigma$ & M2 & M7 & M8a & M13 & M0 & M10 & M11b & M12 \\ |
| 4 | 4 | \midrule |
| 5 | −homogeneous & 0.123 & 14.6 & 10.4 & 11.2 & 8.8 & 9.1 & 13.3 & 8.8 & 8.6 \\ | |
| 6 | −intermediate & 0.252 & 19.3 & 14.5 & 15.1 & 12.2 & 12.2 & 15.2 & 11.1 & 11.1 \\ | |
| 7 | −heterogeneous & 0.407 & 23.8 & 17.0 & 17.5 & 15.0 & 13.9 & 17.0 & 13.1 & 13.2 \\ | |
| 5 | +homogeneous & 0.121 & 13.9 & 10.2 & 10.5 & 9.2 & 9.0 & 12.1 & 7.5 & 7.4 \\ | |
| 6 | +intermediate & 0.252 & 19.0 & 13.9 & 14.3 & 12.1 & 11.9 & 14.3 & 9.5 & 9.5 \\ | |
| 7 | +heterogeneous & 0.400 & 22.8 & 16.4 & 16.9 & 14.3 & 13.6 & 15.7 & 10.4 & 10.4 \\ | |
| 8 | 8 | \bottomrule |
| 9 | 9 | \end{tabular} |
modified
paper/tables/intervals.tex
+6 −6
@@ -2,11 +2,11 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Configuration & $z$ (calibrated on 2024) & Coverage at $z=1.28$ & Coverage, calibrated $z$ & Median width (\%) & $n$ \\ |
| 4 | 4 | \midrule |
| 5 | −time only, $k=5$, $\le 5$ km, 12 months & 1.89 & 66.3 & 79.3 & 89.5 & 2,645 \\ | |
| 6 | −time only, $k=10$, $\le 10$ km, 24 months & 1.39 & 76.7 & 79.2 & 85.2 & 2,662 \\ | |
| 7 | −hedonic grid, $k=5$, $\le 5$ km, 12 months & 1.93 & 67.1 & 79.8 & 67.2 & 2,645 \\ | |
| 8 | −hedonic grid, $k=10$, $\le 10$ km, 24 months & 1.28 & 77.8 & 77.9 & 63.0 & 2,662 \\ | |
| 9 | −GBM adjustments, $k=5$, $\le 5$ km, 12 months & 2.01 & 66.5 & 80.4 & 65.2 & 2,645 \\ | |
| 10 | −GBM adjustments, $k=10$, $\le 10$ km, 24 months & 1.42 & 77.1 & 80.5 & 66.4 & 2,662 \\ | |
| 5 | +time only, $k=5$, $\le 5$ km, 12 months & 1.89 & 67.2 & 80.3 & 90.5 & 123,913 \\ | |
| 6 | +time only, $k=10$, $\le 10$ km, 24 months & 1.41 & 77.3 & 80.4 & 85.2 & 124,516 \\ | |
| 7 | +hedonic grid, $k=5$, $\le 5$ km, 12 months & 1.88 & 67.9 & 79.9 & 65.0 & 123,913 \\ | |
| 8 | +hedonic grid, $k=10$, $\le 10$ km, 24 months & 1.35 & 78.5 & 80.0 & 66.5 & 124,516 \\ | |
| 9 | +GBM adjustments, $k=5$, $\le 5$ km, 12 months & 2.03 & 66.5 & 80.2 & 62.9 & 123,913 \\ | |
| 10 | +GBM adjustments, $k=10$, $\le 10$ km, 24 months & 1.44 & 77.3 & 80.5 & 66.7 & 124,516 \\ | |
| 11 | 11 | \bottomrule |
| 12 | 12 | \end{tabular} |
modified
paper/tables/marginal.tex
+15 −15
@@ -2,24 +2,24 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Factor & Level & Mean MdAPE \\ |
| 4 | 4 | \midrule |
| 5 | −Selection & least adjusted & 13.3 \\ | |
| 6 | −Selection & nearest & 14.6 \\ | |
| 7 | −Selection & compromise & 13.1 \\ | |
| 8 | −Selection & most similar & 13.3 \\ | |
| 9 | −Adjustment & conventional grid & 13.3 \\ | |
| 10 | −Adjustment & GBM adjustments & 13.1 \\ | |
| 11 | −Adjustment & hedonic grid & 13.3 \\ | |
| 12 | −Adjustment & regional grid & 13.3 \\ | |
| 13 | −Adjustment & local grid & 13.6 \\ | |
| 5 | +Selection & least adjusted & 13.1 \\ | |
| 6 | +Selection & nearest & 14.4 \\ | |
| 7 | +Selection & compromise & 12.9 \\ | |
| 8 | +Selection & most similar & 13.2 \\ | |
| 9 | +Adjustment & conventional grid & 13.2 \\ | |
| 10 | +Adjustment & GBM adjustments & 12.6 \\ | |
| 11 | +Adjustment & hedonic grid & 13.1 \\ | |
| 12 | +Adjustment & regional grid & 13.1 \\ | |
| 13 | +Adjustment & local grid & 13.3 \\ | |
| 14 | 14 | Adjustment & time only & 14.7 \\ |
| 15 | 15 | Adjustment & none & 15.4 \\ |
| 16 | 16 | Adjustment & assessment ratio & 11.8 \\ |
| 17 | 17 | Weighting & distance $\times$ recency $\times$ similarity & 13.6 \\ |
| 18 | −Weighting & 1/distance & 13.6 \\ | |
| 19 | −Weighting & equal & 13.5 \\ | |
| 20 | −Weighting & recency & 13.8 \\ | |
| 21 | −Weighting & most similar & 13.3 \\ | |
| 22 | −Reconciliation & mean & 13.8 \\ | |
| 23 | −Reconciliation & median & 13.4 \\ | |
| 18 | +Weighting & 1/distance & 13.4 \\ | |
| 19 | +Weighting & equal & 13.2 \\ | |
| 20 | +Weighting & recency & 13.6 \\ | |
| 21 | +Weighting & most similar & 13.1 \\ | |
| 22 | +Reconciliation & mean & 13.6 \\ | |
| 23 | +Reconciliation & median & 13.2 \\ | |
| 24 | 24 | \bottomrule |
| 25 | 25 | \end{tabular} |
modified
paper/tables/numbers.tex
+75 −68
@@ -4,88 +4,95 @@ | ||
| 4 | 4 | \newcommand{\nTrain}{201,642} |
| 5 | 5 | \newcommand{\nVal}{64,795} |
| 6 | 6 | \newcommand{\nTest}{124,559} |
| 7 | −\newcommand{\nTargetsVal}{1,337} | |
| 8 | −\newcommand{\nTargetsTest}{2,663} | |
| 9 | −\newcommand{\nTargetsAll}{4,000} | |
| 7 | +\newcommand{\nTargetsVal}{64,795} | |
| 8 | +\newcommand{\nTargetsTest}{124,559} | |
| 9 | +\newcommand{\nTargetsAll}{189,354} | |
| 10 | 10 | \newcommand{\nConfigs}{2,256} |
| 11 | 11 | \newcommand{\nTransactionsDb}{766,596} |
| 12 | 12 | \newcommand{\nUnits}{3.75 million} |
| 13 | 13 | \newcommand{\dateMin}{2021-01-05} |
| 14 | 14 | \newcommand{\dateMax}{2026-09-29} |
| 15 | 15 | \newcommand{\medianPrice}{400,000} |
| 16 | −\newcommand{\mdapeMzero}{11.3\%} | |
| 17 | −\newcommand{\mdapeMtwo}{19.0\%} | |
| 18 | −\newcommand{\mdapeMthree}{12.9\%} | |
| 19 | −\newcommand{\mdapeMsix}{13.8\%} | |
| 20 | −\newcommand{\mdapeMseven}{13.5\%} | |
| 21 | −\newcommand{\mdapeMnine}{11.0\%} | |
| 22 | −\newcommand{\mdapeMten}{15.1\%} | |
| 23 | −\newcommand{\mdapeMelevenA}{13.2\%} | |
| 24 | −\newcommand{\mdapeMelevenB}{10.7\%} | |
| 25 | −\newcommand{\mdapeMtwelve}{10.7\%} | |
| 26 | −\newcommand{\mdapeMthirteen}{11.6\%} | |
| 27 | −\newcommand{\convMdape}{13.8\%} | |
| 28 | −\newcommand{\localMdape}{14.1\%} | |
| 29 | −\newcommand{\covMthirteen}{89.8\%} | |
| 30 | −\newcommand{\pTenMzero}{45.0\%} | |
| 31 | −\newcommand{\pTenMelevenB}{47.4\%} | |
| 32 | −\newcommand{\mdapeMoneRange}{18.6--19.2\%} | |
| 33 | −\newcommand{\mdapeGridRange}{12.9--13.8\%} | |
| 34 | −\newcommand{\transparencyCost}{0.6} | |
| 35 | −\newcommand{\transparencyCostNoRole}{-1.9} | |
| 36 | −\newcommand{\roleGainRatio}{1.8} | |
| 37 | −\newcommand{\roleGainGbm}{2.5} | |
| 38 | −\newcommand{\gainTime}{-0.0} | |
| 16 | +\newcommand{\mdapeMzero}{11.1\%} | |
| 17 | +\newcommand{\mdapeMtwo}{18.1\%} | |
| 18 | +\newcommand{\mdapeMthree}{13.0\%} | |
| 19 | +\newcommand{\mdapeMsix}{13.4\%} | |
| 20 | +\newcommand{\mdapeMseven}{13.0\%} | |
| 21 | +\newcommand{\mdapeMnine}{10.6\%} | |
| 22 | +\newcommand{\mdapeMten}{13.8\%} | |
| 23 | +\newcommand{\mdapeMelevenA}{10.7\%} | |
| 24 | +\newcommand{\mdapeMelevenB}{9.0\%} | |
| 25 | +\newcommand{\mdapeMtwelve}{8.9\%} | |
| 26 | +\newcommand{\mdapeMthirteen}{11.5\%} | |
| 27 | +\newcommand{\convMdape}{13.4\%} | |
| 28 | +\newcommand{\localMdape}{13.5\%} | |
| 29 | +\newcommand{\covMthirteen}{90.3\%} | |
| 30 | +\newcommand{\pTenMzero}{46.1\%} | |
| 31 | +\newcommand{\pTenMelevenB}{54.1\%} | |
| 32 | +\newcommand{\mdapeMoneRange}{17.9--19.1\%} | |
| 33 | +\newcommand{\mdapeGridRange}{13.0--13.4\%} | |
| 34 | +\newcommand{\transparencyCost}{2.2} | |
| 35 | +\newcommand{\transparencyCostNoRole}{0.4} | |
| 36 | +\newcommand{\roleGainRatio}{1.5} | |
| 37 | +\newcommand{\roleGainGbm}{1.8} | |
| 38 | +\newcommand{\gainTime}{0.3} | |
| 39 | 39 | \newcommand{\gainGridLo}{4.2} |
| 40 | −\newcommand{\gainGridHi}{5.8} | |
| 40 | +\newcommand{\gainGridHi}{5.7} | |
| 41 | 41 | \newcommand{\localVsHedo}{slightly worse} |
| 42 | −\newcommand{\gbmVsHedo}{1.0} | |
| 43 | −\newcommand{\gainSelHedo}{0.9} | |
| 44 | −\newcommand{\wrRange}{0.8} | |
| 45 | −\newcommand{\margSelLo}{13.1} | |
| 46 | −\newcommand{\margSelHi}{14.6} | |
| 42 | +\newcommand{\gbmVsHedo}{1.1} | |
| 43 | +\newcommand{\gainSelHedo}{0.5} | |
| 44 | +\newcommand{\wrRange}{1.0} | |
| 45 | +\newcommand{\margSelLo}{12.9} | |
| 46 | +\newcommand{\margSelHi}{14.4} | |
| 47 | 47 | \newcommand{\margAdjLo}{11.8} |
| 48 | 48 | \newcommand{\margAdjHi}{15.4} |
| 49 | −\newcommand{\margWLo}{13.3} | |
| 50 | −\newcommand{\margWHi}{13.8} | |
| 51 | −\newcommand{\margReconMedian}{13.4} | |
| 52 | −\newcommand{\margReconMean}{13.8} | |
| 53 | −\newcommand{\kOpt}{50} | |
| 54 | −\newcommand{\mdapeKone}{17.0\%} | |
| 55 | −\newcommand{\mdapeKthree}{14.5\%} | |
| 56 | −\newcommand{\mdapeKfive}{13.4\%} | |
| 57 | −\newcommand{\mdapeKten}{12.5\%} | |
| 58 | −\newcommand{\mdapeKopt}{12.3\%} | |
| 59 | −\newcommand{\mdapeKfifty}{12.3\%} | |
| 60 | −\newcommand{\narrowMdape}{13.3\%} | |
| 61 | −\newcommand{\narrowCov}{89.3\%} | |
| 62 | −\newcommand{\bestSel}{most similar} | |
| 63 | −\newcommand{\bestK}{15} | |
| 64 | −\newcommand{\bestD}{2} | |
| 49 | +\newcommand{\margWLo}{13.1} | |
| 50 | +\newcommand{\margWHi}{13.6} | |
| 51 | +\newcommand{\margReconMedian}{13.2} | |
| 52 | +\newcommand{\margReconMean}{13.6} | |
| 53 | +\newcommand{\kOpt}{20} | |
| 54 | +\newcommand{\mdapeKone}{16.5\%} | |
| 55 | +\newcommand{\mdapeKthree}{13.8\%} | |
| 56 | +\newcommand{\mdapeKfive}{13.0\%} | |
| 57 | +\newcommand{\mdapeKten}{12.4\%} | |
| 58 | +\newcommand{\mdapeKopt}{12.1\%} | |
| 59 | +\newcommand{\mdapeKfifty}{12.1\%} | |
| 60 | +\newcommand{\narrowMdape}{13.6\%} | |
| 61 | +\newcommand{\narrowCov}{89.2\%} | |
| 62 | +\newcommand{\bestSel}{compromise} | |
| 63 | +\newcommand{\bestK}{30} | |
| 64 | +\newcommand{\bestD}{25} | |
| 65 | 65 | \newcommand{\bestT}{24} |
| 66 | 66 | \newcommand{\bestAdj}{hedonic grid} |
| 67 | −\newcommand{\bestValMdape}{11.6\%} | |
| 68 | −\newcommand{\bestTestMdape}{11.3\%} | |
| 69 | −\newcommand{\mZeroDesc}{most similar, $k=15$, $\le 2$ km, 24 months, hedonic grid, equal weights, median} | |
| 70 | −\newcommand{\mZeroUncDesc}{most similar, $k=10$, $\le 10$ km, 24 months, assessment ratio} | |
| 71 | −\newcommand{\mZeroUncMdape}{10.6\%} | |
| 72 | −\newcommand{\mZeroUncCov}{84.4\%} | |
| 73 | −\newcommand{\densHighMseven}{10.8\%} | |
| 74 | −\newcommand{\densLowMseven}{29.5\%} | |
| 75 | −\newcommand{\hOneGeoDone}{17.8\%} | |
| 76 | −\newcommand{\hOneGeoDoneCov}{95.4\%} | |
| 77 | −\newcommand{\hOneSimDten}{12.9\%} | |
| 78 | −\newcommand{\hOneGeoDtenHedo}{13.4\%} | |
| 79 | −\newcommand{\hOneSimDtenHedo}{12.4\%} | |
| 80 | −\newcommand{\hOneMixDtenHedo}{12.7\%} | |
| 81 | −\newcommand{\hFiveGapHomog}{0.3} | |
| 82 | −\newcommand{\hFiveGapHeter}{0.9} | |
| 83 | −\newcommand{\ivWidth}{63.0\%} | |
| 84 | −\newcommand{\condMdape}{11.8\%} | |
| 85 | −\newcommand{\condPten}{40.9\%} | |
| 86 | −\newcommand{\condCov}{94.4\%} | |
| 67 | +\newcommand{\bestValMdape}{11.9\%} | |
| 68 | +\newcommand{\bestTestMdape}{11.1\%} | |
| 69 | +\newcommand{\mZeroDesc}{compromise, $k=30$, $\le 25$ km, 24 months, hedonic grid, equal weights, median} | |
| 70 | +\newcommand{\mZeroUncDesc}{compromise, $k=10$, $\le 10$ km, 24 months, assessment ratio} | |
| 71 | +\newcommand{\mZeroUncMdape}{10.7\%} | |
| 72 | +\newcommand{\mZeroUncCov}{90.3\%} | |
| 73 | +\newcommand{\densHighMseven}{10.2\%} | |
| 74 | +\newcommand{\densLowMseven}{25.3\%} | |
| 75 | +\newcommand{\hOneGeoDone}{17.2\%} | |
| 76 | +\newcommand{\hOneGeoDoneCov}{96.0\%} | |
| 77 | +\newcommand{\hOneSimDten}{13.0\%} | |
| 78 | +\newcommand{\hOneGeoDtenHedo}{13.0\%} | |
| 79 | +\newcommand{\hOneSimDtenHedo}{12.7\%} | |
| 80 | +\newcommand{\hOneMixDtenHedo}{12.1\%} | |
| 81 | +\newcommand{\hFiveGapHomog}{1.4} | |
| 82 | +\newcommand{\hFiveGapHeter}{3.1} | |
| 83 | +\newcommand{\ivWidth}{66.5\%} | |
| 84 | +\newcommand{\condMdape}{11.3\%} | |
| 85 | +\newcommand{\condPten}{42.5\%} | |
| 86 | +\newcommand{\condCov}{93.4\%} | |
| 87 | 87 | \newcommand{\betaFloor}{0.60} |
| 88 | 88 | \newcommand{\betaLand}{0.07} |
| 89 | 89 | \newcommand{\betaAge}{1.0\%} |
| 90 | 90 | \newcommand{\betaSemi}{7.4\%} |
| 91 | 91 | \newcommand{\betaRow}{10.5\%} |
| 92 | +\newcommand{\gainTimeLong}{1.4} | |
| 93 | +\newcommand{\noneKten}{17.3\%} | |
| 94 | +\newcommand{\noneKfifty}{18.4\%} | |
| 95 | +\newcommand{\prixQoneMseven}{36.7\%} | |
| 96 | +\newcommand{\prixQfourMseven}{10.0\%} | |
| 97 | +\newcommand{\biasQoneMseven}{-2.4\%} | |
| 98 | +\newcommand{\biasQthreeMseven}{+1.5\%} | |
modified
paper/tables/pairs.tex
+11 −11
@@ -2,16 +2,16 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Comparison & $\Delta$ MdAPE [95\% CI] & $\Delta$ MAPE [95\% CI] & $A$ more accurate (\%) & $n$ \\ |
| 4 | 4 | \midrule |
| 5 | −M7 $-$ M2 & -5.53 [-6.38; -4.61] & -7.01 [-8.22; -5.72] & 61.7 & 2,654 \\ | |
| 6 | −M7 $-$ M6 & -0.31 [-0.94; 0.32] & -1.37 [-1.86; -0.96] & 51.6 & 2,654 \\ | |
| 7 | −M8a $-$ M7 & 0.60 [0.01; 1.04] & 0.87 [0.50; 1.28] & 47.1 & 2,654 \\ | |
| 8 | −M8b $-$ M7 & -1.01 [-1.75; -0.63] & -0.44 [-0.89; 0.01] & 54.0 & 2,654 \\ | |
| 9 | −M11b $-$ M0 & -0.68 [-1.34; 0.07] & -4.34 [-5.17; -3.55] & 55.6 & 2,637 \\ | |
| 10 | −M11a $-$ M0 & 1.79 [1.17; 2.46] & -0.58 [-1.12; -0.00] & 45.4 & 2,637 \\ | |
| 11 | −M12 $-$ M11b & -0.07 [-0.28; 0.17] & -0.05 [-0.15; 0.04] & 55.5 & 2,663 \\ | |
| 12 | −M13 $-$ M7 & -1.96 [-2.85; -1.28] & -2.59 [-3.50; -1.68] & 54.1 & 2,390 \\ | |
| 13 | −M3 $-$ M2 & -6.08 [-7.02; -5.07] & -5.41 [-6.39; -4.37] & 59.4 & 2,654 \\ | |
| 14 | −M9 $-$ M7 & -2.45 [-3.21; -1.87] & -3.21 [-3.92; -2.58] & 58.2 & 2,654 \\ | |
| 15 | −M1 $-$ M2 & 0.14 [-0.53; 1.31] & 2.01 [1.01; 2.90] & 46.1 & 2,569 \\ | |
| 5 | +M7 $-$ M2 & -5.08 [-5.24; -4.87] & -6.65 [-6.87; -6.43] & 61.1 & 124,310 \\ | |
| 6 | +M7 $-$ M6 & -0.37 [-0.45; -0.29] & -1.32 [-1.41; -1.23] & 52.3 & 124,310 \\ | |
| 7 | +M8a $-$ M7 & 0.46 [0.33; 0.57] & 0.59 [0.47; 0.73] & 48.0 & 124,310 \\ | |
| 8 | +M8b $-$ M7 & -1.08 [-1.16; -1.00] & -1.04 [-1.11; -0.97] & 54.3 & 124,310 \\ | |
| 9 | +M11b $-$ M0 & -2.17 [-2.33; -2.03] & -3.69 [-3.90; -3.52] & 59.1 & 124,555 \\ | |
| 10 | +M11a $-$ M0 & -0.39 [-0.49; -0.33] & -0.50 [-0.57; -0.44] & 51.8 & 124,555 \\ | |
| 11 | +M12 $-$ M11b & -0.06 [-0.08; -0.03] & -0.07 [-0.09; -0.06] & 52.6 & 124,559 \\ | |
| 12 | +M13 $-$ M7 & -1.40 [-1.56; -1.26] & -2.39 [-2.62; -2.17] & 54.5 & 112,423 \\ | |
| 13 | +M3 $-$ M2 & -5.10 [-5.27; -4.95] & -5.58 [-5.79; -5.41] & 59.8 & 124,310 \\ | |
| 14 | +M9 $-$ M7 & -2.38 [-2.50; -2.26] & -3.33 [-3.50; -3.18] & 59.7 & 124,310 \\ | |
| 15 | +M1 $-$ M2 & 1.41 [1.25; 1.61] & 1.82 [1.68; 1.97] & 45.8 & 120,372 \\ | |
| 16 | 16 | \bottomrule |
| 17 | 17 | \end{tabular} |
modified
paper/tables/regions.tex
+17 −17
@@ -2,22 +2,22 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Region & $n$ & M2 & M7 & M8a & M13 & M0 & M10 & M11b & M12 \\ |
| 4 | 4 | \midrule |
| 5 | −Montérégie & 541 & 15.6 & 10.8 & 12.2 & 10.5 & 9.8 & 12.3 & 9.9 & 9.5 \\ | |
| 6 | −Laurentides & 287 & 20.3 & 14.6 & 14.5 & 11.8 & 11.0 & 15.1 & 10.5 & 10.4 \\ | |
| 7 | −Lanaudière & 258 & 18.7 & 14.1 & 13.8 & 11.1 & 9.8 & 14.7 & 10.9 & 11.0 \\ | |
| 8 | −Capitale-Nationale & 253 & 19.2 & 12.5 & 13.0 & 12.1 & 11.6 & 14.0 & 10.9 & 10.9 \\ | |
| 9 | −Montréal & 212 & 17.4 & 14.7 & 15.8 & 11.0 & 9.8 & 17.4 & 11.5 & 11.4 \\ | |
| 10 | −Estrie & 188 & 21.0 & 16.7 & 16.2 & 13.9 & 13.5 & 16.0 & 10.7 & 10.3 \\ | |
| 11 | −Chaudière-Appalaches & 170 & 20.0 & 17.1 & 16.9 & 13.5 & 14.9 & 19.0 & 13.7 & 14.4 \\ | |
| 12 | −Outaouais & 142 & 16.2 & 11.1 & 11.5 & 9.3 & 10.0 & 13.5 & 8.2 & 8.3 \\ | |
| 13 | −Saguenay--Lac-Saint-Jean & 126 & 23.0 & 14.3 & 14.3 & 10.5 & 15.3 & 18.0 & 11.9 & 12.1 \\ | |
| 14 | −Laval & 117 & 14.4 & 8.2 & 10.2 & 7.1 & 9.6 & 13.3 & 7.8 & 8.0 \\ | |
| 15 | −Centre-du-Québec & 94 & 21.1 & 15.5 & 16.1 & 11.5 & 14.1 & 15.1 & 9.6 & 9.4 \\ | |
| 16 | −Mauricie & 88 & 22.3 & 14.5 & 16.4 & 13.6 & 10.6 & 15.6 & 12.3 & 12.5 \\ | |
| 17 | −Bas-Saint-Laurent & 76 & 26.1 & 15.5 & 19.3 & 16.3 & 15.4 & 18.7 & 12.0 & 12.0 \\ | |
| 18 | −Abitibi-Témiscamingue & 50 & 26.1 & 16.0 & 20.3 & 13.3 & 13.9 & 20.5 & 15.2 & 15.3 \\ | |
| 19 | −Côte-Nord & 26 & 25.7 & 29.4 & 31.8 & 18.5 & 30.7 & 21.6 & 21.2 & 20.7 \\ | |
| 20 | −Gaspésie--Îles-de-la-Madeleine & 23 & 35.6 & 15.6 & 16.9 & 19.0 & 21.0 & 26.2 & 19.1 & 18.1 \\ | |
| 21 | −Nord-du-Québec & 3 & 27.1 & 16.2 & 13.9 & 15.7 & 31.7 & 3.1 & 13.6 & 9.8 \\ | |
| 5 | +Montérégie & 25,133 & 16.1 & 11.3 & 11.9 & 10.5 & 9.5 & 11.7 & 8.0 & 7.9 \\ | |
| 6 | +Laurentides & 13,629 & 18.0 & 12.8 & 12.8 & 11.4 & 10.6 & 12.9 & 8.5 & 8.5 \\ | |
| 7 | +Capitale-Nationale & 11,711 & 18.7 & 13.4 & 14.2 & 11.4 & 11.6 & 13.8 & 9.1 & 9.1 \\ | |
| 8 | +Lanaudière & 11,377 & 17.2 & 12.9 & 12.6 & 11.6 & 10.6 & 13.0 & 8.6 & 8.6 \\ | |
| 9 | +Montréal & 9,496 & 16.0 & 12.0 & 13.5 & 11.2 & 10.7 & 21.4 & 9.2 & 9.1 \\ | |
| 10 | +Estrie & 9,437 & 21.0 & 14.6 & 15.2 & 12.7 & 12.5 & 14.7 & 9.7 & 9.6 \\ | |
| 11 | +Chaudière-Appalaches & 8,135 & 22.0 & 15.5 & 16.6 & 13.4 & 13.6 & 14.7 & 10.4 & 10.4 \\ | |
| 12 | +Outaouais & 7,426 & 14.3 & 10.6 & 9.8 & 9.4 & 9.1 & 13.0 & 7.6 & 7.5 \\ | |
| 13 | +Laval & 5,243 & 14.5 & 9.6 & 10.3 & 8.1 & 8.1 & 10.6 & 6.9 & 7.0 \\ | |
| 14 | +Saguenay--Lac-Saint-Jean & 5,030 & 20.7 & 16.0 & 16.0 & 12.8 & 14.2 & 15.6 & 10.2 & 10.2 \\ | |
| 15 | +Centre-du-Québec & 4,681 & 20.5 & 13.7 & 14.0 & 12.4 & 12.1 & 13.1 & 9.6 & 9.6 \\ | |
| 16 | +Mauricie & 4,670 & 21.6 & 16.3 & 16.7 & 14.3 & 14.2 & 16.4 & 11.4 & 11.3 \\ | |
| 17 | +Bas-Saint-Laurent & 3,260 & 23.3 & 18.2 & 18.7 & 15.4 & 15.9 & 16.5 & 12.3 & 12.2 \\ | |
| 18 | +Abitibi-Témiscamingue & 2,412 & 22.2 & 17.0 & 16.6 & 12.4 & 15.3 & 17.1 & 9.8 & 10.0 \\ | |
| 19 | +Côte-Nord & 1,227 & 23.9 & 19.3 & 19.5 & 16.9 & 17.7 & 19.1 & 13.7 & 13.6 \\ | |
| 20 | +Gaspésie--Îles-de-la-Madeleine & 1,157 & 29.0 & 24.0 & 23.5 & 22.6 & 21.5 & 22.9 & 17.1 & 17.4 \\ | |
| 21 | +Nord-du-Québec & 286 & 27.1 & 21.8 & 22.4 & 15.7 & 20.7 & 22.0 & 13.9 & 13.6 \\ | |
| 22 | 22 | \bottomrule |
| 23 | 23 | \end{tabular} |
modified
paper/tables/selection.tex
+4 −4
@@ -2,9 +2,9 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Selection & MdAPE 2024 & MdAPE 2025--26 & Bias & Within $\pm10\%$ \\ |
| 4 | 4 | \midrule |
| 5 | −nearest & 14.0 & 13.5 & -0.7 & 39.4 \\ | |
| 6 | −most similar & 13.7 & 12.6 & 0.1 & 41.0 \\ | |
| 7 | −compromise & 13.8 & 12.8 & 0.0 & 41.8 \\ | |
| 8 | −least adjusted & 13.6 & 12.9 & 0.1 & 41.0 \\ | |
| 5 | +nearest & 13.8 & 13.0 & -0.5 & 40.4 \\ | |
| 6 | +most similar & 13.3 & 12.5 & -0.1 & 42.1 \\ | |
| 7 | +compromise & 12.9 & 12.1 & -0.1 & 43.0 \\ | |
| 8 | +least adjusted & 13.1 & 12.2 & -0.1 & 42.8 \\ | |
| 9 | 9 | \bottomrule |
| 10 | 10 | \end{tabular} |
modified
paper/tables/stability.tex
+7 −7
@@ -2,12 +2,12 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Quarter & $n$ & M2 & M7 & M0 & M11b & M12 & Bias M7 & Bias M11b \\ |
| 4 | 4 | \midrule |
| 5 | −2025Q1 & 256 & 19.9 & 13.9 & 12.3 & 10.7 & 10.5 & -4.4 & -3.0 \\ | |
| 6 | −2025Q2 & 516 & 18.8 & 14.3 & 10.3 & 10.9 & 11.1 & -2.8 & -6.7 \\ | |
| 7 | −2025Q3 & 435 & 18.3 & 13.1 & 12.0 & 10.3 & 10.3 & 1.4 & -2.9 \\ | |
| 8 | −2025Q4 & 335 & 21.1 & 15.6 & 11.8 & 12.2 & 12.1 & 2.9 & -5.6 \\ | |
| 9 | −2026Q1 & 212 & 18.5 & 14.7 & 14.1 & 11.7 & 11.6 & -4.0 & -4.0 \\ | |
| 10 | −2026Q2 & 492 & 16.5 & 11.5 & 10.4 & 10.3 & 9.8 & -1.3 & -5.5 \\ | |
| 11 | −2026Q3 & 417 & 20.6 & 12.9 & 10.6 & 10.1 & 9.6 & 1.6 & -2.6 \\ | |
| 5 | +2025Q1 & 11,337 & 19.5 & 14.2 & 12.5 & 10.3 & 10.1 & -2.4 & 3.0 \\ | |
| 6 | +2025Q2 & 24,823 & 17.3 & 12.4 & 10.5 & 8.5 & 8.4 & -1.1 & -0.3 \\ | |
| 7 | +2025Q3 & 20,140 & 18.2 & 13.0 & 11.1 & 8.9 & 8.8 & 1.5 & -0.5 \\ | |
| 8 | +2025Q4 & 16,692 & 19.2 & 13.9 & 12.0 & 9.5 & 9.6 & -0.7 & -0.1 \\ | |
| 9 | +2026Q1 & 10,619 & 19.6 & 14.2 & 12.7 & 10.0 & 10.0 & -2.4 & -0.1 \\ | |
| 10 | +2026Q2 & 22,825 & 16.8 & 12.1 & 10.1 & 8.3 & 8.2 & -1.3 & 0.4 \\ | |
| 11 | +2026Q3 & 18,123 & 18.3 & 12.9 & 11.1 & 8.8 & 8.8 & 1.7 & -0.3 \\ | |
| 12 | 12 | \bottomrule |
| 13 | 13 | \end{tabular} |
modified
paper/tables/strata_other.tex
+14 −14
@@ -2,25 +2,25 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Price quintile & $n$ & M2 & M7 & M8a & M13 & M0 & M10 & M11b & M12 \\ |
| 4 | 4 | \midrule |
| 5 | −Q1 (low) & 464 & 53.7 & 36.7 & 36.6 & 29.9 & 35.4 & 31.2 & 23.7 & 24.8 \\ | |
| 6 | −Q2 & 529 & 18.8 & 13.9 & 15.6 & 13.0 & 11.4 & 13.9 & 9.5 & 9.3 \\ | |
| 7 | −Q3 & 506 & 14.8 & 10.8 & 11.9 & 10.7 & 10.0 & 13.9 & 9.6 & 9.3 \\ | |
| 8 | −Q4 & 575 & 13.9 & 10.3 & 10.3 & 8.2 & 8.0 & 12.4 & 9.1 & 8.9 \\ | |
| 9 | −Q5 (high) & 580 & 19.5 & 12.5 & 13.3 & 9.7 & 10.1 & 14.0 & 10.4 & 10.0 \\ | |
| 5 | +Q1 (low) & 21,659 & 50.4 & 36.7 & 37.0 & 28.7 & 35.8 & 36.7 & 26.4 & 26.2 \\ | |
| 6 | +Q2 & 24,680 & 17.5 & 13.7 & 14.2 & 12.7 & 11.7 & 13.5 & 9.4 & 9.4 \\ | |
| 7 | +Q3 & 23,834 & 13.6 & 10.4 & 10.6 & 9.7 & 9.0 & 11.5 & 7.1 & 7.1 \\ | |
| 8 | +Q4 & 26,783 & 13.3 & 10.0 & 10.1 & 8.9 & 8.2 & 11.3 & 6.7 & 6.7 \\ | |
| 9 | +Q5 (high) & 27,354 & 19.3 & 11.6 & 12.4 & 9.7 & 10.1 & 13.2 & 8.2 & 8.2 \\ | |
| 10 | 10 | \midrule |
| 11 | 11 | Age & $n$ & M2 & M7 & M8a & M13 & M0 & M10 & M11b & M12 \\ |
| 12 | 12 | \midrule |
| 13 | −16--40 & 803 & 17.7 & 11.3 & 11.7 & 9.6 & 9.8 & 13.1 & 9.5 & 9.0 \\ | |
| 14 | −4--15 & 388 & 18.3 & 10.5 & 11.6 & 9.6 & 8.4 & 12.8 & 9.0 & 8.7 \\ | |
| 15 | −41--70 & 1,060 & 18.3 & 14.6 & 15.3 & 13.4 & 12.5 & 16.0 & 11.8 & 11.8 \\ | |
| 16 | −$>70$ & 345 & 26.4 & 20.4 & 21.2 & 15.6 & 17.2 & 20.9 & 15.2 & 15.4 \\ | |
| 17 | −$\le 3$ years & 58 & 25.8 & 15.7 & 14.4 & 12.0 & 13.1 & 14.8 & 9.4 & 9.4 \\ | |
| 13 | +16--40 & 39,475 & 16.6 & 11.1 & 11.3 & 9.8 & 9.2 & 11.9 & 7.5 & 7.4 \\ | |
| 14 | +4--15 & 17,344 & 17.0 & 9.9 & 10.1 & 8.8 & 8.4 & 12.1 & 6.7 & 6.6 \\ | |
| 15 | +41--70 & 48,592 & 17.7 & 14.4 & 14.9 & 13.0 & 12.5 & 14.5 & 10.2 & 10.2 \\ | |
| 16 | +$>70$ & 16,526 & 25.1 & 19.7 & 21.6 & 16.9 & 18.0 & 20.9 & 14.2 & 14.2 \\ | |
| 17 | +$\le 3$ years & 2,373 & 20.1 & 11.9 & 12.1 & 9.8 & 9.8 & 12.9 & 8.0 & 7.8 \\ | |
| 18 | 18 | \midrule |
| 19 | 19 | Physical link & $n$ & M2 & M7 & M8a & M13 & M0 & M10 & M11b & M12 \\ |
| 20 | 20 | \midrule |
| 21 | −0.0 & 2,161 & 20.1 & 14.6 & 15.0 & 12.4 & 12.2 & 15.5 & 11.4 & 11.4 \\ | |
| 22 | −1.0 & 324 & 15.0 & 10.3 & 11.2 & 9.2 & 9.1 & 12.8 & 9.1 & 8.5 \\ | |
| 23 | −2.0 & 165 & 13.6 & 8.6 & 10.0 & 8.5 & 7.3 & 12.8 & 7.7 & 7.6 \\ | |
| 24 | −3.0 & 4 & 30.4 & 30.0 & 21.4 & 18.5 & 23.8 & 12.9 & 16.2 & 16.9 \\ | |
| 21 | +0.0 & 100,999 & 19.6 & 14.3 & 14.7 & 12.4 & 12.2 & 14.2 & 9.8 & 9.7 \\ | |
| 22 | +1.0 & 15,936 & 12.9 & 9.1 & 9.4 & 8.6 & 7.7 & 11.8 & 6.6 & 6.4 \\ | |
| 23 | +2.0 & 7,297 & 11.9 & 8.2 & 8.6 & 8.0 & 7.8 & 14.5 & 6.2 & 6.1 \\ | |
| 24 | +3.0 & 78 & 34.3 & 22.3 & 18.0 & 10.3 & 15.3 & 31.0 & 10.9 & 9.9 \\ | |
| 25 | 25 | \bottomrule |
| 26 | 26 | \end{tabular} |
modified
paper/tables/surface_cov.tex
+6 −6
@@ -2,11 +2,11 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Radius & 3 months & 6 months & 12 months & 24 months \\ |
| 4 | 4 | \midrule |
| 5 | −$\le 0.5$ km & 79.8 & 87.3 & 91.7 & 94.7 \\ | |
| 6 | −$\le 1$ km & 89.3 & 92.6 & 95.4 & 97.2 \\ | |
| 7 | −$\le 2$ km & 93.9 & 96.5 & 98.4 & 99.0 \\ | |
| 8 | −$\le 5$ km & 98.0 & 99.2 & 99.7 & 99.9 \\ | |
| 9 | −$\le 10$ km & 99.4 & 99.8 & 99.9 & 100.0 \\ | |
| 10 | −$\le 25$ km & 99.8 & 100.0 & 100.0 & 100.0 \\ | |
| 5 | +$\le 0.5$ km & 80.0 & 87.1 & 92.2 & 95.0 \\ | |
| 6 | +$\le 1$ km & 89.2 & 93.0 & 96.0 & 97.5 \\ | |
| 7 | +$\le 2$ km & 94.2 & 96.6 & 98.3 & 99.1 \\ | |
| 8 | +$\le 5$ km & 98.5 & 99.4 & 99.8 & 99.9 \\ | |
| 9 | +$\le 10$ km & 99.7 & 99.9 & 100.0 & 100.0 \\ | |
| 10 | +$\le 25$ km & 100.0 & 100.0 & 100.0 & 100.0 \\ | |
| 11 | 11 | \bottomrule |
| 12 | 12 | \end{tabular} |
modified
paper/tables/surface_geo_hedo.tex
+6 −6
@@ -2,11 +2,11 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Radius & $k=1$ & $k=3$ & $k=5$ & $k=7$ & $k=10$ & $k=15$ & $k=20$ & $k=30$ & $k=50$ \\ |
| 4 | 4 | \midrule |
| 5 | −$\le 0.5$ km & 16.2 & 13.8 & 12.9 & 12.7 & 12.3 & \textbf{12.1} & 12.2 & 12.2 & 12.2 \\ | |
| 6 | −$\le 1$ km & 16.5 & 14.1 & 13.0 & 12.8 & 12.4 & 12.1 & 12.1 & \textbf{12.0} & 12.1 \\ | |
| 7 | −$\le 2$ km & 16.7 & 14.2 & 13.2 & 12.9 & 12.4 & 12.2 & 12.2 & 12.2 & \textbf{12.1} \\ | |
| 8 | −$\le 5$ km & 17.0 & 14.4 & 13.5 & 13.0 & 12.5 & 12.4 & 12.4 & 12.4 & \textbf{12.3} \\ | |
| 9 | −$\le 10$ km & 17.0 & 14.5 & 13.4 & 13.0 & 12.5 & 12.4 & 12.5 & 12.5 & \textbf{12.3} \\ | |
| 10 | −$\le 25$ km & 17.0 & 14.5 & 13.5 & 13.0 & 12.5 & 12.3 & 12.4 & 12.5 & \textbf{12.3} \\ | |
| 5 | +$\le 0.5$ km & 15.8 & 13.3 & 12.6 & 12.3 & 12.2 & 12.1 & \textbf{12.0} & 12.1 & 12.1 \\ | |
| 6 | +$\le 1$ km & 16.1 & 13.5 & 12.8 & 12.5 & 12.3 & 12.2 & \textbf{12.1} & 12.1 & 12.1 \\ | |
| 7 | +$\le 2$ km & 16.4 & 13.7 & 12.9 & 12.6 & 12.3 & 12.2 & \textbf{12.1} & 12.1 & 12.1 \\ | |
| 8 | +$\le 5$ km & 16.5 & 13.8 & 13.0 & 12.7 & 12.4 & 12.2 & \textbf{12.2} & 12.2 & 12.2 \\ | |
| 9 | +$\le 10$ km & 16.5 & 13.8 & 13.0 & 12.6 & 12.4 & 12.2 & \textbf{12.1} & 12.1 & 12.1 \\ | |
| 10 | +$\le 25$ km & 16.5 & 13.8 & 13.0 & 12.6 & 12.4 & 12.2 & 12.1 & 12.1 & \textbf{12.1} \\ | |
| 11 | 11 | \bottomrule |
| 12 | 12 | \end{tabular} |
modified
paper/tables/surface_geo_none.tex
+6 −6
@@ -2,11 +2,11 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Radius & $k=1$ & $k=3$ & $k=5$ & $k=7$ & $k=10$ & $k=15$ & $k=20$ & $k=30$ & $k=50$ \\ |
| 4 | 4 | \midrule |
| 5 | −$\le 0.5$ km & 20.5 & 17.5 & 17.5 & 17.0 & 17.0 & 16.8 & \textbf{16.7} & 17.0 & 17.0 \\ | |
| 6 | −$\le 1$ km & 20.8 & 18.0 & 17.8 & 17.5 & \textbf{17.2} & 17.2 & 17.5 & 17.5 & 18.0 \\ | |
| 7 | −$\le 2$ km & 21.1 & 18.4 & 18.1 & 17.8 & \textbf{17.5} & 17.6 & 17.8 & 17.6 & 18.4 \\ | |
| 8 | −$\le 5$ km & 21.4 & 18.7 & 18.2 & 17.9 & \textbf{17.6} & 17.8 & 17.8 & 17.7 & 18.6 \\ | |
| 9 | −$\le 10$ km & 21.4 & 18.7 & 18.2 & 17.8 & 17.5 & 17.5 & 17.6 & \textbf{17.5} & 18.3 \\ | |
| 10 | −$\le 25$ km & 21.4 & 18.7 & 18.2 & 17.8 & \textbf{17.5} & 17.6 & 17.7 & 17.6 & 18.4 \\ | |
| 5 | +$\le 0.5$ km & 20.1 & 17.4 & 16.9 & 16.7 & \textbf{16.7} & 16.7 & 16.8 & 17.0 & 17.0 \\ | |
| 6 | +$\le 1$ km & 20.7 & 17.8 & 17.2 & 17.0 & \textbf{17.0} & 17.1 & 17.3 & 17.6 & 18.0 \\ | |
| 7 | +$\le 2$ km & 21.0 & 18.0 & 17.5 & 17.2 & \textbf{17.2} & 17.4 & 17.5 & 17.8 & 18.3 \\ | |
| 8 | +$\le 5$ km & 21.3 & 18.2 & 17.6 & 17.4 & \textbf{17.3} & 17.5 & 17.6 & 18.0 & 18.5 \\ | |
| 9 | +$\le 10$ km & 21.3 & 18.2 & 17.6 & 17.4 & \textbf{17.3} & 17.5 & 17.6 & 18.0 & 18.4 \\ | |
| 10 | +$\le 25$ km & 21.3 & 18.2 & 17.6 & 17.4 & \textbf{17.3} & 17.5 & 17.6 & 18.0 & 18.4 \\ | |
| 11 | 11 | \bottomrule |
| 12 | 12 | \end{tabular} |
modified
paper/tables/surface_sim_hedo.tex
+6 −6
@@ -2,11 +2,11 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Radius & $k=1$ & $k=3$ & $k=5$ & $k=7$ & $k=10$ & $k=15$ & $k=20$ & $k=30$ & $k=50$ \\ |
| 4 | 4 | \midrule |
| 5 | −$\le 0.5$ km & 14.6 & 13.1 & 12.3 & 12.1 & 11.9 & \textbf{11.7} & 12.0 & 12.2 & 12.2 \\ | |
| 6 | −$\le 1$ km & 14.9 & 12.9 & 12.2 & 12.0 & 11.7 & 11.6 & \textbf{11.6} & 11.6 & 11.9 \\ | |
| 7 | −$\le 2$ km & 15.2 & 12.9 & 12.4 & 11.9 & 11.7 & 11.7 & \textbf{11.4} & 11.4 & 11.7 \\ | |
| 8 | −$\le 5$ km & 15.7 & 13.1 & 12.6 & 12.5 & 12.0 & \textbf{11.9} & 12.0 & 12.0 & 12.1 \\ | |
| 9 | −$\le 10$ km & 16.2 & 13.4 & 12.4 & 12.4 & 12.3 & 11.9 & \textbf{11.8} & 12.1 & 12.2 \\ | |
| 10 | −$\le 25$ km & 16.3 & 13.6 & 12.8 & 12.4 & 12.5 & 12.3 & \textbf{12.0} & 12.2 & 12.3 \\ | |
| 5 | +$\le 0.5$ km & 14.8 & 12.6 & 12.0 & 11.8 & \textbf{11.7} & 11.8 & 11.9 & 12.0 & 12.1 \\ | |
| 6 | +$\le 1$ km & 15.2 & 12.7 & 12.0 & 11.8 & \textbf{11.6} & 11.6 & 11.6 & 11.7 & 11.9 \\ | |
| 7 | +$\le 2$ km & 15.5 & 12.9 & 12.1 & 11.8 & 11.5 & 11.5 & \textbf{11.4} & 11.4 & 11.6 \\ | |
| 8 | +$\le 5$ km & 16.1 & 13.3 & 12.5 & 12.1 & 11.7 & 11.6 & \textbf{11.6} & 11.6 & 11.6 \\ | |
| 9 | +$\le 10$ km & 16.4 & 13.6 & 12.7 & 12.3 & 12.0 & 11.8 & 11.7 & \textbf{11.7} & 11.8 \\ | |
| 10 | +$\le 25$ km & 16.6 & 13.7 & 12.8 & 12.4 & 12.1 & 12.0 & 11.9 & \textbf{11.9} & 12.0 \\ | |
| 11 | 11 | \bottomrule |
| 12 | 12 | \end{tabular} |
modified
paper/tables/weighting.tex
+10 −10
@@ -2,15 +2,15 @@ | ||
| 2 | 2 | \toprule |
| 3 | 3 | Weighting & Reconciliation & MdAPE 2024 & MdAPE 2025--26 & Bias & Within $\pm10\%$ \\ |
| 4 | 4 | \midrule |
| 5 | −equal & median & 14.0 & 13.5 & -0.7 & 39.4 \\ | |
| 6 | −equal & mean & 14.8 & 13.9 & -2.3 & 36.2 \\ | |
| 7 | −1/distance & median & 13.8 & 13.3 & -0.7 & 39.8 \\ | |
| 8 | −1/distance & mean & 14.6 & 13.8 & -2.2 & 36.8 \\ | |
| 9 | −recency & median & 15.5 & 14.2 & -0.2 & 38.2 \\ | |
| 10 | −recency & mean & 15.5 & 14.1 & -2.2 & 36.5 \\ | |
| 11 | −most similar & median & 13.9 & 13.8 & 0.2 & 39.0 \\ | |
| 12 | −most similar & mean & 14.0 & 13.5 & -1.8 & 38.5 \\ | |
| 13 | −distance $\times$ recency $\times$ similarity & median & 14.7 & 13.7 & 0.4 & 38.1 \\ | |
| 14 | −distance $\times$ recency $\times$ similarity & mean & 14.7 & 13.9 & -1.6 & 38.3 \\ | |
| 5 | +equal & median & 13.8 & 13.0 & -0.5 & 40.4 \\ | |
| 6 | +equal & mean & 14.6 & 13.7 & -1.8 & 38.4 \\ | |
| 7 | +1/distance & median & 13.9 & 13.1 & -0.5 & 40.3 \\ | |
| 8 | +1/distance & mean & 14.6 & 13.7 & -1.8 & 38.6 \\ | |
| 9 | +recency & median & 14.5 & 13.7 & -0.5 & 38.8 \\ | |
| 10 | +recency & mean & 14.8 & 13.9 & -1.6 & 38.0 \\ | |
| 11 | +most similar & median & 13.8 & 12.9 & -0.3 & 40.8 \\ | |
| 12 | +most similar & mean & 14.3 & 13.3 & -1.5 & 39.7 \\ | |
| 13 | +product of the three & median & 14.6 & 13.6 & -0.3 & 39.2 \\ | |
| 14 | +product of the three & mean & 14.5 & 13.5 & -1.4 & 39.3 \\ | |
| 15 | 15 | \bottomrule |
| 16 | 16 | \end{tabular} |
modified
pipeline/03_models.py
+1 −1
@@ -79,7 +79,7 @@ for m_asof in TODO: | ||
| 79 | 79 | tr["res_u"] = tr["res_m"] - tr["code_mun"].map(mun_eff).fillna(0) |
| 80 | 80 | # correction médiane : la MCO vise la moyenne du log ; la distribution est asymétrique (queue basse), on recentre sur la médiane |
| 81 | 81 | uv_tmp = tr.groupby(["code_mun", "unite_voisinage"])["res_u"].transform(lambda v: v.sum() / (len(v) + 10)) |
| 82 | − median_shift = float(np.median(tr["res_u"] - uv_tmp)) | |
| 82 | + median_shift = float(np.nanmedian(tr["res_u"] - uv_tmp.fillna(0))) | |
| 83 | 83 | uv = tr.groupby(["code_mun", "unite_voisinage"])["res_u"].agg(["sum", "count"]) |
| 84 | 84 | uv_eff = {f"{a}|{b}": v for (a, b), v in (uv["sum"] / (uv["count"] + 10)).items()} |
| 85 | 85 | # --- LightGBM (prix ajusté dans le temps) avec rôle et sans rôle |
modified
pipeline/05_analyze.py
+3 −1
@@ -126,10 +126,12 @@ for a in load_json("asof.json")["asof"]: | ||
| 126 | 126 | shift = level_shift(mod["m_asof"]) |
| 127 | 127 | fe = (T["region"].map(mod["region_fe"]).fillna(0) + T["mrc"].map(mod["mrc_eff"]).fillna(0) + T["code_mun"].map(mod["mun_eff"]).fillna(0) |
| 128 | 128 | + (T["code_mun"].astype(str) + "|" + T["unite_voisinage"].astype(str)).map(mod["uv_eff"]).fillna(0)).to_numpy() |
| 129 | − M10[mask] = (XF @ beta + fe + shift + mod["median_shift"])[mask] | |
| 129 | + M10[mask] = (XF @ beta + fe + shift)[mask] | |
| 130 | 130 | M11[mask] = (np.load(OUT / f"gbm_role_pred_{period}.npy")[T["idx"].to_numpy()] + shift)[mask] |
| 131 | 131 | M11b[mask] = (np.load(OUT / f"gbm_pred_{period}.npy")[T["idx"].to_numpy()] + shift)[mask] |
| 132 | 132 | |
| 133 | +# M10 : recentrage médian calibré sur la validation 2024 (la MCO vise la moyenne du log, distribution asymétrique) | |
| 134 | +M10 = M10 + np.nanmedian((lnP - M10)[VAL]) | |
| 133 | 135 | def e2col(sel, k, d, Tm, adj, w, recon): |
| 134 | 136 | m = (E2.sel == sel) & (E2.k == k) & (E2.d == d) & (E2["T"] == Tm) & (E2.adj == adj) & (E2.w == w) & (E2.recon == recon) |
| 135 | 137 | return int(E2.index[m][0]) |
modified
pipeline/06_report.py
+8 −8
@@ -124,12 +124,12 @@ lang: fr-CA | ||
| 124 | 124 | |
| 125 | 125 | 1. **Les ajustements sont le facteur dominant.** Prendre la moyenne des cinq ventes les plus proches, ajustées seulement pour le temps (M2), donne une erreur absolue médiane (MdAPE) de **{pct(comp[M2]['mdape'])}** ; une grille d'ajustement hédonique (M7) la ramène à **{pct(comp[M7]['mdape'])}** (−{f1(gain_adj)} points, IC 95 % de la différence de MdAPE [{f2(pr(M7, M2)['ci_mdape'][0])} ; {f2(pr(M7, M2)['ci_mdape'][1])}]). Une grille conventionnelle stylisée (M6) fait presque aussi bien ({pct(comp[M6]['mdape'])}) : ce qui compte, c'est d'ajuster, plus que la finesse de la grille. |
| 126 | 126 | 2. **Choisir des comparables semblables vaut autant qu'ajuster.** Sans aucun ajustement physique, sélectionner les cinq ventes les plus **semblables** (aire, terrain, âge, lien physique, étages) plutôt que les cinq plus **proches** fait passer la MdAPE de {pct(comp[M2]['mdape'])} à **{pct(comp[M3]['mdape'])}** (H1 confirmée : un comparable un peu plus éloigné mais semblable vaut mieux qu'un voisin dissemblable). |
| 127 | −3. **Le nombre optimal de comparables est bien supérieur à trois.** Avec la grille hédonique, la MdAPE décroît de {pct(k_curve[1])} (k = 1) à {pct(k_curve[3])} (k = 3), {pct(k_curve[5])} (k = 5), {pct(k_curve[10])} (k = 10) et atteint son minimum à **k = {k_best}** ({pct(k_curve[k_best])}) avant de remonter ({pct(k_curve[50])} à k = 50) ; l'optimum dépend de la densité du marché (H2 confirmée). | |
| 128 | −4. **Le rayon et la fenêtre temporelle doivent être larges.** La meilleure configuration de la surface Erreur(k, d, t) choisie en 2024 est « {LAB[e1b['sel']]}, k = {int(e1b['k'])}, ≤ {e1b['d']} km, {int(e1b['T'])} mois, {LAB[e1b['adj']]} » ({pct(e1b['mdape_val'])} en validation → **{pct(e1b['mdape_test'])}** en test). Les rayons de 0,5-1 km et les fenêtres de 3 mois, privilégiés par la pratique, sont dominés dès que les comparables sont ajustés. | |
| 127 | +3. **Le nombre optimal de comparables est bien supérieur à trois.** Avec la grille hédonique, la MdAPE décroît de {pct(k_curve[1])} (k = 1) à {pct(k_curve[3])} (k = 3), {pct(k_curve[5])} (k = 5), {pct(k_curve[10])} (k = 10), atteint son minimum à **k = {k_best}** ({pct(k_curve[k_best])}) et n'augmente plus jusqu'à k = 50 ({pct(k_curve[50])}), quelle que soit la densité du marché ; sans ajustement physique, l'optimum est d'environ dix et l'erreur remonte ensuite (H2 confirmée seulement pour la méthode non ajustée). | |
| 128 | +4. **La fenêtre temporelle doit être large ; le rayon importe peu.** La meilleure configuration de la surface Erreur(k, d, t) choisie en 2024 est « {LAB[e1b['sel']]}, k = {int(e1b['k'])}, ≤ {e1b['d']} km, {int(e1b['T'])} mois, {LAB[e1b['adj']]} » ({pct(e1b['mdape_val'])} en validation → **{pct(e1b['mdape_test'])}** en test). Les fenêtres de 3 mois sont dominées par 12-24 mois à tous les rayons ; au meilleur k, le rayon (0,5 à 25 km) ne change presque rien à la précision, car k est un maximum et un grand rayon n'ajoute des ventes que là où les voisines manquent. | |
| 129 | 129 | 5. **La pondération et le mode de réconciliation comptent peu** (effets marginaux moyens de {f1(min(marg['w'].values()))} à {f1(max(marg['w'].values()))} points selon la pondération, médiane {f1(marg['recon']['median'])} contre moyenne {f1(marg['recon']['mean'])}), bien moins que la sélection ({f1(min(marg['sel'].values()))}-{f1(max(marg['sel'].values()))}) et l'ajustement ({f1(min(marg['adj'].values()))}-{f1(max(marg['adj'].values()))}). |
| 130 | −6. **La meilleure méthode des comparables, entièrement transparente et choisie en 2024, atteint {pct(comp[M0]['mdape'])} en 2025-2026** (M0 : {LAB[m0['sel']]}, k = {int(m0['k'])}, ≤ {m0['d']} km, {int(m0['T'])} mois, {LAB[m0['adj']]}, pondération {LAB[m0['w']]}, {LAB[m0['recon']]}), contre **{pct(comp[M11b]['mdape'])}** pour un gradient boosting ré-entraîné chaque trimestre avec la valeur au rôle (M11b) et {pct(comp[M11a]['mdape'])} sans le rôle (M11a). L'hybride comparables + GBM (M12) atteint **{pct(comp[M12]['mdape'])}**. Le coût de la transparence est donc de {f1(comp[M0]['mdape'] - comp[M11b]['mdape'])} point{'s' if abs(comp[M0]['mdape'] - comp[M11b]['mdape']) >= 2 else ''} de MdAPE face au meilleur modèle opaque, et il s'annule dans les sous-marchés homogènes (H5). | |
| 130 | +6. **La meilleure méthode des comparables, entièrement transparente et choisie en 2024, atteint {pct(comp[M0]['mdape'])} en 2025-2026** (M0 : {LAB[m0['sel']]}, k = {int(m0['k'])}, ≤ {m0['d']} km, {int(m0['T'])} mois, {LAB[m0['adj']]}, pondération {LAB[m0['w']]}, {LAB[m0['recon']]}), contre **{pct(comp[M11b]['mdape'])}** pour un gradient boosting ré-entraîné chaque trimestre avec la valeur au rôle (M11b) et {pct(comp[M11a]['mdape'])} sans le rôle (M11a). L'hybride comparables + GBM (M12) atteint **{pct(comp[M12]['mdape'])}**. Le coût de la transparence est donc de {f1(comp[M0]['mdape'] - comp[M11b]['mdape'])} point{'s' if abs(comp[M0]['mdape'] - comp[M11b]['mdape']) >= 2 else ''} de MdAPE face au meilleur modèle opaque ({f1(comp[M0]['mdape'] - comp[M11a]['mdape'])} point sans le rôle), et il se réduit à {f1(H['H5']['homogène']['M0'] - H['H5']['homogène']['M11b'])} point dans le tiers des sous-marchés les plus homogènes (H5). | |
| 131 | 131 | 7. **Le ratio au rôle est un comparable redoutable** : rôle de la cible × ratio prix/rôle médian des cinq plus proches ventes du même rôle (M13) donne {pct(comp[M13]['mdape'])}, mieux que toute grille d'ajustement physique, mais seulement pour {pct(comp[M13]['couverture'])} des cibles. |
| 132 | −8. **La fiabilité dépend d'abord de la liquidité du sous-marché** : la MdAPE de M7 passe de {pct(dens['≥ 200']['M7'])} là où plus de 200 ventes ont eu lieu à moins de 2 km dans l'année à {pct(dens['< 5']['M7'])} là où il y en a eu moins de 5 ; des règles conditionnelles à la densité (système de recommandation) obtiennent {pct(cond_g['mdape'])} globalement avec {pct(cond_g['couverture'])} de couverture. | |
| 132 | +8. **La fiabilité dépend d'abord de la liquidité du sous-marché** : la MdAPE de M7 passe de {pct(dens['≥ 200']['M7'])} là où plus de 200 ventes ont eu lieu à moins de 2 km dans l'année à {pct(dens['< 5']['M7'])} là où il y en a eu moins de 5 ; des règles choisies strate par strate (système de recommandation) obtiennent {pct(cond_g['mdape'])} avec {pct(cond_g['couverture'])} de couverture, sans faire mieux que la meilleure règle unique ({pct(comp[M0]['mdape'])}, couverture complète) : une règle « filet large » qui retient les ventes les plus semblables dans un grand rayon s'adapte d'elle-même à la densité. | |
| 133 | 133 | |
| 134 | 134 | **Portée.** Nous validons la précision prédictive de règles professionnelles *simulées* sur des caractéristiques observables (aire, terrain, âge, étages, lien physique, rôle) ; les ajustements non observables (garage, piscine, chambres, qualité, rénovations) restent dans l'erreur résiduelle, et le jugement réel d'un évaluateur n'est pas reproduit. |
| 135 | 135 | |
@@ -197,7 +197,7 @@ Erreur absolue en pourcentage APE = |P̂ − P| / P ; MdAPE (médiane), MAPE (mo | ||
| 197 | 197 | **Sélection par similarité physique, grille hédonique, fenêtre 12 mois — MdAPE test (%)** |
| 198 | 198 | |
| 199 | 199 | {surf_tab('sim', 'hedo', 12)} |
| 200 | −Lecture. (i) Sans ajustement, l'erreur décroît avec k et avec le rayon tant que l'on reste sous quelques kilomètres, puis se stabilise ; (ii) avec la grille hédonique, elle décroît nettement plus et l'optimum se déplace vers des k et des rayons plus grands ; (iii) la fenêtre de 3 mois est systématiquement dominée par 12-24 mois dès que l'on ajuste pour le temps. Meilleures configurations de E1 par sélection × ajustement (choisies en 2024, évaluées en 2025-2026) : | |
| 200 | +Lecture. (i) Sans ajustement physique, l'erreur décroît avec k jusqu'à une dizaine de comparables puis remonte (les ventes supplémentaires sont de plus en plus dissemblables) ; (ii) avec la grille hédonique, elle décroît nettement plus, jusqu'à k ≈ 20, et ne remonte plus ; (iii) la fenêtre de 3 mois est systématiquement dominée par 12-24 mois, alors qu'au meilleur k le rayon ne change presque rien. Meilleures configurations de E1 par sélection × ajustement (choisies en 2024, évaluées en 2025-2026) : | |
| 201 | 201 | |
| 202 | 202 | {md_table(pd.DataFrame(R['E1_best_by_sel_adj']).T.reset_index().rename(columns={'index': 'sélection | ajustement', 'mdape_val': 'MdAPE val.', 'mdape_test': 'MdAPE test', 'couverture_test': 'couverture test'}), ['sélection | ajustement', 'k', 'd', 'T', 'MdAPE val.', 'MdAPE test', 'couverture test'], fmt={'k': lambda v: str(int(v)), 'T': lambda v: str(int(v)), 'd': lambda v: f1(v)})} |
| 203 | 203 | ### k optimal selon la densité (H2) |
@@ -285,7 +285,7 @@ Le biais trimestriel commun à toutes les méthodes reflète le fait que le nive | ||
| 285 | 285 | |
| 286 | 286 | ## 3.7 Intervalles de valeur |
| 287 | 287 | |
| 288 | −La dispersion des prix ajustés des comparables retenus fournit un intervalle de valeur. Avec z = 1,28 (couverture nominale de 80 % si les erreurs étaient normales), puis avec un z calibré sur la validation 2024 : | |
| 288 | +La dispersion des prix ajustés des comparables retenus fournit un intervalle de valeur — mais un intervalle large : calibré pour couvrir 80 % des prix, il s'étend sur environ ±30 % de la valeur (largeur médiane ci-dessous). Avec z = 1,28 (couverture nominale de 80 % si les erreurs étaient normales), puis avec un z calibré sur la validation 2024 : | |
| 289 | 289 | |
| 290 | 290 | {iv_md} |
| 291 | 291 | ## 3.8 Vers un système de recommandation des comparables |
@@ -293,7 +293,7 @@ La dispersion des prix ajustés des comparables retenus fournit un intervalle de | ||
| 293 | 293 | Règle choisie en 2024 pour chaque strate de densité (parmi les 2 256 configurations couvrant ≥ 95 % des cibles de la strate), évaluée en 2025-2026 : |
| 294 | 294 | |
| 295 | 295 | {rc_md} |
| 296 | −Globalement, ces règles conditionnelles atteignent une MdAPE de **{pct(cond_g['mdape'])}** ({pct(cond_g['p10'])} des estimations à ±10 %, couverture {pct(cond_g['couverture'])}), contre {pct(comp[M0]['mdape'])} pour la meilleure règle unique. | |
| 296 | +Globalement, ces règles conditionnelles atteignent une MdAPE de **{pct(cond_g['mdape'])}** ({pct(cond_g['p10'])} des estimations à ±10 %, couverture {pct(cond_g['couverture'])}), contre {pct(comp[M0]['mdape'])} à couverture complète pour la meilleure règle unique : elles ne font pas mieux. La meilleure règle unique (les {int(m0['k'])} ventes les plus semblables à ≤ {m0['d']} km et {int(m0['T'])} mois) s'adapte d'elle-même : elle utilise les ventes voisines là où elles existent et va plus loin seulement là où elles manquent. Ce que la stratification apporte, c'est le choix de l'ajustement (ratio au rôle dans les marchés denses où les comparables du même rôle abondent), pas des nombres ou des rayons propres à chaque strate. | |
| 297 | 297 | |
| 298 | 298 | # 4. Discussion |
| 299 | 299 | |
@@ -301,7 +301,7 @@ Globalement, ces règles conditionnelles atteignent une MdAPE de **{pct(cond_g[' | ||
| 301 | 301 | |
| 302 | 302 | **Ce qui contredit la pratique.** Trois comparables, un rayon de quelques centaines de mètres et une fenêtre de trois mois — les conventions les plus répandues — sont dominés sur toute la surface Erreur(k, d, t) : {pct(surf[(surf.sel == 'geo') & (surf.adj == 'hedo') & (surf.k == 3) & (surf.d == 1) & (surf['T'] == 3)].mdape_test.iloc[0])} de MdAPE (k = 3, ≤ 1 km, 3 mois, grille hédonique, couverture {pct(surf[(surf.sel == 'geo') & (surf.adj == 'hedo') & (surf.k == 3) & (surf.d == 1) & (surf['T'] == 3)].couverture_test.iloc[0])}) contre {pct(e1b['mdape_test'])} pour la meilleure configuration. La rareté des comparables « parfaits » est un argument pour élargir la recherche et ajuster, non pour se restreindre. |
| 303 | 303 | |
| 304 | −**Le rôle d'évaluation comme information.** Le ratio au rôle (M13) et le GBM avec rôle (M11b) dominent leurs équivalents sans rôle : la valeur au rôle encapsule des caractéristiques non observées ici (qualité, dépendances, état) et une appréciation locale que les modèles globaux ne captent pas. Les modèles globaux sans rôle (M10, M11a) présentent d'ailleurs un biais négatif en 2025-2026 : l'appréciation est spatialement hétérogène et un indice régional, même ré-estimé chaque trimestre, la sous-estime là où les ventes se concentrent. | |
| 304 | +**Le rôle d'évaluation comme information.** Le ratio au rôle (M13) et le GBM avec rôle (M11b) dominent leurs équivalents sans rôle : la valeur au rôle encapsule des caractéristiques non observées ici (qualité, dépendances, état) et une appréciation locale que les modèles globaux ne captent pas. Les modèles globaux estimés par moindres carrés présentaient d'ailleurs un biais médian de −5 % tant qu'ils visaient la moyenne du log (distribution asymétrique) ; ils ont été ré-estimés en régression médiane (L1) ou recentrés, et ne sont plus biaisés. | |
| 305 | 305 | |
| 306 | 306 | **Limites.** (1) Règles professionnelles simulées, non dossiers d'évaluateurs. (2) Caractéristiques limitées à celles du rôle et du registre. (3) Délai de publication des ventes ignoré. (4) Un seul type de bien (unifamilial) ; condos et plex restent à traiter. (5) Les configurations ont été choisies sur 2024 puis évaluées sur 2025-2026 : les écarts entre validation et test (tableaux ci-dessus) mesurent la stabilité des règles, et ils sont faibles. |
| 307 | 307 | |
modified
run_distributed.sh
+4 −4
@@ -13,7 +13,7 @@ rm -rf /tmp/cv-models && mkdir -p /tmp/cv-models | ||
| 13 | 13 | for n in M2U64 M3U96a M3U96b M4M64a M4M64b; do ssh $n "cd ~/comparables-validation/out/$V && tar czf - models_*.json gbm_pred_*.npy gbm_role_pred_*.npy asof.json 2>/dev/null" | tar xzf - -C /tmp/cv-models; done |
| 14 | 14 | ls /tmp/cv-models | wc -l |
| 15 | 15 | for n in M2U64 M3U96a M3U96b M4M64a M4M64b; do tar czf - -C /tmp/cv-models . | ssh $n "tar xzf - -C ~/comparables-validation/out/$V" & done; wait |
| 16 | −for n in M2U64 M3U96a M3U96b M4M64a M4M64b; do echo " $n: $(ssh $n "ls ~/comparables-validation/out/$V/models_*.json | wc -l") modèles ; rm -f shards"; ssh $n "rm -f ~/comparables-validation/out/shard-*.log ~/comparables-validation/out/$V/*shard*"; done | |
| 16 | +for n in M2U64 M3U96a M3U96b M4M64a M4M64b; do echo " $n: $(ssh $n "ls ~/comparables-validation/out/$V/models_*.json | wc -l") modèles ; rm -f shards"; ssh $n "find ~/comparables-validation/out -maxdepth 1 -name 'shard-*.log' -delete; find ~/comparables-validation/out/$V -name '*shard*' -delete; true"; done | |
| 17 | 17 | echo "== 2. lancement des $N fragments" |
| 18 | 18 | i=0 |
| 19 | 19 | for n in ${(k)SHARDS}; do |
@@ -27,10 +27,10 @@ done | ||
| 27 | 27 | echo "== 3. attente" |
| 28 | 28 | while true; do |
| 29 | 29 | done_=0 |
| 30 | − for n in ${(k)SHARDS}; do done_=$(( done_ + $(ssh $n "grep -l 'rétro-évaluation terminée' ~/comparables-validation/out/shard-*.log 2>/dev/null | wc -l") )); done | |
| 31 | − err=0; for n in ${(k)SHARDS}; do err=$(( err + $(ssh $n "grep -l Traceback ~/comparables-validation/out/shard-*.log 2>/dev/null | wc -l") )); done | |
| 30 | + for n in ${(k)SHARDS}; do done_=$(( done_ + $(ssh $n "cd ~/comparables-validation/out && grep -l 'rétro-évaluation terminée' \$(ls | grep shard-) 2>/dev/null | wc -l; true") )); done | |
| 31 | + err=0; for n in ${(k)SHARDS}; do err=$(( err + $(ssh $n "cd ~/comparables-validation/out && grep -l Traceback \$(ls | grep shard-) 2>/dev/null | wc -l; true") )); done | |
| 32 | 32 | echo " $(date +%T) fragments terminés : $done_/$N (erreurs : $err)" |
| 33 | − [ "$err" -gt 0 ] && { for n in ${(k)SHARDS}; do ssh $n "grep -B2 -A8 Traceback ~/comparables-validation/out/shard-*.log 2>/dev/null"; done; exit 1; } | |
| 33 | + [ "$err" -gt 0 ] && { for n in ${(k)SHARDS}; do ssh $n "cd ~/comparables-validation/out && grep -B2 -A8 Traceback \$(ls | grep shard-) 2>/dev/null; true"; done; exit 1; } | |
| 34 | 34 | [ "$done_" -ge "$N" ] && break |
| 35 | 35 | sleep 20 |
| 36 | 36 | done |
| 37 | 37 | |