Ch. 1 livré et validé (compilation isolée, tests, fusion des registres)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
52 changed files +3,540 −95
modified
analysis/python/cases/ch04_marches.py
+3 −0
@@ -315,6 +315,9 @@ def main(verbose: bool = True) -> dict: | |||||
| 315 | plex_like = sp.loc[[5, 6], "qc_menages"].sum(); print(f" Duplex + appartements < 5 étages, Québec : {fmt(plex_like)} ménages = {plex_like/tot.loc['Québec','total']*100:.1f} %") | 315 | plex_like = sp.loc[[5, 6], "qc_menages"].sum(); print(f" Duplex + appartements < 5 étages, Québec : {fmt(plex_like)} ménages = {plex_like/tot.loc['Québec','total']*100:.1f} %") | ||
| 316 | print("\n=== Ménages par RMR (98-10-0231-01)"); print(mr.to_string(float_format=lambda v: f"{v:.4f}")) | 316 | print("\n=== Ménages par RMR (98-10-0231-01)"); print(mr.to_string(float_format=lambda v: f"{v:.4f}")) | ||
| 317 | print("\n=== Population des RMR au 1er juillet (17-10-0148-01)"); print(pop.to_string(float_format=lambda v: f"{v:.4f}")) | 317 | print("\n=== Population des RMR au 1er juillet (17-10-0148-01)"); print(pop.to_string(float_format=lambda v: f"{v:.4f}")) | ||
| 318 | + popqc = CAL["demographie_structure"]["population_quebec_2025"]["valeur"] | ||||
| 319 | + print(f" Part des RMR dans la population du Québec 2025p ({fmt(popqc)}, ISQ) : {pop.loc['Ensemble des RMR du Québec', 2025]/popqc*100:.1f} % ; " | ||||
| 320 | + f"six RMR du chapitre : {pop.loc[[k for k in RMR_148.values() if k not in ('Drummondville','Ensemble des RMR du Québec')], 2025].sum()/popqc*100:.1f} %") | ||||
| 318 | print("\n=== IPLN (18-10-0205-01, déc. 2016 = 100)"); print(st.to_string(float_format=lambda v: f"{v:.4f}")) | 321 | print("\n=== IPLN (18-10-0205-01, déc. 2016 = 100)"); print(st.to_string(float_format=lambda v: f"{v:.4f}")) | ||
| 319 | print("\n=== SCHL — ELL octobre 2025 (fichier rmr-quebec-2025-fr.xlsx, tableaux 1.1.1/1.1.2/1.1.3/1.1.5)") | 322 | print("\n=== SCHL — ELL octobre 2025 (fichier rmr-quebec-2025-fr.xlsx, tableaux 1.1.1/1.1.2/1.1.3/1.1.5)") | ||
| 320 | cols = ["inocc_tous_2024", "inocc_tous_2025", "inocc_2_chambres_2025", "loyer_2_chambres_2024", "loyer_2_chambres_2025", "loyer_tous_2025", "univers_tous_2025", | 323 | cols = ["inocc_tous_2024", "inocc_tous_2025", "inocc_2_chambres_2025", "loyer_2_chambres_2024", "loyer_2_chambres_2025", "loyer_tous_2025", "univers_tous_2025", | ||
added
analysis/python/cases/ch17_ajustements.py
+252 −0
@@ -0,0 +1,252 @@ | |||||
| 1 | +#!/usr/bin/env python3 | ||||
| 2 | +"""Chapitre 17 — ajustements qualitatifs et quantitatifs des cinq comparables du cas 1 (Gatineau, données synthétiques). | ||||
| 3 | +Reprend exactement la sélection du chapitre 16 (traite.cas1.selection) et la grille d'ajustements dérivée du modèle | ||||
| 4 | +hédonique de référence (traite.cas1.ajustements_hedoniques). Imprime tous les chiffres cités dans le chapitre. | ||||
| 5 | +Usage (racine du dépôt) : PYTHONPATH=analysis/python python3 analysis/python/cases/ch17_ajustements.py""" | ||||
| 6 | +from __future__ import annotations | ||||
| 7 | +import sys, pathlib, math | ||||
| 8 | +import numpy as np, pandas as pd | ||||
| 9 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) | ||||
| 10 | +from traite import cas1 | ||||
| 11 | +from traite import comparables as cp | ||||
| 12 | + | ||||
| 13 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 14 | +GROUPES = ["conditions_marche", "localisation", "superficie", "terrain", "age", "qualite", "garage", "sous_sol", "piscine", "type"] | ||||
| 15 | +LIBELLES = {"conditions_marche": "Conditions du marché", "localisation": "Localisation", "superficie": "Superficie habitable", | ||||
| 16 | + "terrain": "Terrain", "age": "Âge", "qualite": "Qualité", "garage": "Garage", "sous_sol": "Sous-sol fini", | ||||
| 17 | + "piscine": "Piscine", "type": "Type de bâtiment"} | ||||
| 18 | +COLS_GROUPES = {"conditions_marche": ["mois"], "localisation": ["dist_centre"] + [f"sect_{x}" for x in cas1.SECTEURS[1:]], | ||||
| 19 | + "superficie": ["ln_S"], "terrain": ["ln_T"], "age": ["age", "age2_100"], "qualite": ["qualite"], | ||||
| 20 | + "garage": ["garage"], "sous_sol": ["sous_sol"], "piscine": ["piscine"], "type": ["etages"]} | ||||
| 21 | +TAUX_GENERATION = 1.0906 ** 0.5 - 1 # 9,06 % sur deux ans (rôle 2027-2029 de Gatineau) → 4,43 %/an composé (loi du jeu) | ||||
| 22 | + | ||||
| 23 | +# ---------------------------------------------------------------- 1. base : modèle, comparables, grille hédonique | ||||
| 24 | +def base() -> dict: | ||||
| 25 | + t = cas1.tout() | ||||
| 26 | + m = t["modele"]; comps = t["selection"]["comparables"]; s = t["sujet"] | ||||
| 27 | + adj = t["ajustements"].copy() | ||||
| 28 | + res = pd.Series(m["residus"], index=t["ventes"].index).loc[comps.index].values | ||||
| 29 | + adj["residu_log"] = res | ||||
| 30 | + adj["residu_pct"] = np.exp(res) - 1 | ||||
| 31 | + g = m["croissance_mensuelle"] | ||||
| 32 | + return {**t, "comps": comps, "adj": adj, "g_mensuel": g, "g_annuel": (1 + g) ** 12 - 1, | ||||
| 33 | + "point_sans_duan": float(t["intervalle"]["point"]), "facteur_duan": float(np.mean(np.exp(m["residus"])))} | ||||
| 34 | + | ||||
| 35 | +# ---------------------------------------------------------------- 2. cascade d'un comparable et variantes de forme | ||||
| 36 | +def dlogs(b: dict, comp_index) -> dict: | ||||
| 37 | + """Δln par groupe : β_k (x_s − x_c) pour chaque groupe d'ajustement.""" | ||||
| 38 | + m = b["modele"]; beta = pd.Series(m["beta"], index=m["X"].columns) | ||||
| 39 | + Xs = cas1.matrice(cas1.sujet_df(b["sujet"])).iloc[0] | ||||
| 40 | + Xc = cas1.matrice(b["comps"]).loc[comp_index] | ||||
| 41 | + return {g: float(sum(beta[c] * (Xs[c] - Xc[c]) for c in cols)) for g, cols in COLS_GROUPES.items()} | ||||
| 42 | + | ||||
| 43 | +def cascade(b: dict, id_vente: str, ordre: list[str] | None = None) -> pd.DataFrame: | ||||
| 44 | + """Cascade multiplicative : à chaque étape A_k = base × (exp(Δln_k) − 1), base ← base + A_k.""" | ||||
| 45 | + ordre = ordre or GROUPES | ||||
| 46 | + idx = b["comps"].index[b["comps"]["id_vente"] == id_vente][0] | ||||
| 47 | + d = dlogs(b, idx); base_ = float(b["comps"].loc[idx, "prix_vente"]) | ||||
| 48 | + rows = [{"etape": "Prix de vente", "dlog": 0.0, "pct": 0.0, "ajustement": 0.0, "base_apres": base_}] | ||||
| 49 | + for g in ordre: | ||||
| 50 | + a = base_ * (math.exp(d[g]) - 1); base_ += a | ||||
| 51 | + rows.append({"etape": LIBELLES[g], "dlog": d[g], "pct": math.exp(d[g]) - 1, "ajustement": a, "base_apres": base_}) | ||||
| 52 | + rows.append({"etape": "Prix ajusté", "dlog": sum(d.values()), "pct": math.exp(sum(d.values())) - 1, "ajustement": base_ - rows[0]["base_apres"], "base_apres": base_}) | ||||
| 53 | + return pd.DataFrame(rows) | ||||
| 54 | + | ||||
| 55 | +def formes(b: dict) -> pd.DataFrame: | ||||
| 56 | + """Trois façons d'agréger les mêmes effets : additif sur le prix brut, multiplicatif (cascade), mixte (temps en %, reste en $).""" | ||||
| 57 | + out = [] | ||||
| 58 | + for idx, c in b["comps"].iterrows(): | ||||
| 59 | + d = dlogs(b, idx); P = float(c["prix_vente"]) | ||||
| 60 | + effets = {g: math.exp(v) - 1 for g, v in d.items()} | ||||
| 61 | + additif = cp.prix_ajuste_additif(P, {g: P * e for g, e in effets.items()}) | ||||
| 62 | + multiplicatif = cp.prix_ajuste_multiplicatif(P, list(effets.values())) | ||||
| 63 | + base_t = P * (1 + effets["conditions_marche"]) | ||||
| 64 | + mixte = cp.prix_ajuste_mixte(P, [effets["conditions_marche"]], {g: base_t * e for g, e in effets.items() if g != "conditions_marche"})["prix_ajuste"] | ||||
| 65 | + out.append({"id_vente": c["id_vente"], "prix_vente": P, "additif": additif, "multiplicatif": multiplicatif, "mixte": mixte, | ||||
| 66 | + "ecart_additif_pct": additif / multiplicatif - 1, "ecart_mixte_pct": mixte / multiplicatif - 1, "somme_dlog": sum(d.values())}) | ||||
| 67 | + return pd.DataFrame(out) | ||||
| 68 | + | ||||
| 69 | +# ---------------------------------------------------------------- 3. ajustement de temps | ||||
| 70 | +def temps(b: dict, id_vente: str = "G0404") -> dict: | ||||
| 71 | + c = b["comps"][b["comps"]["id_vente"] == id_vente].iloc[0] | ||||
| 72 | + P = float(c["prix_vente"]); mois = (pd.Timestamp(b["sujet"]["date_evaluation"]) - c["date_vente"]).days / 30.4375 | ||||
| 73 | + g = b["g_mensuel"] | ||||
| 74 | + return {"id_vente": id_vente, "prix": P, "mois": mois, | ||||
| 75 | + "coefficient": P * (math.exp(math.log(1 + g) * mois) - 1), | ||||
| 76 | + "taux_compose_estime": cp.ajustement_temps_taux(P, b["g_annuel"], mois), | ||||
| 77 | + "taux_compose_generation": cp.ajustement_temps_taux(P, TAUX_GENERATION, mois), | ||||
| 78 | + "lineaire_simple": P * g * mois, | ||||
| 79 | + "indices": cp.ajustement_temps(P, 100.0, 100.0 * (1 + b["g_annuel"]) ** (mois / 12)), | ||||
| 80 | + "g_mensuel": g, "g_annuel": b["g_annuel"], "taux_generation": TAUX_GENERATION} | ||||
| 81 | + | ||||
| 82 | +# ---------------------------------------------------------------- 4. ventes appariées | ||||
| 83 | +CRITERES = {"superficie_pct": 0.05, "age_ans": 5, "mois_max": 12} | ||||
| 84 | + | ||||
| 85 | +def paires(b: dict, attribut: str, superficie_pct: float = 0.05, age_ans: float = 5, mois_max: float = 12, | ||||
| 86 | + memes: tuple = ("secteur", "type", "qualite_1a5", "piscine")) -> pd.DataFrame: | ||||
| 87 | + """Paires (avec, sans) construites dans les 600 ventes : même secteur, même type, même qualité, même piscine, autre attribut | ||||
| 88 | + binaire identique, écart d'exactement une unité sur l'attribut étudié, superficie ±superficie_pct, âge ±age_ans, dates à | ||||
| 89 | + moins de mois_max mois. La vente « sans » est ramenée à la date de la vente « avec » par le taux mensuel du modèle.""" | ||||
| 90 | + v = b["ventes"]; g = b["g_mensuel"] | ||||
| 91 | + autres = [c for c in ["garage_places", "sous_sol_fini"] if c != attribut] | ||||
| 92 | + rows = [] | ||||
| 93 | + for _, r in v.iterrows(): | ||||
| 94 | + m = v[v[attribut] == r[attribut] - 1] | ||||
| 95 | + for c in list(memes) + autres: | ||||
| 96 | + m = m[m[c] == r[c]] | ||||
| 97 | + m = m[(abs(m["superficie_habitable_m2"] / r["superficie_habitable_m2"] - 1) <= superficie_pct) & (abs(m["age"] - r["age"]) <= age_ans) | ||||
| 98 | + & (abs((m["date_vente"] - r["date_vente"]).dt.days) <= mois_max * 30.4375)] | ||||
| 99 | + for _, q in m.iterrows(): | ||||
| 100 | + dm = (r["date_vente"] - q["date_vente"]).days / 30.4375 | ||||
| 101 | + q_t = q["prix_vente"] * (1 + g) ** dm | ||||
| 102 | + rows.append({"avec": r["id_vente"], "sans": q["id_vente"], "prix_avec": r["prix_vente"], "prix_sans": q["prix_vente"], "prix_sans_temps": q_t, | ||||
| 103 | + "delta_mois": dm, "diff_brute": r["prix_vente"] - q["prix_vente"], "diff_temps": r["prix_vente"] - q_t, "pct": r["prix_vente"] / q_t - 1, | ||||
| 104 | + "superficie_avec": r["superficie_habitable_m2"], "superficie_sans": q["superficie_habitable_m2"], "secteur": r["secteur"]}) | ||||
| 105 | + return pd.DataFrame(rows) | ||||
| 106 | + | ||||
| 107 | +def resume_paires(p: pd.DataFrame) -> dict: | ||||
| 108 | + r = cp.ventes_appariees(list(p["prix_avec"]), list(p["prix_sans_temps"])) | ||||
| 109 | + r["erreur_type"] = r["ecart_type"] / math.sqrt(r["n"]) if r["n"] > 1 else float("nan") | ||||
| 110 | + r["pct_moyen"] = float(p["pct"].mean()); r["pct_median"] = float(p["pct"].median()) | ||||
| 111 | + return r | ||||
| 112 | + | ||||
| 113 | +def variantes_paires(b: dict, attribut: str) -> pd.DataFrame: | ||||
| 114 | + out = [] | ||||
| 115 | + for sp, aa, mm in [(0.05, 5, 6), (0.05, 5, 12), (0.05, 5, 18), (0.075, 5, 12), (0.05, 7, 12), (0.075, 7, 18)]: | ||||
| 116 | + p = paires(b, attribut, sp, aa, mm) | ||||
| 117 | + if len(p) > 1: | ||||
| 118 | + r = resume_paires(p) | ||||
| 119 | + out.append({"superficie_pct": sp, "age_ans": aa, "mois_max": mm, "n": r["n"], "moyenne": r["moyenne"], "mediane": r["mediane"], "ecart_type": r["ecart_type"], "erreur_type": r["erreur_type"], "pct_moyen": r["pct_moyen"]}) | ||||
| 120 | + else: | ||||
| 121 | + out.append({"superficie_pct": sp, "age_ans": aa, "mois_max": mm, "n": len(p), "moyenne": np.nan, "mediane": np.nan, "ecart_type": np.nan, "erreur_type": np.nan, "pct_moyen": np.nan}) | ||||
| 122 | + return pd.DataFrame(out) | ||||
| 123 | + | ||||
| 124 | +# ---------------------------------------------------------------- 5. Halvorsen–Palmquist et Kennedy | ||||
| 125 | +def hp_kennedy(b: dict) -> pd.DataFrame: | ||||
| 126 | + coef = b["modele"]["coef"] | ||||
| 127 | + rows = [] | ||||
| 128 | + for k in ["garage", "sous_sol", "piscine", "etages", "sect_Aylmer", "sect_Gatineau", "sect_Buckingham", "sect_Masson-Angers"]: | ||||
| 129 | + be, se = float(coef.loc[k, "coef"]), float(coef.loc[k, "se_hc1"]) | ||||
| 130 | + rows.append({"variable": k, "beta": be, "se": se, "naif_pct": be, "hp_pct": cp.ajustement_depuis_coefficient_log(be), | ||||
| 131 | + "kennedy_pct": cp.ajustement_depuis_coefficient_log_sans_biais(be, se ** 2)}) | ||||
| 132 | + return pd.DataFrame(rows) | ||||
| 133 | + | ||||
| 134 | +# ---------------------------------------------------------------- 6. grille, brut/net, pondération, réconciliation | ||||
| 135 | +def comparables_ajustes(b: dict, adj: pd.DataFrame | None = None) -> list[cp.ComparableAjuste]: | ||||
| 136 | + adj = b["adj"] if adj is None else adj | ||||
| 137 | + return [cp.ComparableAjuste(r["id_vente"], float(r["prix_vente"]), {g: float(r[g]) for g in GROUPES}) for _, r in adj.iterrows()] | ||||
| 138 | + | ||||
| 139 | +def reconcilier(b: dict, adj: pd.DataFrame | None = None) -> dict: | ||||
| 140 | + ca = comparables_ajustes(b, adj) | ||||
| 141 | + w_brut = cp.poids_inverse_brut(ca) | ||||
| 142 | + return {"comparables": ca, "grille": cp.grille(ca), "poids_inverse_brut": w_brut, | ||||
| 143 | + "egal": cp.reconciliation(ca), "inverse_brut": cp.reconciliation(ca, w_brut)} | ||||
| 144 | + | ||||
| 145 | +def analyse_qualitative(b: dict) -> pd.DataFrame: | ||||
| 146 | + """Analyse relative : pour chaque élément, le comparable est-il inférieur (ajustement > 0), égal ou supérieur (< 0) au sujet ? | ||||
| 147 | + Le net > 0 signifie « comparable globalement inférieur » : la valeur du sujet devrait dépasser son prix.""" | ||||
| 148 | + rows = [] | ||||
| 149 | + for _, r in b["adj"].iterrows(): | ||||
| 150 | + row = {"id_vente": r["id_vente"], "prix_vente": r["prix_vente"]} | ||||
| 151 | + for g in GROUPES: | ||||
| 152 | + a = r[g]; row[g] = "inf." if a > 1 else ("sup." if a < -1 else "égal") | ||||
| 153 | + row["net"] = r["prix_ajuste"] - r["prix_vente"] | ||||
| 154 | + row["position"] = "inférieur" if row["net"] > 0 else "supérieur" | ||||
| 155 | + rows.append(row) | ||||
| 156 | + q = pd.DataFrame(rows) | ||||
| 157 | + return q | ||||
| 158 | + | ||||
| 159 | +def encadrement(q: pd.DataFrame) -> dict: | ||||
| 160 | + inf = q[q["position"] == "inférieur"]["prix_vente"]; sup = q[q["position"] == "supérieur"]["prix_vente"] | ||||
| 161 | + return {"borne_basse": float(inf.max()) if len(inf) else float("nan"), "borne_haute": float(sup.min()) if len(sup) else float("nan"), | ||||
| 162 | + "n_inferieurs": int(len(inf)), "n_superieurs": int(len(sup))} | ||||
| 163 | + | ||||
| 164 | +# ---------------------------------------------------------------- 7. sensibilité | ||||
| 165 | +def grille_avec_beta(b: dict, beta_mod: pd.Series) -> pd.DataFrame: | ||||
| 166 | + m = dict(b["modele"]); m["beta"] = beta_mod.values | ||||
| 167 | + return cas1.ajustements_hedoniques(m, b["comps"], b["sujet"]) | ||||
| 168 | + | ||||
| 169 | +def sensibilite(b: dict) -> pd.DataFrame: | ||||
| 170 | + """Valeur pondérée (poids inverse du brut) lorsque les coefficients d'un groupe varient de ±1,96 erreur-type, lorsque le taux | ||||
| 171 | + de croissance change, ou lorsqu'un ajustement est omis.""" | ||||
| 172 | + m = b["modele"]; beta = pd.Series(m["beta"], index=m["X"].columns); se = m["coef"]["se_hc1"] | ||||
| 173 | + ref = reconcilier(b)["inverse_brut"]["valeur_ponderee"] | ||||
| 174 | + rows = [{"scenario": "Référence (grille hédonique)", "bas": ref, "haut": ref}] | ||||
| 175 | + for g in ["conditions_marche", "superficie", "terrain", "age", "qualite", "garage", "sous_sol"]: | ||||
| 176 | + vals = [] | ||||
| 177 | + for sgn in (-1, 1): | ||||
| 178 | + bm = beta.copy() | ||||
| 179 | + for c in COLS_GROUPES[g]: bm[c] = beta[c] + sgn * 1.96 * se[c] | ||||
| 180 | + vals.append(reconcilier(b, grille_avec_beta(b, bm))["inverse_brut"]["valeur_ponderee"]) | ||||
| 181 | + rows.append({"scenario": f"{LIBELLES[g]} : coefficient ±1,96 é.-t.", "bas": min(vals), "haut": max(vals)}) | ||||
| 182 | + # taux de croissance imposé (3 % et 6 % par an) | ||||
| 183 | + vals = [] | ||||
| 184 | + for taux in (0.03, 0.06): | ||||
| 185 | + bm = beta.copy(); bm["mois"] = math.log(1 + taux) / 12 | ||||
| 186 | + vals.append(reconcilier(b, grille_avec_beta(b, bm))["inverse_brut"]["valeur_ponderee"]) | ||||
| 187 | + rows.append({"scenario": "Conditions du marché : taux de 3 % à 6 %/an", "bas": min(vals), "haut": max(vals)}) | ||||
| 188 | + # omission d'un ajustement | ||||
| 189 | + for g in ["qualite", "age", "garage", "sous_sol", "conditions_marche"]: | ||||
| 190 | + bm = beta.copy() | ||||
| 191 | + for c in COLS_GROUPES[g]: bm[c] = 0.0 | ||||
| 192 | + v = reconcilier(b, grille_avec_beta(b, bm))["inverse_brut"]["valeur_ponderee"] | ||||
| 193 | + rows.append({"scenario": f"Omission de l'ajustement « {LIBELLES[g].lower()} »", "bas": min(v, ref), "haut": max(v, ref), "valeur": v}) | ||||
| 194 | + # pondération | ||||
| 195 | + rec = reconcilier(b) | ||||
| 196 | + rows.append({"scenario": "Pondération : égale vs inverse du brut", "bas": min(rec["egal"]["valeur_ponderee"], ref), "haut": max(rec["egal"]["valeur_ponderee"], ref)}) | ||||
| 197 | + df = pd.DataFrame(rows); df["etendue"] = df["haut"] - df["bas"] | ||||
| 198 | + return df | ||||
| 199 | + | ||||
| 200 | +# ---------------------------------------------------------------- 8. tout | ||||
| 201 | +def tout() -> dict: | ||||
| 202 | + b = base() | ||||
| 203 | + r = {"base": b, "cascade_G0404": cascade(b, "G0404"), "cascade_G0404_ordre_inverse": cascade(b, "G0404", list(reversed(GROUPES))), | ||||
| 204 | + "formes": formes(b), "temps": temps(b), "hp_kennedy": hp_kennedy(b)} | ||||
| 205 | + r["paires_garage"] = paires(b, "garage_places", **{"superficie_pct": CRITERES["superficie_pct"], "age_ans": CRITERES["age_ans"], "mois_max": CRITERES["mois_max"]}) | ||||
| 206 | + r["paires_sous_sol"] = paires(b, "sous_sol_fini", **{"superficie_pct": CRITERES["superficie_pct"], "age_ans": CRITERES["age_ans"], "mois_max": CRITERES["mois_max"]}) | ||||
| 207 | + r["resume_garage"] = resume_paires(r["paires_garage"]); r["resume_sous_sol"] = resume_paires(r["paires_sous_sol"]) | ||||
| 208 | + r["variantes_garage"] = variantes_paires(b, "garage_places"); r["variantes_sous_sol"] = variantes_paires(b, "sous_sol_fini") | ||||
| 209 | + r["reconciliation"] = reconcilier(b) | ||||
| 210 | + r["qualitatif"] = analyse_qualitative(b); r["encadrement"] = encadrement(r["qualitatif"]) | ||||
| 211 | + r["sensibilite"] = sensibilite(b) | ||||
| 212 | + # identité : prix ajusté_j = prédiction ponctuelle (sans Duan) × exp(résidu_j) | ||||
| 213 | + r["identite_residus"] = pd.DataFrame({"id_vente": b["adj"]["id_vente"], "prix_ajuste": b["adj"]["prix_ajuste"], | ||||
| 214 | + "point_x_exp_res": b["point_sans_duan"] * np.exp(b["adj"]["residu_log"])}) | ||||
| 215 | + # prix implicites hédoniques du garage et du sous-sol, au prix médian des paires et au niveau du sujet | ||||
| 216 | + coef = b["modele"]["coef"] | ||||
| 217 | + for k, attr in (("garage", "garage"), ("sous_sol", "sous_sol")): | ||||
| 218 | + eff = math.exp(coef.loc[k, "coef"]) - 1 | ||||
| 219 | + pm = float(r[f"paires_{attr}"]["prix_sans_temps"].median()) | ||||
| 220 | + r[f"implicite_{attr}"] = {"effet_pct": eff, "au_prix_median_paires": eff * pm, "prix_median_paires": pm, "au_sujet": eff * b["point_sans_duan"] / (1 + eff)} | ||||
| 221 | + return r | ||||
| 222 | + | ||||
| 223 | +def main(): | ||||
| 224 | + pd.set_option("display.width", 220); pd.set_option("display.max_columns", 30) | ||||
| 225 | + r = tout(); b = r["base"]; m = b["modele"] | ||||
| 226 | + print("== Modèle hédonique de référence : n = %d, k = %d, R² = %.3f, R² ajusté = %.3f, sigma = %.4f" % (m["n"], m["k"], m["r2"], m["r2_ajuste"], m["sigma"])) | ||||
| 227 | + print(m["coef"].round(5).to_string()) | ||||
| 228 | + print("== Croissance mensuelle %.4f %% ; taux annuel équivalent %.3f %% ; taux de génération %.3f %%" % (100 * b["g_mensuel"], 100 * b["g_annuel"], 100 * TAUX_GENERATION)) | ||||
| 229 | + print("== Grille hédonique (cascade) :\n", b["adj"].round(1).to_string(index=False)) | ||||
| 230 | + print("== Moyenne des prix ajustés %.0f ; médiane %.0f ; écart-type %.0f (prix bruts : moyenne %.0f, écart-type %.0f)" % (b["adj"].prix_ajuste.mean(), b["adj"].prix_ajuste.median(), b["adj"].prix_ajuste.std(), b["adj"].prix_vente.mean(), b["adj"].prix_vente.std())) | ||||
| 231 | + print("== Prédiction hédonique (Duan) %.0f ; point sans Duan %.0f ; facteur de Duan %.4f ; IC 95 %% [%.0f ; %.0f]" % (b["prediction_hedonique"], b["point_sans_duan"], b["facteur_duan"], b["intervalle"]["bas"], b["intervalle"]["haut"])) | ||||
| 232 | + print("== Résidus des cinq comparables (log) :", np.round(b["adj"].residu_log.values, 4), "moyenne log %.4f ; moyenne exp(e)−1 %.4f" % (b["adj"].residu_log.mean(), np.mean(np.exp(b["adj"].residu_log)) - 1)) | ||||
| 233 | + print("== Identité prix ajusté = point × exp(résidu) :\n", r["identite_residus"].round(1).to_string(index=False)) | ||||
| 234 | + print("== Cascade G0404 :\n", r["cascade_G0404"].round(4).to_string(index=False)) | ||||
| 235 | + print("== Cascade G0404, ordre inverse (même total, répartition différente) :\n", r["cascade_G0404_ordre_inverse"].round(1).to_string(index=False)) | ||||
| 236 | + print("== Formes additive / multiplicative / mixte :\n", r["formes"].round(4).to_string(index=False)) | ||||
| 237 | + t = r["temps"]; print("== Ajustement de temps G0404 (%.1f mois) : coefficient %.0f ; taux composé estimé %.0f ; taux de génération 4,43 %% %.0f ; linéaire %.0f ; indices %.0f" % (t["mois"], t["coefficient"], t["taux_compose_estime"], t["taux_compose_generation"], t["lineaire_simple"], t["indices"])) | ||||
| 238 | + for attr in ("garage", "sous_sol"): | ||||
| 239 | + rs = r[f"resume_{attr}"]; im = r[f"implicite_{attr}"] | ||||
| 240 | + print("== Paires %s : n = %d, moyenne %.0f, médiane %.0f, écart-type %.0f, erreur-type %.0f, pct moyen %.2f %% ; prix implicite hédonique %.2f %% soit %.0f au prix médian des paires (%.0f) et %.0f au niveau du sujet" % (attr, rs["n"], rs["moyenne"], rs["mediane"], rs["ecart_type"], rs["erreur_type"], 100 * rs["pct_moyen"], 100 * im["effet_pct"], im["au_prix_median_paires"], im["prix_median_paires"], im["au_sujet"])) | ||||
| 241 | + print(r[f"variantes_{attr}"].round(2).to_string(index=False)) | ||||
| 242 | + print("== Halvorsen–Palmquist / Kennedy :\n", r["hp_kennedy"].round(5).to_string(index=False)) | ||||
| 243 | + rec = r["reconciliation"] | ||||
| 244 | + print("== Poids inverse du brut :", np.round(rec["poids_inverse_brut"], 3)) | ||||
| 245 | + print("== Réconciliation égale :", {k: (round(v, 1) if isinstance(v, float) else v) for k, v in rec["egal"].items() if k != "poids"}) | ||||
| 246 | + print("== Réconciliation inverse du brut :", {k: (round(v, 1) if isinstance(v, float) else v) for k, v in rec["inverse_brut"].items() if k != "poids"}) | ||||
| 247 | + print("== Analyse qualitative :\n", r["qualitatif"].to_string(index=False)); print("== Encadrement :", r["encadrement"]) | ||||
| 248 | + print("== Sensibilité :\n", r["sensibilite"].round(0).to_string(index=False)) | ||||
| 249 | + return r | ||||
| 250 | + | ||||
| 251 | +if __name__ == "__main__": | ||||
| 252 | + main() | ||||
added
analysis/python/cases/ch18_hedonique.py
+375 −0
@@ -0,0 +1,375 @@ | |||||
| 1 | +#!/usr/bin/env python3 | ||||
| 2 | +"""Chapitre 18 — Modèles hédoniques : exemple intégral sur les 600 ventes du cas 1 (Gatineau, DONNÉES SYNTHÉTIQUES, graine 20261031). | ||||
| 3 | + | ||||
| 4 | +Le modèle de référence est `traite.cas1.hedonique` (semi-log, HC1) ; il n'est PAS redéfini ici (les ch. 17, 19, 20, 35, 37, 39, 45 s'y réfèrent). | ||||
| 5 | +Ce script ajoute : la comparaison des coefficients estimés aux paramètres de génération (data/synthetic/README.md), les variantes de | ||||
| 6 | +spécification (linéaire, log-log, Box–Cox, sans secteurs, indicatrices trimestrielles), les diagnostics (Breusch–Pagan, Jarque–Bera, VIF, | ||||
| 7 | +distances de Cook, I de Moran des résidus), les prix implicites au sujet (en $), la prédiction avec correction de Duan et son intervalle, | ||||
| 8 | +les statistiques de ratio (COD, PRD, PRB) du modèle et du rôle fictif, et l'analyse de sensibilité (spécification, sous-échantillons). | ||||
| 9 | +Usage (racine du dépôt) : PYTHONPATH=analysis/python python3 analysis/python/cases/ch18_hedonique.py""" | ||||
| 10 | +from __future__ import annotations | ||||
| 11 | +import sys, math, pathlib | ||||
| 12 | +import numpy as np, pandas as pd | ||||
| 13 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) | ||||
| 14 | +from traite import cas1 | ||||
| 15 | +from traite import hedonique as h | ||||
| 16 | +from scipy import stats, optimize | ||||
| 17 | + | ||||
| 18 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 19 | +GRAINE = 20261031 | ||||
| 20 | + | ||||
| 21 | +# ----------------------------------------------------------------------------- paramètres de génération (README synthétique) | ||||
| 22 | +_g = (1 + 9.06 / 100) ** 0.5 - 1 # croissance annuelle composée du jeu (variation du rôle 2027-2029 sur deux ans) | ||||
| 23 | +VRAIS = {"ln_S": 0.55, "ln_T": 0.10, "age": -0.0055, "age2_100": 0.0030, "qualite": 0.06, "garage": 0.035, "sous_sol": 0.03, | ||||
| 24 | + "piscine": 0.02, "etages": 0.02, "dist_centre": -0.006, | ||||
| 25 | + "sect_Gatineau": math.log(464_900 / 475_000), "sect_Aylmer": math.log(530_000 / 475_000), | ||||
| 26 | + "sect_Buckingham": math.log(395_000 / 475_000), "sect_Masson-Angers": math.log(395_000 / 475_000) - 0.02, | ||||
| 27 | + "mois": math.log1p(_g) / 12, "sigma": 0.085} | ||||
| 28 | +ETIQUETTES = {"const": "Constante", "ln_S": "ln(superficie habitable / 140 m²)", "ln_T": "ln(terrain / 560 m²)", "age": "Âge (années)", | ||||
| 29 | + "age2_100": "Âge² / 100", "qualite": "Qualité (écart à 3)", "garage": "Garage (places)", "sous_sol": "Sous-sol fini", | ||||
| 30 | + "piscine": "Piscine", "etages": "À étages", "dist_centre": "Distance au centre au-delà de 3 km (km)", | ||||
| 31 | + "sect_Gatineau": "Secteur Gatineau", "sect_Aylmer": "Secteur Aylmer", "sect_Buckingham": "Secteur Buckingham", | ||||
| 32 | + "sect_Masson-Angers": "Secteur Masson-Angers", "mois": "Mois depuis le 1er juillet 2024"} | ||||
| 33 | + | ||||
| 34 | +# ----------------------------------------------------------------------------- utilitaires | ||||
| 35 | +def _duan(res: np.ndarray) -> float: | ||||
| 36 | + return float(np.mean(np.exp(res))) | ||||
| 37 | + | ||||
| 38 | +def ratios(valeurs: np.ndarray, prix: np.ndarray) -> dict: | ||||
| 39 | + return h.statistiques_ratio(valeurs, prix) | ||||
| 40 | + | ||||
| 41 | +def _rmse(a, b) -> float: | ||||
| 42 | + a = np.asarray(a, float); b = np.asarray(b, float) | ||||
| 43 | + return float(np.sqrt(np.mean((a - b) ** 2))) | ||||
| 44 | + | ||||
| 45 | +def trimestre(d: pd.Series) -> np.ndarray: | ||||
| 46 | + d = pd.to_datetime(d) | ||||
| 47 | + return ((d.dt.year - 2023) * 4 + (d.dt.month - 1) // 3).to_numpy() | ||||
| 48 | + | ||||
| 49 | +# ----------------------------------------------------------------------------- variantes de spécification | ||||
| 50 | +def matrice_lineaire(v: pd.DataFrame) -> pd.DataFrame: | ||||
| 51 | + """Forme linéaire : mêmes variables, superficie et terrain en niveaux (m²).""" | ||||
| 52 | + X = cas1.matrice(v).copy() | ||||
| 53 | + X["S"] = v["superficie_habitable_m2"].astype(float); X["T"] = v["superficie_terrain_m2"].astype(float) | ||||
| 54 | + X = X.drop(columns=["ln_S", "ln_T"]) | ||||
| 55 | + return X[["const", "S", "T"] + [c for c in X.columns if c not in ("const", "S", "T")]] | ||||
| 56 | + | ||||
| 57 | +def matrice_loglog(v: pd.DataFrame) -> pd.DataFrame: | ||||
| 58 | + """Forme log-log : l'âge entre en logarithme (ln(1 + âge)) à la place du polynôme.""" | ||||
| 59 | + X = cas1.matrice(v).copy() | ||||
| 60 | + X["ln_age"] = np.log1p(v["age"].astype(float)) | ||||
| 61 | + X = X.drop(columns=["age", "age2_100"]) | ||||
| 62 | + return X[["const", "ln_S", "ln_T", "ln_age"] + [c for c in X.columns if c not in ("const", "ln_S", "ln_T", "ln_age")]] | ||||
| 63 | + | ||||
| 64 | +def matrice_sans_secteurs(v: pd.DataFrame) -> pd.DataFrame: | ||||
| 65 | + X = cas1.matrice(v) | ||||
| 66 | + return X[[c for c in X.columns if not c.startswith("sect_")]] | ||||
| 67 | + | ||||
| 68 | +def matrice_trimestres(v: pd.DataFrame) -> pd.DataFrame: | ||||
| 69 | + """Indicatrices trimestrielles (2023T1 = référence) à la place de la tendance linéaire `mois`.""" | ||||
| 70 | + X = cas1.matrice(v).drop(columns=["mois"]) | ||||
| 71 | + q = trimestre(v["date_vente"]) | ||||
| 72 | + for k in range(1, int(q.max()) + 1): | ||||
| 73 | + X[f"trim_{k}"] = (q == k).astype(float) | ||||
| 74 | + return X | ||||
| 75 | + | ||||
| 76 | +def boxcox_profil(P: np.ndarray, X: np.ndarray) -> dict: | ||||
| 77 | + """Transformation de Box–Cox (1964) de la variable dépendante : y(λ) = (P^λ − 1)/λ, λ = 0 → ln P. | ||||
| 78 | + Log-vraisemblance concentrée : ℓ(λ) = −(n/2) ln(SCR_λ / n) + (λ − 1) Σ ln P. IC à 95 % : ℓ(λ) ≥ ℓ_max − χ²₁(0,95)/2.""" | ||||
| 79 | + P = np.asarray(P, float); n = len(P); slog = np.log(P).sum() | ||||
| 80 | + def y_l(l): return np.log(P) if abs(l) < 1e-8 else (P ** l - 1) / l | ||||
| 81 | + def ll(l): | ||||
| 82 | + y = y_l(l); b = np.linalg.lstsq(X, y, rcond=None)[0]; r = y - X @ b | ||||
| 83 | + return -(n / 2) * np.log(r @ r / n) + (l - 1) * slog | ||||
| 84 | + opt = optimize.minimize_scalar(lambda l: -ll(l), bounds=(-1.0, 1.5), method="bounded") | ||||
| 85 | + lam = float(opt.x); llmax = ll(lam); seuil = llmax - stats.chi2.ppf(0.95, 1) / 2 | ||||
| 86 | + bas = optimize.brentq(lambda l: ll(l) - seuil, -1.0, lam); haut = optimize.brentq(lambda l: ll(l) - seuil, lam, 1.5) | ||||
| 87 | + grille = np.linspace(-0.6, 1.2, 73) | ||||
| 88 | + return {"lambda": lam, "ic95": (float(bas), float(haut)), "ll_max": float(llmax), "ll_0": float(ll(0.0)), "ll_1": float(ll(1.0)), | ||||
| 89 | + "grille": grille, "ll_grille": np.array([ll(l) for l in grille]), "y": y_l(lam)} | ||||
| 90 | + | ||||
| 91 | +def _predire_lineaire(beta, X): return X @ beta | ||||
| 92 | + | ||||
| 93 | +def ajuster_variantes(v: pd.DataFrame, s: dict, ref: dict) -> dict: | ||||
| 94 | + """Estime les variantes et renvoie, pour chacune : R², σ, RMSE en $, COD, prédiction du sujet.""" | ||||
| 95 | + P = v["prix_vente"].astype(float).to_numpy(); lnP = np.log(P) | ||||
| 96 | + sd = cas1.sujet_df(s) | ||||
| 97 | + out = {} | ||||
| 98 | + # --- référence (semi-log) | ||||
| 99 | + out["semi-log (référence)"] = {"r2": ref["r2"], "r2_ajuste": ref["r2_ajuste"], "sigma": ref["sigma"], "k": ref["k"], | ||||
| 100 | + "ajuste": np.exp(ref["X"].values @ ref["beta"]) * _duan(ref["residus"]), "sujet": float(cas1.predire(ref, sd)[0])} | ||||
| 101 | + # --- linéaire | ||||
| 102 | + XL = matrice_lineaire(v); rL = h.mco(XL.values, P) | ||||
| 103 | + XLs = matrice_lineaire(sd)[XL.columns].values | ||||
| 104 | + out["linéaire"] = {"r2": rL["r2"], "r2_ajuste": rL["r2_ajuste"], "sigma": float(np.sqrt(rL["sigma2"])), "k": rL["k"], | ||||
| 105 | + "ajuste": XL.values @ rL["beta"], "sujet": float((XLs @ rL["beta"])[0]), "mco": rL, "X": XL} | ||||
| 106 | + # --- log-log | ||||
| 107 | + XG = matrice_loglog(v); rG = h.mco(XG.values, lnP) | ||||
| 108 | + XGs = matrice_loglog(sd)[XG.columns].values | ||||
| 109 | + out["log-log"] = {"r2": rG["r2"], "r2_ajuste": rG["r2_ajuste"], "sigma": float(np.sqrt(rG["sigma2"])), "k": rG["k"], | ||||
| 110 | + "ajuste": np.exp(XG.values @ rG["beta"]) * _duan(rG["residus"]), "sujet": float(np.exp(XGs @ rG["beta"])[0] * _duan(rG["residus"])), | ||||
| 111 | + "mco": rG, "X": XG} | ||||
| 112 | + # --- Box–Cox | ||||
| 113 | + X0 = ref["X"].values; bc = boxcox_profil(P, X0) | ||||
| 114 | + rB = h.mco(X0, bc["y"]); lam = bc["lambda"] | ||||
| 115 | + def inv(yl): return np.exp(yl) if abs(lam) < 1e-8 else np.power(np.maximum(lam * yl + 1, 1e-9), 1 / lam) | ||||
| 116 | + Xs0 = cas1.matrice(sd)[ref["X"].columns].values | ||||
| 117 | + # retransformation par lissage de Duan généralisé : moyenne des inv(ŷ + e_i) | ||||
| 118 | + aj_bc = np.array([np.mean(inv(yh + rB["residus"])) for yh in (X0 @ rB["beta"])]) | ||||
| 119 | + out["Box–Cox"] = {"r2": rB["r2"], "r2_ajuste": rB["r2_ajuste"], "sigma": float(np.sqrt(rB["sigma2"])), "k": rB["k"], "lambda": lam, | ||||
| 120 | + "ic95": bc["ic95"], "ajuste": aj_bc, "sujet": float(np.mean(inv((Xs0 @ rB["beta"])[0] + rB["residus"]))), "mco": rB, "boxcox": bc} | ||||
| 121 | + # --- sans secteurs | ||||
| 122 | + XS = matrice_sans_secteurs(v); rS = h.mco(XS.values, lnP) | ||||
| 123 | + XSs = matrice_sans_secteurs(sd)[XS.columns].values | ||||
| 124 | + out["semi-log sans secteurs"] = {"r2": rS["r2"], "r2_ajuste": rS["r2_ajuste"], "sigma": float(np.sqrt(rS["sigma2"])), "k": rS["k"], | ||||
| 125 | + "ajuste": np.exp(XS.values @ rS["beta"]) * _duan(rS["residus"]), "sujet": float(np.exp(XSs @ rS["beta"])[0] * _duan(rS["residus"])), | ||||
| 126 | + "mco": rS, "X": XS, "coef": pd.Series(rS["beta"], index=XS.columns), "se": pd.Series(rS["se_hc1"], index=XS.columns)} | ||||
| 127 | + # --- indicatrices trimestrielles | ||||
| 128 | + XT = matrice_trimestres(v); rT = h.mco(XT.values, lnP) | ||||
| 129 | + # sujet : date d'évaluation 2026-09-01 → trimestre 2026T3 (= dernier trimestre observé) | ||||
| 130 | + sdT = cas1.matrice(sd).drop(columns=["mois"]) | ||||
| 131 | + for c in XT.columns: | ||||
| 132 | + if c.startswith("trim_"): sdT[c] = 0.0 | ||||
| 133 | + sdT[f"trim_{int(trimestre(sd['date_vente']).max())}"] = 1.0 | ||||
| 134 | + XTs = sdT[XT.columns].values | ||||
| 135 | + out["semi-log, indicatrices trimestrielles"] = {"r2": rT["r2"], "r2_ajuste": rT["r2_ajuste"], "sigma": float(np.sqrt(rT["sigma2"])), "k": rT["k"], | ||||
| 136 | + "ajuste": np.exp(XT.values @ rT["beta"]) * _duan(rT["residus"]), "sujet": float(np.exp(XTs @ rT["beta"])[0] * _duan(rT["residus"])), | ||||
| 137 | + "mco": rT, "X": XT} | ||||
| 138 | + for nom, d in out.items(): | ||||
| 139 | + d["rmse"] = _rmse(d["ajuste"], P); d["ratios"] = ratios(d["ajuste"], P) | ||||
| 140 | + return out | ||||
| 141 | + | ||||
| 142 | +# ----------------------------------------------------------------------------- diagnostics | ||||
| 143 | +def breusch_pagan(X: np.ndarray, res: np.ndarray) -> dict: | ||||
| 144 | + """Test de Breusch–Pagan (1979), version studentisée de Koenker : LM = n·R² de la régression de e² sur X ; χ²(k − 1).""" | ||||
| 145 | + e2 = res ** 2 | ||||
| 146 | + r = h.mco(X, e2, robuste=False) | ||||
| 147 | + n, k = X.shape; LM = n * r["r2"] | ||||
| 148 | + return {"LM": float(LM), "ddl": k - 1, "p": float(1 - stats.chi2.cdf(LM, k - 1))} | ||||
| 149 | + | ||||
| 150 | +def vif(X: pd.DataFrame) -> pd.Series: | ||||
| 151 | + cols = [c for c in X.columns if c != "const"] | ||||
| 152 | + out = {} | ||||
| 153 | + for c in cols: | ||||
| 154 | + autres = X[[k for k in X.columns if k != c]].values | ||||
| 155 | + r = h.mco(autres, X[c].values, robuste=False) | ||||
| 156 | + out[c] = 1.0 / max(1.0 - r["r2"], 1e-12) | ||||
| 157 | + return pd.Series(out) | ||||
| 158 | + | ||||
| 159 | +def cook(X: np.ndarray, res: np.ndarray, sigma2: float) -> dict: | ||||
| 160 | + n, k = X.shape | ||||
| 161 | + H = X @ np.linalg.pinv(X.T @ X) @ X.T | ||||
| 162 | + hii = np.diag(H) | ||||
| 163 | + D = res ** 2 * hii / (k * sigma2 * (1 - hii) ** 2) | ||||
| 164 | + return {"D": D, "h": hii, "seuil": 4.0 / n, "n_sup": int((D > 4.0 / n).sum())} | ||||
| 165 | + | ||||
| 166 | +def moran_residus(v: pd.DataFrame, res: np.ndarray, k: int = 8) -> dict: | ||||
| 167 | + coords = np.column_stack([(v["lat"] - 45.428) * 111.0, (v["lon"] + 75.714) * 78.0]) | ||||
| 168 | + W = h.matrice_poids_knn(coords, k) | ||||
| 169 | + return h.moran_i(res, W) | ||||
| 170 | + | ||||
| 171 | +def diagnostics(v: pd.DataFrame, ref: dict) -> dict: | ||||
| 172 | + X = ref["X"]; res = ref["residus"] | ||||
| 173 | + jb = stats.jarque_bera(res) | ||||
| 174 | + return {"breusch_pagan": breusch_pagan(X.values, res), "jarque_bera": {"stat": float(jb.statistic), "p": float(jb.pvalue)}, | ||||
| 175 | + "skew": float(stats.skew(res)), "kurtosis": float(stats.kurtosis(res, fisher=False)), | ||||
| 176 | + "vif": vif(X), "cook": cook(X.values, res, ref["sigma"] ** 2), "moran": moran_residus(v, res), | ||||
| 177 | + "res_min": float(res.min()), "res_max": float(res.max()), "pct_abs_sup_15": float(np.mean(np.abs(res) > 0.15) * 100)} | ||||
| 178 | + | ||||
| 179 | +# ----------------------------------------------------------------------------- prix implicites au sujet | ||||
| 180 | +def prix_implicites_sujet(ref: dict, s: dict) -> pd.DataFrame: | ||||
| 181 | + """Prix implicites en dollars au sujet, dérivés du semi-log autour de la prédiction corrigée P̂_s (Duan). | ||||
| 182 | + Continues : ∂P/∂x = β P̂ (× dérivée de la transformation) ; indicatrices : P̂ [exp(β) − 1] (Halvorsen–Palmquist) et Kennedy.""" | ||||
| 183 | + beta = pd.Series(ref["beta"], index=ref["X"].columns); se = pd.Series(np.sqrt(np.diag(ref["V_hc1"])), index=ref["X"].columns) | ||||
| 184 | + sd = cas1.sujet_df(s); Ps = float(cas1.predire(ref, sd)[0]); xs = cas1.matrice(sd).iloc[0] | ||||
| 185 | + S = float(s["superficie_habitable_m2"]); T = float(s["superficie_terrain_m2"]); age = float(s["age"]) | ||||
| 186 | + rows = [] | ||||
| 187 | + def cont(nom, unite, b, scale, se_b): | ||||
| 188 | + rows.append({"caracteristique": nom, "unite": unite, "type": "continue", "beta": b, "prix_implicite": b * Ps * scale, "se": abs(scale) * Ps * se_b}) | ||||
| 189 | + cont("Superficie habitable", "$/m²", beta["ln_S"], 1.0 / S, se["ln_S"]) | ||||
| 190 | + cont("Superficie du terrain", "$/m²", beta["ln_T"], 1.0 / T, se["ln_T"]) | ||||
| 191 | + d_age = beta["age"] + 2 * beta["age2_100"] * age / 100.0 | ||||
| 192 | + se_age = math.sqrt(ref["V_hc1"][list(beta.index).index("age"), list(beta.index).index("age")] | ||||
| 193 | + + (2 * age / 100) ** 2 * ref["V_hc1"][list(beta.index).index("age2_100"), list(beta.index).index("age2_100")] | ||||
| 194 | + + 2 * (2 * age / 100) * ref["V_hc1"][list(beta.index).index("age"), list(beta.index).index("age2_100")]) | ||||
| 195 | + rows.append({"caracteristique": "Âge (une année de plus, à 28 ans)", "unite": "$/an", "type": "continue", "beta": d_age, "prix_implicite": d_age * Ps, "se": Ps * se_age}) | ||||
| 196 | + cont("Conditions du marché (un mois)", "$/mois", beta["mois"], 1.0, se["mois"]) | ||||
| 197 | + rows.append({"caracteristique": "Distance au centre (sujet à 2,1 km : dans le plateau)", "unite": "$/km", "type": "continue", "beta": beta["dist_centre"], "prix_implicite": 0.0, "se": 0.0}) | ||||
| 198 | + def disc(nom, col, direction=+1): | ||||
| 199 | + b = beta[col] * direction; v = se[col] ** 2 | ||||
| 200 | + hp = Ps * (math.exp(b) - 1); ken = Ps * (math.exp(b - v / 2) - 1) | ||||
| 201 | + rows.append({"caracteristique": nom, "unite": "$", "type": "indicatrice", "beta": beta[col], "prix_implicite": hp, "kennedy": ken, "se": Ps * math.exp(b) * se[col]}) | ||||
| 202 | + rows.append({"caracteristique": "Qualité (un échelon de plus)", "unite": "$", "type": "indicatrice", "beta": beta["qualite"], | ||||
| 203 | + "prix_implicite": Ps * (math.exp(beta["qualite"]) - 1), "kennedy": Ps * (math.exp(beta["qualite"] - se["qualite"] ** 2 / 2) - 1), "se": Ps * math.exp(beta["qualite"]) * se["qualite"]}) | ||||
| 204 | + disc("Garage (une place de plus)", "garage") | ||||
| 205 | + disc("Sous-sol fini (contribution : fini vs non fini)", "sous_sol") | ||||
| 206 | + disc("Piscine (ajout)", "piscine") | ||||
| 207 | + disc("Cottage à étages vs plain-pied", "etages") | ||||
| 208 | + disc("Secteur Aylmer vs Hull", "sect_Aylmer") | ||||
| 209 | + disc("Secteur Gatineau vs Hull", "sect_Gatineau") | ||||
| 210 | + df = pd.DataFrame(rows); df["P_sujet"] = Ps | ||||
| 211 | + return df | ||||
| 212 | + | ||||
| 213 | +# ----------------------------------------------------------------------------- prédiction et intervalle | ||||
| 214 | +def prediction_sujet(ref: dict, s: dict) -> dict: | ||||
| 215 | + sd = cas1.sujet_df(s); X = cas1.matrice(sd)[ref["X"].columns].values | ||||
| 216 | + lnp = float((X @ ref["beta"])[0]); xVx = float((X @ ref["V_hc1"] @ X.T)[0, 0]) | ||||
| 217 | + duan = _duan(ref["residus"]); logn = math.exp(ref["sigma"] ** 2 / 2) | ||||
| 218 | + ip = cas1.intervalle_prediction(ref, sd).iloc[0] | ||||
| 219 | + ip80 = cas1.intervalle_prediction(ref, sd, 0.80).iloc[0] | ||||
| 220 | + # prédiction à la date de référence du rôle fictif (2024-07-01) pour la comparaison avec la valeur au rôle | ||||
| 221 | + sd_ref = cas1.sujet_df(s, "2024-07-01"); p_ref = float(cas1.predire(ref, sd_ref)[0]) | ||||
| 222 | + return {"ln_pred": lnp, "naif": math.exp(lnp), "duan": math.exp(lnp) * duan, "facteur_duan": duan, "facteur_lognormal": logn, | ||||
| 223 | + "lognormal": math.exp(lnp) * logn, "xVx": xVx, "sigma2": ref["sigma"] ** 2, "sd_pred": math.sqrt(ref["sigma"] ** 2 + xVx), | ||||
| 224 | + "ic95": (float(ip["bas"]), float(ip["haut"])), "ic80": (float(ip80["bas"]), float(ip80["haut"])), | ||||
| 225 | + "pred_2024_07": p_ref, "ratio_role": float(s["valeur_role_2025"]) / p_ref} | ||||
| 226 | + | ||||
| 227 | +# ----------------------------------------------------------------------------- validation croisée et ratios | ||||
| 228 | +def validation_croisee(v: pd.DataFrame, nfolds: int = 10, graine: int = GRAINE) -> dict: | ||||
| 229 | + rng = np.random.default_rng(graine) | ||||
| 230 | + X = cas1.matrice(v).values; lnP = np.log(v["prix_vente"].astype(float).to_numpy()); P = np.exp(lnP) | ||||
| 231 | + idx = rng.permutation(len(P)); folds = np.array_split(idx, nfolds) | ||||
| 232 | + pred = np.empty_like(P) | ||||
| 233 | + for f in folds: | ||||
| 234 | + tr = np.setdiff1d(idx, f); r = h.mco(X[tr], lnP[tr]) | ||||
| 235 | + pred[f] = np.exp(X[f] @ r["beta"]) * _duan(r["residus"]) | ||||
| 236 | + return {"pred": pred, "rmse": _rmse(pred, P), "ratios": ratios(pred, P), "erreur_abs_pct_mediane": float(np.median(np.abs(pred / P - 1)) * 100)} | ||||
| 237 | + | ||||
| 238 | +def ratios_role_fictif(v: pd.DataFrame, ref: dict) -> dict: | ||||
| 239 | + """Étude de ratios du rôle fictif : valeur au rôle / prix ramené à la date de référence (2024-07-01) par la tendance du modèle.""" | ||||
| 240 | + bm = ref["beta"][list(ref["X"].columns).index("mois")] | ||||
| 241 | + prix_ref = v["prix_vente"].astype(float).to_numpy() * np.exp(-bm * ref["X"]["mois"].to_numpy()) | ||||
| 242 | + return {"ratios": ratios(v["valeur_role_2025"].to_numpy(float), prix_ref), "prix_ref": prix_ref, | ||||
| 243 | + "r": v["valeur_role_2025"].to_numpy(float) / prix_ref} | ||||
| 244 | + | ||||
| 245 | +def indice_trimestriel(variantes: dict, ref: dict, v: pd.DataFrame) -> pd.DataFrame: | ||||
| 246 | + rT = variantes["semi-log, indicatrices trimestrielles"]["mco"]; XT = variantes["semi-log, indicatrices trimestrielles"]["X"] | ||||
| 247 | + cols = [c for c in XT.columns if c.startswith("trim_")] | ||||
| 248 | + bq = np.array([rT["beta"][list(XT.columns).index(c)] for c in cols]); seq = np.array([rT["se_hc1"][list(XT.columns).index(c)] for c in cols]) | ||||
| 249 | + idx = h.indice_dummies_temps(bq) | ||||
| 250 | + q = np.arange(len(cols) + 1) | ||||
| 251 | + # tendance : mois au milieu de chaque trimestre depuis 2024-07-01, normalisée à 2023T1 | ||||
| 252 | + mid = pd.to_datetime([f"{2023 + k // 4}-{3 * (k % 4) + 2:02d}-15" for k in q]) | ||||
| 253 | + mois_mid = (mid - cas1.REF_DATE).days / 30.4375 | ||||
| 254 | + bm = ref["beta"][list(ref["X"].columns).index("mois")] | ||||
| 255 | + tend = 100 * np.exp(bm * (mois_mid - mois_mid[0])) | ||||
| 256 | + lab = [f"{2023 + k // 4}T{k % 4 + 1}" for k in q] | ||||
| 257 | + return pd.DataFrame({"trimestre": lab, "indice_dummies": idx, "bas": np.concatenate([[100], 100 * np.exp(bq - 1.96 * seq)]), | ||||
| 258 | + "haut": np.concatenate([[100], 100 * np.exp(bq + 1.96 * seq)]), "indice_tendance": tend, | ||||
| 259 | + "n_ventes": [int((trimestre(v["date_vente"]) == k).sum()) for k in q]}) | ||||
| 260 | + | ||||
| 261 | +# ----------------------------------------------------------------------------- sensibilité : sous-échantillons | ||||
| 262 | +def sensibilite_echantillon(v: pd.DataFrame, s: dict, ref: dict, diag: dict) -> pd.DataFrame: | ||||
| 263 | + sd = cas1.sujet_df(s); Xs_full = cas1.matrice(sd) | ||||
| 264 | + def fit(sub: pd.DataFrame, nom: str): | ||||
| 265 | + X = cas1.matrice(sub); y = np.log(sub["prix_vente"].astype(float)).values | ||||
| 266 | + garder = [c for c in X.columns if X[c].std() > 0 or c == "const"] | ||||
| 267 | + X = X[garder]; r = h.mco(X.values, y) | ||||
| 268 | + p = float(np.exp((Xs_full[garder].values @ r["beta"])[0]) * _duan(r["residus"])) | ||||
| 269 | + bS = r["beta"][garder.index("ln_S")] | ||||
| 270 | + return {"echantillon": nom, "n": len(sub), "r2": r["r2"], "sigma": float(np.sqrt(r["sigma2"])), "beta_ln_S": bS, "sujet": p} | ||||
| 271 | + rows = [fit(v, "600 ventes (référence)")] | ||||
| 272 | + rows.append(fit(v[v["secteur"] == "Hull"], "Secteur Hull seulement")) | ||||
| 273 | + mois_av = (pd.Timestamp(s["date_evaluation"]) - v["date_vente"]).dt.days / 30.4375 | ||||
| 274 | + rows.append(fit(v[mois_av <= 18], "Ventes des 18 derniers mois")) | ||||
| 275 | + rows.append(fit(v[v["type"] == "à étages"], "Cottages à étages seulement")) | ||||
| 276 | + rows.append(fit(v[diag["cook"]["D"] <= diag["cook"]["seuil"]], "Sans les observations influentes (Cook > 4/n)")) | ||||
| 277 | + rows.append(fit(v[(v["superficie_habitable_m2"].between(110, 230))], "Superficie de 110 à 230 m²")) | ||||
| 278 | + return pd.DataFrame(rows) | ||||
| 279 | + | ||||
| 280 | +# ----------------------------------------------------------------------------- exercices (chiffres des solutions) | ||||
| 281 | +def exercices(ref: dict, pred: dict, vari: dict, idx: pd.DataFrame) -> dict: | ||||
| 282 | + ex = {} | ||||
| 283 | + # 18.1 : interprétation des coefficients | ||||
| 284 | + ex["1"] = {"elasticite_S": 0.539, "garage_hp": math.exp(0.0324) - 1, "buck_hp": math.exp(-0.250) - 1, "buck_kennedy": math.exp(-0.250 - 0.072 ** 2 / 2) - 1, | ||||
| 285 | + "mois_annuel": (1 + 0.0036) ** 12 - 1} | ||||
| 286 | + # 18.2 : prix implicites à partir de coefficients arrondis | ||||
| 287 | + P, S = 638_000.0, 165.0 | ||||
| 288 | + ex["2"] = {"pS_marginal": 0.539 * P / S, "pS_10m2_exact": P * ((175 / 165) ** 0.539 - 1), "pS_10m2_lineaire": 0.539 * P / S * 10, | ||||
| 289 | + "age28": (-0.0051 + 2 * 0.0026 * 28 / 100) * P, "age60": (-0.0051 + 2 * 0.0026 * 60 / 100) * P, "age_min": 0.0051 / (2 * 0.0026 / 100), | ||||
| 290 | + "piscine_hp": P * (math.exp(0.0263) - 1)} | ||||
| 291 | + # 18.3 : Box–Cox | ||||
| 292 | + ex["3"] = {"bc_1": (500_000 ** 1 - 1) / 1, "bc_05": (500_000 ** 0.5 - 1) / 0.5, "bc_0": math.log(500_000), "lambda_hat": vari["Box–Cox"]["lambda"], "ic": vari["Box–Cox"]["ic95"]} | ||||
| 293 | + # 18.4 : Duan et intervalle avec chiffres arrondis | ||||
| 294 | + lnp, sig, xVx, duan = 13.3627, 0.0830, round(pred["xVx"], 5), 1.0034 | ||||
| 295 | + sd = math.sqrt(sig ** 2 + xVx); z = 1.959964 | ||||
| 296 | + ex["4"] = {"naif": math.exp(lnp), "duan": math.exp(lnp) * duan, "lognormal": math.exp(lnp) * math.exp(sig ** 2 / 2), "sd": sd, | ||||
| 297 | + "bas": math.exp(lnp - z * sd), "haut": math.exp(lnp + z * sd), "xVx": xVx, "part_xVx": xVx / (sig ** 2 + xVx), | ||||
| 298 | + "demi_largeur_pct": (math.exp(z * sd) - 1) * 100} | ||||
| 299 | + # 18.5 : étude de ratios (dix ventes fictives) | ||||
| 300 | + prix = np.array([312_000, 358_500, 401_000, 445_000, 489_500, 532_000, 598_000, 655_000, 742_000, 895_000], float) | ||||
| 301 | + val = np.array([298_000, 329_000, 371_000, 405_000, 452_000, 478_000, 539_000, 576_000, 645_000, 752_000], float) | ||||
| 302 | + r5 = ratios(val, prix); ex["5"] = {"ratios": val / prix, **r5} | ||||
| 303 | + # 18.6 : variables omises (coefficients sans secteurs) | ||||
| 304 | + cS = vari["semi-log sans secteurs"]["coef"]; cR = pd.Series(ref["beta"], index=ref["X"].columns) | ||||
| 305 | + ex["6"] = {"dist_ref": cR["dist_centre"], "dist_sans": cS["dist_centre"], "lnT_ref": cR["ln_T"], "lnT_sans": cS["ln_T"], | ||||
| 306 | + "sigma_ref": ref["sigma"], "sigma_sans": vari["semi-log sans secteurs"]["sigma"], "sujet_ref": vari["semi-log (référence)"]["sujet"], | ||||
| 307 | + "sujet_sans": vari["semi-log sans secteurs"]["sujet"], "r2_sans": vari["semi-log sans secteurs"]["r2"]} | ||||
| 308 | + # 18.7 : Rosen — prix implicite marginal et enchère | ||||
| 309 | + ex["7"] = {"p_S": 0.539 * 638_000 / 165, "p_S_120": 0.539 * 638_000 * (120 / 165) ** 0.539 / 120, "p_S_220": 0.539 * 638_000 * (220 / 165) ** 0.539 / 220} | ||||
| 310 | + # 18.8 : indice trimestriel vs tendance | ||||
| 311 | + bm = ref["beta"][list(ref["X"].columns).index("mois")] | ||||
| 312 | + ecart = (idx["indice_dummies"] / idx["indice_tendance"] - 1) * 100 | ||||
| 313 | + ex["8"] = {"g_mensuel": math.exp(bm) - 1, "g_annuel": math.exp(12 * bm) - 1, "ecart_abs_moyen_pct": float(ecart.abs().mean()), "ecart_max_pct": float(ecart.abs().max()), | ||||
| 314 | + "G0404_tendance": 506_500 * (math.exp(bm * 15.2) - 1), "indice_fin": float(idx["indice_dummies"].iloc[-1]), "tendance_fin": float(idx["indice_tendance"].iloc[-1])} | ||||
| 315 | + return ex | ||||
| 316 | + | ||||
| 317 | +# ----------------------------------------------------------------------------- principal | ||||
| 318 | +def main(verbose: bool = True) -> dict: | ||||
| 319 | + d = cas1.charger(); v = d["ventes"]; s = d["sujet"] | ||||
| 320 | + ref = cas1.hedonique(v) | ||||
| 321 | + coef = ref["coef"].copy(); coef["vrai"] = [VRAIS.get(c, np.nan) for c in coef.index] | ||||
| 322 | + coef["ecart_t"] = (coef["coef"] - coef["vrai"]) / coef["se_hc1"] | ||||
| 323 | + coef["ic_bas"] = coef["coef"] - 1.96 * coef["se_hc1"]; coef["ic_haut"] = coef["coef"] + 1.96 * coef["se_hc1"] | ||||
| 324 | + coef["couvre"] = (coef["ic_bas"] <= coef["vrai"]) & (coef["vrai"] <= coef["ic_haut"]) | ||||
| 325 | + coef["etiquette"] = [ETIQUETTES[c] for c in coef.index] | ||||
| 326 | + diag = diagnostics(v, ref) | ||||
| 327 | + vari = ajuster_variantes(v, s, ref) | ||||
| 328 | + pi = prix_implicites_sujet(ref, s) | ||||
| 329 | + pred = prediction_sujet(ref, s) | ||||
| 330 | + cv = validation_croisee(v) | ||||
| 331 | + role = ratios_role_fictif(v, ref) | ||||
| 332 | + idx = indice_trimestriel(vari, ref, v) | ||||
| 333 | + sens = sensibilite_echantillon(v, s, ref, diag) | ||||
| 334 | + ex = exercices(ref, pred, vari, idx) | ||||
| 335 | + # comparables du ch. 16 : résidus du modèle | ||||
| 336 | + sel = cas1.selection(); comps = sel["comparables"] | ||||
| 337 | + res_comps = pd.Series(ref["residus"], index=v.index).loc[comps.index] | ||||
| 338 | + P = v["prix_vente"].astype(float).to_numpy() | ||||
| 339 | + out = {"ventes": v, "sujet": s, "modele": ref, "coef": coef, "diag": diag, "variantes": vari, "prix_implicites": pi, "prediction": pred, | ||||
| 340 | + "cv": cv, "role": role, "indice": idx, "sensibilite": sens, "exercices": ex, "comparables": comps, "residus_comparables": res_comps, | ||||
| 341 | + "ratios_modele": ratios(vari["semi-log (référence)"]["ajuste"], P)} | ||||
| 342 | + if verbose: | ||||
| 343 | + pd.set_option("display.width", 220); pd.set_option("display.max_columns", 30) | ||||
| 344 | + print("== Modèle de référence (traite.cas1.hedonique) : n =", ref["n"], "k =", ref["k"], f"R² = {ref['r2']:.4f} R²aj = {ref['r2_ajuste']:.4f} σ = {ref['sigma']:.4f}") | ||||
| 345 | + print(coef[["coef", "se_hc1", "t", "effet_pct", "vrai", "ecart_t", "couvre"]].round(4).to_string()) | ||||
| 346 | + print(f" couverture des IC 95 % : {int(coef['couvre'].sum())}/{int(coef['vrai'].notna().sum())} paramètres de génération couverts") | ||||
| 347 | + print(f"== Croissance mensuelle {ref['croissance_mensuelle']*100:.3f} % ; annuelle {((1+ref['croissance_mensuelle'])**12-1)*100:.2f} % ; vraie {_g*100:.2f} %") | ||||
| 348 | + bp = diag["breusch_pagan"]; print(f"== Breusch–Pagan (Koenker) LM = {bp['LM']:.2f}, ddl = {bp['ddl']}, p = {bp['p']:.3f}") | ||||
| 349 | + print(f"== Jarque–Bera = {diag['jarque_bera']['stat']:.2f} (p = {diag['jarque_bera']['p']:.3f}) ; asymétrie {diag['skew']:.3f} ; aplatissement {diag['kurtosis']:.3f}") | ||||
| 350 | + print(f"== Résidus : min {diag['res_min']:.3f}, max {diag['res_max']:.3f}, |e| > 0,15 : {diag['pct_abs_sup_15']:.1f} %") | ||||
| 351 | + print("== VIF :\n", diag["vif"].round(2).to_string()) | ||||
| 352 | + ck = diag["cook"]; top = np.argsort(-ck["D"])[:3] | ||||
| 353 | + print(f"== Cook : seuil 4/n = {ck['seuil']:.4f} ; {ck['n_sup']} observations au-dessus ; max {ck['D'].max():.4f} ; 3 plus grandes :", list(v['id_vente'].iloc[top]), np.round(ck['D'][top], 4)) | ||||
| 354 | + m = diag["moran"]; print(f"== Moran (résidus, 8 voisins) I = {m['I']:.4f}, z = {m['z']:.2f}, p = {m['p']:.3f}") | ||||
| 355 | + print("== Variantes :") | ||||
| 356 | + for nom, dd in vari.items(): | ||||
| 357 | + extra = f" λ = {dd['lambda']:.3f} IC [{dd['ic95'][0]:.3f}; {dd['ic95'][1]:.3f}]" if "lambda" in dd else "" | ||||
| 358 | + print(f" {nom:42s} k={dd['k']:2d} R²={dd['r2']:.4f} R²aj={dd['r2_ajuste']:.4f} σ={dd['sigma']:.4f} RMSE={dd['rmse']:,.0f} $ COD={dd['ratios']['COD']:.2f} PRD={dd['ratios']['PRD']:.3f} PRB={dd['ratios']['PRB']:.3f} sujet={dd['sujet']:,.0f} ${extra}") | ||||
| 359 | + cS = vari["semi-log sans secteurs"] | ||||
| 360 | + print(f" sans secteurs : dist_centre {cS['coef']['dist_centre']:.4f} (réf {ref['beta'][list(ref['X'].columns).index('dist_centre')]:.4f}) ; ln_T {cS['coef']['ln_T']:.4f} (réf {ref['beta'][list(ref['X'].columns).index('ln_T')]:.4f})") | ||||
| 361 | + print("== Prix implicites au sujet (P̂ = %.0f $) :" % pi["P_sujet"].iloc[0]) | ||||
| 362 | + print(pi[["caracteristique", "unite", "beta", "prix_implicite", "kennedy", "se"]].round(4).to_string(index=False)) | ||||
| 363 | + print("== Prédiction du sujet :", {k: (round(x, 5) if isinstance(x, float) and abs(x) < 10 else (tuple(round(y) for y in x) if isinstance(x, tuple) else round(x))) for k, x in pred.items()}) | ||||
| 364 | + print(f"== Ratios du modèle (in-sample) : COD {out['ratios_modele']['COD']:.2f}, PRD {out['ratios_modele']['PRD']:.4f}, PRB {out['ratios_modele']['PRB']:.4f}, médiane {out['ratios_modele']['ratio_median']:.4f}") | ||||
| 365 | + print(f"== Validation croisée 10 plis : RMSE {cv['rmse']:,.0f} $, COD {cv['ratios']['COD']:.2f}, PRD {cv['ratios']['PRD']:.4f}, PRB {cv['ratios']['PRB']:.4f}, erreur absolue médiane {cv['erreur_abs_pct_mediane']:.2f} %") | ||||
| 366 | + rr = role["ratios"]; print(f"== Rôle fictif vs prix ramenés au 2024-07-01 : médiane {rr['ratio_median']:.4f}, COD {rr['COD']:.2f}, PRD {rr['PRD']:.4f}, PRB {rr['PRB']:.4f}") | ||||
| 367 | + print("== Indice trimestriel :\n", idx.round(2).to_string(index=False)) | ||||
| 368 | + print("== Sensibilité à l'échantillon :\n", sens.round(4).to_string(index=False)) | ||||
| 369 | + print("== Résidus des 5 comparables du ch. 16 :", dict(zip(comps["id_vente"], res_comps.round(4))), "moyenne", round(res_comps.mean(), 4)) | ||||
| 370 | + print("== Exercices :") | ||||
| 371 | + for k, e in ex.items(): print(" ", k, {kk: (np.round(vv, 4) if not isinstance(vv, tuple) else tuple(round(x, 4) for x in vv)) for kk, vv in e.items()}) | ||||
| 372 | + return out | ||||
| 373 | + | ||||
| 374 | +if __name__ == "__main__": | ||||
| 375 | + main() | ||||
added
analysis/python/figures/ch03_cout_usage.py
+43 −0
@@ -0,0 +1,43 @@ | |||||
| 1 | +#!/usr/bin/env python3 | ||||
| 2 | +"""Figure ch03 — Coût d'usage du logement au Québec, 2001-2026, données RÉELLES (Banque du Canada, Valet : V80691335 taux | ||||
| 3 | +hypothécaire affiché 5 ans, BD.CDN.5YR.DQ.YLD obligation 5 ans, V39079 taux directeur ; Statistique Canada 18-10-0004-01 IPC Québec, | ||||
| 4 | +18-10-0205-01 IPLN Québec), lues dans data/raw (téléchargées le 2026-10-31). Paramètres déclarés : τ = 0,825 % (taxes Ville de | ||||
| 5 | +Québec 2026 + scolaire 2026-2027), δ = 2,5 % (entretien, dépréciation, prime de risque : hypothèse pédagogique). | ||||
| 6 | +Panneau A : taux nominaux et inflation ; B : taux de coût d'usage u sous deux hypothèses d'anticipation ; C : ratio prix/loyer implicite 1/u. | ||||
| 7 | +Sortie : assets/figures/ch03/ch03-fig-cout-usage.pdf""" | ||||
| 8 | +import sys, pathlib | ||||
| 9 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 10 | +sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) | ||||
| 11 | +import matplotlib.pyplot as plt, matplotlib.dates as mdates | ||||
| 12 | +from traite.style import setup, palette, savefig, LARGEUR | ||||
| 13 | +import ch03_cycles as cas | ||||
| 14 | + | ||||
| 15 | + | ||||
| 16 | +def main(): | ||||
| 17 | + setup() | ||||
| 18 | + df = cas.serie_cout_usage() | ||||
| 19 | + fig, (a, b, c) = plt.subplots(3, 1, figsize=(LARGEUR, 6.0), sharex=True) | ||||
| 20 | + a.plot(df.index, df["hyp5"], color=palette.cat[0], label="taux hypothécaire affiché 5 ans (V80691335)") | ||||
| 21 | + a.plot(df.index, df["gdc5"], color=palette.cat[1], label="obligation du Canada 5 ans") | ||||
| 22 | + a.plot(df.index, df["directeur"], color=palette.cat[2], lw=1.2, label="taux directeur (depuis 2009)") | ||||
| 23 | + a.plot(df.index, df["pi"], color=palette.cat[3], lw=1.2, ls="--", label="inflation IPC Québec, 12 mois") | ||||
| 24 | + a.set_ylabel("% par an"); a.legend(fontsize=7, ncol=2, loc="upper center"); a.set_title("A. Taux nominaux et inflation", loc="left"); a.set_ylim(-1, 12.5) | ||||
| 25 | + b.plot(df.index, df["u_ipc"], color=palette.cat[0], label="$u$ avec $g$ = inflation IPC (12 mois)") | ||||
| 26 | + b.plot(df.index, df["u_ipln"], color=palette.cat[1], label="$u$ avec $g$ = croissance IPLN Québec (5 ans)") | ||||
| 27 | + b.axhline(0, color=palette.ink2, lw=0.7) | ||||
| 28 | + b.set_ylabel("% du prix par an"); b.legend(fontsize=7, loc="upper right"); b.set_title("B. Taux de coût d'usage $u = i + \\tau + \\delta - g$", loc="left") | ||||
| 29 | + c.plot(df.index, df["pr_ipc"], color=palette.cat[0], label="$P/R$ = 1/$u$, anticipation IPC") | ||||
| 30 | + c.plot(df.index, df["pr_ipln"].clip(upper=40), color=palette.cat[1], label="$P/R$ = 1/$u$, anticipation IPLN") | ||||
| 31 | + c.set_ylabel("multiple du loyer annuel"); c.set_ylim(5, 40); c.legend(fontsize=7, loc="upper left"); c.set_title("C. Ratio prix/loyer implicite", loc="left") | ||||
| 32 | + last = df.index[-1] | ||||
| 33 | + c.annotate(f"{last:%Y-%m} : {df['pr_ipc'].iloc[-1]:.1f}", xy=(last, df["pr_ipc"].iloc[-1]), xytext=(-60, -14), textcoords="offset points", fontsize=7.5, | ||||
| 34 | + arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6)) | ||||
| 35 | + for ax in (a, b, c): | ||||
| 36 | + ax.axvspan(mdates.date2num(__import__("datetime").date(2022, 3, 1)), mdates.date2num(__import__("datetime").date(2023, 7, 31)), color=palette.grid, alpha=0.7, lw=0) | ||||
| 37 | + c.xaxis.set_major_locator(mdates.YearLocator(3)); c.xaxis.set_major_formatter(mdates.DateFormatter("%Y")) | ||||
| 38 | + fig.tight_layout(h_pad=1.0) | ||||
| 39 | + out = savefig(fig, "ch03/ch03-fig-cout-usage.pdf"); print("OK", out) | ||||
| 40 | + | ||||
| 41 | + | ||||
| 42 | +if __name__ == "__main__": | ||||
| 43 | + main() | ||||
added
analysis/python/figures/ch03_cycle.py
+68 −0
@@ -0,0 +1,68 @@ | |||||
| 1 | +#!/usr/bin/env python3 | ||||
| 2 | +"""Figures ch03 — Simulation d'un cycle stock-flux (SYNTHÉTIQUE, analysis/python/cases/ch03_cycles.py, paramètres pédagogiques). | ||||
| 3 | +1. ch03-fig-cycle-simule.pdf : quatre panneaux (demande et stock ; inoccupation ; loyer ; mises en chantier) après un choc de demande. | ||||
| 4 | +2. ch03-fig-cycle-sensibilite.pdf : trajectoires du loyer selon le délai de livraison L et selon la réactivité de l'offre κ.""" | ||||
| 5 | +import sys, pathlib | ||||
| 6 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 7 | +sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) | ||||
| 8 | +from dataclasses import replace | ||||
| 9 | +import matplotlib.pyplot as plt | ||||
| 10 | +from traite.style import setup, palette, savefig, LARGEUR | ||||
| 11 | +import ch03_cycles as cas | ||||
| 12 | + | ||||
| 13 | + | ||||
| 14 | +def fig_cycle(pc): | ||||
| 15 | + df = cas.simuler_cycle(pc); ss = cas.etat_stationnaire_cycle(pc); ss0 = cas.etat_stationnaire_cycle(pc, apres_choc=False) | ||||
| 16 | + x = df["annee"] | ||||
| 17 | + fig, axs = plt.subplots(2, 2, figsize=(LARGEUR, 4.6), sharex=True) | ||||
| 18 | + c0, c1, c2 = palette.cat[0], palette.cat[1], palette.cat[2] | ||||
| 19 | + a = axs[0, 0] | ||||
| 20 | + a.plot(x, df["S"] / 1000, color=c0, label="stock $S_t$") | ||||
| 21 | + a.plot(x, df["D"] / 1000, color=c1, label="demande occupée $D_t$") | ||||
| 22 | + a.axhline(ss["S"] / 1000, color=c0, lw=0.7, ls=":") | ||||
| 23 | + a.set_ylabel("milliers de logements"); a.legend(loc="lower right", fontsize=7.5); a.set_title("A. Stock et demande", loc="left") | ||||
| 24 | + a = axs[0, 1] | ||||
| 25 | + a.plot(x, 100 * df["v"], color=c0) | ||||
| 26 | + a.axhline(100 * pc.v_nat, color=palette.ink2, lw=0.8, ls="--"); a.text(x.iloc[-1], 100 * pc.v_nat + 0.15, "$v^*$", ha="right", fontsize=8, color=palette.ink2) | ||||
| 27 | + a.set_ylabel("%"); a.set_title("B. Taux d'inoccupation $v_t$", loc="left"); a.set_ylim(0, None) | ||||
| 28 | + a = axs[1, 0] | ||||
| 29 | + a.plot(x, df["R_mois"], color=c0) | ||||
| 30 | + a.axhline(ss["R"] / 12, color=palette.ink2, lw=0.8, ls="--"); a.text(x.iloc[-1], ss["R"] / 12 + 8, "nouveau stationnaire", ha="right", fontsize=7.5, color=palette.ink2) | ||||
| 31 | + a.set_ylabel("$/mois"); a.set_title("C. Loyer $R_t$", loc="left"); a.set_xlabel("années depuis le début") | ||||
| 32 | + a = axs[1, 1] | ||||
| 33 | + a.plot(x, df["C_annuel"], color=c0) | ||||
| 34 | + a.axhline(ss["C"], color=palette.ink2, lw=0.8, ls="--"); a.text(x.iloc[-1], ss["C"] + 80, "$\\delta S^*$", ha="right", fontsize=8, color=palette.ink2) | ||||
| 35 | + a.set_ylabel("logements / an (rythme annuel)"); a.set_title("D. Mises en chantier $C_t$", loc="left"); a.set_xlabel("années depuis le début") | ||||
| 36 | + for ax in axs.flat: | ||||
| 37 | + ax.axvspan(pc.t_choc / 4, (pc.t_choc + pc.n_choc) / 4, color=palette.grid, alpha=0.6, lw=0) | ||||
| 38 | + axs[0, 0].text((pc.t_choc + pc.n_choc / 2) / 4, axs[0, 0].get_ylim()[1] * 0.995, "choc de\ndemande", ha="center", va="top", fontsize=7, color=palette.ink2) | ||||
| 39 | + fig.tight_layout(h_pad=1.0, w_pad=1.2) | ||||
| 40 | + return savefig(fig, "ch03/ch03-fig-cycle-simule.pdf") | ||||
| 41 | + | ||||
| 42 | + | ||||
| 43 | +def fig_sensibilite(pc): | ||||
| 44 | + fig, axs = plt.subplots(1, 2, figsize=(LARGEUR, 2.7), sharey=True) | ||||
| 45 | + ss = cas.etat_stationnaire_cycle(pc) | ||||
| 46 | + for k, L in enumerate((2, 6, 12)): | ||||
| 47 | + p = replace(pc, L=L); d = cas.simuler_cycle(p); s = cas.etat_stationnaire_cycle(p) | ||||
| 48 | + axs[0].plot(d["annee"], 100 * (d["R"] / s["R"] - 1), color=palette.cat[k], label=f"$L$ = {L} trimestres") | ||||
| 49 | + axs[0].set_title("A. Délai de livraison ($\\kappa$ = 0,48)", loc="left") | ||||
| 50 | + for k, m in enumerate((1.0, 0.5, 0.25)): | ||||
| 51 | + p = replace(pc, mult_c1=m); d = cas.simuler_cycle(p); s = cas.etat_stationnaire_cycle(p) | ||||
| 52 | + axs[1].plot(d["annee"], 100 * (d["R"] / s["R"] - 1), color=palette.cat[k], label=f"$\\kappa$ = {p.kappa:.2f}") | ||||
| 53 | + axs[1].set_title("B. Réactivité de l'offre ($L$ = 6)", loc="left") | ||||
| 54 | + for ax in axs: | ||||
| 55 | + ax.axhline(0, color=palette.ink2, lw=0.8, ls="--"); ax.set_xlabel("années depuis le début"); ax.legend(fontsize=7.5) | ||||
| 56 | + axs[0].set_ylabel("loyer, écart au stationnaire final (%)") | ||||
| 57 | + fig.tight_layout(w_pad=1.2) | ||||
| 58 | + return savefig(fig, "ch03/ch03-fig-cycle-sensibilite.pdf") | ||||
| 59 | + | ||||
| 60 | + | ||||
| 61 | +def main(): | ||||
| 62 | + setup() | ||||
| 63 | + pc = cas.ParametresCycle() | ||||
| 64 | + print("OK", fig_cycle(pc)); print("OK", fig_sensibilite(pc)) | ||||
| 65 | + | ||||
| 66 | + | ||||
| 67 | +if __name__ == "__main__": | ||||
| 68 | + main() | ||||
added
analysis/python/figures/ch03_mises_chantier.py
+49 −0
@@ -0,0 +1,49 @@ | |||||
| 1 | +#!/usr/bin/env python3 | ||||
| 2 | +"""Figure ch03 — Mises en chantier au Québec, données RÉELLES : Statistique Canada (SCHL), tableau 34-10-0135-01, | ||||
| 3 | +toutes les régions, trimestriel non désaisonnalisé, lu dans data/raw/statcan_34100135/34100135.csv (téléchargé le 2026-10-31). | ||||
| 4 | +Panneau A : totaux annuels 1990-2025 (2026 : trois trimestres, hachuré) et somme mobile sur quatre trimestres ; la zone grisée | ||||
| 5 | +marque le resserrement monétaire (mars 2022 → juillet 2023, série V39079). Panneau B : composition par type d'unité. | ||||
| 6 | +Sortie : assets/figures/ch03/ch03-fig-mises-chantier-quebec.pdf""" | ||||
| 7 | +import sys, pathlib | ||||
| 8 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 9 | +sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) | ||||
| 10 | +import pandas as pd, matplotlib.pyplot as plt | ||||
| 11 | +from traite.style import setup, palette, savefig, LARGEUR, fmt_milliers | ||||
| 12 | +import ch03_cycles as cas | ||||
| 13 | + | ||||
| 14 | + | ||||
| 15 | +def main(): | ||||
| 16 | + setup() | ||||
| 17 | + df = cas.mises_en_chantier_quebec() | ||||
| 18 | + ann = cas.mises_en_chantier_annuelles(df) | ||||
| 19 | + tot = df[df["type"] == "Total d'unités"].set_index("date")["unites"] | ||||
| 20 | + mobile = tot.rolling(4).sum() | ||||
| 21 | + fig, (a, b) = plt.subplots(2, 1, figsize=(LARGEUR, 4.9), height_ratios=[3, 2], sharex=False) | ||||
| 22 | + yrs = ann.loc[1990:2026] | ||||
| 23 | + complet = yrs[yrs["trimestres"] == 4]; partiel = yrs[yrs["trimestres"] < 4] | ||||
| 24 | + a.bar(complet.index, complet["total"] / 1000, width=0.8, color=palette.cat[0], alpha=0.75, label="total annuel") | ||||
| 25 | + a.bar(partiel.index, partiel["total"] / 1000, width=0.8, color=palette.cat[0], alpha=0.35, hatch="///", edgecolor=palette.cat[0], label=f"{int(partiel.index[0])} (3 trimestres)") | ||||
| 26 | + mob = mobile[mobile.index >= "1990-10-01"] | ||||
| 27 | + a.plot(mob.index.year + (mob.index.month - 1) / 12 + 0.25, mob / 1000, color=palette.cat[1], lw=1.4, label="somme mobile sur 4 trimestres") | ||||
| 28 | + a.axvspan(2022 + 2 / 12, 2023 + 6.5 / 12, color=palette.grid, alpha=0.8, lw=0) | ||||
| 29 | + a.text(2023.75, 74, "resserrement monétaire\n(mars 2022 – juillet 2023)", ha="left", va="top", fontsize=7, color=palette.ink2) | ||||
| 30 | + for y, va in ((2021, "bottom"), (2023, "bottom"), (2025, "bottom")): | ||||
| 31 | + a.annotate(f"{fmt_milliers(ann.loc[y, 'total'])}", xy=(y, ann.loc[y, "total"] / 1000), xytext=(0, 3), textcoords="offset points", ha="center", va=va, fontsize=7.5) | ||||
| 32 | + a.set_ylabel("milliers de logements"); a.set_xlim(1989.3, 2026.9); a.set_ylim(0, 75) | ||||
| 33 | + a.legend(loc="upper left", fontsize=7.5, ncol=1); a.set_title("A. Logements mis en chantier, Québec (toutes les régions)", loc="left") | ||||
| 34 | + # B. composition | ||||
| 35 | + comp = ann.loc[1990:2025] | ||||
| 36 | + b.stackplot(comp.index, 100 * comp["part_individuelles"], 100 * comp["jumeles"] / comp["total"] + 100 * comp["bande"] / comp["total"], | ||||
| 37 | + 100 * comp["part_appartements"], colors=[palette.cat[0], palette.cat[2], palette.cat[1]], alpha=0.85, | ||||
| 38 | + labels=["maisons individuelles", "jumelés et en bande", "appartements et autres"]) | ||||
| 39 | + b.set_ylim(0, 100); b.set_ylabel("% des unités"); b.set_xlim(1989.3, 2026.9) | ||||
| 40 | + b.legend(loc="upper center", bbox_to_anchor=(0.5, -0.16), fontsize=7.5, ncol=3, frameon=False) | ||||
| 41 | + b.set_title("B. Composition par type d'unité (années complètes)", loc="left") | ||||
| 42 | + for y, ha in ((2005, "center"), (2025, "right")): | ||||
| 43 | + b.annotate(f"{100*ann.loc[y,'part_individuelles']:.0f} %", xy=(y + (0.3 if ha == "right" else 0), 100 * ann.loc[y, "part_individuelles"] / 2), ha=ha, va="center", fontsize=7.5, color="white") | ||||
| 44 | + fig.tight_layout(h_pad=1.4) | ||||
| 45 | + out = savefig(fig, "ch03/ch03-fig-mises-chantier-quebec.pdf"); print("OK", out) | ||||
| 46 | + | ||||
| 47 | + | ||||
| 48 | +if __name__ == "__main__": | ||||
| 49 | + main() | ||||
modified
analysis/python/figures/ch03_quadrants.py
+67 −57
@@ -2,88 +2,98 @@ | |||||
| 2 | """Figure ch03 — Modèle des quatre quadrants (DiPasquale–Wheaton) tracé à partir des paramètres pédagogiques du marché type | 2 | """Figure ch03 — Modèle des quatre quadrants (DiPasquale–Wheaton) tracé à partir des paramètres pédagogiques du marché type | ||
| 3 | (analysis/python/cases/ch03_cycles.py, SYNTHÉTIQUE). Équilibre de référence (trait plein) et nouvel équilibre après une baisse | 3 | (analysis/python/cases/ch03_cycles.py, SYNTHÉTIQUE). Équilibre de référence (trait plein) et nouvel équilibre après une baisse | ||
| 4 | du taux de capitalisation de 5 % à 4 % (tirets), avec la réaction de court terme (stock fixe) en pointillé. | 4 | du taux de capitalisation de 5 % à 4 % (tirets), avec la réaction de court terme (stock fixe) en pointillé. | ||
| 5 | +Les quatre demi-axes ont des échelles propres (S en milliers de logements, P en k$/logement, R en k$/logement/an, | ||||
| 6 | +C en milliers de logements/an) ; les graduations sont dessinées explicitement. | ||||
| 5 | Sortie : assets/figures/ch03/ch03-fig-quatre-quadrants.pdf""" | 7 | Sortie : assets/figures/ch03/ch03-fig-quatre-quadrants.pdf""" | ||
| 6 | import sys, pathlib | 8 | import sys, pathlib | ||
| 7 | ROOT = pathlib.Path(__file__).resolve().parents[3] | 9 | ROOT = pathlib.Path(__file__).resolve().parents[3] | ||
| 8 | sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) | 10 | sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) | ||
| 9 | import numpy as np, matplotlib.pyplot as plt | 11 | import numpy as np, matplotlib.pyplot as plt | ||
| 12 | +from matplotlib.lines import Line2D | ||||
| 10 | from traite.style import setup, palette, savefig, LARGEUR | 13 | from traite.style import setup, palette, savefig, LARGEUR | ||
| 11 | import ch03_cycles as cas | 14 | import ch03_cycles as cas | ||
| 12 | 15 | ||||
| 16 | +# facteurs d'affichage : unités de données → unités du tracé | ||||
| 17 | +FS = 1.0 / 1000.0 # S : logements → milliers (axe x positif, 0..150) | ||||
| 18 | +FP = 1.0 / 3000.0 # P : $ → k$/3 (axe x négatif ; 420 k$ → 140 unités) | ||||
| 19 | +FR = 1.0 / 1000.0 # R : $/an → k$ (axe y positif, 0..24) | ||||
| 20 | +FC = 4.0 / 1000.0 # C : logements/an → milliers × 4 (axe y négatif ; 3 000/an → 12 unités) | ||||
| 21 | + | ||||
| 13 | 22 | ||||
| 14 | def main(): | 23 | def main(): | ||
| 15 | setup() | 24 | setup() | ||
| 16 | p = cas.Parametres4Q() | 25 | p = cas.Parametres4Q() | ||
| 17 | − base = cas.equilibre_4q(p) | 26 | + base = cas.equilibre_4q(p); i2 = 0.04 | ||
| 18 | − i2 = 0.04 | 27 | + nouv = cas.equilibre_4q(p, i=i2); ct = cas.court_terme_4q(p, i=i2) | ||
| 19 | − nouv = cas.equilibre_4q(p, i=i2) | ||||
| 20 | − ct = cas.court_terme_4q(p, i=i2) | ||||
| 21 | − k = 1000.0 # affichage en milliers | ||||
| 22 | c0, c1 = palette.cat[0], palette.cat[1] | 28 | c0, c1 = palette.cat[0], palette.cat[1] | ||
| 23 | − fig, ax = plt.subplots(figsize=(LARGEUR, LARGEUR * 0.92)) | 29 | + fig, ax = plt.subplots(figsize=(LARGEUR, LARGEUR * 0.9)) | ||
| 24 | − # bornes | 30 | + XP, XS, YR, YC = -150, 150, 24, -13.5 | ||
| 25 | − Smax, Pmax, Rmax, Cmax = 150, 420, 25, 3.2 | 31 | + ax.set_xlim(XP - 2, XS + 2); ax.set_ylim(YC - 1, YR + 1) | ||
| 26 | − ax.set_xlim(-Pmax, Smax); ax.set_ylim(-Cmax, Rmax) | ||||
| 27 | ax.axhline(0, color=palette.ink, lw=0.9); ax.axvline(0, color=palette.ink, lw=0.9) | 32 | ax.axhline(0, color=palette.ink, lw=0.9); ax.axvline(0, color=palette.ink, lw=0.9) | ||
| 28 | − ax.grid(False) | 33 | + ax.grid(False); ax.set_xticks([]); ax.set_yticks([]) | ||
| 29 | − for s in ("left", "bottom"): | 34 | + for s in ax.spines.values(): | ||
| 30 | − ax.spines[s].set_visible(False) | 35 | + s.set_visible(False) | ||
| 31 | − ax.set_xticks([]); ax.set_yticks([]) | 36 | + # graduations manuelles | ||
| 32 | − # --- NE : marché de l'espace, D(R) = S → R = (a − S)/b | 37 | + for v in (50, 100, 150): | ||
| 33 | − S = np.linspace(60, 150, 50) * k | 38 | + ax.plot([v, v], [0, -0.35], color=palette.ink, lw=0.7); ax.text(v, -0.6, f"{v}", ha="center", va="top", fontsize=7, color=palette.ink2) | ||
| 34 | − ax.plot(S / k, (p.a - S) / p.b / k, color=c0, lw=1.8) | 39 | + for v in (150, 300, 450): | ||
| 35 | − ax.plot(S / k, (1.0 * p.a - S) / p.b / k, color=c0, lw=0, label="_") | 40 | + ax.plot([-v / 3, -v / 3], [0, -0.35], color=palette.ink, lw=0.7); ax.text(-v / 3, -0.6, f"{v}", ha="center", va="top", fontsize=7, color=palette.ink2) | ||
| 36 | − # --- NW : marché des actifs, P = R / i (P à gauche, R en haut) | 41 | + for v in (6, 12, 18, 24): | ||
| 37 | − R = np.linspace(0, Rmax, 50) * k | 42 | + ax.plot([0, -1.5], [v, v], color=palette.ink, lw=0.7); ax.text(-2.5, v, f"{v}", ha="right", va="center", fontsize=7, color=palette.ink2) | ||
| 38 | − ax.plot(-R / p.i / k, R / k, color=c0, lw=1.8) | 43 | + for v in (1, 2, 3): | ||
| 39 | − ax.plot(-R / i2 / k, R / k, color=c1, lw=1.8, ls="--") | 44 | + ax.plot([0, -1.5], [-4 * v, -4 * v], color=palette.ink, lw=0.7); ax.text(-2.5, -4 * v, f"{v}", ha="right", va="center", fontsize=7, color=palette.ink2) | ||
| 40 | − # --- SW : construction, C = (P − c0)/c1 (P à gauche, C en bas) | 45 | + # --- NE : marché de l'espace R = (a − S)/b | ||
| 41 | − P = np.linspace(p.c0, Pmax * k, 50) | 46 | + S = np.linspace(50_000, 150_000, 50) | ||
| 42 | − ax.plot(-P / k, -(P - p.c0) / p.c1 / k, color=c0, lw=1.8) | 47 | + ax.plot(S * FS, (p.a - S) / p.b * FR, color=c0, lw=1.8) | ||
| 43 | − # --- SE : ajustement du stock, S = C/δ (C en bas, S à droite) | 48 | + # --- NW : marché des actifs P = R/i | ||
| 44 | − C = np.linspace(0, Cmax, 50) * k | 49 | + R = np.linspace(0, YR / FR, 50) | ||
| 45 | − ax.plot(C / p.delta / k, -C / k, color=c0, lw=1.8) | 50 | + ax.plot(-R / p.i * FP, R * FR, color=c0, lw=1.8) | ||
| 51 | + ax.plot(-R / i2 * FP, R * FR, color=c1, lw=1.8, ls="--") | ||||
| 52 | + # --- SW : construction C = (P − c0)/c1 | ||||
| 53 | + P = np.linspace(p.c0, 450_000, 50) | ||||
| 54 | + ax.plot(-P * FP, -(P - p.c0) / p.c1 * FC, color=c0, lw=1.8) | ||||
| 55 | + # --- SE : stock stationnaire S = C/δ | ||||
| 56 | + C = np.linspace(0, 1_500, 50) | ||||
| 57 | + ax.plot(C / p.delta * FS, -C * FC, color=c0, lw=1.8) | ||||
| 46 | 58 | ||||
| 47 | def rectangle(eq, color, ls, lw=1.0): | 59 | def rectangle(eq, color, ls, lw=1.0): | ||
| 48 | − Sx, Rx, Px, Cx = eq["S"] / k, eq["R"] / k, eq["P"] / k, eq["C"] / k | 60 | + Sx, Rx, Px, Cx = eq["S"] * FS, eq["R"] * FR, eq["P"] * FP, eq["C"] * FC | ||
| 49 | − ax.plot([Sx, Sx], [0, Rx], color=color, lw=lw, ls=ls) | 61 | + ax.plot([Sx, Sx], [-Cx, Rx], color=color, lw=lw, ls=ls) | ||
| 50 | ax.plot([-Px, Sx], [Rx, Rx], color=color, lw=lw, ls=ls) | 62 | ax.plot([-Px, Sx], [Rx, Rx], color=color, lw=lw, ls=ls) | ||
| 51 | ax.plot([-Px, -Px], [Rx, -Cx], color=color, lw=lw, ls=ls) | 63 | ax.plot([-Px, -Px], [Rx, -Cx], color=color, lw=lw, ls=ls) | ||
| 52 | ax.plot([-Px, Sx], [-Cx, -Cx], color=color, lw=lw, ls=ls) | 64 | ax.plot([-Px, Sx], [-Cx, -Cx], color=color, lw=lw, ls=ls) | ||
| 53 | − ax.plot([Sx, Sx], [-Cx, 0], color=color, lw=lw, ls=ls) | 65 | + for x, y in ((Sx, Rx), (-Px, Rx), (-Px, -Cx), (Sx, -Cx)): | ||
| 66 | + ax.plot(x, y, "o", color=color, ms=3.8) | ||||
| 54 | 67 | ||||
| 55 | rectangle(base, c0, "-") | 68 | rectangle(base, c0, "-") | ||
| 56 | rectangle(nouv, c1, "--") | 69 | rectangle(nouv, c1, "--") | ||
| 57 | − # court terme : stock fixe, prix bondit à R0/i2 | 70 | + # court terme : stock fixe, P bondit à R0/i2, C bondit, mais S n'a pas encore bougé | ||
| 58 | − ax.plot([-ct["P"] / k, base["S"] / k], [base["R"] / k, base["R"] / k], color=c1, lw=1.0, ls=":") | 71 | + Pct, Cct = ct["P"] * FP, ct["C"] * FC | ||
| 59 | − ax.plot([-ct["P"] / k, -ct["P"] / k], [base["R"] / k, -ct["C"] / k], color=c1, lw=1.0, ls=":") | 72 | + ax.plot([-Pct, base["S"] * FS], [base["R"] * FR, base["R"] * FR], color=c1, lw=1.0, ls=":") | ||
| 60 | − ax.plot([-ct["P"] / k, base["S"] / k], [-ct["C"] / k, -ct["C"] / k], color=c1, lw=1.0, ls=":") | 73 | + ax.plot([-Pct, -Pct], [base["R"] * FR, -Cct], color=c1, lw=1.0, ls=":") | ||
| 61 | − # points | 74 | + ax.plot([-Pct, base["S"] * FS], [-Cct, -Cct], color=c1, lw=1.0, ls=":") | ||
| 62 | − ax.plot(base["S"] / k, base["R"] / k, "o", color=c0, ms=4); ax.plot(nouv["S"] / k, nouv["R"] / k, "o", color=c1, ms=4) | 75 | + ax.plot(-Pct, base["R"] * FR, "o", color=c1, ms=3.8, mfc="white"); ax.plot(-Pct, -Cct, "o", color=c1, ms=3.8, mfc="white") | ||
| 63 | − ax.plot(-base["P"] / k, base["R"] / k, "o", color=c0, ms=4); ax.plot(-nouv["P"] / k, nouv["R"] / k, "o", color=c1, ms=4) | 76 | + # titres des quadrants (coins) et noms d'axes | ||
| 64 | − ax.plot(-ct["P"] / k, base["R"] / k, "o", color=c1, ms=4, mfc="white") | 77 | + ax.text(XS, YR, "Marché de l'espace\n$D(R) = S$", ha="right", va="top", fontsize=8, color=palette.ink2) | ||
| 65 | − # étiquettes d'axes et de quadrants | 78 | + ax.text(XP, YR, "Marché des actifs\n$P = R/i$", ha="left", va="top", fontsize=8, color=palette.ink2) | ||
| 66 | − ax.text(Smax, 0.6, "Stock $S$ (milliers de log.)", ha="right", va="bottom", fontsize=8) | 79 | + ax.text(XP, YC + 4.0, "Construction\n$C = (P - c_0)/c_1$", ha="left", va="bottom", fontsize=8, color=palette.ink2) | ||
| 67 | − ax.text(-Pmax, 0.6, "Prix $P$ (k\\$/log.)", ha="left", va="bottom", fontsize=8) | 80 | + ax.text(XS, YC, "Ajustement du stock\n$C = \\delta S$", ha="right", va="bottom", fontsize=8, color=palette.ink2) | ||
| 68 | − ax.text(1.5, Rmax, "Loyer $R$ (k\\$/log./an)", ha="left", va="top", fontsize=8) | 81 | + ax.text(XS, 1.0, "Stock $S$\n(milliers de logements)", ha="right", va="bottom", fontsize=7.5) | ||
| 69 | − ax.text(1.5, -Cmax, "Construction $C$ (milliers de log./an)", ha="left", va="bottom", fontsize=8) | 82 | + ax.text(XP, 1.0, "Prix $P$\n(k\\$ par logement)", ha="left", va="bottom", fontsize=7.5) | ||
| 70 | − ax.text(Smax * 0.98, Rmax * 0.93, "Marché de l'espace\n$D(R) = S$", ha="right", va="top", fontsize=8, color=palette.ink2) | 83 | + ax.text(-2.5, YR, "Loyer $R$\n(k\\$/logement/an)", ha="right", va="top", fontsize=7.5) | ||
| 71 | − ax.text(-Pmax * 0.98, Rmax * 0.93, "Marché des actifs\n$P = R/i$", ha="left", va="top", fontsize=8, color=palette.ink2) | 84 | + ax.text(-2.5, YC, "Construction $C$\n(milliers de logements/an)", ha="right", va="bottom", fontsize=7.5) | ||
| 72 | − ax.text(-Pmax * 0.98, -Cmax * 0.93, "Construction\n$C = (P - c_0)/c_1$", ha="left", va="bottom", fontsize=8, color=palette.ink2) | ||||
| 73 | − ax.text(Smax * 0.98, -Cmax * 0.93, "Ajustement du stock\n$\\Delta S = C - \\delta S = 0$", ha="right", va="bottom", fontsize=8, color=palette.ink2) | ||||
| 74 | # annotations numériques | 85 | # annotations numériques | ||
| 75 | − ax.annotate(f"$S^*$ = {base['S']/k:.0f}", xy=(base["S"] / k, 0), xytext=(base["S"] / k + 2, 1.2), fontsize=7.5, color=c0) | 86 | + ax.text(base["S"] * FS + 1.5, base["R"] * FR + 0.4, f"$S^*$ = {base['S']/1000:.0f} ; $R^*$ = {base['R']/1000:.1f}", fontsize=7.5, color=c0, ha="left", va="bottom") | ||
| 76 | − ax.annotate(f"{nouv['S']/k:.1f}", xy=(nouv["S"] / k, 0), xytext=(nouv["S"] / k + 2, 3.4), fontsize=7.5, color=c1) | 87 | + ax.text(nouv["S"] * FS + 1.5, nouv["R"] * FR - 0.4, f"{nouv['S']/1000:.1f} ; {nouv['R']/1000:.1f}", fontsize=7.5, color=c1, ha="left", va="top") | ||
| 77 | − ax.annotate(f"$R^*$ = {base['R']/k:.1f}", xy=(0, base["R"] / k), xytext=(3, base["R"] / k + 0.6), fontsize=7.5, color=c0) | 88 | + ax.text(-base["P"] * FP + 1.5, base["R"] * FR + 0.4, f"$P^*$ = {base['P']/1000:.0f}", fontsize=7.5, color=c0, ha="left", va="bottom") | ||
| 78 | − ax.annotate(f"{nouv['R']/k:.1f}", xy=(0, nouv["R"] / k), xytext=(3, nouv["R"] / k - 1.9), fontsize=7.5, color=c1) | 89 | + ax.text(-nouv["P"] * FP - 1.5, nouv["R"] * FR - 0.4, f"{nouv['P']/1000:.1f}", fontsize=7.5, color=c1, ha="right", va="top") | ||
| 79 | − ax.annotate(f"$P^*$ = {base['P']/k:.0f}", xy=(-base["P"] / k, 0), xytext=(-base["P"] / k - 6, 1.2), fontsize=7.5, color=c0, ha="right") | 90 | + ax.text(-Pct, base["R"] * FR + 1.6, f"court terme :\n$P$ = {ct['P']/1000:.0f}", fontsize=7.5, color=c1, ha="center", va="bottom") | ||
| 80 | − ax.annotate(f"court terme : {ct['P']/k:.0f}", xy=(-ct["P"] / k, 0), xytext=(-ct["P"] / k - 4, -0.9), fontsize=7.5, color=c1, ha="right", va="top") | 91 | + ax.text(-Pct + 1.5, -Cct - 0.3, f"$C$ = {ct['C']/1000:.1f}", fontsize=7.5, color=c1, ha="left", va="top") | ||
| 81 | − ax.annotate(f"$C^*$ = {base['C']/k:.1f}", xy=(0, -base["C"] / k), xytext=(3, -base["C"] / k - 0.1), fontsize=7.5, color=c0, va="top") | 92 | + ax.text(base["S"] * FS + 1.5, -base["C"] * FC - 0.3, f"$C^*$ = {base['C']/1000:.1f}", fontsize=7.5, color=c0, ha="left", va="top") | ||
| 82 | − from matplotlib.lines import Line2D | ||||
| 83 | h = [Line2D([], [], color=c0, lw=1.8, label="équilibre de référence ($i$ = 5 %)"), | 93 | h = [Line2D([], [], color=c0, lw=1.8, label="équilibre de référence ($i$ = 5 %)"), | ||
| 84 | − Line2D([], [], color=c1, lw=1.8, ls="--", label="nouvel équilibre de long terme ($i$ = 4 %)"), | 94 | + Line2D([], [], color=c1, lw=1.8, ls="--", label="long terme après la baisse à $i$ = 4 %"), | ||
| 85 | Line2D([], [], color=c1, lw=1.0, ls=":", label="court terme (stock fixe)")] | 95 | Line2D([], [], color=c1, lw=1.0, ls=":", label="court terme (stock fixe)")] | ||
| 86 | − ax.legend(handles=h, loc="lower center", bbox_to_anchor=(0.5, -0.06), ncol=3, fontsize=7.5, frameon=False) | 96 | + ax.legend(handles=h, loc="upper center", bbox_to_anchor=(0.5, -0.01), ncol=3, fontsize=7.5, frameon=False) | ||
| 87 | out = savefig(fig, "ch03/ch03-fig-quatre-quadrants.pdf"); print("OK", out) | 97 | out = savefig(fig, "ch03/ch03-fig-quatre-quadrants.pdf"); print("OK", out) | ||
| 88 | 98 | ||||
| 89 | 99 | ||||
modified
analysis/python/figures/ch04_ipln.py
+1 −1
@@ -19,7 +19,7 @@ def main(): | |||||
| 19 | s = df[df["geo"] == geo] | 19 | s = df[df["geo"] == geo] | ||
| 20 | ls = "--" if geo == "Canada" else "-"; lw = 2.0 if geo == "Montréal" else 1.4 | 20 | ls = "--" if geo == "Canada" else "-"; lw = 2.0 if geo == "Montréal" else 1.4 | ||
| 21 | ax.plot(s["date"], s["indice"], color=palette.cat[i], ls=ls, lw=lw, label=geo.replace(" (partie du Québec)", " (partie QC)")) | 21 | ax.plot(s["date"], s["indice"], color=palette.cat[i], ls=ls, lw=lw, label=geo.replace(" (partie du Québec)", " (partie QC)")) | ||
| 22 | − dy = {"Canada": 2.3, "Trois-Rivières": -2.0}.get(geo, 0.0) | 22 | + dy = {"Canada": 2.6, "Trois-Rivières": 0.4, "Gatineau (partie du Québec)": -2.2}.get(geo, 0.0) | ||
| 23 | ax.text(s["date"].iloc[-1] + pd.Timedelta(days=60), s["indice"].iloc[-1] + dy, f"{s['indice'].iloc[-1]:.1f}".replace(".", ","), fontsize=7, va="center", color=palette.ink) | 23 | ax.text(s["date"].iloc[-1] + pd.Timedelta(days=60), s["indice"].iloc[-1] + dy, f"{s['indice'].iloc[-1]:.1f}".replace(".", ","), fontsize=7, va="center", color=palette.ink) | ||
| 24 | ax.axhline(100, color=palette.ink2, lw=0.6, ls=":"); ax.text(pd.Timestamp("2010-02-01"), 101.5, "déc. 2016 = 100", fontsize=7.5, color=palette.ink2) | 24 | ax.axhline(100, color=palette.ink2, lw=0.6, ls=":"); ax.text(pd.Timestamp("2010-02-01"), 101.5, "déc. 2016 = 100", fontsize=7.5, color=palette.ink2) | ||
| 25 | ax.axvspan(pd.Timestamp("2020-03-01"), pd.Timestamp("2022-12-31"), color=palette.grid, alpha=0.5, lw=0) | 25 | ax.axvspan(pd.Timestamp("2020-03-01"), pd.Timestamp("2022-12-31"), color=palette.grid, alpha=0.5, lw=0) | ||
modified
analysis/python/figures/ch04_mutations.py
+2 −2
@@ -18,8 +18,8 @@ def main(): | |||||
| 18 | for i, (nom, bar) in enumerate(cas.BAREMES_2026.items()): | 18 | for i, (nom, bar) in enumerate(cas.BAREMES_2026.items()): | ||
| 19 | te = np.array([cas.droits_mutation(p, bar) / p for p in prix]) * 100 | 19 | te = np.array([cas.droits_mutation(p, bar) / p for p in prix]) * 100 | ||
| 20 | ax.plot(prix / 1000, te, color=palette.cat[i], lw=1.6 if i else 1.2, ls="--" if i == 0 else "-", label=nom) | 20 | ax.plot(prix / 1000, te, color=palette.cat[i], lw=1.6 if i else 1.2, ls="--" if i == 0 else "-", label=nom) | ||
| 21 | − for p, lab, y in [(500000, "500 000 $ : médiane unifamiliale,\nprovince, T3 2026", 0.12), (860500, "860 500 $ : médiane plex,\nRMR Montréal, T3 2026", 0.5)]: | 21 | + for p, lab, y, ha, dx in [(500000, "500 000 $ : médiane unifamiliale,\nprovince, T3 2026", 0.1, "right", -25), (860500, "860 500 $ : médiane plex,\nRMR Montréal, T3 2026", 0.5, "left", 25)]: | ||
| 22 | − ax.axvline(p / 1000, color=palette.ink2, lw=0.6, ls=":"); ax.text(p / 1000 + 25, y, lab, fontsize=6.8, color=palette.ink2) | 22 | + ax.axvline(p / 1000, color=palette.ink2, lw=0.6, ls=":"); ax.text(p / 1000 + dx, y, lab, fontsize=6.8, color=palette.ink2, ha=ha) | ||
| 23 | ax.set_xlabel("Base d'imposition (milliers de dollars)"); ax.set_ylabel("Taux effectif (% de la base)") | 23 | ax.set_xlabel("Base d'imposition (milliers de dollars)"); ax.set_ylabel("Taux effectif (% de la base)") | ||
| 24 | ax.xaxis.set_major_formatter(FuncFormatter(lambda v, p: f"{v:,.0f}".replace(",", " "))); ax.yaxis.set_major_formatter(FuncFormatter(lambda v, p: f"{v:.1f}".replace(".", ","))) | 24 | ax.xaxis.set_major_formatter(FuncFormatter(lambda v, p: f"{v:,.0f}".replace(",", " "))); ax.yaxis.set_major_formatter(FuncFormatter(lambda v, p: f"{v:.1f}".replace(".", ","))) | ||
| 25 | ax.set_ylim(0, 3.2); ax.legend(loc="upper left", fontsize=7.5) | 25 | ax.set_ylim(0, 3.2); ax.legend(loc="upper left", fontsize=7.5) | ||
modified
analysis/python/figures/ch04_taux.py
+1 −1
@@ -17,7 +17,7 @@ def main(): | |||||
| 17 | obl = b["obl5"].resample("W").mean() | 17 | obl = b["obl5"].resample("W").mean() | ||
| 18 | ax.plot(obl.index, obl.values, color=palette.cat[1], lw=1.2, label="Obligation du Canada, 5 ans (moyenne hebdomadaire)") | 18 | ax.plot(obl.index, obl.values, color=palette.cat[1], lw=1.2, label="Obligation du Canada, 5 ans (moyenne hebdomadaire)") | ||
| 19 | ax.step(b["directeur"].index, b["directeur"].values, color=palette.cat[2], lw=1.4, where="post", label="Taux directeur (cible du financement à un jour, dès 2009)") | 19 | ax.step(b["directeur"].index, b["directeur"].values, color=palette.cat[2], lw=1.4, where="post", label="Taux directeur (cible du financement à un jour, dès 2009)") | ||
| 20 | − for t, lab, y in [("2008-09-15", "crise\nfinancière", 9.3), ("2020-03-11", "pandémie", 9.3), ("2022-03-02", "resserrement\n2022-2023", 9.3)]: | 20 | + for t, lab, y in [("2008-09-15", "crise\nfinancière", 9.3), ("2020-03-11", "pandémie", 9.3), ("2022-03-02", "resserrement\n2022-2023", 8.4)]: | ||
| 21 | ax.axvline(pd.Timestamp(t), color=palette.ink2, lw=0.6, ls=":"); ax.text(pd.Timestamp(t) + pd.Timedelta(days=40), y, lab, fontsize=7, color=palette.ink2, va="top") | 21 | ax.axvline(pd.Timestamp(t), color=palette.ink2, lw=0.6, ls=":"); ax.text(pd.Timestamp(t) + pd.Timedelta(days=40), y, lab, fontsize=7, color=palette.ink2, va="top") | ||
| 22 | ax.set_ylabel("Taux (% annuel)"); ax.set_ylim(0, 9.6); ax.set_xlim(pd.Timestamp("2000-01-01"), pd.Timestamp("2027-01-01")) | 22 | ax.set_ylabel("Taux (% annuel)"); ax.set_ylim(0, 9.6); ax.set_xlim(pd.Timestamp("2000-01-01"), pd.Timestamp("2027-01-01")) | ||
| 23 | ax.xaxis.set_major_locator(mdates.YearLocator(2)); ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y")) | 23 | ax.xaxis.set_major_locator(mdates.YearLocator(2)); ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y")) | ||
modified
analysis/python/figures/ch05_rmr.py
+1 −1
@@ -32,7 +32,7 @@ def main(): | |||||
| 32 | a2.set_yticks(y2); a2.set_yticklabels(sub.index); a2.set_xlim(-0.8, 0.15) | 32 | a2.set_yticks(y2); a2.set_yticklabels(sub.index); a2.set_xlim(-0.8, 0.15) | ||
| 33 | a2.set_xlabel("Écart logarithmique avec Montréal"); a2.grid(axis="y", visible=False) | 33 | a2.set_xlabel("Écart logarithmique avec Montréal"); a2.grid(axis="y", visible=False) | ||
| 34 | a2.set_title("B. Décomposition de l'écart (losange = total)", loc="left", fontsize=8.5) | 34 | a2.set_title("B. Décomposition de l'écart (losange = total)", loc="left", fontsize=8.5) | ||
| 35 | − a2.legend(fontsize=6.8, loc="upper left") | 35 | + a2.legend(fontsize=6.8, loc="upper center", bbox_to_anchor=(0.45, -0.2), ncol=2) | ||
| 36 | out = savefig(fig, "ch05/ch05-fig-valeur-logement-rmr.pdf"); print("OK", out) | 36 | out = savefig(fig, "ch05/ch05-fig-valeur-logement-rmr.pdf"); print("OK", out) | ||
| 37 | 37 | ||||
| 38 | if __name__ == "__main__": | 38 | if __name__ == "__main__": | ||
modified
analysis/python/figures/ch09_ratios.py
+7 −6
@@ -33,7 +33,7 @@ def fig_distribution(et): | |||||
| 33 | ax.text(ep["borne_haute"] + 0.01, ax.get_ylim()[1] * 0.55, f"médiane ± 2σ\n{ep['n_retires']} ventes\nretirées", fontsize=7.5, color=palette.cat[3]) | 33 | ax.text(ep["borne_haute"] + 0.01, ax.get_ylim()[1] * 0.55, f"médiane ± 2σ\n{ep['n_retires']} ventes\nretirées", fontsize=7.5, color=palette.cat[3]) | ||
| 34 | for ax in axes: | 34 | for ax in axes: | ||
| 35 | ax.axvspan(0.90, 1.10, color=palette.grid, alpha=0.35, lw=0, zorder=0) | 35 | ax.axvspan(0.90, 1.10, color=palette.grid, alpha=0.35, lw=0, zorder=0) | ||
| 36 | − axes[0].text(0.905, axes[0].get_ylim()[1] * 0.05, "niveau IAAO 0,90–1,10", fontsize=7, color=palette.ink2) | 36 | + axes[0].text(1.13, axes[0].get_ylim()[1] * 0.55, "zone grise :\nniveau IAAO\n0,90–1,10", fontsize=7, color=palette.ink2, ha="center", va="center") | ||
| 37 | fig.suptitle(f"COD {et['brut']['COD']:.1f} → {et['aj']['COD']:.1f} ; PRD {et['brut']['PRD']:.3f} → {et['aj']['PRD']:.3f} ; proportion médiane après épuration {et['PM']:.3f}".replace(".", ","), | 37 | fig.suptitle(f"COD {et['brut']['COD']:.1f} → {et['aj']['COD']:.1f} ; PRD {et['brut']['PRD']:.3f} → {et['aj']['PRD']:.3f} ; proportion médiane après épuration {et['PM']:.3f}".replace(".", ","), | ||
| 38 | fontsize=8, color=palette.ink2, x=0.02, ha="left", y=1.02) | 38 | fontsize=8, color=palette.ink2, x=0.02, ha="left", y=1.02) | ||
| 39 | print("OK", savefig(fig, "ch09/ch09-fig-ratios-distribution.pdf")) | 39 | print("OK", savefig(fig, "ch09/ch09-fig-ratios-distribution.pdf")) | ||
@@ -74,14 +74,15 @@ def fig_sensibilite(d, et, da): | |||||
| 74 | s = cas.sensibilite_acheteur(d, et, da); tv = cas.taux_voisinage_gatineau() | 74 | s = cas.sensibilite_acheteur(d, et, da); tv = cas.taux_voisinage_gatineau() | ||
| 75 | fig, ax = plt.subplots(figsize=(LARGEUR, 2.9)) | 75 | fig, ax = plt.subplots(figsize=(LARGEUR, 2.9)) | ||
| 76 | for col, lab, c in [("gain_net_min", f"taux de voisinage minimal ({tv['min']:.3f} $/1 000 $)", palette.cat[2]), ("gain_net_mediane", f"taux médian ({tv['mediane']:.3f} $/1 000 $)", palette.cat[0]), ("gain_net_max", f"taux maximal ({tv['max']:.3f} $/1 000 $)", palette.cat[1])]: | 76 | for col, lab, c in [("gain_net_min", f"taux de voisinage minimal ({tv['min']:.3f} $/1 000 $)", palette.cat[2]), ("gain_net_mediane", f"taux médian ({tv['mediane']:.3f} $/1 000 $)", palette.cat[0]), ("gain_net_max", f"taux maximal ({tv['max']:.3f} $/1 000 $)", palette.cat[1])]: | ||
| 77 | − ax.plot(s["valeur_reelle"], s[col], marker="o", ms=3, color=c, label=lab.replace(".", ",")) | 77 | + ax.plot(s["valeur_reelle"], s[col], marker="o", ms=3, color=c, label=lab.replace(".", ",").replace("$", "\\$")) | ||
| 78 | ax.axhline(0, color=palette.ink2, lw=0.8) | 78 | ax.axhline(0, color=palette.ink2, lw=0.8) | ||
| 79 | − ax.axvline(da["prix_ref"], color=palette.cat[3], ls="--", lw=0.9); ax.text(da["prix_ref"] + 1500, ax.get_ylim()[1] * 0.92, "prix rajusté\nde la vente", fontsize=7.5, color=palette.cat[3]) | 79 | + ax.axvline(da["prix_ref"], color=palette.cat[3], ls="--", lw=0.9); ax.text(da["prix_ref"] + 1500, ax.get_ylim()[1] * 0.97, "prix rajusté\nde la vente", fontsize=7.5, color=palette.cat[3], va="top") | ||
| 80 | − ax.axvline(da["valeur_role"] - da["seuil_valeur"], color=palette.ink2, ls=":", lw=0.9) | 80 | + seuil = da["valeur_role"] - da["seuil_valeur"] | ||
| 81 | + ax.axvline(seuil, color=palette.ink2, ls=":", lw=0.9); ax.text(seuil - 1500, ax.get_ylim()[1] * 0.97, "seuil de\nrentabilité", fontsize=7.5, color=palette.ink2, ha="right", va="top") | ||||
| 81 | ax.set_xlabel("Valeur réelle conclue à la date de référence ($)"); ax.set_ylabel("Gain net sur trois exercices ($)") | 82 | ax.set_xlabel("Valeur réelle conclue à la date de référence ($)"); ax.set_ylabel("Gain net sur trois exercices ($)") | ||
| 82 | ax.xaxis.set_major_formatter(FuncFormatter(fmt_dollars)); ax.yaxis.set_major_formatter(FuncFormatter(fmt_dollars)) | 83 | ax.xaxis.set_major_formatter(FuncFormatter(fmt_dollars)); ax.yaxis.set_major_formatter(FuncFormatter(fmt_dollars)) | ||
| 83 | − ax.set_title(f"Valeur inscrite {fmt_dollars(da['valeur_role'])} ; frais de révision {da['frais_revision']:.0f} $ ; facteur comparatif {et['F']:.4f}".replace(".", ","), loc="left", fontsize=8.5) | 84 | + ax.set_title(f"Valeur inscrite {fmt_dollars(da['valeur_role'])} ; frais de révision {da['frais_revision']:.0f} $ ; facteur comparatif {et['F']:.4f}".replace(".", ",").replace("$", "\\$"), loc="left", fontsize=8.5) | ||
| 84 | − ax.legend(loc="upper right", fontsize=7.5) | 85 | + ax.legend(loc="lower left", fontsize=7.5) | ||
| 85 | print("OK", savefig(fig, "ch09/ch09-fig-sensibilite-contestation.pdf")) | 86 | print("OK", savefig(fig, "ch09/ch09-fig-sensibilite-contestation.pdf")) | ||
| 86 | 87 | ||||
| 87 | 88 | ||||
added
analysis/python/figures/ch17_figures.py
+104 −0
@@ -0,0 +1,104 @@ | |||||
| 1 | +#!/usr/bin/env python3 | ||||
| 2 | +"""Chapitre 17 — figures : cascade d'ajustements (G0404), dispersion des paires, prix bruts vs ajustés, tornade de sensibilité. | ||||
| 3 | +Usage (racine du dépôt) : PYTHONPATH=analysis/python python3 analysis/python/figures/ch17_figures.py""" | ||||
| 4 | +from __future__ import annotations | ||||
| 5 | +import sys, pathlib | ||||
| 6 | +import numpy as np | ||||
| 7 | +import matplotlib.pyplot as plt | ||||
| 8 | +from matplotlib.ticker import FuncFormatter | ||||
| 9 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) | ||||
| 10 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / "cases")) | ||||
| 11 | +from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars | ||||
| 12 | +import ch17_ajustements as c17 | ||||
| 13 | + | ||||
| 14 | +def fig_cascade(r): | ||||
| 15 | + c = r["cascade_G0404"] | ||||
| 16 | + fig, ax = plt.subplots(figsize=(LARGEUR, 3.7)) | ||||
| 17 | + n = len(c); x = np.arange(n) | ||||
| 18 | + bases = c["base_apres"].values; adj = c["ajustement"].values | ||||
| 19 | + for i in range(n): | ||||
| 20 | + if i == 0 or i == n - 1: | ||||
| 21 | + ax.bar(x[i], bases[i], color=palette.cat[0] if i == 0 else palette.brand, width=0.7) | ||||
| 22 | + ax.text(x[i], bases[i] + 900, fmt_dollars(bases[i]), ha="center", va="bottom", fontsize=7.5) | ||||
| 23 | + elif adj[i] == 0: | ||||
| 24 | + ax.plot([x[i] - 0.35, x[i] + 0.35], [bases[i], bases[i]], color=palette.ink2, lw=1.2) | ||||
| 25 | + ax.text(x[i], bases[i] + 900, "0", ha="center", va="bottom", fontsize=7, color=palette.ink2) | ||||
| 26 | + else: | ||||
| 27 | + bottom = min(bases[i - 1], bases[i]) | ||||
| 28 | + couleur = palette.cat[2] if adj[i] > 0 else palette.cat[1] | ||||
| 29 | + ax.bar(x[i], abs(adj[i]), bottom=bottom, color=couleur, width=0.7) | ||||
| 30 | + lab = ("+" if adj[i] > 0 else "\u2212") + f"{abs(adj[i]):,.0f}".replace(",", " ") | ||||
| 31 | + if adj[i] > 0: | ||||
| 32 | + ax.text(x[i], bases[i] + 900, lab, ha="center", va="bottom", fontsize=7.5) | ||||
| 33 | + else: | ||||
| 34 | + ax.text(x[i], bases[i] - 900, lab, ha="center", va="top", fontsize=7.5) | ||||
| 35 | + if 0 < i < n: | ||||
| 36 | + ax.plot([x[i - 1] + 0.35, x[i] - 0.35], [bases[i - 1], bases[i - 1]], color=palette.ink2, lw=0.6) | ||||
| 37 | + ax.set_ylim(495000, 558000); ax.set_xticks(x) | ||||
| 38 | + ax.set_xticklabels(c["etape"], rotation=35, ha="right", fontsize=7.5) | ||||
| 39 | + ax.yaxis.set_major_formatter(FuncFormatter(fmt_dollars)); ax.set_ylabel("Base après l'étape") | ||||
| 40 | + savefig(fig, "ch17/ch17-fig-cascade-g0404.pdf") | ||||
| 41 | + | ||||
| 42 | +def fig_paires(r): | ||||
| 43 | + fig, axes = plt.subplots(1, 2, figsize=(LARGEUR, 3.3), sharey=True) | ||||
| 44 | + for ax, attr, titre in zip(axes, ("garage", "sous_sol"), ("Garage (une place de plus)", "Sous-sol fini")): | ||||
| 45 | + p = r[f"paires_{attr}"].sort_values("diff_temps").reset_index(drop=True) | ||||
| 46 | + rs = r[f"resume_{attr}"]; im = r[f"implicite_{attr}"] | ||||
| 47 | + y = p["diff_temps"].values; x = np.arange(len(y)) | ||||
| 48 | + ax.axhline(0, color=palette.ink2, lw=0.6) | ||||
| 49 | + ax.axhspan(rs["moyenne"] - 1.96 * rs["erreur_type"], rs["moyenne"] + 1.96 * rs["erreur_type"], color=palette.cat[0], alpha=0.12, lw=0) | ||||
| 50 | + ax.axhline(rs["moyenne"], color=palette.cat[0], lw=1.4, label="moyenne des paires (± 1,96 erreur-type)") | ||||
| 51 | + ax.axhline(rs["mediane"], color=palette.cat[0], lw=1.0, ls=":", label="médiane des paires") | ||||
| 52 | + ax.axhline(im["au_prix_median_paires"], color=palette.cat[1], lw=1.4, ls="--", label="prix implicite hédonique") | ||||
| 53 | + ax.scatter(x, y, s=22, color=palette.ink, zorder=3) | ||||
| 54 | + ax.set_title(f"{titre} — n = {rs['n']} paires", fontsize=9) | ||||
| 55 | + ax.set_xticks([]); ax.set_xlabel("Paires classées par écart croissant") | ||||
| 56 | + ax.yaxis.set_major_formatter(FuncFormatter(fmt_dollars)) | ||||
| 57 | + ax.set_ylim(-160000, 160000) | ||||
| 58 | + axes[0].set_ylabel("Écart de prix « avec » − « sans » (date alignée)") | ||||
| 59 | + axes[0].legend(loc="upper left", fontsize=7) | ||||
| 60 | + savefig(fig, "ch17/ch17-fig-paires.pdf") | ||||
| 61 | + | ||||
| 62 | +def fig_bruts_ajustes(r): | ||||
| 63 | + b = r["base"]; a = b["adj"]; rec = r["reconciliation"] | ||||
| 64 | + fig, ax = plt.subplots(figsize=(LARGEUR, 3.2)) | ||||
| 65 | + y = np.arange(len(a))[::-1] | ||||
| 66 | + for yi, (_, row) in zip(y, a.iterrows()): | ||||
| 67 | + ax.plot([row["prix_vente"], row["prix_ajuste"]], [yi, yi], color=palette.grid, lw=2.2, zorder=1) | ||||
| 68 | + ax.scatter(a["prix_vente"], y, s=42, facecolor="white", edgecolor=palette.cat[0], linewidth=1.6, zorder=3, label="prix de vente") | ||||
| 69 | + ax.scatter(a["prix_ajuste"], y, s=42, color=palette.cat[0], zorder=4, label="prix ajusté (grille hédonique)") | ||||
| 70 | + w = rec["poids_inverse_brut"] | ||||
| 71 | + for yi, (_, row), wi in zip(y, a.iterrows(), w): | ||||
| 72 | + ax.text(max(row["prix_vente"], row["prix_ajuste"]) + 4000, yi, f"brut {row['ajust_brut_pct']*100:.0f} % · poids {wi:.2f}".replace(".", ","), va="center", fontsize=7.2, color=palette.ink2) | ||||
| 73 | + vp = rec["inverse_brut"]["valeur_ponderee"]; pred = b["prediction_hedonique"] | ||||
| 74 | + ax.axvline(vp, color=palette.brand, lw=1.3, ls="-") | ||||
| 75 | + ax.text(vp, len(a) - 0.45, "valeur pondérée\n" + fmt_dollars(vp), ha="center", va="bottom", fontsize=7.3, color=palette.brand) | ||||
| 76 | + ax.axvline(pred, color=palette.cat[1], lw=1.3, ls="--") | ||||
| 77 | + ax.text(pred, len(a) - 0.45, "prédiction hédonique\n" + fmt_dollars(pred), ha="center", va="bottom", fontsize=7.3, color=palette.cat[1]) | ||||
| 78 | + ax.set_yticks(y); ax.set_yticklabels(a["id_vente"]); ax.set_ylim(-0.7, len(a) + 0.6) | ||||
| 79 | + ax.set_xlim(490000, 720000); ax.xaxis.set_major_formatter(FuncFormatter(fmt_dollars)) | ||||
| 80 | + ax.legend(loc="upper left", fontsize=7.3) | ||||
| 81 | + savefig(fig, "ch17/ch17-fig-bruts-ajustes.pdf") | ||||
| 82 | + | ||||
| 83 | +def fig_sensibilite(r): | ||||
| 84 | + s = r["sensibilite"]; ref = float(s.iloc[0]["bas"]) | ||||
| 85 | + s = s.iloc[1:].copy(); s = s.sort_values("etendue") | ||||
| 86 | + fig, ax = plt.subplots(figsize=(LARGEUR, 3.6)) | ||||
| 87 | + y = np.arange(len(s)) | ||||
| 88 | + ax.barh(y, s["haut"] - s["bas"], left=s["bas"], color=palette.cat[0], alpha=0.85, height=0.62) | ||||
| 89 | + ax.axvline(ref, color=palette.ink, lw=1.0) | ||||
| 90 | + for yi, (_, row) in zip(y, s.iterrows()): | ||||
| 91 | + ax.text(row["bas"] - 1500, yi, fmt_dollars(row["bas"]), ha="right", va="center", fontsize=6.8, color=palette.ink2) | ||||
| 92 | + ax.text(row["haut"] + 1500, yi, fmt_dollars(row["haut"]), ha="left", va="center", fontsize=6.8, color=palette.ink2) | ||||
| 93 | + ax.set_yticks(y); ax.set_yticklabels(s["scenario"], fontsize=7.4) | ||||
| 94 | + ax.set_xlim(530000, 615000); ax.xaxis.set_major_formatter(FuncFormatter(fmt_dollars)) | ||||
| 95 | + ax.set_xlabel("Valeur pondérée (poids inverse de l'ajustement brut) ; trait vertical : référence " + fmt_dollars(ref)) | ||||
| 96 | + savefig(fig, "ch17/ch17-fig-sensibilite.pdf") | ||||
| 97 | + | ||||
| 98 | +def main(): | ||||
| 99 | + setup(); r = c17.tout() | ||||
| 100 | + fig_cascade(r); fig_paires(r); fig_bruts_ajustes(r); fig_sensibilite(r) | ||||
| 101 | + print("figures écrites dans assets/figures/ch17/") | ||||
| 102 | + | ||||
| 103 | +if __name__ == "__main__": | ||||
| 104 | + main() | ||||
added
analysis/python/tests/test_ch03.py
+218 −0
@@ -0,0 +1,218 @@ | |||||
| 1 | +"""Tests du chapitre 3 — Offre, demande et cycles. | ||||
| 2 | +Tolérances : identités algébriques 1e-9 (relatif) ; valeurs citées dans le texte : 0,5 unité sur les logements et les dollars arrondis, | ||||
| 3 | +0,05 point de pourcentage sur les taux ; valeurs réelles lues dans data/raw : exactes (sommes d'entiers) ou 0,01.""" | ||||
| 4 | +import sys, pathlib, math | ||||
| 5 | +import numpy as np, pytest | ||||
| 6 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / "cases")) | ||||
| 7 | +import ch03_cycles as cas | ||||
| 8 | +from dataclasses import replace | ||||
| 9 | + | ||||
| 10 | + | ||||
| 11 | +@pytest.fixture(scope="module") | ||||
| 12 | +def p4q(): | ||||
| 13 | + return cas.Parametres4Q() | ||||
| 14 | + | ||||
| 15 | + | ||||
| 16 | +@pytest.fixture(scope="module") | ||||
| 17 | +def pc(): | ||||
| 18 | + return cas.ParametresCycle() | ||||
| 19 | + | ||||
| 20 | + | ||||
| 21 | +class TestQuatreQuadrants: | ||||
| 22 | + def test_parametres_derives(self, p4q): | ||||
| 23 | + assert p4q.b == pytest.approx(3.4722, abs=5e-4) | ||||
| 24 | + assert p4q.a == pytest.approx(150_000, abs=1e-6) | ||||
| 25 | + assert p4q.P0 == pytest.approx(288_000, abs=1e-6) | ||||
| 26 | + assert p4q.C0 == pytest.approx(1_000, abs=1e-9) | ||||
| 27 | + assert p4q.c1 == pytest.approx(48.0, abs=1e-9) | ||||
| 28 | + | ||||
| 29 | + def test_equilibre_ferme_egal_iteratif(self, p4q): | ||||
| 30 | + eq, it = cas.equilibre_4q(p4q), cas.equilibre_4q_iteratif(p4q) | ||||
| 31 | + for k in ("S", "R", "P", "C"): | ||||
| 32 | + assert eq[k] == pytest.approx(it[k], rel=1e-6) | ||||
| 33 | + assert eq["S"] == pytest.approx(100_000, abs=1e-6) and eq["R"] == pytest.approx(14_400, abs=1e-6) | ||||
| 34 | + assert eq["C"] == pytest.approx(p4q.delta * eq["S"], rel=1e-12) # ΔS = 0 | ||||
| 35 | + assert eq["P"] == pytest.approx(eq["R"] / p4q.i, rel=1e-12) # P = R/i | ||||
| 36 | + assert eq["C"] == pytest.approx((eq["P"] - p4q.c0) / p4q.c1, rel=1e-9) # C = g(P) | ||||
| 37 | + | ||||
| 38 | + def test_baisse_du_taux(self, p4q): | ||||
| 39 | + lt = cas.equilibre_4q(p4q, i=0.04); ct = cas.court_terme_4q(p4q, i=0.04) | ||||
| 40 | + assert ct["P"] == pytest.approx(360_000, abs=0.5) | ||||
| 41 | + assert lt["S"] == pytest.approx(109_375, abs=0.5) | ||||
| 42 | + assert lt["R"] == pytest.approx(11_700, abs=0.5) | ||||
| 43 | + assert lt["P"] == pytest.approx(292_500, abs=0.5) | ||||
| 44 | + assert lt["C"] == pytest.approx(1_093.75, abs=0.01) | ||||
| 45 | + | ||||
| 46 | + def test_statique_comparative(self, p4q): | ||||
| 47 | + sc = cas.statique_comparative(p4q) | ||||
| 48 | + assert sc.loc["Demande a : +10 %", "R_ct"] == pytest.approx(18_720, abs=0.5) | ||||
| 49 | + assert sc.loc["Demande a : +10 %", "S_lt"] == pytest.approx(113_846.15, abs=0.5) | ||||
| 50 | + assert sc.loc["Demande a : +10 %", "R_lt"] == pytest.approx(14_732.31, abs=0.5) | ||||
| 51 | + assert sc.loc["Demande a : +10 %", "dR_ct_pct"] == pytest.approx(30.0, abs=0.05) | ||||
| 52 | + assert sc.loc["Demande a : +10 %", "dR_lt_pct"] == pytest.approx(2.31, abs=0.05) | ||||
| 53 | + assert sc.loc["Coût c0 : +10 %", "S_lt"] == pytest.approx(96_153.85, abs=0.5) | ||||
| 54 | + assert sc.loc["Coût c0 : +10 %", "dP_lt_pct"] == pytest.approx(7.69, abs=0.05) | ||||
| 55 | + assert sc.loc["Taux i : 5 % → 4 %", "dP_lt_pct"] == pytest.approx(1.56, abs=0.05) | ||||
| 56 | + assert sc.loc["Taux i : 5 % → 4 %", "dR_lt_pct"] == pytest.approx(-18.75, abs=0.05) | ||||
| 57 | + | ||||
| 58 | + def test_elasticites(self, p4q): | ||||
| 59 | + el = cas.elasticites_4q(p4q) | ||||
| 60 | + assert el["eps_C_P"] == pytest.approx(6.0, rel=1e-9) | ||||
| 61 | + assert el["kappa"] == pytest.approx(0.12, rel=1e-9) | ||||
| 62 | + assert el["eps_S_a"] == pytest.approx(1.385, abs=5e-3) | ||||
| 63 | + | ||||
| 64 | + | ||||
| 65 | +class TestDynamique: | ||||
| 66 | + def test_etat_initial_stationnaire(self, pc): | ||||
| 67 | + df = cas.simuler_cycle(replace(pc, choc_demande=0.0)) | ||||
| 68 | + assert np.allclose(df["S"], pc.p4q.S0, rtol=1e-9) and np.allclose(df["R"], pc.p4q.R0, rtol=1e-9) | ||||
| 69 | + assert np.allclose(df["v"], pc.v_nat, atol=1e-12) | ||||
| 70 | + assert pc.c0 == pytest.approx(276_000, abs=1e-6) and pc.kappa == pytest.approx(0.48, rel=1e-9) | ||||
| 71 | + | ||||
| 72 | + def test_stationnaire_apres_choc(self, pc): | ||||
| 73 | + ss = cas.etat_stationnaire_cycle(pc) | ||||
| 74 | + assert ss["S"] == pytest.approx(108_902, abs=1.0) | ||||
| 75 | + assert ss["R"] == pytest.approx(14_453, abs=1.0) | ||||
| 76 | + assert ss["C"] == pytest.approx(pc.p4q.delta * ss["S"], rel=1e-12) | ||||
| 77 | + df = cas.simuler_cycle(replace(pc, T=600)) | ||||
| 78 | + assert df["S"].iloc[-1] == pytest.approx(ss["S"], rel=2e-3) | ||||
| 79 | + assert df["v"].iloc[-1] == pytest.approx(pc.v_nat, abs=2e-3) | ||||
| 80 | + | ||||
| 81 | + def test_mesures_du_cycle_cite(self, pc): | ||||
| 82 | + r = cas.resume_cycle(cas.simuler_cycle(pc), pc) | ||||
| 83 | + assert r["R_pointe_pct"] == pytest.approx(15.0, abs=0.1) | ||||
| 84 | + assert r["t_pointe"] == 13 | ||||
| 85 | + assert r["R_creux_pct"] == pytest.approx(-7.0, abs=0.1) | ||||
| 86 | + assert r["t_creux"] == 35 | ||||
| 87 | + assert r["v_max_pct"] == pytest.approx(5.0, abs=0.05) | ||||
| 88 | + assert r["v_min_pct"] == pytest.approx(1.17, abs=0.05) | ||||
| 89 | + assert r["C_max_annuel"] == pytest.approx(4_711, abs=1.0) | ||||
| 90 | + assert r["periode_trim"] == 47 | ||||
| 91 | + assert r["amortissement"] == pytest.approx(0.17, abs=0.01) | ||||
| 92 | + | ||||
| 93 | + def test_sensibilite(self, pc): | ||||
| 94 | + s = cas.sensibilite_cycle(pc, delais=(2, 6, 12), mult_c1=(0.25, 1.0), lams=(0.75,)).set_index(["L", "mult_c1"]) | ||||
| 95 | + assert s.loc[(12, 0.25), "R_creux_pct"] == pytest.approx(-18.06, abs=0.1) | ||||
| 96 | + assert s.loc[(2, 0.25), "R_creux_pct"] == pytest.approx(-1.21, abs=0.1) | ||||
| 97 | + assert s.loc[(6, 1.0), "R_creux_pct"] > 0 # offre peu réactive : pas de sous-ajustement | ||||
| 98 | + assert math.isnan(s.loc[(6, 1.0), "periode_trim"]) # pas de second cycle | ||||
| 99 | + # le délai allonge la période et creuse le creux | ||||
| 100 | + assert s.loc[(12, 0.25), "periode_trim"] > s.loc[(6, 0.25), "periode_trim"] > s.loc[(2, 0.25), "periode_trim"] | ||||
| 101 | + | ||||
| 102 | + def test_condition_oscillation(self, pc): | ||||
| 103 | + d = pc.p4q.delta | ||||
| 104 | + for k in (0.05, 0.12, 0.2449, 0.2451, 0.3, 0.48, 0.6, 1.2): | ||||
| 105 | + a = cas.condition_oscillation_L1(k, d); b = cas.racines_caracteristiques(k, d, L=1) | ||||
| 106 | + assert a["oscille"] == b["oscille"] | ||||
| 107 | + assert a["module"] == pytest.approx(b["module"], rel=1e-9) | ||||
| 108 | + if a["oscille"]: | ||||
| 109 | + assert a["periode"] == pytest.approx(b["periode"], rel=1e-9) | ||||
| 110 | + assert a["module"] == pytest.approx(math.sqrt(k), rel=1e-12) | ||||
| 111 | + assert cas.condition_oscillation_L1(0.12, d)["seuil"] == pytest.approx(0.2450, abs=1e-4) | ||||
| 112 | + assert not cas.condition_oscillation_L1(0.12, d)["oscille"] | ||||
| 113 | + c = cas.condition_oscillation_L1(0.48, d) | ||||
| 114 | + assert c["oscille"] and c["stable"] and c["periode"] == pytest.approx(8.1, abs=0.05) and c["module"] == pytest.approx(0.693, abs=5e-4) | ||||
| 115 | + assert not cas.condition_oscillation_L1(1.2, d)["stable"] | ||||
| 116 | + assert cas.racines_caracteristiques(0.48, d, L=3)["module"] > 1.0 # délai de 3 ans : instable | ||||
| 117 | + | ||||
| 118 | + | ||||
| 119 | +class TestDonneesReelles: | ||||
| 120 | + def test_mises_en_chantier_quebec(self): | ||||
| 121 | + ann = cas.mises_en_chantier_annuelles() | ||||
| 122 | + assert (ann.loc[1990:2025, "trimestres"] == 4).all() and ann.loc[2026, "trimestres"] == 3 | ||||
| 123 | + attendu = {1990: 48_070, 2000: 24_695, 2005: 50_910, 2015: 37_926, 2020: 54_066, 2021: 67_810, 2022: 57_107, | ||||
| 124 | + 2023: 38_912, 2024: 48_713, 2025: 59_864, 2026: 42_159} | ||||
| 125 | + for y, v in attendu.items(): | ||||
| 126 | + assert ann.loc[y, "total"] == v | ||||
| 127 | + assert ann.loc[2005, "individuelles"] == 23_930 and ann.loc[2025, "individuelles"] == 8_477 | ||||
| 128 | + assert ann.loc[2005, "collectifs"] == 26_980 and ann.loc[2025, "collectifs"] == 51_387 | ||||
| 129 | + assert ann.loc[2025, "part_individuelles"] == pytest.approx(0.1416, abs=5e-4) | ||||
| 130 | + assert ann.loc[2005, "part_individuelles"] == pytest.approx(0.470, abs=5e-4) | ||||
| 131 | + # cohérence interne : les cinq types somment au total | ||||
| 132 | + tot = ann[["individuelles", "jumeles", "bande", "appartements"]].sum(axis=1) | ||||
| 133 | + assert np.allclose(tot.loc[1990:2026], ann.loc[1990:2026, "total"]) | ||||
| 134 | + assert np.allclose(ann["jumeles"] + ann["bande"] + ann["appartements"], ann["collectifs"]) | ||||
| 135 | + # variation 2021 → 2023 et 2023 → 2025 | ||||
| 136 | + assert (ann.loc[2023, "total"] / ann.loc[2021, "total"] - 1) == pytest.approx(-0.426, abs=5e-4) | ||||
| 137 | + assert (ann.loc[2025, "total"] / ann.loc[2023, "total"] - 1) == pytest.approx(0.538, abs=5e-4) | ||||
| 138 | + | ||||
| 139 | + def test_montreal_incomplet(self): | ||||
| 140 | + m = cas.mises_en_chantier_montreal_annuelles() | ||||
| 141 | + assert m.loc[2024, "mois"] == 12 and m.loc[2024, "total"] == 17_570 | ||||
| 142 | + assert m.loc[2025, "mois"] == 9 and m.loc[2025, "total"] == 21_138 # juillet-septembre 2025 absents du fichier | ||||
| 143 | + q = cas.mises_en_chantier_montreal_annuelles("Québec") | ||||
| 144 | + assert q.loc[2025, "mois"] == 12 and q.loc[2025, "total"] == 54_220 | ||||
| 145 | + | ||||
| 146 | + def test_taux_directeur(self): | ||||
| 147 | + ch = cas.changements_taux_directeur() | ||||
| 148 | + assert len(ch) == 23 | ||||
| 149 | + assert ch.loc["2022-03-03", "apres"] == 0.50 and ch.loc["2023-07-13", "apres"] == 5.00 | ||||
| 150 | + assert ch.loc["2025-10-30", "apres"] == 2.25 and ch.loc["2026-10-29", "apres"] == 2.50 | ||||
| 151 | + assert ch.loc["2022-07-14", "variation_pb"] == 100 | ||||
| 152 | + assert int(ch.loc["2022-03-03":"2023-07-13", "variation_pb"].sum()) == 475 | ||||
| 153 | + assert int(ch.loc["2024-06-06":"2025-10-30", "variation_pb"].sum()) == -275 | ||||
| 154 | + | ||||
| 155 | + def test_taux_effectifs_a4(self): | ||||
| 156 | + a4 = cas.taux_effectifs_a4() | ||||
| 157 | + assert a4["serie_assure"] == "V122667780" and a4["serie_non_assure"] == "V122667786" | ||||
| 158 | + assert a4["assure_fixe_5ans_plus"] == pytest.approx(4.12) and a4["non_assure_fixe_5ans_plus"] == pytest.approx(4.58) | ||||
| 159 | + | ||||
| 160 | + def test_ipc_ipln(self): | ||||
| 161 | + ipc = cas.ipc_quebec(); ipln = cas.ipln_quebec() | ||||
| 162 | + assert ipc.index[-1].strftime("%Y-%m") == "2026-09" and ipc.iloc[-1] == 167.7 and ipc.iloc[-13] == 162.6 | ||||
| 163 | + assert (ipc.iloc[-1] / ipc.iloc[-13] - 1) * 100 == pytest.approx(3.14, abs=0.01) | ||||
| 164 | + assert ipln.iloc[-1] == 150.0 and (ipln.iloc[-1] / ipln.iloc[-13] - 1) * 100 == pytest.approx(1.28, abs=0.01) | ||||
| 165 | + loyer = cas.ipc_quebec("Loyer") | ||||
| 166 | + assert loyer.iloc[-1] == 174.2 and (loyer.iloc[-1] / loyer.iloc[-13] - 1) * 100 == pytest.approx(3.3, abs=0.05) | ||||
| 167 | + | ||||
| 168 | + def test_serie_cout_usage(self): | ||||
| 169 | + cu = cas.serie_cout_usage() | ||||
| 170 | + assert cu.index[0].strftime("%Y-%m") == "2001-01" and cu.index[-1].strftime("%Y-%m") == "2026-09" | ||||
| 171 | + t = cu.loc[cas.DATES_TABLEAU_COUT_USAGE] | ||||
| 172 | + assert t["hyp5"].round(2).tolist() == [7.79, 7.49, 5.29, 4.94, 7.04, 6.09] | ||||
| 173 | + assert t["pi"].round(2).tolist() == [2.76, 2.02, 2.84, 0.30, 4.16, 3.14] | ||||
| 174 | + assert t["pr_ipc"].round(1).tolist() == [12.0, 11.4, 17.3, 12.6, 16.1, 15.9] | ||||
| 175 | + assert np.allclose(cu["u_ipc"], cu["hyp5"] + 100 * (cas.TAUX_TAXE_QUEBEC_2026 + cas.DELTA_ENTRETIEN_RISQUE) - cu["pi"]) | ||||
| 176 | + assert np.allclose(cu["pr_ipc"] * cu["u_ipc"], 100.0) | ||||
| 177 | + # plancher du coût d'usage sous l'hypothèse IPLN en 2021-2022 (anticipations extrapolatives) | ||||
| 178 | + assert cu["u_ipln"].min() < 1.5 and cu["u_ipln"].idxmin().year in (2021, 2022) | ||||
| 179 | + | ||||
| 180 | + | ||||
| 181 | +class TestCoutUsageExemple: | ||||
| 182 | + def test_formules(self): | ||||
| 183 | + assert cas.taux_cout_usage(0.06, 0.01, 0.02, 0.03) == pytest.approx(0.06) | ||||
| 184 | + assert cas.cout_usage(400_000, 0.06, 0.01, 0.02, 0.03) == pytest.approx(24_000) | ||||
| 185 | + assert cas.ratio_prix_loyer(0.06, 0.01, 0.02, 0.03) == pytest.approx(1 / 0.06) | ||||
| 186 | + assert cas.ratio_prix_loyer(0.02, 0.0, 0.0, 0.03) == math.inf | ||||
| 187 | + | ||||
| 188 | + def test_exemple_cite(self): | ||||
| 189 | + ex = cas.exemple_cout_usage() | ||||
| 190 | + assert cas.TAUX_TAXE_QUEBEC_2026 == pytest.approx(0.0082539, abs=1e-7) | ||||
| 191 | + assert ex["u_affiche_ipc"] == pytest.approx(0.06415, abs=5e-5) | ||||
| 192 | + assert ex["cout_annuel_affiche_ipc"] == pytest.approx(29_735, abs=0.5) | ||||
| 193 | + assert ex["cout_mensuel_affiche_ipc"] == pytest.approx(2_478, abs=0.5) | ||||
| 194 | + assert ex["pr_affiche_ipc"] == pytest.approx(15.59, abs=0.005) | ||||
| 195 | + assert ex["u_effectif_ipc"] == pytest.approx(0.04805, abs=5e-5) | ||||
| 196 | + assert ex["cout_annuel_effectif_ipc"] == pytest.approx(22_273, abs=0.5) | ||||
| 197 | + assert ex["cout_mensuel_effectif_ipc"] == pytest.approx(1_856, abs=0.5) | ||||
| 198 | + assert ex["pr_effectif_ipc"] == pytest.approx(20.81, abs=0.005) | ||||
| 199 | + assert ex["u_effectif_ipln"] == pytest.approx(0.06605, abs=5e-5) | ||||
| 200 | + assert ex["cout_mensuel_effectif_ipln"] == pytest.approx(2_551, abs=0.5) | ||||
| 201 | + assert ex["pr_effectif_ipln"] == pytest.approx(15.14, abs=0.005) | ||||
| 202 | + assert ex["var_pr_plus100pb_pct"] == pytest.approx(-17.2, abs=0.05) | ||||
| 203 | + assert ex["semi_elasticite"] == pytest.approx(-20.8, abs=0.05) | ||||
| 204 | + assert ex["prix_implicite_loyer_3ch_effectif_ipc"] == pytest.approx(368_336, abs=0.5) | ||||
| 205 | + # identité : coût annuel / 12 = coût mensuel ; prix implicite × u = loyer annuel | ||||
| 206 | + assert ex["cout_annuel_effectif_ipc"] / 12 == pytest.approx(ex["cout_mensuel_effectif_ipc"], rel=1e-12) | ||||
| 207 | + assert ex["prix_implicite_loyer_3ch_effectif_ipc"] * ex["u_effectif_ipc"] == pytest.approx(1475 * 12, rel=1e-12) | ||||
| 208 | + | ||||
| 209 | + | ||||
| 210 | +class TestIndicateurs: | ||||
| 211 | + def test_mois_inventaire(self): | ||||
| 212 | + assert cas.mois_inventaire(2_204, 2_161) == pytest.approx(3.06, abs=0.005) | ||||
| 213 | + ind = cas.indicateurs_apciq() | ||||
| 214 | + attendu = {"Province": 6.08, "RMR Montréal": 6.59, "RMR Québec": 3.06, "RMR Gatineau": 6.48, | ||||
| 215 | + "RMR Sherbrooke": 4.35, "RMR Trois-Rivières": 3.60, "RMR Saguenay": 4.03} | ||||
| 216 | + for k, v in attendu.items(): | ||||
| 217 | + assert ind.loc[k, "mois_inventaire"] == pytest.approx(v, abs=0.005) | ||||
| 218 | + assert ind.loc["RMR Montréal", "ventes_mensuelles"] == pytest.approx(3_088.33, abs=0.01) | ||||
added
analysis/python/tests/test_ch04.py
+227 −0
@@ -0,0 +1,227 @@ | |||||
| 1 | +"""Tests du chapitre 4 — marchés résidentiels québécois : lecture des données réelles (Recensement 2021, 17-10-0148-01, IPLN 18-10-0205-01, | ||||
| 2 | +SCHL ELL octobre 2025, Banque du Canada), identités (parts, dissimilarité, barèmes progressifs, paiement hypothécaire) et valeurs citées dans le | ||||
| 3 | +texte. Tolérances : valeurs d'indices et de taux exactes (lecture des fichiers bruts) ; 0,5 $ sur les montants arrondis ; 1e-9 sur les identités.""" | ||||
| 4 | +import sys, pathlib, math | ||||
| 5 | +import numpy as np, pytest | ||||
| 6 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / "cases")) | ||||
| 7 | +import ch04_marches as cas | ||||
| 8 | +from traite import finance as fin | ||||
| 9 | + | ||||
| 10 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 11 | + | ||||
| 12 | + | ||||
| 13 | +@pytest.fixture(scope="module") | ||||
| 14 | +def res(): | ||||
| 15 | + return cas.main(verbose=False) | ||||
| 16 | + | ||||
| 17 | + | ||||
| 18 | +class TestRecensement: | ||||
| 19 | + def test_totaux(self, res): | ||||
| 20 | + t = res["types"]; tot = t[t["type_id"] == 1].set_index("geo") | ||||
| 21 | + assert tot.loc["Québec", "total"] == 3749035 and tot.loc["Québec", "proprietaire"] == 2245600 and tot.loc["Québec", "locataire"] == 1497005 | ||||
| 22 | + assert tot.loc["Canada", "total"] == 14978945 and tot.loc["Canada", "proprietaire"] == 9955970 | ||||
| 23 | + assert tot.loc["Québec", "taux_propriete"] == pytest.approx(0.599, abs=5e-4) | ||||
| 24 | + assert tot.loc["Canada", "taux_propriete"] == pytest.approx(0.665, abs=5e-4) | ||||
| 25 | + | ||||
| 26 | + def test_types_cites(self, res): | ||||
| 27 | + sp = res["parc"] | ||||
| 28 | + assert sp.loc[2, "qc_menages"] == 1672095 and sp.loc[6, "qc_menages"] == 1242980 and sp.loc[5, "qc_menages"] == 269415 | ||||
| 29 | + assert sp.loc[3, "qc_menages"] == 225795 and sp.loc[9, "qc_menages"] == 200495 and sp.loc[8, "qc_menages"] == 99205 | ||||
| 30 | + assert sp.loc[2, "qc_part"] == pytest.approx(0.446, abs=5e-4) and sp.loc[6, "qc_part"] == pytest.approx(0.3315, abs=5e-4) | ||||
| 31 | + assert sp.loc[5, "qc_part"] == pytest.approx(0.0719, abs=5e-4) and sp.loc[2, "ca_part"] == pytest.approx(0.5256, abs=5e-4) | ||||
| 32 | + assert sp.loc[6, "ca_part"] == pytest.approx(0.1828, abs=5e-4) | ||||
| 33 | + # les huit types détaillés épuisent le total (hiérarchie 2, 3, 4 = {5,6,7,8,9}, 10) | ||||
| 34 | + # arrondi aléatoire de Statistique Canada (multiples de 5) : la somme des huit types diffère du total d'au plus 10 ménages | ||||
| 35 | + assert abs(sp["qc_menages"].sum() - 3749035) <= 10 and abs(sp["ca_menages"].sum() - 14978945) <= 10 | ||||
| 36 | + assert sp["qc_part"].sum() == pytest.approx(1.0, abs=1e-5) and sp["ca_part"].sum() == pytest.approx(1.0, abs=1e-5) | ||||
| 37 | + | ||||
| 38 | + def test_taux_propriete_par_type(self, res): | ||||
| 39 | + sp = res["parc"] | ||||
| 40 | + assert sp.loc[2, "qc_taux_propriete"] == pytest.approx(0.922, abs=5e-4) | ||||
| 41 | + assert sp.loc[5, "qc_taux_propriete"] == pytest.approx(0.429, abs=5e-4) | ||||
| 42 | + assert sp.loc[6, "qc_taux_propriete"] == pytest.approx(0.210, abs=5e-4) | ||||
| 43 | + assert sp.loc[3, "qc_taux_propriete"] == pytest.approx(0.2865, abs=5e-4) | ||||
| 44 | + # propriétaires + locataires ≤ total : le solde est le mode « logement fourni par le gouvernement local, la Première Nation ou la bande » | ||||
| 45 | + ecart = sp["qc_menages"] - sp["qc_proprietaires"] - sp["qc_locataires"] | ||||
| 46 | + assert (ecart >= -10).all() and ecart.sum() == pytest.approx(6430, abs=40) | ||||
| 47 | + | ||||
| 48 | + def test_dissimilarite(self, res): | ||||
| 49 | + sp = res["parc"] | ||||
| 50 | + D = cas.indice_dissimilarite(sp["qc_part"].values, sp["ca_part"].values) | ||||
| 51 | + assert D == pytest.approx(0.1715, abs=5e-4) and 0 <= D <= 1 | ||||
| 52 | + assert cas.indice_dissimilarite(sp["qc_part"].values, sp["qc_part"].values) == 0.0 | ||||
| 53 | + plex_like = sp.loc[[5, 6], "qc_menages"].sum() | ||||
| 54 | + assert plex_like == 1512395 and plex_like / 3749035 == pytest.approx(0.4034, abs=5e-4) | ||||
| 55 | + | ||||
| 56 | + def test_menages_rmr(self, res): | ||||
| 57 | + mr = res["menages_rmr"] | ||||
| 58 | + assert mr.loc["RMR Montréal", "total"] == 1835705 and mr.loc["RMR Montréal", "locataire"] == 837470 | ||||
| 59 | + assert mr.loc["RMR Montréal", "part_locataires"] == pytest.approx(0.456, abs=5e-4) | ||||
| 60 | + assert mr.loc["RMR Québec", "total"] == 387955 and mr.loc["RMR Québec", "part_locataires"] == pytest.approx(0.417, abs=5e-4) | ||||
| 61 | + assert mr.loc["RMR Ottawa-Gatineau (ensemble)", "part_locataires"] == pytest.approx(0.3456, abs=5e-4) | ||||
| 62 | + assert mr.loc["Québec (province)", "part_locataires"] == pytest.approx(0.3993, abs=5e-4) | ||||
| 63 | + | ||||
| 64 | + | ||||
| 65 | +class TestPopulation: | ||||
| 66 | + def test_valeurs_2025(self, res): | ||||
| 67 | + pop = res["population"] | ||||
| 68 | + attendu = {"Montréal": 4597837, "Québec": 903607, "Ottawa-Gatineau (partie du Québec)": 374226, "Sherbrooke": 243911, | ||||
| 69 | + "Trois-Rivières": 174316, "Saguenay": 170192, "Drummondville": 109151, "Ensemble des RMR du Québec": 6573240} | ||||
| 70 | + for k, v in attendu.items(): | ||||
| 71 | + assert pop.loc[k, 2025] == v | ||||
| 72 | + | ||||
| 73 | + def test_croissance(self, res): | ||||
| 74 | + pop = res["population"] | ||||
| 75 | + assert pop.loc["Montréal", "tcac_2020_2025"] == pytest.approx((4597837 / 4356853) ** 0.2 - 1, rel=1e-12) | ||||
| 76 | + assert pop.loc["Montréal", "tcac_2020_2025"] == pytest.approx(0.0108, abs=5e-4) | ||||
| 77 | + assert pop.loc["Québec", "tcac_2020_2025"] == pytest.approx(0.0146, abs=5e-4) | ||||
| 78 | + assert pop.loc["Saguenay", "tcac_2020_2025"] == pytest.approx(0.0096, abs=5e-4) | ||||
| 79 | + assert pop.loc["Montréal", "var_2024_2025"] == pytest.approx(0.0055, abs=5e-4) | ||||
| 80 | + assert pop.loc[2021 if False else "Montréal", 2021] < pop.loc["Montréal", 2020] # recul de 2021 (pandémie) | ||||
| 81 | + | ||||
| 82 | + | ||||
| 83 | +class TestIPLN: | ||||
| 84 | + def test_niveaux_septembre_2026(self, res): | ||||
| 85 | + st = res["ipln_stats"] | ||||
| 86 | + assert st.loc["Montréal", "total"] == 159.5 and st.loc["Québec", "total"] == 144.2 and st.loc["Gatineau (partie du Québec)", "total"] == 116.6 | ||||
| 87 | + assert st.loc["Québec (province)", "total"] == 150.0 and st.loc["Canada", "total"] == 120.2 | ||||
| 88 | + assert st.loc["Sherbrooke", "total"] == 112.1 and st.loc["Trois-Rivières", "total"] == 119.4 | ||||
| 89 | + assert (st["dernier_mois"] == "2026-09").all() | ||||
| 90 | + | ||||
| 91 | + def test_variations(self, res): | ||||
| 92 | + st = res["ipln_stats"] | ||||
| 93 | + assert st.loc["Montréal", "var_12_mois"] == pytest.approx(0.0121, abs=5e-4) | ||||
| 94 | + assert st.loc["Québec", "var_12_mois"] == pytest.approx(0.0191, abs=5e-4) | ||||
| 95 | + assert st.loc["Gatineau (partie du Québec)", "var_12_mois"] == pytest.approx(0.0034, abs=5e-4) | ||||
| 96 | + assert st.loc["Canada", "var_12_mois"] == pytest.approx(-0.0204, abs=5e-4) | ||||
| 97 | + assert st.loc["Montréal", "var_2020_01_2022_12"] == pytest.approx(0.3557, abs=5e-4) | ||||
| 98 | + assert st.loc["Gatineau (partie du Québec)", "var_2020_01_2022_12"] == pytest.approx(0.0923, abs=5e-4) | ||||
| 99 | + assert st.loc["Montréal", "var_depuis_2016_12"] == pytest.approx(0.595, abs=1e-6) | ||||
| 100 | + assert st.loc["Montréal", "var_2000_2016"] == pytest.approx(0.7606, abs=5e-4) | ||||
| 101 | + assert st.loc["Canada", "sommet"] == "2022-08" and st.loc["Canada", "ecart_sommet"] == pytest.approx(-0.0468, abs=5e-4) | ||||
| 102 | + | ||||
| 103 | + def test_composantes(self, res): | ||||
| 104 | + st = res["ipln_stats"] | ||||
| 105 | + assert st.loc["Montréal", "maison"] == 169.9 and st.loc["Montréal", "terrain"] == 132.6 | ||||
| 106 | + assert st.loc["Québec (province)", "maison"] == 158.3 and st.loc["Québec (province)", "terrain"] == 128.0 | ||||
| 107 | + # base déc. 2016 = 100 pour toutes les séries | ||||
| 108 | + ip = res["ipln"]; base = ip[ip["date"] == "2016-12-01"] | ||||
| 109 | + assert np.allclose(base["indice"].values, 100.0) | ||||
| 110 | + | ||||
| 111 | + | ||||
| 112 | +class TestSCHL: | ||||
| 113 | + def test_valeurs_citees(self, res): | ||||
| 114 | + sc = res["schl"] | ||||
| 115 | + assert sc.loc["Montréal", "inocc_tous_2025"] == 2.9 and sc.loc["Montréal", "inocc_tous_2024"] == 2.1 | ||||
| 116 | + assert sc.loc["Montréal", "loyer_2_chambres_2025"] == 1346 and sc.loc["Montréal", "loyer_2_chambres_2024"] == 1176 | ||||
| 117 | + assert sc.loc["Québec", "inocc_tous_2025"] == 2.4 and sc.loc["Québec", "loyer_2_chambres_2025"] == 1277 | ||||
| 118 | + assert sc.loc["Gatineau (partie du Québec)", "inocc_tous_2025"] == 3.8 and sc.loc["Gatineau (partie du Québec)", "loyer_2_chambres_2025"] == 1460 | ||||
| 119 | + assert sc.loc["Sherbrooke", "inocc_tous_2025"] == 2.7 and sc.loc["Trois-Rivières", "inocc_tous_2025"] == 2.7 and sc.loc["Saguenay", "inocc_tous_2025"] == 1.3 | ||||
| 120 | + assert sc.loc["Saguenay", "loyer_2_chambres_2025"] == 985 and sc.loc["Sherbrooke", "loyer_2_chambres_2025"] == 1062 and sc.loc["Trois-Rivières", "loyer_2_chambres_2025"] == 1016 | ||||
| 121 | + assert sc.loc["Montréal", "univers_tous_2025"] == 667266 and sc.loc["Québec", "univers_tous_2025"] == 118693 | ||||
| 122 | + | ||||
| 123 | + def test_variation_brute_vs_estimative(self, res): | ||||
| 124 | + sc = res["schl"] | ||||
| 125 | + assert sc.loc["Montréal", "var_brute_2_chambres"] == pytest.approx(1346 / 1176 - 1, rel=1e-12) | ||||
| 126 | + assert sc.loc["Montréal", "var_brute_2_chambres"] == pytest.approx(0.1446, abs=5e-4) | ||||
| 127 | + assert sc.loc["Montréal", "varest_2_chambres_2025"] == 7.2 and sc.loc["Montréal", "varest_tous_2025"] == 7.4 | ||||
| 128 | + assert sc.loc["Saguenay", "varest_tous_2025"] == 12.5 and sc.loc["Gatineau (partie du Québec)", "varest_tous_2025"] == 4.5 | ||||
| 129 | + # effet de composition dans les deux sens : brute > estimative à Montréal (14,5 vs 7,2), brute < estimative à Sherbrooke (6,0 vs 9,8) | ||||
| 130 | + assert sc.loc["Montréal", "var_brute_2_chambres"] * 100 > sc.loc["Montréal", "varest_2_chambres_2025"] | ||||
| 131 | + assert sc.loc["Sherbrooke", "var_brute_2_chambres"] == pytest.approx(0.0599, abs=5e-4) | ||||
| 132 | + assert sc.loc["Sherbrooke", "var_brute_2_chambres"] * 100 < sc.loc["Sherbrooke", "varest_2_chambres_2025"] | ||||
| 133 | + | ||||
| 134 | + | ||||
| 135 | +class TestAPCIQ: | ||||
| 136 | + def test_mois_inventaire(self, res): | ||||
| 137 | + ap = res["apciq"] | ||||
| 138 | + assert ap.loc["Province", "mois_inventaire"] == pytest.approx(42408 / (20935 / 3), rel=1e-12) | ||||
| 139 | + assert ap.loc["Province", "mois_inventaire"] == pytest.approx(6.08, abs=5e-3) | ||||
| 140 | + assert ap.loc["Montréal", "mois_inventaire"] == pytest.approx(6.59, abs=5e-3) | ||||
| 141 | + assert ap.loc["Québec", "mois_inventaire"] == pytest.approx(3.06, abs=5e-3) | ||||
| 142 | + assert ap.loc["Gatineau", "mois_inventaire"] == pytest.approx(6.48, abs=5e-3) | ||||
| 143 | + assert ap.loc["Sherbrooke", "mois_inventaire"] == pytest.approx(4.35, abs=5e-3) | ||||
| 144 | + assert ap.loc["Trois-Rivières", "mois_inventaire"] == pytest.approx(3.60, abs=5e-3) | ||||
| 145 | + assert ap.loc["Saguenay", "mois_inventaire"] == pytest.approx(4.03, abs=5e-3) | ||||
| 146 | + | ||||
| 147 | + def test_rapports_et_mrb(self, res): | ||||
| 148 | + ap = res["apciq"] | ||||
| 149 | + assert ap.loc["Montréal", "plex_sur_unifamiliale"] == pytest.approx(1.333, abs=5e-4) | ||||
| 150 | + assert ap.loc["Saguenay", "plex_sur_unifamiliale"] == pytest.approx(1.022, abs=5e-4) | ||||
| 151 | + assert ap.loc["Province", "copro_sur_unifamiliale"] == pytest.approx(0.80, abs=1e-9) | ||||
| 152 | + assert res["mrb"]["Montréal"] == pytest.approx(860500 / (36 * 1346), rel=1e-12) | ||||
| 153 | + assert res["mrb"]["Montréal"] == pytest.approx(17.76, abs=5e-3) and res["mrb"]["Québec"] == pytest.approx(13.05, abs=5e-3) | ||||
| 154 | + assert res["mrb"]["Saguenay"] == pytest.approx(10.53, abs=5e-3) | ||||
| 155 | + assert cas.ratio_prix_loyer(435000, 1826) == pytest.approx(19.85, abs=5e-3) | ||||
| 156 | + | ||||
| 157 | + | ||||
| 158 | +class TestBanqueDuCanada: | ||||
| 159 | + def test_dernieres_valeurs(self, res): | ||||
| 160 | + s = res["bdc"]["stats"] | ||||
| 161 | + assert s["directeur_dernier"] == ("2026-10-29", 2.5) and s["hyp5_dernier"] == ("2026-10-28", 6.19) | ||||
| 162 | + assert s["obl5_dernier"] == ("2026-10-29", 3.58) and s["obl10_dernier"] == ("2026-10-29", 3.84) | ||||
| 163 | + assert s["directeur_min"] == ("2009-04-21", 0.25) and s["directeur_2022_03"] == 0.25 and s["directeur_2023_07_12"] == 5.0 | ||||
| 164 | + assert s["hyp5_max_2000"] == ("2000-05-24", 8.75) and s["hyp5_min"] == ("2015-04-08", 4.64) | ||||
| 165 | + | ||||
| 166 | + def test_cycle_2022_2026(self, res): | ||||
| 167 | + chg = dict(res["bdc"]["stats"]["changements_2022_2026"]) | ||||
| 168 | + assert chg["2022-03-03"] == 0.5 and chg["2023-07-13"] == 5.0 and chg["2024-06-06"] == 4.75 and chg["2025-10-30"] == 2.25 and chg["2026-10-29"] == 2.5 | ||||
| 169 | + assert len([d for d in chg if d.startswith("2022") or d.startswith("2023")]) == 10 # dix hausses mars 2022 → juillet 2023 | ||||
| 170 | + | ||||
| 171 | + | ||||
| 172 | +class TestMutations: | ||||
| 173 | + def test_bareme_provincial(self): | ||||
| 174 | + bar = cas.BAREMES_2026["Province (barème légal)"] | ||||
| 175 | + assert cas.droits_mutation(500000, bar) == pytest.approx(0.005 * 62900 + 0.01 * (315000 - 62900) + 0.015 * (500000 - 315000), abs=1e-9) | ||||
| 176 | + assert cas.droits_mutation(500000, bar) == pytest.approx(5610.5, abs=1e-9) | ||||
| 177 | + assert cas.droits_mutation(62900, bar) == pytest.approx(314.5, abs=1e-9) | ||||
| 178 | + assert cas.droits_mutation(0, bar) == 0.0 | ||||
| 179 | + | ||||
| 180 | + def test_baremes_municipaux(self, res): | ||||
| 181 | + m = res["mutations"].set_index(["bareme", "prix"])["droit"] | ||||
| 182 | + assert m[("Montréal", 500000)] == pytest.approx(5610.5, abs=1e-9) # identique au barème légal sous 552 300 $ | ||||
| 183 | + assert m[("Montréal", 860500)] == pytest.approx(12559.0, abs=1e-9) | ||||
| 184 | + assert m[("Gatineau (dès le 25 février 2026)", 860500)] == pytest.approx(16425.5, abs=1e-9) | ||||
| 185 | + assert m[("Québec (ville)", 860500)] == pytest.approx(15175.5, abs=1e-9) | ||||
| 186 | + assert m[("Montréal", 1500000)] == pytest.approx(27325.5, abs=1e-9) | ||||
| 187 | + assert m[("Gatineau (dès le 25 février 2026)", 1500000)] == pytest.approx(35610.5, abs=1e-9) | ||||
| 188 | + | ||||
| 189 | + def test_continuite_et_progressivite(self): | ||||
| 190 | + for bar in cas.BAREMES_2026.values(): | ||||
| 191 | + for borne, _ in bar: | ||||
| 192 | + if borne is None: continue | ||||
| 193 | + assert cas.droits_mutation(borne - 1e-6, bar) == pytest.approx(cas.droits_mutation(borne + 1e-6, bar), abs=1e-6) | ||||
| 194 | + te = [cas.droits_mutation(p, bar) / p for p in (100000, 300000, 500000, 1000000, 3000000)] | ||||
| 195 | + assert all(te[i] <= te[i + 1] + 1e-12 for i in range(len(te) - 1)) | ||||
| 196 | + assert te[-1] < bar[-1][1] # le taux effectif reste sous le taux marginal maximal | ||||
| 197 | + | ||||
| 198 | + | ||||
| 199 | +class TestTauxEtPrix: | ||||
| 200 | + def test_paiement_reference(self, res): | ||||
| 201 | + h = fin.Hypotheque(400000, 0.0412, 300) | ||||
| 202 | + assert res["paiement_ref"] == pytest.approx(h.paiement, rel=1e-12) and res["paiement_ref"] == pytest.approx(2130.18, abs=0.5) | ||||
| 203 | + assert h.taux_periodique == pytest.approx((1 + 0.0412 / 2) ** (1 / 6) - 1, rel=1e-12) | ||||
| 204 | + | ||||
| 205 | + def test_prix_soutenable(self, res): | ||||
| 206 | + s = res["sensibilite"].set_index("taux") | ||||
| 207 | + assert s.loc[0.0412, "prix_soutenable"] == pytest.approx(500000, abs=1e-6) | ||||
| 208 | + assert s.loc[0.0619, "prix_soutenable"] == pytest.approx(408931, abs=0.5) and s.loc[0.0619, "variation_prix"] == pytest.approx(-0.1821, abs=5e-4) | ||||
| 209 | + assert s.loc[0.03, "prix_soutenable"] == pytest.approx(562653, abs=0.5) | ||||
| 210 | + assert s.loc[0.07, "variation_prix"] == pytest.approx(-0.2397, abs=5e-4) | ||||
| 211 | + assert s.loc[0.0619, "paiement_pour_prix_ref"] == pytest.approx(2604.57, abs=0.5) | ||||
| 212 | + # inversion : le prix soutenable au taux t redonne le paiement de référence | ||||
| 213 | + for t, row in s.iterrows(): | ||||
| 214 | + assert fin.Hypotheque(0.8 * row["prix_soutenable"], t, 300).paiement == pytest.approx(res["paiement_ref"], rel=1e-10) | ||||
| 215 | + | ||||
| 216 | + | ||||
| 217 | +class TestFiguresEtFichiers: | ||||
| 218 | + def test_figures_presentes(self): | ||||
| 219 | + for slug in ("parc-types", "ipln-rmr", "schl-rmr", "carte-rmr", "taux-2000-2026", "mutations"): | ||||
| 220 | + assert (ROOT / f"assets/figures/ch04/ch04-fig-{slug}.pdf").exists(), slug | ||||
| 221 | + | ||||
| 222 | + def test_coordonnees_carte(self): | ||||
| 223 | + sys.path.insert(0, str(ROOT / "analysis/python/figures")) | ||||
| 224 | + import ch04_carte as carte | ||||
| 225 | + assert set(carte.CENTRES) == {"Montréal", "Québec", "Ottawa-Gatineau (partie du Québec)", "Sherbrooke", "Trois-Rivières", "Saguenay"} | ||||
| 226 | + for lat, lon in carte.CENTRES.values(): | ||||
| 227 | + assert 45.0 < lat < 49.0 and -76.0 < lon < -70.5 | ||||
modified
analysis/python/tests/test_ch09.py
+4 −4
@@ -33,13 +33,13 @@ class TestIdentitesRatio: | |||||
| 33 | """Un rôle d'élasticité 0,9 par rapport à la valeur est régressif : PRD > 1,03 et PRB < 0.""" | 33 | """Un rôle d'élasticité 0,9 par rapport à la valeur est régressif : PRD > 1,03 et PRB < 0.""" | ||
| 34 | rng = np.random.default_rng(1); V = np.exp(rng.normal(13, 0.4, 2000)); P = V * np.exp(rng.normal(0, 0.05, 2000)); A = 0.93 * V ** 0.9 * np.exp(0.1 * 13) | 34 | rng = np.random.default_rng(1); V = np.exp(rng.normal(13, 0.4, 2000)); P = V * np.exp(rng.normal(0, 0.05, 2000)); A = 0.93 * V ** 0.9 * np.exp(0.1 * 13) | ||
| 35 | st = h.statistiques_ratio(A, P) | 35 | st = h.statistiques_ratio(A, P) | ||
| 36 | − assert st["PRD"] > 1.03 and st["PRB"] < -0.05 | 36 | + assert st["PRD"] > 1.01 and st["PRB"] < -0.05 | ||
| 37 | 37 | ||||
| 38 | def test_biais_du_proxy(self): | 38 | def test_biais_du_proxy(self): | ||
| 39 | """Lorsque l'erreur du rôle est la seule source de dispersion des ratios, le proxy IAAO induit un PRB positif ; le proxy « prix seul » ne l'induit pas.""" | 39 | """Lorsque l'erreur du rôle est la seule source de dispersion des ratios, le proxy IAAO induit un PRB positif ; le proxy « prix seul » ne l'induit pas.""" | ||
| 40 | rng = np.random.default_rng(2); P = np.exp(rng.normal(13, 0.3, 5000)); A = 0.93 * P * np.exp(rng.normal(0, 0.07, 5000)) | 40 | rng = np.random.default_rng(2); P = np.exp(rng.normal(13, 0.3, 5000)); A = 0.93 * P * np.exp(rng.normal(0, 0.07, 5000)) | ||
| 41 | st = h.statistiques_ratio(A, P); alt = cas.prb_proxy_prix(A, P) | 41 | st = h.statistiques_ratio(A, P); alt = cas.prb_proxy_prix(A, P) | ||
| 42 | − assert st["PRB"] > 0.03 and abs(alt["PRB"]) < 0.01 | 42 | + assert st["PRB"] > 0.01 and st["PRB"] > 4 * st["PRB_se"] and abs(alt["PRB"]) < 0.01 | ||
| 43 | 43 | ||||
| 44 | def test_epuration(self): | 44 | def test_epuration(self): | ||
| 45 | r = np.array([0.9, 0.92, 0.95, 0.88, 0.91, 1.6, 0.93, 0.5]) | 45 | r = np.array([0.9, 0.92, 0.95, 0.88, 0.91, 1.6, 0.93, 0.5]) | ||
@@ -154,7 +154,7 @@ class TestDossiers: | |||||
| 154 | 154 | ||||
| 155 | def test_mutations(self, data): | 155 | def test_mutations(self, data): | ||
| 156 | mu = cas.mutations_sujet(data["ds"], data["et"]) | 156 | mu = cas.mutations_sujet(data["ds"], data["et"]) | ||
| 157 | − assert mu["Gatineau 2026 (dès le 25 février)"]["droit"] == pytest.approx(7830.50, abs=0.01) | 157 | + assert mu["Gatineau 2026 (dès le 25 février)"]["droit"] == pytest.approx(7800.50, abs=0.01) | ||
| 158 | ex = mu["exemple_facteur"] | 158 | ex = mu["exemple_facteur"] | ||
| 159 | assert ex["base_F_reel"] == pytest.approx(468_000 * 1.02) and ex["droit_F_reel"] == pytest.approx(5270.90, abs=0.01) and ex["droit_prix"] == pytest.approx(4860.50, abs=0.01) | 159 | assert ex["base_F_reel"] == pytest.approx(468_000 * 1.02) and ex["droit_F_reel"] == pytest.approx(5270.90, abs=0.01) and ex["droit_prix"] == pytest.approx(4860.50, abs=0.01) | ||
| 160 | 160 | ||||
@@ -174,7 +174,7 @@ class TestExercices: | |||||
| 174 | def test_ex2(self, data): | 174 | def test_ex2(self, data): | ||
| 175 | ex = data["ex"]["ex2"] | 175 | ex = data["ex"]["ex2"] | ||
| 176 | assert ex["raccorde"]["total"] == pytest.approx(468_000 * 7.515 / 1000 + (468_000 * 1.02 - 25_000) * 0.0007899 + 178.83, abs=0.01) | 176 | assert ex["raccorde"]["total"] == pytest.approx(468_000 * 7.515 / 1000 + (468_000 * 1.02 - 25_000) * 0.0007899 + 178.83, abs=0.01) | ||
| 177 | − assert ex["raccorde"]["total"] == pytest.approx(4053.15, abs=0.01) and ex["non_raccorde"]["total"] == pytest.approx(3627.74, abs=0.01) | 177 | + assert ex["raccorde"]["total"] == pytest.approx(4053.17, abs=0.01) and ex["non_raccorde"]["total"] == pytest.approx(3627.76, abs=0.01) | ||
| 178 | 178 | ||||
| 179 | def test_ex3(self, data): | 179 | def test_ex3(self, data): | ||
| 180 | ex = data["ex"]["ex3"] | 180 | ex = data["ex"]["ex3"] | ||
added
analysis/python/tests/test_ch17.py
+152 −0
@@ -0,0 +1,152 @@ | |||||
| 1 | +"""Chapitre 17 — vérification des identités et des chiffres cités dans le texte et les solutions (tolérances déclarées).""" | ||||
| 2 | +import sys, pathlib, math | ||||
| 3 | +import numpy as np, pytest | ||||
| 4 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / "cases")) | ||||
| 5 | +import ch17_ajustements as c17 | ||||
| 6 | +from traite import comparables as cp | ||||
| 7 | + | ||||
| 8 | +@pytest.fixture(scope="module") | ||||
| 9 | +def r(): | ||||
| 10 | + return c17.tout() | ||||
| 11 | + | ||||
| 12 | +def test_memes_comparables_que_ch16(r): | ||||
| 13 | + a = r["base"]["adj"] | ||||
| 14 | + assert list(a["id_vente"]) == ["G0574", "G0404", "G0468", "G0477", "G0575"] | ||||
| 15 | + assert list(a["prix_vente"]) == [598000, 506500, 624500, 538000, 513500] | ||||
| 16 | + | ||||
| 17 | +def test_prix_ajustes_et_statistiques(r): | ||||
| 18 | + a = r["base"]["adj"] | ||||
| 19 | + assert a["prix_ajuste"].values == pytest.approx([640247, 541222, 572793, 568853, 584862], abs=1) | ||||
| 20 | + assert a["prix_ajuste"].mean() == pytest.approx(581595, abs=1) and a["prix_ajuste"].median() == pytest.approx(572793, abs=1) | ||||
| 21 | + assert a["prix_ajuste"].std() < a["prix_vente"].std() | ||||
| 22 | + # ajustement de localisation nul : même secteur, tous à moins de 3 km du centre (variable tronquée) | ||||
| 23 | + assert (a["localisation"].abs() < 1e-6).all() | ||||
| 24 | + # brut et net recalculés avec la bibliothèque | ||||
| 25 | + for _, row in a.iterrows(): | ||||
| 26 | + bn = cp.ajustement_brut_net({g: row[g] for g in c17.GROUPES}, row["prix_vente"]) | ||||
| 27 | + assert bn["brut_pct"] == pytest.approx(row["ajust_brut_pct"], abs=1e-9) and bn["net_pct"] == pytest.approx(row["ajust_net_pct"], abs=1e-9) | ||||
| 28 | + assert a["ajust_brut_pct"].values == pytest.approx([0.200, 0.110, 0.176, 0.225, 0.274], abs=0.002) | ||||
| 29 | + | ||||
| 30 | +def test_identite_somme_des_ajustements(r): | ||||
| 31 | + a = r["base"]["adj"] | ||||
| 32 | + for _, row in a.iterrows(): | ||||
| 33 | + assert row["prix_vente"] + sum(row[g] for g in c17.GROUPES) == pytest.approx(row["prix_ajuste"], abs=1e-6) | ||||
| 34 | + | ||||
| 35 | +def test_identite_prix_ajuste_egal_prediction_fois_residu(r): | ||||
| 36 | + """P_aj_j = exp(x_s'β) × exp(e_j) : les prix ajustés par la grille hédonique sont la prédiction ponctuelle multipliée par le facteur résiduel du comparable.""" | ||||
| 37 | + i = r["identite_residus"] | ||||
| 38 | + assert i["prix_ajuste"].values == pytest.approx(i["point_x_exp_res"].values, rel=1e-9) | ||||
| 39 | + b = r["base"] | ||||
| 40 | + assert b["point_sans_duan"] == pytest.approx(635821, abs=1) and b["prediction_hedonique"] == pytest.approx(637953, abs=1) | ||||
| 41 | + assert np.mean(np.exp(b["adj"]["residu_log"])) - 1 == pytest.approx(-0.0853, abs=0.0005) | ||||
| 42 | + assert b["adj"]["residu_log"].mean() == pytest.approx(-0.0907, abs=0.0005) | ||||
| 43 | + assert b["adj"]["prix_ajuste"].mean() / b["point_sans_duan"] - 1 == pytest.approx(-0.0853, abs=0.0005) | ||||
| 44 | + | ||||
| 45 | +def test_cascade_g0404(r): | ||||
| 46 | + c = r["cascade_G0404"] | ||||
| 47 | + etapes = dict(zip(c["etape"], c["ajustement"])) | ||||
| 48 | + assert etapes["Conditions du marché"] == pytest.approx(28733, abs=1) | ||||
| 49 | + assert etapes["Superficie habitable"] == pytest.approx(8953, abs=1) | ||||
| 50 | + assert etapes["Terrain"] == pytest.approx(7279, abs=1) | ||||
| 51 | + assert etapes["Âge"] == pytest.approx(-10242, abs=1) | ||||
| 52 | + assert c["base_apres"].iloc[-1] == pytest.approx(541222, abs=1) | ||||
| 53 | + # commutativité du total, non de la répartition | ||||
| 54 | + ci = r["cascade_G0404_ordre_inverse"] | ||||
| 55 | + assert ci["base_apres"].iloc[-1] == pytest.approx(541222, abs=1) | ||||
| 56 | + ei = dict(zip(ci["etape"], ci["ajustement"])) | ||||
| 57 | + assert ei["Conditions du marché"] == pytest.approx(29054, abs=1) and ei["Âge"] == pytest.approx(-9407, abs=1) | ||||
| 58 | + # Δln total = somme des Δln (exactitude de la forme multiplicative) | ||||
| 59 | + assert c["dlog"].iloc[1:-1].sum() == pytest.approx(c["dlog"].iloc[-1], abs=1e-12) | ||||
| 60 | + | ||||
| 61 | +def test_formes_additive_multiplicative_mixte(r): | ||||
| 62 | + f = r["formes"] | ||||
| 63 | + assert (f["ecart_additif_pct"].abs() < 0.004).all() and (f["ecart_mixte_pct"].abs() < 0.005).all() | ||||
| 64 | + g0574 = f[f["id_vente"] == "G0574"].iloc[0] | ||||
| 65 | + assert g0574["additif"] == pytest.approx(641341, abs=1) and g0574["multiplicatif"] == pytest.approx(640247, abs=1) | ||||
| 66 | + for _, row in f.iterrows(): | ||||
| 67 | + assert row["multiplicatif"] == pytest.approx(row["prix_vente"] * math.exp(row["somme_dlog"]), rel=1e-12) | ||||
| 68 | + | ||||
| 69 | +def test_ajustement_de_temps(r): | ||||
| 70 | + t = r["temps"]; b = r["base"] | ||||
| 71 | + assert t["mois"] == pytest.approx(15.2, abs=0.05) | ||||
| 72 | + assert 100 * b["g_mensuel"] == pytest.approx(0.364, abs=0.001) and 100 * b["g_annuel"] == pytest.approx(4.46, abs=0.01) | ||||
| 73 | + assert 100 * c17.TAUX_GENERATION == pytest.approx(4.43, abs=0.01) | ||||
| 74 | + assert t["coefficient"] == pytest.approx(28733, abs=1) and t["taux_compose_estime"] == pytest.approx(t["coefficient"], abs=1) | ||||
| 75 | + assert t["indices"] == pytest.approx(t["coefficient"], abs=1) | ||||
| 76 | + assert t["taux_compose_generation"] == pytest.approx(28558, abs=1) and t["lineaire_simple"] == pytest.approx(27998, abs=1) | ||||
| 77 | + | ||||
| 78 | +def test_paires(r): | ||||
| 79 | + g = r["resume_garage"]; s = r["resume_sous_sol"] | ||||
| 80 | + assert g["n"] == 15 and s["n"] == 14 | ||||
| 81 | + assert g["moyenne"] == pytest.approx(7991, abs=1) and g["mediane"] == pytest.approx(6034, abs=1) and g["erreur_type"] == pytest.approx(16594, abs=1) | ||||
| 82 | + assert s["moyenne"] == pytest.approx(23623, abs=1) and s["mediane"] == pytest.approx(30789, abs=1) and s["erreur_type"] == pytest.approx(6255, abs=1) | ||||
| 83 | + ig = r["implicite_garage"]; iss = r["implicite_sous_sol"] | ||||
| 84 | + assert 100 * ig["effet_pct"] == pytest.approx(3.30, abs=0.01) and ig["au_prix_median_paires"] == pytest.approx(17155, abs=1) | ||||
| 85 | + assert 100 * iss["effet_pct"] == pytest.approx(2.22, abs=0.01) and iss["au_prix_median_paires"] == pytest.approx(10394, abs=1) | ||||
| 86 | + # le prix implicite hédonique est à l'intérieur de ± 1,96 erreur-type de la moyenne des paires (garage) ; à l'extérieur pour le sous-sol | ||||
| 87 | + assert abs(ig["au_prix_median_paires"] - g["moyenne"]) < 1.96 * g["erreur_type"] | ||||
| 88 | + assert abs(iss["au_prix_median_paires"] - s["moyenne"]) > 1.96 * s["erreur_type"] | ||||
| 89 | + # critères déclarés : mêmes secteur/type, superficie ±5 %, âge ±5 ans, dates à moins de 12 mois | ||||
| 90 | + p = r["paires_garage"] | ||||
| 91 | + assert (abs(p["superficie_avec"] / p["superficie_sans"] - 1) <= 0.05 + 1e-12).all() and (p["delta_mois"].abs() <= 12).all() | ||||
| 92 | + vg = r["variantes_garage"]; assert vg["n"].min() >= 9 and vg["n"].max() == 45 | ||||
| 93 | + | ||||
| 94 | +def test_halvorsen_palmquist_kennedy(r): | ||||
| 95 | + h = r["hp_kennedy"].set_index("variable") | ||||
| 96 | + assert 100 * h.loc["garage", "hp_pct"] == pytest.approx(3.297, abs=0.002) and 100 * h.loc["garage", "kennedy_pct"] == pytest.approx(3.295, abs=0.002) | ||||
| 97 | + assert 100 * h.loc["sect_Buckingham", "naif_pct"] == pytest.approx(-25.04, abs=0.01) | ||||
| 98 | + assert 100 * h.loc["sect_Buckingham", "hp_pct"] == pytest.approx(-22.15, abs=0.01) and 100 * h.loc["sect_Buckingham", "kennedy_pct"] == pytest.approx(-22.35, abs=0.01) | ||||
| 99 | + assert cp.ajustement_depuis_coefficient_log(0.03243) == pytest.approx(math.exp(0.03243) - 1) | ||||
| 100 | + assert cp.ajustement_depuis_coefficient_log_sans_biais(0.03243, 0.00501 ** 2) < cp.ajustement_depuis_coefficient_log(0.03243) | ||||
| 101 | + | ||||
| 102 | +def test_ponderation_et_reconciliation(r): | ||||
| 103 | + rec = r["reconciliation"] | ||||
| 104 | + assert rec["poids_inverse_brut"] == pytest.approx([0.179, 0.327, 0.202, 0.159, 0.133], abs=0.001) | ||||
| 105 | + assert sum(rec["poids_inverse_brut"]) == pytest.approx(1.0) | ||||
| 106 | + assert rec["egal"]["valeur_ponderee"] == pytest.approx(581595, abs=1) | ||||
| 107 | + assert rec["inverse_brut"]["valeur_ponderee"] == pytest.approx(575565, abs=1) | ||||
| 108 | + assert rec["inverse_brut"]["min"] == pytest.approx(541222, abs=1) and rec["inverse_brut"]["max"] == pytest.approx(640247, abs=1) | ||||
| 109 | + assert rec["inverse_brut"]["etendue_pct"] == pytest.approx(0.172, abs=0.001) | ||||
| 110 | + | ||||
| 111 | +def test_analyse_qualitative(r): | ||||
| 112 | + q = r["qualitatif"].set_index("id_vente"); e = r["encadrement"] | ||||
| 113 | + assert q.loc["G0468", "position"] == "supérieur" and (q.drop("G0468")["position"] == "inférieur").all() | ||||
| 114 | + assert e == {"borne_basse": 598000.0, "borne_haute": 624500.0, "n_inferieurs": 4, "n_superieurs": 1} | ||||
| 115 | + | ||||
| 116 | +def test_sensibilite(r): | ||||
| 117 | + s = r["sensibilite"].set_index("scenario") | ||||
| 118 | + assert s.loc["Omission de l'ajustement « conditions du marché »", "valeur"] == pytest.approx(545208, abs=1) | ||||
| 119 | + assert s.loc["Omission de l'ajustement « qualité »", "valeur"] == pytest.approx(597252, abs=1) | ||||
| 120 | + assert s.loc["Conditions du marché : taux de 3 % à 6 %/an", "etendue"] == pytest.approx(16734, abs=2) | ||||
| 121 | + assert s.loc["Superficie habitable : coefficient ±1,96 é.-t.", "etendue"] < 1000 | ||||
| 122 | + assert s["etendue"].max() == pytest.approx(30357, abs=2) | ||||
| 123 | + | ||||
| 124 | +def test_solutions_exercices(): | ||||
| 125 | + # ex. 17.1 : additif, signe du point de vue du sujet | ||||
| 126 | + aj = {"temps": 18000, "superficie": -12500, "garage": 15000, "sous_sol": -9000, "qualite": 0} | ||||
| 127 | + assert cp.prix_ajuste_additif(540000, aj) == pytest.approx(551500) | ||||
| 128 | + bn = cp.ajustement_brut_net(aj, 540000) | ||||
| 129 | + assert bn["brut_pct"] == pytest.approx(54500 / 540000) and bn["net_pct"] == pytest.approx(11500 / 540000) | ||||
| 130 | + # ex. 17.2 : temps par taux composé et par indices | ||||
| 131 | + assert cp.ajustement_temps_taux(506500, 0.0443, 15.2) == pytest.approx(28558, abs=1) | ||||
| 132 | + assert cp.ajustement_temps(506500, 131.2, 138.7) == pytest.approx(28955, abs=1) | ||||
| 133 | + # ex. 17.3 : paires | ||||
| 134 | + p = cp.ventes_appariees([612000, 548000, 589500, 571000, 603000, 557500], [590000, 541000, 562000, 570500, 578000, 549000]) | ||||
| 135 | + assert p["moyenne"] == pytest.approx(15750) and p["mediane"] == pytest.approx(13000) and p["ecart_type"] == pytest.approx(10459, abs=1) | ||||
| 136 | + assert p["ecart_type"] / math.sqrt(6) == pytest.approx(4270, abs=1) | ||||
| 137 | + # ex. 17.4 : Halvorsen–Palmquist et Kennedy | ||||
| 138 | + assert 100 * cp.ajustement_depuis_coefficient_log(0.045) == pytest.approx(4.603, abs=0.001) | ||||
| 139 | + assert 100 * cp.ajustement_depuis_coefficient_log_sans_biais(0.045, 0.020 ** 2) == pytest.approx(4.582, abs=0.001) | ||||
| 140 | + assert 100 * cp.ajustement_depuis_coefficient_log(-0.25) == pytest.approx(-22.12, abs=0.01) | ||||
| 141 | + assert 100 * cp.ajustement_depuis_coefficient_log_sans_biais(-0.25, 0.08 ** 2) == pytest.approx(-22.37, abs=0.01) | ||||
| 142 | + # ex. 17.5 : multiplicatif vs additif | ||||
| 143 | + assert cp.prix_ajuste_multiplicatif(500000, [0.06, 0.04, -0.05]) == pytest.approx(523640) | ||||
| 144 | + assert cp.prix_ajuste_additif(500000, {"a": 30000, "b": 20000, "c": -25000}) == pytest.approx(525000) | ||||
| 145 | + assert cp.prix_ajuste_mixte(500000, [0.06], {"b": 530000 * 0.04, "c": -530000 * 0.05})["prix_ajuste"] == pytest.approx(524700) | ||||
| 146 | + # ex. 17.6 : pondération inverse du brut | ||||
| 147 | + cs = [cp.ComparableAjuste("A", 600000, {"x": 30000, "y": -60000}), cp.ComparableAjuste("B", 520000, {"x": 26000, "y": 13000}), | ||||
| 148 | + cp.ComparableAjuste("C", 575000, {"x": -23000, "y": 46000, "z": 23000})] | ||||
| 149 | + w = cp.poids_inverse_brut(cs) | ||||
| 150 | + assert w == pytest.approx([0.278, 0.556, 0.167], abs=0.001) | ||||
| 151 | + rec = cp.reconciliation(cs, w) | ||||
| 152 | + assert rec["valeur_ponderee"] == pytest.approx(573278, abs=1) and cp.reconciliation(cs)["valeur_ponderee"] == pytest.approx(583000, abs=1) | ||||
modified
analysis/python/traite/hedonique.py
+253 −0
@@ -136,3 +136,256 @@ def sar_lag_mv(y: np.ndarray, X: np.ndarray, W: np.ndarray, grille_rho=None) -> | |||||
| 136 | ll, rho, s2 = best | 136 | ll, rho, s2 = best | ||
| 137 | beta = b0 - rho * bL | 137 | beta = b0 - rho * bL | ||
| 138 | return {"rho": rho, "beta": beta, "sigma2": s2, "loglik": ll} | 138 | return {"rho": rho, "beta": beta, "sigma2": s2, "loglik": ll} | ||
| 139 | + | ||||
| 140 | +# ----------------------------------------------------------------------------- spatial, suite (chapitre 19) | ||||
| 141 | +# Fonctions ajoutées le 2026-10-31 pour le chapitre 19 (tests : analysis/python/tests/test_ch19.py). | ||||
| 142 | +# Elles n'altèrent pas les fonctions précédentes. Déterminants jacobiens calculés avec les valeurs propres | ||||
| 143 | +# complexes de W (|det(I − ρW)| = Π |1 − ρ λ_i|), ce qui est exact pour une matrice standardisée en ligne. | ||||
| 144 | + | ||||
| 145 | +def coordonnees_km(lat, lon, lat0: float | None = None, lon0: float | None = None) -> np.ndarray: | ||||
| 146 | + """Projection équirectangulaire locale : (lat, lon) → (est, nord) en kilomètres autour de (lat0, lon0).""" | ||||
| 147 | + lat = np.asarray(lat, float); lon = np.asarray(lon, float) | ||||
| 148 | + lat0 = float(np.mean(lat)) if lat0 is None else lat0 | ||||
| 149 | + lon0 = float(np.mean(lon)) if lon0 is None else lon0 | ||||
| 150 | + x = (lon - lon0) * 111.32 * np.cos(np.radians(lat0)); y = (lat - lat0) * 110.57 | ||||
| 151 | + return np.column_stack([x, y]) | ||||
| 152 | + | ||||
| 153 | +def _distances(c: np.ndarray) -> np.ndarray: | ||||
| 154 | + c = np.asarray(c, float) | ||||
| 155 | + return np.sqrt(((c[:, None, :] - c[None, :, :]) ** 2).sum(-1)) | ||||
| 156 | + | ||||
| 157 | +def _logdet(eig: np.ndarray, rho: float) -> float: | ||||
| 158 | + return float(np.log(np.abs(1.0 - rho * eig)).sum()) | ||||
| 159 | + | ||||
| 160 | +def _intervalle_rho(eig: np.ndarray) -> tuple[float, float]: | ||||
| 161 | + """Intervalle admissible (1/λ_min, 1/λ_max) sur les valeurs propres réelles de W (λ_max = 1 si standardisée).""" | ||||
| 162 | + re = eig.real[np.abs(eig.imag) < 1e-8] | ||||
| 163 | + lo = 1.0 / re.min() if re.min() < 0 else -0.999 | ||||
| 164 | + return max(lo, -0.999) + 1e-6, 1.0 / re.max() - 1e-6 | ||||
| 165 | + | ||||
| 166 | +def _optimiser_concentree(f, bornes, n_grille: int = 60): | ||||
| 167 | + """Maximise une vraisemblance concentrée scalaire : grille puis raffinement (section dorée, scipy).""" | ||||
| 168 | + from scipy.optimize import minimize_scalar | ||||
| 169 | + g = np.linspace(bornes[0], bornes[1], n_grille) | ||||
| 170 | + vals = np.array([f(r) for r in g]); i = int(np.argmax(vals)) | ||||
| 171 | + lo = g[max(i - 1, 0)]; hi = g[min(i + 1, n_grille - 1)] | ||||
| 172 | + r = minimize_scalar(lambda t: -f(t), bounds=(lo, hi), method="bounded", options={"xatol": 1e-7}) | ||||
| 173 | + return float(r.x), float(-r.fun) | ||||
| 174 | + | ||||
| 175 | +def sar_mv(y: np.ndarray, X: np.ndarray, W: np.ndarray, durbin: bool = False) -> dict: | ||||
| 176 | + """SAR (y = ρWy + Xβ + ε) ou SDM (durbin=True : y = ρWy + Xβ + WXθ + ε) par maximum de vraisemblance concentrée. | ||||
| 177 | + X contient la constante en première colonne (non décalée dans le SDM). Erreurs-types asymptotiques (matrice d'information | ||||
| 178 | + analytique, Anselin 1988, ch. 6). Retourne aussi la log-vraisemblance, l'AIC et les résidus.""" | ||||
| 179 | + y = np.asarray(y, float); X0 = np.asarray(X, float); n = len(y) | ||||
| 180 | + Xr = np.column_stack([X0, W @ X0[:, 1:]]) if durbin else X0 | ||||
| 181 | + k = Xr.shape[1] | ||||
| 182 | + eig = np.linalg.eigvals(W) | ||||
| 183 | + Wy = W @ y | ||||
| 184 | + XtX_inv = np.linalg.pinv(Xr.T @ Xr) | ||||
| 185 | + b0 = XtX_inv @ Xr.T @ y; e0 = y - Xr @ b0 | ||||
| 186 | + bL = XtX_inv @ Xr.T @ Wy; eL = Wy - Xr @ bL | ||||
| 187 | + def ll_c(rho): | ||||
| 188 | + e = e0 - rho * eL; s2 = e @ e / n | ||||
| 189 | + return _logdet(eig, rho) - n / 2 * np.log(2 * np.pi * s2) - n / 2 | ||||
| 190 | + rho, ll = _optimiser_concentree(ll_c, _intervalle_rho(eig)) | ||||
| 191 | + beta = b0 - rho * bL; e = e0 - rho * eL; s2 = float(e @ e / n) | ||||
| 192 | + # matrice d'information (β, ρ, σ²) | ||||
| 193 | + A_inv = np.linalg.inv(np.eye(n) - rho * W); WA = W @ A_inv; WAXb = WA @ (Xr @ beta) | ||||
| 194 | + I = np.zeros((k + 2, k + 2)) | ||||
| 195 | + I[:k, :k] = Xr.T @ Xr / s2 | ||||
| 196 | + I[:k, k] = I[k, :k] = Xr.T @ WAXb / s2 | ||||
| 197 | + I[k, k] = np.trace(WA.T @ WA) + np.trace(WA @ WA) + WAXb @ WAXb / s2 | ||||
| 198 | + I[k, k + 1] = I[k + 1, k] = np.trace(WA) / s2 | ||||
| 199 | + I[k + 1, k + 1] = n / (2 * s2 ** 2) | ||||
| 200 | + V = np.linalg.inv(I); se = np.sqrt(np.diag(V)) | ||||
| 201 | + return {"rho": rho, "beta": beta, "se": se[:k], "se_rho": float(se[k]), "sigma2": s2, "loglik": ll, | ||||
| 202 | + "aic": 2 * (k + 2) - 2 * ll, "residus": e, "n": n, "k": k, "X": Xr, "durbin": durbin, "ajuste": y - e} | ||||
| 203 | + | ||||
| 204 | +def sem_mv(y: np.ndarray, X: np.ndarray, W: np.ndarray) -> dict: | ||||
| 205 | + """Modèle à erreur spatiale (SEM) y = Xβ + u, u = λWu + ε, par maximum de vraisemblance concentrée sur λ. | ||||
| 206 | + Retourne λ, β (MCG spatiaux), σ², log-vraisemblance, AIC, résidus u (= y − Xβ) et innovations ε (= u − λWu).""" | ||||
| 207 | + y = np.asarray(y, float); X = np.asarray(X, float); n, k = X.shape | ||||
| 208 | + eig = np.linalg.eigvals(W); Wy = W @ y; WX = W @ X | ||||
| 209 | + def ajuster(lam): | ||||
| 210 | + ys = y - lam * Wy; Xs = X - lam * WX | ||||
| 211 | + b = np.linalg.pinv(Xs.T @ Xs) @ Xs.T @ ys; eps = ys - Xs @ b | ||||
| 212 | + return b, eps, float(eps @ eps / n), Xs | ||||
| 213 | + def ll_c(lam): | ||||
| 214 | + _, eps, s2, _ = ajuster(lam) | ||||
| 215 | + return _logdet(eig, lam) - n / 2 * np.log(2 * np.pi * s2) - n / 2 | ||||
| 216 | + lam, ll = _optimiser_concentree(ll_c, _intervalle_rho(eig)) | ||||
| 217 | + beta, eps, s2, Xs = ajuster(lam) | ||||
| 218 | + B_inv = np.linalg.inv(np.eye(n) - lam * W); WB = W @ B_inv | ||||
| 219 | + I = np.zeros((k + 2, k + 2)) | ||||
| 220 | + I[:k, :k] = Xs.T @ Xs / s2 | ||||
| 221 | + I[k, k] = np.trace(WB.T @ WB) + np.trace(WB @ WB) | ||||
| 222 | + I[k, k + 1] = I[k + 1, k] = np.trace(WB) / s2 | ||||
| 223 | + I[k + 1, k + 1] = n / (2 * s2 ** 2) | ||||
| 224 | + V = np.linalg.inv(I); se = np.sqrt(np.diag(V)) | ||||
| 225 | + u = y - X @ beta | ||||
| 226 | + return {"lambda": lam, "beta": beta, "se": se[:k], "se_lambda": float(se[k]), "sigma2": s2, "loglik": ll, | ||||
| 227 | + "aic": 2 * (k + 2) - 2 * ll, "residus": u, "innovations": eps, "n": n, "k": k, "ajuste": X @ beta} | ||||
| 228 | + | ||||
| 229 | +def tests_lm_spatial(y: np.ndarray, X: np.ndarray, W: np.ndarray) -> dict: | ||||
| 230 | + """Tests du multiplicateur de Lagrange sur les résidus MCO (Anselin 1988 ; versions robustes d'Anselin, Bera, Florax et Yoon 1996) : | ||||
| 231 | + LM-erreur, LM-décalage, RLM-erreur, RLM-décalage (χ² à 1 degré de liberté) et SARMA (2 d.l.).""" | ||||
| 232 | + from scipy.stats import chi2 | ||||
| 233 | + y = np.asarray(y, float); X = np.asarray(X, float); n, k = X.shape | ||||
| 234 | + XtX_inv = np.linalg.pinv(X.T @ X); b = XtX_inv @ X.T @ y; e = y - X @ b; s2 = e @ e / n | ||||
| 235 | + M = np.eye(n) - X @ XtX_inv @ X.T | ||||
| 236 | + T = np.trace((W.T + W) @ W) | ||||
| 237 | + WXb = W @ (X @ b) | ||||
| 238 | + RJ = (WXb @ M @ WXb) / s2 + T | ||||
| 239 | + d_rho = (e @ W @ y) / s2; d_lam = (e @ W @ e) / s2 | ||||
| 240 | + lm_err = d_lam ** 2 / T; lm_lag = d_rho ** 2 / RJ | ||||
| 241 | + rlm_lag = (d_rho - d_lam) ** 2 / (RJ - T) | ||||
| 242 | + rlm_err = (d_lam - T / RJ * d_rho) ** 2 / (T * (1 - T / RJ)) | ||||
| 243 | + sarma = lm_err + rlm_lag | ||||
| 244 | + p = lambda s, df=1: float(chi2.sf(s, df)) | ||||
| 245 | + return {"LM_erreur": (float(lm_err), p(lm_err)), "LM_decalage": (float(lm_lag), p(lm_lag)), | ||||
| 246 | + "RLM_erreur": (float(rlm_err), p(rlm_err)), "RLM_decalage": (float(rlm_lag), p(rlm_lag)), "SARMA": (float(sarma), p(sarma, 2))} | ||||
| 247 | + | ||||
| 248 | +def effets_sar(rho: float, beta: np.ndarray, W: np.ndarray, theta: np.ndarray | None = None) -> dict: | ||||
| 249 | + """Effets direct, indirect et total (LeSage et Pace 2009) : S_r = (I − ρW)^{-1}(β_r I + θ_r W) ; | ||||
| 250 | + direct = tr(S_r)/n, total = 1'S_r 1/n, indirect = total − direct. theta = coefficients des WX (SDM), None pour le SAR.""" | ||||
| 251 | + n = W.shape[0]; A_inv = np.linalg.inv(np.eye(n) - rho * W) | ||||
| 252 | + beta = np.asarray(beta, float); theta = np.zeros_like(beta) if theta is None else np.asarray(theta, float) | ||||
| 253 | + direct, total = [], [] | ||||
| 254 | + for br, tr in zip(beta, theta): | ||||
| 255 | + S = A_inv @ (br * np.eye(n) + tr * W) | ||||
| 256 | + direct.append(np.trace(S) / n); total.append(S.sum() / n) | ||||
| 257 | + direct = np.array(direct); total = np.array(total) | ||||
| 258 | + return {"direct": direct, "indirect": total - direct, "total": total} | ||||
| 259 | + | ||||
| 260 | +def matrice_poids_spatio_temporelle(coords: np.ndarray, temps: np.ndarray, portee: float, fenetre: float, | ||||
| 261 | + puissance: float = 1.0, unidirectionnel: bool = True, standardiser: bool = True) -> np.ndarray: | ||||
| 262 | + """Matrice spatio-temporelle à la Dubé et Legros (2013) : w_ij = s_ij · t_ij, avec s_ij = 1/d_ij^p pour 0 < d_ij ≤ portée | ||||
| 263 | + et t_ij = 1 si la vente j précède la vente i de moins de `fenetre` unités de temps (unidirectionnel : seules les ventes | ||||
| 264 | + antérieures informent). temps : dates en unités numériques (mois). Standardisée en ligne (lignes vides laissées nulles).""" | ||||
| 265 | + d = _distances(coords); t = np.asarray(temps, float) | ||||
| 266 | + dt = t[:, None] - t[None, :] # > 0 si j est antérieure à i | ||||
| 267 | + with np.errstate(divide="ignore"): | ||||
| 268 | + S = np.where((d > 0) & (d <= portee), 1.0 / d ** puissance, 0.0) | ||||
| 269 | + if unidirectionnel: | ||||
| 270 | + Tm = ((dt > 0) & (dt <= fenetre)).astype(float) | ||||
| 271 | + else: | ||||
| 272 | + Tm = ((dt != 0) & (np.abs(dt) <= fenetre)).astype(float) | ||||
| 273 | + W = S * Tm | ||||
| 274 | + if standardiser: | ||||
| 275 | + s = W.sum(1, keepdims=True); s[s == 0] = 1.0; W = W / s | ||||
| 276 | + return W | ||||
| 277 | + | ||||
| 278 | +def moran_par_distance(x: np.ndarray, coords: np.ndarray, bornes) -> list[dict]: | ||||
| 279 | + """Corrélogramme : I de Moran calculé avec une matrice binaire des paires dont la distance tombe dans chaque bande [b_k, b_{k+1}).""" | ||||
| 280 | + d = _distances(coords); out = [] | ||||
| 281 | + for lo, hi in zip(bornes[:-1], bornes[1:]): | ||||
| 282 | + W = ((d >= lo) & (d < hi)).astype(float); np.fill_diagonal(W, 0.0) | ||||
| 283 | + npaires = int(W.sum() / 2) | ||||
| 284 | + if npaires < 10: | ||||
| 285 | + continue | ||||
| 286 | + r = moran_i(x, W); r.update({"d_min": lo, "d_max": hi, "paires": npaires}); out.append(r) | ||||
| 287 | + return out | ||||
| 288 | + | ||||
| 289 | +def gwr(y: np.ndarray, X: np.ndarray, coords: np.ndarray, bande: float, cibles: np.ndarray | None = None) -> dict: | ||||
| 290 | + """Régression géographiquement pondérée à noyau gaussien fixe : w_ij = exp(−½ (d_ij / h)²). | ||||
| 291 | + Coefficients locaux à chaque cible (par défaut les observations), valeurs ajustées, trace de la matrice chapeau, | ||||
| 292 | + score de validation croisée (somme des carrés des erreurs leave-one-out) et AICc (Fotheringham, Brunsdon et Charlton 2002).""" | ||||
| 293 | + y = np.asarray(y, float); X = np.asarray(X, float); n, k = X.shape | ||||
| 294 | + c = np.asarray(coords, float); cib = c if cibles is None else np.asarray(cibles, float) | ||||
| 295 | + d = np.sqrt(((cib[:, None, :] - c[None, :, :]) ** 2).sum(-1)) | ||||
| 296 | + Wk = np.exp(-0.5 * (d / bande) ** 2) | ||||
| 297 | + betas = np.zeros((len(cib), k)) | ||||
| 298 | + for i in range(len(cib)): | ||||
| 299 | + Xw = X * Wk[i][:, None] | ||||
| 300 | + betas[i] = np.linalg.solve(X.T @ Xw + 1e-10 * np.eye(k), Xw.T @ y) | ||||
| 301 | + out = {"beta": betas, "bande": bande} | ||||
| 302 | + if cibles is None: | ||||
| 303 | + yhat = (X * betas).sum(1) | ||||
| 304 | + # matrice chapeau et validation croisée leave-one-out | ||||
| 305 | + S_diag = np.zeros(n); cv = 0.0 | ||||
| 306 | + for i in range(n): | ||||
| 307 | + Xw = X * Wk[i][:, None] | ||||
| 308 | + Ainv = np.linalg.inv(X.T @ Xw + 1e-10 * np.eye(k)) | ||||
| 309 | + S_diag[i] = X[i] @ Ainv @ Xw[i] | ||||
| 310 | + w_loo = Wk[i].copy(); w_loo[i] = 0.0 | ||||
| 311 | + b_loo = np.linalg.solve(X.T @ (X * w_loo[:, None]) + 1e-10 * np.eye(k), (X * w_loo[:, None]).T @ y) | ||||
| 312 | + cv += (y[i] - X[i] @ b_loo) ** 2 | ||||
| 313 | + res = y - yhat; rss = float(res @ res); tr_S = float(S_diag.sum()) | ||||
| 314 | + aicc = n * np.log(rss / n) + n * np.log(2 * np.pi) + n * (n + tr_S) / (n - 2 - tr_S) | ||||
| 315 | + out.update({"ajuste": yhat, "residus": res, "trace_S": tr_S, "cv": float(cv), "aicc": float(aicc), | ||||
| 316 | + "r2": 1 - rss / float(((y - y.mean()) ** 2).sum()), "sigma": float(np.sqrt(rss / (n - tr_S)))}) | ||||
| 317 | + return out | ||||
| 318 | + | ||||
| 319 | +def gwr_bande_cv(y: np.ndarray, X: np.ndarray, coords: np.ndarray, bornes=(0.3, 15.0), n_grille: int = 25) -> dict: | ||||
| 320 | + """Bande passante (km) minimisant le score de validation croisée du noyau gaussien : grille log puis section dorée.""" | ||||
| 321 | + from scipy.optimize import minimize_scalar | ||||
| 322 | + g = np.exp(np.linspace(np.log(bornes[0]), np.log(bornes[1]), n_grille)) | ||||
| 323 | + cv = np.array([gwr(y, X, coords, h)["cv"] for h in g]); i = int(np.argmin(cv)) | ||||
| 324 | + lo = g[max(i - 1, 0)]; hi = g[min(i + 1, n_grille - 1)] | ||||
| 325 | + r = minimize_scalar(lambda h: gwr(y, X, coords, h)["cv"], bounds=(lo, hi), method="bounded", options={"xatol": 1e-3}) | ||||
| 326 | + return {"bande": float(r.x), "cv": float(r.fun), "grille": g, "cv_grille": cv} | ||||
| 327 | + | ||||
| 328 | +def variogramme_empirique(coords: np.ndarray, z: np.ndarray, bornes) -> dict: | ||||
| 329 | + """Semi-variogramme empirique (Matheron) : γ(h) = Σ_{paires dans la bande} (z_i − z_j)² / (2 N(h)).""" | ||||
| 330 | + d = _distances(coords); z = np.asarray(z, float) | ||||
| 331 | + dz2 = (z[:, None] - z[None, :]) ** 2 | ||||
| 332 | + iu = np.triu_indices(len(z), 1); dd = d[iu]; zz = dz2[iu] | ||||
| 333 | + h, g, nb = [], [], [] | ||||
| 334 | + for lo, hi in zip(bornes[:-1], bornes[1:]): | ||||
| 335 | + m = (dd >= lo) & (dd < hi) | ||||
| 336 | + if m.sum() < 30: | ||||
| 337 | + continue | ||||
| 338 | + h.append(dd[m].mean()); g.append(zz[m].sum() / (2 * m.sum())); nb.append(int(m.sum())) | ||||
| 339 | + return {"h": np.array(h), "gamma": np.array(g), "n": np.array(nb)} | ||||
| 340 | + | ||||
| 341 | +def variogramme_exponentiel(h, pepite: float, palier_partiel: float, portee: float) -> np.ndarray: | ||||
| 342 | + """γ(h) = c₀ + c₁ (1 − exp(−h/a)) pour h > 0 ; portée pratique ≈ 3a.""" | ||||
| 343 | + h = np.asarray(h, float) | ||||
| 344 | + return np.where(h > 0, pepite + palier_partiel * (1 - np.exp(-h / portee)), 0.0) | ||||
| 345 | + | ||||
| 346 | +def ajuster_variogramme(h, gamma, n_paires, portee_init: float = 2.0) -> dict: | ||||
| 347 | + """Ajustement du modèle exponentiel par moindres carrés pondérés (poids N(h)/γ_modèle², Cressie 1985).""" | ||||
| 348 | + from scipy.optimize import least_squares | ||||
| 349 | + h = np.asarray(h, float); g = np.asarray(gamma, float); nb = np.asarray(n_paires, float) | ||||
| 350 | + def res(p): | ||||
| 351 | + gm = variogramme_exponentiel(h, *p); return np.sqrt(nb) * (g - gm) / np.maximum(gm, 1e-9) | ||||
| 352 | + p0 = [0.5 * g[0], max(g[-1] - 0.5 * g[0], 1e-6), portee_init] | ||||
| 353 | + r = least_squares(res, p0, bounds=([0, 0, 1e-3], [np.inf, np.inf, np.inf])) | ||||
| 354 | + c0, c1, a = r.x | ||||
| 355 | + return {"pepite": float(c0), "palier_partiel": float(c1), "portee": float(a), "portee_pratique": float(3 * a), "palier": float(c0 + c1)} | ||||
| 356 | + | ||||
| 357 | +def krigeage_ordinaire(coords_obs: np.ndarray, z: np.ndarray, coords_cibles: np.ndarray, params: dict, voisins: int | None = 40) -> dict: | ||||
| 358 | + """Krigeage ordinaire avec covariance exponentielle C(h) = c₁ exp(−h/a) (+ c₀ en h = 0), voisinage des `voisins` points | ||||
| 359 | + les plus proches (None = tous). Retourne la prédiction et la variance de krigeage à chaque cible.""" | ||||
| 360 | + co = np.asarray(coords_obs, float); z = np.asarray(z, float); ct = np.asarray(coords_cibles, float) | ||||
| 361 | + c0, c1, a = params["pepite"], params["palier_partiel"], params["portee"] | ||||
| 362 | + cov = lambda h: c1 * np.exp(-h / a) | ||||
| 363 | + dct = np.sqrt(((ct[:, None, :] - co[None, :, :]) ** 2).sum(-1)) | ||||
| 364 | + pred = np.zeros(len(ct)); var = np.zeros(len(ct)) | ||||
| 365 | + for i in range(len(ct)): | ||||
| 366 | + idx = np.argsort(dct[i])[:voisins] if voisins else np.arange(len(co)) | ||||
| 367 | + sub = co[idx]; dd = _distances(sub); m = len(idx) | ||||
| 368 | + K = np.zeros((m + 1, m + 1)); K[:m, :m] = cov(dd); K[np.arange(m), np.arange(m)] = c0 + c1 | ||||
| 369 | + K[m, :m] = 1.0; K[:m, m] = 1.0 | ||||
| 370 | + rhs = np.concatenate([cov(dct[i, idx]), [1.0]]) | ||||
| 371 | + sol = np.linalg.solve(K, rhs); w = sol[:m]; mu = sol[m] | ||||
| 372 | + pred[i] = w @ z[idx]; var[i] = (c0 + c1) - w @ rhs[:m] - mu | ||||
| 373 | + return {"prediction": pred, "variance": var} | ||||
| 374 | + | ||||
| 375 | +def krigeage_validation_croisee(coords: np.ndarray, z: np.ndarray, params: dict, voisins: int = 40) -> np.ndarray: | ||||
| 376 | + """Prédiction leave-one-out de chaque observation par krigeage ordinaire de ses voisins (hors elle-même).""" | ||||
| 377 | + c = np.asarray(coords, float); z = np.asarray(z, float); d = _distances(c); out = np.zeros(len(z)) | ||||
| 378 | + c0, c1, a = params["pepite"], params["palier_partiel"], params["portee"]; cov = lambda h: c1 * np.exp(-h / a) | ||||
| 379 | + for i in range(len(z)): | ||||
| 380 | + idx = np.argsort(d[i])[1:voisins + 1]; m = len(idx); dd = d[np.ix_(idx, idx)] | ||||
| 381 | + K = np.zeros((m + 1, m + 1)); K[:m, :m] = cov(dd); K[np.arange(m), np.arange(m)] = c0 + c1; K[m, :m] = 1; K[:m, m] = 1 | ||||
| 382 | + rhs = np.concatenate([cov(d[i, idx]), [1.0]]); sol = np.linalg.solve(K, rhs); out[i] = sol[:m] @ z[idx] | ||||
| 383 | + return out | ||||
| 384 | + | ||||
| 385 | +def sem_esperance_conditionnelle(lam: float, W_aug: np.ndarray, u_obs: np.ndarray, idx_cibles) -> np.ndarray: | ||||
| 386 | + """Espérance conditionnelle des perturbations u aux cibles sachant les u observés, dans un SEM de matrice augmentée W_aug | ||||
| 387 | + (observations puis cibles) : avec Q = (I − λW)'(I − λW) (précision à σ² près), E[u_c | u_o] = −Q_cc^{-1} Q_co u_o.""" | ||||
| 388 | + n = W_aug.shape[0]; B = np.eye(n) - lam * W_aug; Q = B.T @ B | ||||
| 389 | + idx_c = np.asarray(idx_cibles); idx_o = np.setdiff1d(np.arange(n), idx_c) | ||||
| 390 | + Qcc = Q[np.ix_(idx_c, idx_c)]; Qco = Q[np.ix_(idx_c, idx_o)] | ||||
| 391 | + return -np.linalg.solve(Qcc, Qco @ np.asarray(u_obs, float)) | ||||
added
assets/figures/ch03/ch03-fig-cout-usage.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch03/ch03-fig-cycle-sensibilite.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch03/ch03-fig-cycle-simule.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch03/ch03-fig-mises-chantier-quebec.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch03/ch03-fig-quatre-quadrants.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch04/ch04-fig-ipln-rmr.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch04/ch04-fig-mutations.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch04/ch04-fig-taux-2000-2026.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch05/ch05-fig-valeur-logement-rmr.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch09/ch09-fig-prb.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch09/ch09-fig-ratios-distribution.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch09/ch09-fig-ratios-temps.pdf
+0 −0
Binary file not shown.
modified
assets/figures/ch09/ch09-fig-sensibilite-contestation.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch17/ch17-fig-bruts-ajustes.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch17/ch17-fig-cascade-g0404.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch17/ch17-fig-paires.pdf
+0 −0
Binary file not shown.
added
assets/figures/ch17/ch17-fig-sensibilite.pdf
+0 −0
Binary file not shown.
modified
manuscript/chapters/ch01.tex
+493 −1
@@ -1,2 +1,494 @@ | |||||
| 1 | \chapter{Théorie de la valeur et prix immobiliers}\label{ch:01} | 1 | \chapter{Théorie de la valeur et prix immobiliers}\label{ch:01} | ||
| 2 | −\stubchapter | 2 | + | ||
| 3 | +Tout l'édifice de l'évaluation immobilière repose sur une distinction que le langage courant efface sans cesse : celle qui sépare le prix auquel un immeuble s'est vendu, la valeur qu'on lui attribue et le coût qu'il a fallu engager pour le construire. Le prix est un fait, daté et observable ; la valeur est une estimation, c'est-à-dire une opinion motivée sur un prix qui n'a pas encore eu lieu ; le coût est une dépense, qui n'a de rapport avec la valeur que si le marché le veut bien. Le présent chapitre fonde cette distinction en théorie économique, puis en tire les principes qui gouvernent toutes les méthodes des parties suivantes : substitution, anticipation, contribution, équilibre, conformité, rendements décroissants et plus haute et meilleure utilisation. Il montre ensuite pourquoi deux immeubles identiques ne se vendent pas au même prix et propose la définition opératoire de la valeur marchande qui servira dans tout l'ouvrage, celle d'une espérance conditionnelle, avant d'examiner les biais de jugement qui menacent l'évaluateur lorsqu'il passe des prix observés à la valeur estimée. Les illustrations chiffrées proviennent du dossier synthétique de la maison de Gatineau (cas~1), dont le modèle hédonique de référence est partagé avec les \cref{ch:16,ch:18}. | ||||
| 4 | + | ||||
| 5 | +\begin{objectifs} | ||||
| 6 | +\begin{itemize} | ||||
| 7 | +\item Distinguer rigoureusement prix, valeur marchande, valeur au rôle, valeur d'investissement et coût, et savoir lequel de ces termes employer dans chaque phrase d'un rapport. | ||||
| 8 | +\item Relier la valeur aux quatre facteurs économiques qui la créent : utilité, rareté, désirabilité et pouvoir d'achat. | ||||
| 9 | +\item Énoncer les sept principes d'évaluation et reconnaître, dans un dossier, la méthode ou l'ajustement qui en découle. | ||||
| 10 | +\item Décrire le bien immobilier comme un panier d'attributs (Lancaster, Rosen) et comme un actif producteur de flux, et montrer que les deux descriptions conduisent au même prix d'équilibre. | ||||
| 11 | +\item Expliquer, par un modèle de recherche, pourquoi les prix de biens identiques se dispersent et comment la liquidité et le délai de vente s'échangent contre le prix. | ||||
| 12 | +\item Définir la valeur marchande comme l'espérance conditionnelle du prix et en déduire les conséquences pratiques : médiane, moyenne et mode, intervalle de prédiction, nombre de ventes nécessaires. | ||||
| 13 | +\item Reconnaître le biais d'ancrage et adopter un protocole de travail qui en limite l'effet. | ||||
| 14 | +\end{itemize} | ||||
| 15 | +\end{objectifs} | ||||
| 16 | + | ||||
| 17 | +\section{Valeur, prix, coût : trois notions}\label{sec:1:trois} | ||||
| 18 | + | ||||
| 19 | +\subsection{Le prix : un fait} | ||||
| 20 | + | ||||
| 21 | +Le \motcle{prix} est la contrepartie en argent convenue entre un vendeur et un acheteur pour le transfert d'un droit sur un immeuble. Le Code civil du Québec en fait l'élément constitutif de la vente : le vendeur transfère la propriété d'un bien « moyennant un prix en argent » que l'acheteur s'oblige à payer \parencite[art.~1708]{ccq}. Un prix a trois propriétés qui le distinguent de tout ce qui suit. Il est \emph{historique} : il a été convenu à une date précise, celle de l'acceptation de la promesse d'achat, et il porte l'empreinte des conditions du marché à cette date. Il est \emph{particulier} : il résulte de la rencontre de deux parties déterminées, avec leurs besoins, leurs contraintes de temps, leur information et leur habileté à négocier, et une autre paire de parties aurait conclu un autre prix pour le même bien le même jour. Il est enfin \emph{observable}, au moins en principe : au Québec, le prix déclaré dans l'acte de vente est publié au registre foncier et il sert d'assiette aux droits de mutation (\cref{ch:13}). Le prix ne dit donc rien par lui-même de ce que le bien « vaut » ; il dit ce que ces deux personnes ont accepté ce jour-là. | ||||
| 22 | + | ||||
| 23 | +\subsection{La valeur : une estimation} | ||||
| 24 | + | ||||
| 25 | +La \motcle{valeur} n'est pas une propriété physique de l'immeuble que l'on pourrait mesurer comme sa superficie. C'est une \emph{opinion} sur le prix qu'il obtiendrait dans des conditions précisées. Le Code des professions définit d'ailleurs l'acte réservé à l'évaluateur agréé comme le fait de « formuler, en toutes matières, une opinion dûment motivée de la valeur d'un bien ou d'un droit immobilier » \parencite[art.~37~j)]{codeProfessions}. Le mot \emph{opinion} n'y est pas une concession à la subjectivité, mais la reconnaissance que la valeur porte sur un événement hypothétique, une vente qui n'a pas eu lieu, et qu'elle ne peut être qu'inférée des ventes qui ont eu lieu. Le mot \emph{motivée} impose en retour que l'inférence soit explicite, documentée et reproductible : c'est tout l'objet de ce traité. | ||||
| 26 | + | ||||
| 27 | +Parce qu'elle dépend des conditions que l'on précise, la valeur n'est jamais une notion unique. Les \motcle{bases de valeur} sont les ensembles de conditions sous lesquelles l'estimation est produite, et le \cref{ch:2} les compare en détail. Il suffit ici d'en distinguer quatre, parce que leur confusion est la source la plus fréquente d'erreurs de raisonnement. La \motcle{valeur marchande} est le prix le plus probable d'une vente sur un marché libre, entre parties informées et non contraintes, après une exposition suffisante ; c'est la base par défaut de l'évaluation professionnelle. La \motcle{valeur au rôle} est la « valeur réelle » inscrite au rôle d'évaluation foncière aux fins de la taxation municipale : elle est elle aussi un prix le plus probable, mais à une date de référence fixée par la loi, souvent antérieure de deux à quatre ans à la date où l'on consulte le rôle, et selon des conventions propres (\cref{ch:9}). La \motcle{valeur d'investissement} est la valeur d'un bien \emph{pour un investisseur déterminé}, compte tenu de ses objectifs, de son coût du capital, de sa fiscalité et de ses synergies ; elle diffère légitimement de la valeur marchande, et c'est précisément cette différence qui motive les transactions. La \motcle{valeur d'usage} enfin est la valeur du bien dans l'emploi que son détenteur en fait, sans égard au marché. Chaque fois qu'un rapport ou un article de presse écrit « la valeur », le lecteur doit se demander laquelle. | ||||
| 28 | + | ||||
| 29 | +\subsection{Le coût : une dépense} | ||||
| 30 | + | ||||
| 31 | +Le \motcle{coût} est la somme des dépenses nécessaires pour produire le bien : acquérir le terrain, le viabiliser, construire le bâtiment, payer les honoraires, les permis, le financement intercalaire et la rémunération du promoteur. Le coût regarde vers le passé, ou vers un passé reconstitué : c'est ce qu'il a fallu, ou ce qu'il faudrait, dépenser. La valeur regarde vers l'avenir : c'est ce que le marché est disposé à payer pour les services que le bien rendra. Rien ne garantit que les deux coïncident. Un bâtiment construit à grands frais dans un secteur où personne ne veut habiter vaut moins que son coût ; un terrain acheté pour une bouchée de pain avant l'arrivée du train léger vaut davantage. La méthode du coût (\cref{ch:21,ch:24}) ne contredit pas cette asymétrie : elle part du coût, puis elle retranche les dépréciations qui mesurent justement l'écart entre ce que le bien a coûté et ce que le marché en veut. | ||||
| 32 | + | ||||
| 33 | +\begin{figure}[htbp] | ||||
| 34 | +\centering | ||||
| 35 | +\begin{tikzpicture}[every node/.style={font=\sffamily\small}, boite/.style={draw=brandPrimary, fill=brandLight, rounded corners=1pt, minimum width=38mm, minimum height=14mm, align=center}, lien/.style={<->, >={Stealth[length=2mm]}, brandGray, thick}] | ||||
| 36 | +\node[boite] (prix) at (0, 0) {\textbf{Prix} $P$\\ un fait daté\\ observé, particulier}; | ||||
| 37 | +\node[boite] (valeur) at (6.2, 0) {\textbf{Valeur} $V$\\ une estimation\\ conditionnelle à une base}; | ||||
| 38 | +\node[boite] (cout) at (3.1, -3.4) {\textbf{Coût} $C$\\ une dépense\\ passée ou reconstituée}; | ||||
| 39 | +\draw[lien] (prix) -- node[above, text=brandGray, font=\sffamily\footnotesize] {$P = V\,e^{\varepsilon}$ : le prix est une réalisation bruitée} (valeur); | ||||
| 40 | +\draw[lien] (prix) -- node[left, xshift=-1mm, text=brandGray, font=\sffamily\footnotesize, align=right] {droits de mutation,\\ indices de prix} (cout); | ||||
| 41 | +\draw[lien] (valeur) -- node[right, xshift=1mm, text=brandGray, font=\sffamily\footnotesize, align=left] {$V = V_L + C_N - D$ :\\ méthode du coût (ch.~21)} (cout); | ||||
| 42 | +\end{tikzpicture} | ||||
| 43 | +\caption{Les trois notions et ce qui les relie. Le prix est une réalisation particulière autour de la valeur ; le coût n'est relié à la valeur que par l'intermédiaire des dépréciations, qui mesurent l'écart entre ce que le bien a coûté et ce que le marché en veut.}\label{fig:1:triangle} | ||||
| 44 | +\figsource{schéma de l'auteur.} | ||||
| 45 | +\end{figure} | ||||
| 46 | + | ||||
| 47 | +\subsection{Pourquoi prix et valeur divergent} | ||||
| 48 | + | ||||
| 49 | +Si la valeur est le prix le plus probable, le prix effectivement observé s'en écarte pour des raisons qui tiennent à la transaction et non au bien. Il est commode de représenter cet écart par un terme multiplicatif aléatoire : | ||||
| 50 | +\begin{equation}\label{eq:1:bruit} | ||||
| 51 | +P_j = V_j\, e^{\varepsilon_j}, \qquad \text{soit}\qquad \ln P_j = \ln V_j + \varepsilon_j, \quad \E[\varepsilon_j] = 0,\ \Var[\varepsilon_j] = \sigma^2 . | ||||
| 52 | +\end{equation} | ||||
| 53 | +Le terme $\varepsilon_j$ rassemble tout ce que la vente $j$ a de particulier : l'urgence du vendeur ou de l'acheteur, l'information imparfaite de l'un ou de l'autre, le nombre d'offres concurrentes reçues, l'habileté des courtiers, la date exacte dans un marché qui bouge, et les caractéristiques du bien que l'observateur ne voit pas. L'écriture logarithmique est préférée à l'écriture additive parce que les écarts de négociation sont proportionnels au prix : on marchande cinq pour cent d'une maison de \dollars{400000} comme d'une maison de \dollars{900000}, non un montant fixe. Le \cref{tab:1:trois} résume les trois notions et leurs attributs ; la \cref{sec:1:dispersion} donnera une mesure de $\sigma$ et une explication économique de son existence, et la \cref{sec:1:esperance} montrera que l'\cref{eq:1:bruit} suffit à définir la valeur marchande de façon opératoire. | ||||
| 54 | + | ||||
| 55 | +\begin{table}[htbp] | ||||
| 56 | +\caption{Prix, valeur et coût : trois notions à ne jamais confondre}\label{tab:1:trois} | ||||
| 57 | +\centering | ||||
| 58 | +\begin{tabularx}{\textwidth}{lYYY} | ||||
| 59 | +\toprule | ||||
| 60 | + & Prix & Valeur & Coût \\ | ||||
| 61 | +\midrule | ||||
| 62 | +Nature & Fait : contrepartie convenue & Opinion : prix le plus probable sous une base déclarée & Dépense : somme des intrants nécessaires \\ | ||||
| 63 | +Temps & Passé, daté (promesse d'achat) & Date d'évaluation (prospectif) & Passé ou reconstitué à la date d'évaluation \\ | ||||
| 64 | +Particularité & Propre à deux parties & Propre à un marché et à une base & Propre à une technique et à un lieu \\ | ||||
| 65 | +Observabilité & Registre foncier, courtage & Jamais observée ; inférée des prix & Devis, soumissions, guides de coûts \\ | ||||
| 66 | +Pluralité & Un seul par transaction & Autant que de bases (marchande, rôle, investissement, usage) & Reproduction ou remplacement \\ | ||||
| 67 | +Rôle dans l'ouvrage & Donnée d'entrée (ch.~13--16) & Résultat de l'évaluation & Intrant de la méthode du coût (ch.~21--25) \\ | ||||
| 68 | +\bottomrule | ||||
| 69 | +\end{tabularx} | ||||
| 70 | +\tabsource{synthèse de l'auteur d'après \textcite{appraisal2026}, \textcite{ivs2025} et \textcite{oeaqNormes}.} | ||||
| 71 | +\end{table} | ||||
| 72 | + | ||||
| 73 | +\begin{quebec} | ||||
| 74 | +Trois textes québécois fixent le vocabulaire. Les Normes de pratique professionnelle de l'Ordre des évaluateurs agréés du Québec définissent la valeur marchande comme le « prix sincère le plus probable » d'une vente réelle ou présumée, à une date donnée, « sur un marché libre et ouvert à la concurrence », assortie de quatre conditions : parties bien informées, exposition suffisante, paiement comptant ou l'équivalent, prix épuré des incitatifs et des conditions de financement avantageuses \parencite[Intro-11]{oeaqNormes}. La Loi sur la fiscalité municipale définit la valeur réelle d'une unité d'évaluation comme « sa valeur d'échange sur un marché libre et ouvert à la concurrence, soit le prix le plus probable » d'une vente de gré à gré entre parties qui n'y sont pas obligées et qui sont raisonnablement informées de l'état de l'unité, de l'utilisation qui peut le plus probablement en être faite et des conditions du marché \parencite[art.~43]{lfm} ; cette valeur est établie à la date de référence du 1\textsuperscript{er} juillet du deuxième exercice précédant l'entrée en vigueur du rôle \parencite[art.~46]{lfm}, ce qui explique que la valeur au rôle d'un immeuble, lue en 2026 sur un rôle 2026-2028, décrive le marché du 1\textsuperscript{er} juillet 2024. Enfin, le Code des professions réserve à l'évaluateur agréé l'opinion « dûment motivée » de la valeur \parencite[art.~37~j)]{codeProfessions}. Les trois textes convergent : la valeur est un prix \emph{probable}, non un prix constaté, et elle est indissociable d'une date. Les normes internationales disent la même chose en d'autres mots : la valeur marchande est « the estimated amount for which an asset and/or liability should exchange on the valuation date between a willing buyer and a willing seller in an arm's-length transaction, after proper marketing » \parencite[IVS~102, A10.01]{ivs2025}, et les normes canadiennes parlent de « the most probable price, as of a specified date, in cash, or in terms equivalent to cash » \parencite[s.~3]{cuspap2026}. Textes consultés le 31 octobre 2026. | ||||
| 75 | +\end{quebec} | ||||
| 76 | + | ||||
| 77 | +\section{Les quatre facteurs de la valeur}\label{sec:1:facteurs} | ||||
| 78 | + | ||||
| 79 | +La tradition de l'évaluation, héritée de l'économie classique et formalisée par les manuels nord-américains \parencite{appraisal2026,appraisalCdn}, enseigne qu'un bien n'a de valeur que si quatre conditions sont réunies simultanément : il doit être utile, rare, désiré, et les personnes qui le désirent doivent pouvoir le payer. Aucune de ces conditions ne suffit seule ; la valeur naît de leur conjonction, et elle disparaît si l'une manque. | ||||
| 80 | + | ||||
| 81 | +L'\motcle{utilité} est la capacité du bien à satisfaire un besoin : abriter un ménage, produire un loyer, servir d'emplacement à un commerce. L'utilité d'un immeuble est multidimensionnelle, parce qu'un logement rend simultanément des services d'espace, de localisation, de confort, de sécurité et de statut ; la \cref{sec:1:attributs} donnera à cette idée sa forme moderne. La \motcle{rareté} est la limitation de l'offre par rapport à la demande : le sol est rare par nature, parce qu'il n'est pas reproductible et que chaque emplacement est unique, et le bâti est rare à court terme, parce qu'il faut des années pour construire. Un bien utile mais abondant, l'air, n'a pas de prix. La \motcle{désirabilité}, que les manuels appellent aussi la demande effective, est le fait que des acheteurs veuillent réellement le bien ; elle dépend des goûts, de la démographie, des modes, de l'information et des anticipations. Le \motcle{pouvoir d'achat} enfin est la capacité des acheteurs de payer : revenus, épargne, et surtout accès au crédit, puisque la quasi-totalité des achats résidentiels est financée par hypothèque. C'est par ce canal que la politique monétaire agit sur les prix : une hausse des taux ne change ni l'utilité ni la rareté des maisons, mais elle réduit le montant que les ménages peuvent emprunter pour un même paiement mensuel, et donc le prix qu'ils peuvent offrir (\cref{ch:3,ch:31}). | ||||
| 82 | + | ||||
| 83 | +Le \cref{tab:1:facteurs} rattache chaque facteur aux variables que l'évaluateur mesure concrètement et à la partie de l'ouvrage qui les traite. La lecture par les quatre facteurs est utile en diagnostic : lorsqu'un marché local s'effondre, c'est presque toujours parce que l'un des quatre s'est dérobé, et savoir lequel oriente l'analyse. La fermeture d'une usine en région ressource atteint la désirabilité et le pouvoir d'achat ; une vague de construction de copropriétés atteint la rareté ; une contamination découverte atteint l'utilité. | ||||
| 84 | + | ||||
| 85 | +\begin{table}[htbp] | ||||
| 86 | +\caption{Les quatre facteurs de la valeur et leur traduction opérationnelle}\label{tab:1:facteurs} | ||||
| 87 | +\centering | ||||
| 88 | +\begin{tabularx}{\textwidth}{lYYl} | ||||
| 89 | +\toprule | ||||
| 90 | +Facteur & Ce qu'il désigne & Variables mesurées par l'évaluateur & Chapitres \\ | ||||
| 91 | +\midrule | ||||
| 92 | +Utilité & Capacité à satisfaire un besoin & Superficie, pièces, état, qualité, localisation, loyers potentiels & 11, 12, 26 \\ | ||||
| 93 | +Rareté & Offre limitée relativement à la demande & Stock, mises en chantier, inventaire, taux d'inoccupation, contraintes de zonage & 3, 8, 15 \\ | ||||
| 94 | +Désirabilité & Demande effective pour le bien & Ventes, délais de vente, ratio prix demandé/prix obtenu, migration, ménages & 4, 15 \\ | ||||
| 95 | +Pouvoir d'achat & Capacité de payer & Revenus, taux hypothécaires, règles d'admissibilité, mise de fonds & 3, 31 \\ | ||||
| 96 | +\bottomrule | ||||
| 97 | +\end{tabularx} | ||||
| 98 | +\tabsource{synthèse de l'auteur d'après \textcite{appraisal2026}.} | ||||
| 99 | +\end{table} | ||||
| 100 | + | ||||
| 101 | +\section{Les principes d'évaluation}\label{sec:1:principes} | ||||
| 102 | + | ||||
| 103 | +Les manuels professionnels énoncent une dizaine de principes qui gouvernent la formation des valeurs. Ce ne sont pas des lois au sens juridique, ni des théorèmes au sens mathématique, mais des régularités économiques dont chaque méthode d'évaluation est une application. Les sept qui suivent sont les plus féconds ; le \cref{tab:1:principes} en résume les implications, et chacun est illustré par un chiffre du dossier du cas~1, dont le modèle hédonique de référence (\cref{sec:1:attributs}) a été estimé sur six cents ventes synthétiques. Le lecteur trouvera dans ces illustrations une première rencontre avec les chiffres qui reviendront, exactement les mêmes, aux \cref{ch:16,ch:17,ch:18,ch:45}. | ||||
| 104 | + | ||||
| 105 | +\begin{synthetique} | ||||
| 106 | +Le dossier du cas~1 est synthétique. Le fichier \texttt{data/synthetic/cas1\_gatineau\_ventes.csv} contient 600 ventes fictives d'unifamiliales réparties dans les cinq secteurs de Gatineau entre janvier 2023 et août 2026, et \texttt{cas1\_gatineau\_sujet.json} décrit le sujet : un cottage à étages de 1998, de \msq{165} habitables sur un terrain de \msq{620}, dans le secteur de Hull, évalué au 1\textsuperscript{er} septembre 2026. Les ventes ont été générées par \texttt{analysis/python/traite/synth.py} (graine 20261031) selon des lois déclarées dans \texttt{data/synthetic/README.md} et calibrées sur les prix médians par secteur publiés par l'APCIQ pour le troisième trimestre de 2026 \parencite{apciqgatineaut32026}. Le modèle hédonique de référence est la fonction \texttt{traite.cas1.hedonique}, partagée par tous les chapitres qui utilisent ce dossier. Tous les chiffres du présent chapitre sont reproduits par \texttt{analysis/python/cases/ch01\_valeur\_prix.py} et vérifiés par \texttt{analysis/python/tests/test\_ch01.py}. Aucune adresse, aucune transaction et aucune personne réelles ne sont décrites. | ||||
| 107 | +\end{synthetique} | ||||
| 108 | + | ||||
| 109 | +\subsection{Substitution} | ||||
| 110 | + | ||||
| 111 | +Le \motcle{principe de substitution} affirme qu'un acheteur informé ne paiera pas, pour un bien, davantage que le coût d'acquisition d'un bien de substitution d'utilité équivalente et disponible dans un délai raisonnable. C'est le principe fondateur des trois méthodes : la comparaison substitue des immeubles vendus (\cref{ch:16}), le coût substitue la construction d'un équivalent (\cref{ch:21}), le revenu substitue un placement de rendement équivalent (\cref{ch:29}). Son implication immédiate est que le prix d'un immeuble est \emph{borné} par les prix des substituts disponibles au même moment : il ne peut s'en écarter durablement que si les substituts n'existent pas ou ne sont pas connus. Dans le cas~1, les cinq comparables retenus au \cref{ch:16} se sont vendus entre \dollars{506500} et \dollars{624500} ; aucun n'est identique au sujet, et la \cref{sec:1:esperance} montrera que leurs prix bruts se situent tous sous la valeur estimée du sujet (\dollars{635821}), parce qu'ils sont plus petits, plus anciens dans le temps ou dépourvus de garage. La substitution ne dit pas que le sujet vaut la moyenne de ces prix ; elle dit que sa valeur est reliée à ces prix par les différences qui le séparent de chacun, et que le travail de l'évaluateur consiste à mesurer ces différences. | ||||
| 112 | + | ||||
| 113 | +\subsection{Anticipation} | ||||
| 114 | + | ||||
| 115 | +Le \motcle{principe d'anticipation} affirme que la valeur est créée par l'attente des avantages futurs, non par les avantages passés. On n'achète pas un immeuble pour les loyers qu'il a versés à son ancien propriétaire, mais pour ceux qu'il versera ; on n'achète pas une maison pour le confort qu'elle a procuré, mais pour celui qu'elle procurera. Le principe a deux conséquences. La première fonde la méthode du revenu : la valeur d'un immeuble locatif est la somme actualisée de ses revenus nets futurs, ce que la \cref{sec:1:actif} formalisera et que les \cref{ch:29,ch:30} développeront. La seconde concerne tous les immeubles : les anticipations de hausse ou de baisse des prix sont elles-mêmes capitalisées dans les prix courants, de sorte qu'un marché peut monter parce que l'on s'attend à ce qu'il monte, ce qui est le mécanisme des bulles qu'étudie \textcite{shiller2015}. Dans le cas~1, le modèle de référence estime une tendance de \pct{0.36} par mois, soit \pct{4.46} par année en taux composé : la même maison, vendue vingt-six mois plus tôt à la date de référence du rôle (1\textsuperscript{er} juillet 2024), aurait eu une valeur estimée de \dollars{578436} au lieu de \dollars{635821}. L'écart de \pct{9.9} ne tient à aucun changement du bien ; il tient à la date, c'est-à-dire aux conditions du marché et aux anticipations qui les portent. C'est pourquoi la valeur est indissociable de sa date, et pourquoi l'ajustement de conditions du marché est le premier ajustement de toute grille de comparaison (\cref{ch:17}). | ||||
| 116 | + | ||||
| 117 | +\subsection{Contribution} | ||||
| 118 | + | ||||
| 119 | +Le \motcle{principe de contribution} affirme que la valeur d'une composante d'un immeuble est mesurée par ce qu'elle ajoute à la valeur de l'ensemble, non par son coût. Un garage ajoute à la valeur d'une maison ce que les acheteurs sont prêts à payer de plus pour une maison avec garage, que le garage ait coûté \dollars{30000} ou \dollars{60000}. Le principe est la clé de la méthode de comparaison, où chaque ajustement est une contribution marchande, et il explique la \emph{désuétude fonctionnelle} de la méthode du coût (\cref{ch:24}) : une composante dont le coût dépasse la contribution est, par définition, une surconstruction. Dans le cas~1, le modèle de référence attribue au garage simple du sujet un effet de \pct{3.3} sur le prix, soit une contribution de \dollars{20291} à la valeur estimée ; au sous-sol fini, \pct{2.2}, soit \dollars{13829} ; et au fait que le bâtiment soit à étages plutôt que de plain-pied, \pct{3.1}, soit \dollars{18860}. Ces montants sont ce que le marché synthétique « paie » pour chaque attribut ; ils ne doivent rien au coût de l'attribut, et c'est l'écart entre les deux qui, dans un marché réel, guide le propriétaire qui hésite à rénover (\cref{ch:44}). | ||||
| 120 | + | ||||
| 121 | +\subsection{Équilibre} | ||||
| 122 | + | ||||
| 123 | +Le \motcle{principe d'équilibre} affirme que la valeur est maximale lorsque les facteurs de production, terrain, bâtiment, capital et gestion, sont combinés dans des proportions appropriées. Un bâtiment trop grand pour son terrain, ou un terrain trop vaste pour son bâtiment, vaut moins que la somme de ce que vaudraient les deux dans des proportions équilibrées. Le principe se lit dans les élasticités du modèle de référence : un accroissement de dix pour cent de la superficie habitable augmente le prix de \pct{5.4} environ, mais un accroissement de dix pour cent du terrain ne l'augmente que de \pct{0.9}, dans un secteur bâti où le terrain supplémentaire a peu d'usages. Le ménage qui paierait un terrain double au prix du mètre carré du terrain moyen commettrait l'erreur que le principe d'équilibre dénonce ; et l'évaluateur qui ajusterait le terrain à ce prix la reproduirait. Le \cref{ch:25} reviendra sur la valeur du terrain en excédent. | ||||
| 124 | + | ||||
| 125 | +\subsection{Conformité et externalités} | ||||
| 126 | + | ||||
| 127 | +Le \motcle{principe de conformité} affirme que la valeur d'un immeuble est maximale lorsqu'il s'harmonise avec son voisinage : la maison la plus chère d'une rue modeste se vend moins que son coût, et la maison la plus modeste d'une rue cossue se vend plus que ses attributs propres ne le justifient. Le principe est un cas particulier d'un fait plus général, que l'économie urbaine appelle les \motcle{externalités} et que le \cref{ch:5} développe : la valeur d'un immeuble dépend de ce qui l'entoure. Dans le cas~1, le sujet placé tel quel, avec les mêmes attributs, dans chacun des cinq secteurs de Gatineau aurait une valeur estimée de \dollars{692518} à Aylmer (\pct{8.9} de plus qu'à Hull), de \dollars{621798} dans le secteur de Gatineau ($-\pct{2.2}$), de \dollars{494999} à Buckingham ($-\pct{22.1}$) et de \dollars{488712} à Masson-Angers ($-\pct{23.1}$). Le bâtiment n'a pas changé ; son environnement a changé, et avec lui la valeur. C'est la raison pour laquelle la localisation est le premier critère de comparabilité (\cref{ch:16}) et pour laquelle les modèles spatiaux du \cref{ch:19} sont indispensables. | ||||
| 128 | + | ||||
| 129 | +\subsection{Rendements décroissants} | ||||
| 130 | + | ||||
| 131 | +Le \motcle{principe des rendements décroissants} affirme que l'ajout successif d'unités d'un même facteur accroît la valeur de moins en moins. Il se manifeste dans toutes les études hédoniques par une élasticité du prix à la superficie inférieure à l'unité : dans le cas~1, elle vaut 0,539. Il en résulte que le prix \emph{marginal} du mètre carré est inférieur au prix \emph{moyen}. Pour le sujet, le prix moyen est de \parmsq{3853} (la valeur estimée divisée par \msq{165}), mais le prix marginal, c'est-à-dire la valeur ajoutée par le dernier mètre carré, n'est que de \parmsq{2077} : | ||||
| 132 | +\begin{equation}\label{eq:1:marginal} | ||||
| 133 | +\frac{\partial V}{\partial S} = \beta_S\, \frac{V}{S}, \qquad \text{soit}\qquad \text{prix marginal} = \beta_S \times \text{prix moyen}, | ||||
| 134 | +\end{equation} | ||||
| 135 | +où $\beta_S$ est l'élasticité. Dix mètres carrés de plus ajouteraient \dollars{20491} à la valeur du sujet ; les dix suivants, \dollars{19958} seulement. Le principe a une conséquence directe sur la pratique : ajuster la superficie d'un comparable au prix moyen du mètre carré, comme on le fait trop souvent, surestime l'ajustement d'un facteur $1/\beta_S$, soit ici de près du double. Le \cref{ch:17} en tire la règle d'ajustement correcte. | ||||
| 136 | + | ||||
| 137 | +\subsection{Plus haute et meilleure utilisation} | ||||
| 138 | + | ||||
| 139 | +Le principe de la \motcle{plus haute et meilleure utilisation} (PHMU, \emph{highest and best use}) affirme que la valeur d'un bien est déterminée par l'usage qui, parmi ceux qui sont physiquement possibles, légalement permis, financièrement réalisables et maximalement productifs, lui procure la valeur la plus élevée. Les normes internationales le formulent comme « the use, from a participant perspective, that would produce the highest value for an asset » \parencite[IVS~102, A90.01]{ivs2025}, et la Loi sur la fiscalité municipale l'intègre à la définition même de la valeur réelle par la référence à « l'utilisation qui peut le plus probablement en être faite » \parencite[art.~43]{lfm}. Le principe tranche une question que les trois autres laissent ouverte : par rapport à quel usage mesure-t-on la valeur ? Un terrain occupé par une maison modeste dans un secteur où le zonage permet des immeubles de trois logements ne vaut pas la maison ; il vaut le plus élevé de la valeur de la maison et de la valeur du terrain pour le triplex, déduction faite du coût de la démolition. Le \cref{tab:1:phmu} en donne une illustration hypothétique à chiffres déclarés : pour un terrain donné, la valeur résiduelle que laisse chaque usage, produit fini moins coût total de réalisation, désigne l'usage optimal. Ici l'usage actuel l'emporte, de peu ; un recul du coût de construction du duplex ou une hausse de son prix de vente renverserait la conclusion, et l'évaluateur devrait alors écrire que la maison existante ne représente plus la PHMU du terrain. Le \cref{ch:41} développe l'analyse et ses quatre tests. | ||||
| 140 | + | ||||
| 141 | +\begin{table}[htbp] | ||||
| 142 | +\caption{Illustration hypothétique du principe de la plus haute et meilleure utilisation : valeur résiduelle d'un même terrain selon trois usages (chiffres déclarés, non calibrés)}\label{tab:1:phmu} | ||||
| 143 | +\centering | ||||
| 144 | +\small | ||||
| 145 | +\begin{tabular}{lS[table-format=7.0]S[table-format=7.0]S[table-format=6.0]} | ||||
| 146 | +\toprule | ||||
| 147 | +Usage & {\makecell{Valeur du\\produit fini (\$)}} & {\makecell{Coût total de\\réalisation (\$)}} & {\makecell{Valeur résiduelle\\du terrain (\$)}} \\ | ||||
| 148 | +\midrule | ||||
| 149 | +Unifamiliale (usage actuel) & 640000 & 470000 & 170000 \\ | ||||
| 150 | +Duplex & 880000 & 720000 & 160000 \\ | ||||
| 151 | +Triplex (si le zonage le permet) & 1150000 & 1010000 & 140000 \\ | ||||
| 152 | +\bottomrule | ||||
| 153 | +\end{tabular} | ||||
| 154 | +\tabsource{hypothèses pédagogiques de l'auteur, \texttt{analysis/python/cases/ch01\_valeur\_prix.py} ; le coût total comprend la construction, les frais indirects et le profit du promoteur.} | ||||
| 155 | +\end{table} | ||||
| 156 | + | ||||
| 157 | +\begin{table}[htbp] | ||||
| 158 | +\caption{Les sept principes d'évaluation, leurs implications méthodologiques et leur illustration dans le cas~1 (données synthétiques)}\label{tab:1:principes} | ||||
| 159 | +\centering | ||||
| 160 | +\small | ||||
| 161 | +\begin{tabularx}{\textwidth}{lYY} | ||||
| 162 | +\toprule | ||||
| 163 | +Principe & Implication pour l'évaluateur & Illustration (cas~1) \\ | ||||
| 164 | +\midrule | ||||
| 165 | +Substitution & Fonde les trois méthodes ; la valeur est bornée par les prix des substituts & Cinq comparables vendus de \dollars{506500} à \dollars{624500} \\ | ||||
| 166 | +Anticipation & La valeur est datée ; les revenus et les variations de prix attendus sont capitalisés & Tendance de \pct{4.46} par an ; même maison : \dollars{578436} en juillet 2024, \dollars{635821} en septembre 2026 \\ | ||||
| 167 | +Contribution & Chaque ajustement mesure un apport marchand, non un coût & Garage \dollars{20291}, sous-sol fini \dollars{13829}, étages \dollars{18860} \\ | ||||
| 168 | +Équilibre & Les facteurs se combinent dans des proportions optimales ; le terrain en excédent vaut peu & Élasticités : superficie 0,54, terrain 0,09 \\ | ||||
| 169 | +Conformité & La valeur dépend du voisinage ; la localisation est le premier critère de comparabilité & Sujet relocalisé : de \dollars{488712} (Masson-Angers) à \dollars{692518} (Aylmer) \\ | ||||
| 170 | +Rendements décroissants & Prix marginal $<$ prix moyen ; ne pas ajuster la superficie au prix moyen & Prix moyen \parmsq{3853}, prix marginal \parmsq{2077} \\ | ||||
| 171 | +PHMU & La valeur se mesure pour l'usage optimal, non pour l'usage actuel & Résidu du terrain : unifamiliale \dollars{170000}, duplex \dollars{160000}, triplex \dollars{140000} (hypothèses) \\ | ||||
| 172 | +\bottomrule | ||||
| 173 | +\end{tabularx} | ||||
| 174 | +\tabsource{\synth{analysis/python/cases/ch01\_valeur\_prix.py, graine 20261031 ; dernière ligne : hypothèses déclarées}} | ||||
| 175 | +\end{table} | ||||
| 176 | + | ||||
| 177 | +\section{Le bien immobilier comme panier d'attributs et comme actif}\label{sec:1:attributs} | ||||
| 178 | + | ||||
| 179 | +Les principes de la section précédente sont des régularités ; la théorie économique moderne en donne le fondement. Deux descriptions du bien immobilier coexistent, et il importe de voir qu'elles ne se contredisent pas : le logement est un \emph{panier d'attributs} qui procurent de l'utilité à son occupant, et il est un \emph{actif} qui procure des flux à son détenteur. La première description fonde la méthode de comparaison et les modèles hédoniques ; la seconde fonde la méthode du revenu. Le prix d'équilibre doit satisfaire les deux. | ||||
| 180 | + | ||||
| 181 | +\subsection{L'utilité porte sur les caractéristiques : Lancaster} | ||||
| 182 | + | ||||
| 183 | +Dans la théorie classique du consommateur, l'utilité est une fonction des quantités de biens consommés. \textcite{lancaster1966} a proposé de la définir plutôt sur les \emph{caractéristiques} que les biens possèdent : un ménage ne tire pas d'utilité d'« une maison », mais de la superficie, du nombre de chambres, de la proximité du travail, de la qualité de l'école du quartier et du calme que cette maison lui procure. Formellement, si le bien $j$ est décrit par un vecteur de caractéristiques $\mathbf{z}_j = (z_{j1}, \dots, z_{jK})$, l'utilité du ménage s'écrit | ||||
| 184 | +\begin{equation}\label{eq:1:lancaster} | ||||
| 185 | +U = U(\mathbf{z}, x), \qquad \text{sous la contrainte}\qquad p(\mathbf{z}) + x = y, | ||||
| 186 | +\end{equation} | ||||
| 187 | +où $x$ est la consommation de tous les autres biens (numéraire), $y$ le revenu et $p(\mathbf{z})$ le prix du logement de caractéristiques $\mathbf{z}$. Ce déplacement de l'objet de l'utilité a trois conséquences pour l'évaluateur. Il rend comparables des biens hétérogènes : deux maisons différentes sont deux points dans le même espace de caractéristiques, et la « distance » entre elles a un sens (\cref{ch:16}). Il justifie la décomposition du prix en contributions : si l'utilité dépend des caractéristiques, le prix doit en dépendre aussi, et chaque caractéristique a un \emph{prix implicite}. Il explique enfin la substitution : deux paniers de caractéristiques différents peuvent procurer la même utilité, et l'acheteur choisit le moins cher. | ||||
| 188 | + | ||||
| 189 | +\subsection{L'équilibre hédonique : Rosen} | ||||
| 190 | + | ||||
| 191 | +\textcite{rosen1974} a montré comment la fonction de prix $p(\mathbf{z})$ se forme sur un marché où des acheteurs hétérogènes rencontrent des vendeurs hétérogènes. Chaque acheteur possède une \motcle{fonction d'enchère} $\theta(\mathbf{z}; u, y)$, le montant maximal qu'il paierait pour un bien de caractéristiques $\mathbf{z}$ tout en conservant le niveau d'utilité $u$ ; chaque vendeur ou producteur possède une \motcle{fonction d'offre} $\phi(\mathbf{z}; \pi)$, le montant minimal qu'il accepterait pour produire $\mathbf{z}$ en conservant le profit $\pi$. À l'équilibre, chaque acheteur choisit le $\mathbf{z}$ qui égalise sa disposition marginale à payer et le prix marginal, et de même chaque vendeur : | ||||
| 192 | +\begin{equation}\label{eq:1:rosen} | ||||
| 193 | +\frac{\partial \theta}{\partial z_k} = \frac{\partial p}{\partial z_k} = \frac{\partial \phi}{\partial z_k}, \qquad k = 1, \dots, K . | ||||
| 194 | +\end{equation} | ||||
| 195 | +La fonction de prix observée $p(\mathbf{z})$ est l'\emph{enveloppe} des fonctions d'enchère et des fonctions d'offre : en chaque point, elle est tangente à l'enchère de l'acheteur et à l'offre du vendeur qui s'y sont appariés (\cref{fig:1:rosen}). Il en découle deux leçons que l'on oublie souvent. La première est que le prix implicite $\partial p / \partial z_k$ est un prix d'équilibre \emph{marginal} : il mesure ce que l'acheteur marginal paie pour une unité de plus de $z_k$ au point $\mathbf{z}$, et rien n'impose qu'il soit constant d'un point à l'autre de l'espace des caractéristiques. L'évaluateur qui transporte un ajustement de garage d'un marché de maisons à \dollars{400000} vers un marché de maisons à \dollars{900000} suppose implicitement une linéarité que la théorie n'autorise pas. La seconde leçon est que $p(\mathbf{z})$ n'est ni une fonction de demande ni une fonction d'offre, mais le lieu des appariements : elle ne révèle les préférences qu'au point de tangence, ce qui est la source des difficultés d'identification étudiées par \textcite{epple1987}, \textcite{ekelandHeckmanNesheim2004} et \textcite{bajariBenkard2005}, et qui importe pour l'évaluateur chaque fois qu'il veut prédire l'effet d'un changement \emph{non marginal} d'un attribut (\cref{ch:18}). | ||||
| 196 | + | ||||
| 197 | +\begin{figure}[htbp] | ||||
| 198 | +\centering | ||||
| 199 | +\includegraphics[width=\textwidth]{ch01/ch01-fig-rosen.pdf} | ||||
| 200 | +\caption{L'équilibre hédonique de \textcite{rosen1974} : la fonction de prix $p(z)$ est l'enveloppe des fonctions d'enchère des acheteurs (concaves) et des fonctions d'offre des vendeurs (convexes). En chaque appariement, la pente commune est le prix implicite de l'attribut ; elle varie le long de la courbe.}\label{fig:1:rosen} | ||||
| 201 | +\figsource{schéma de l'auteur, formes fonctionnelles illustratives (\texttt{analysis/python/figures/ch01\_figures.py}).} | ||||
| 202 | +\end{figure} | ||||
| 203 | + | ||||
| 204 | +\subsection{La forme semi-logarithmique et les prix implicites} | ||||
| 205 | + | ||||
| 206 | +L'approche hédonique remonte, avant Lancaster et Rosen, aux travaux de \textcite{court1939} sur les automobiles et de \textcite{griliches1961} sur les indices de prix à qualité constante, dont \textcite{goodman1998} a retracé l'histoire ; \textcite{sheppard1999} et \textcite{malpezzi2003} en donnent les revues de référence pour le logement. La forme fonctionnelle la plus utilisée, et celle que tout l'ouvrage adopte par convention (\cref{app:conventions-calcul}), est la forme semi-logarithmique : | ||||
| 207 | +\begin{equation}\label{eq:1:semilog} | ||||
| 208 | +\ln P_i = \alpha + \mathbf{x}_i\T \boldsymbol\beta + \tau_{t(i)} + \mu_{s(i)} + \varepsilon_i , | ||||
| 209 | +\end{equation} | ||||
| 210 | +où $\mathbf{x}_i$ rassemble les caractéristiques physiques, $\tau_{t(i)}$ l'effet de la période de vente, $\mu_{s(i)}$ l'effet du secteur et $\varepsilon_i$ le terme aléatoire de l'\cref{eq:1:bruit}. Sous cette forme, un coefficient $\beta_k$ est approximativement l'effet proportionnel d'une unité de $x_k$ sur le prix, et l'effet exact d'une variable indicatrice est $e^{\beta_k} - 1$ \parencite{halvorsenPalmquist1980}. La contribution d'un attribut à la valeur d'un bien donné s'obtient en comparant la valeur avec et sans l'attribut : | ||||
| 211 | +\begin{equation}\label{eq:1:contribution} | ||||
| 212 | +C_k = V - V\, e^{-\beta_k x_k} = V\left(1 - e^{-\beta_k x_k}\right), | ||||
| 213 | +\end{equation} | ||||
| 214 | +ce qui est la formalisation du principe de contribution : $C_k$ dépend de $V$, donc de tous les autres attributs, et un garage ne « vaut » pas la même chose sur toutes les maisons. Le \cref{tab:1:implicites} donne les prix implicites du modèle de référence du cas~1 et les contributions correspondantes pour le sujet. Le modèle explique \pct{85.3} de la variance des logarithmes de prix sur six cents ventes, avec un écart-type résiduel $\hat\sigma = 0{,}083$ qui occupera la section suivante. | ||||
| 215 | + | ||||
| 216 | +\begin{table}[htbp] | ||||
| 217 | +\caption{Prix implicites du modèle hédonique de référence du cas~1 et contributions à la valeur estimée du sujet (données synthétiques)}\label{tab:1:implicites} | ||||
| 218 | +\centering | ||||
| 219 | +\footnotesize\setlength{\tabcolsep}{4pt} | ||||
| 220 | +\begin{tabular}{lS[table-format=-1.5]S[table-format=1.5]S[table-format=-2.1]S[table-format=-6.0]} | ||||
| 221 | +\toprule | ||||
| 222 | +Attribut (unité) & {$\hat\beta_k$} & {\makecell{Erreur-type\\(HC1)}} & {\makecell{Effet\\unitaire (\%)}} & {\makecell{Contribution\\au sujet (\$)}} \\ | ||||
| 223 | +\midrule | ||||
| 224 | +Superficie habitable (élasticité, réf. \msq{140}) & 0.53907 & 0.01270 & {---} & 53893 \\ | ||||
| 225 | +Superficie du terrain (élasticité, réf. \msq{560}) & 0.09366 & 0.01097 & {---} & 6032 \\ | ||||
| 226 | +Âge (par année) & -0.00510 & 0.00056 & -0.5 & -97533 \\ | ||||
| 227 | +Âge au carré ($/100$) & 0.00264 & 0.00064 & 0.3 & 13035 \\ | ||||
| 228 | +Qualité (par échelon, réf. 3) & 0.06108 & 0.00423 & 6.3 & 0 \\ | ||||
| 229 | +Garage (par place) & 0.03243 & 0.00501 & 3.3 & 20291 \\ | ||||
| 230 | +Sous-sol fini & 0.02199 & 0.00692 & 2.2 & 13829 \\ | ||||
| 231 | +Piscine & 0.02633 & 0.00845 & 2.7 & 0 \\ | ||||
| 232 | +Bâtiment à étages & 0.03011 & 0.00687 & 3.1 & 18860 \\ | ||||
| 233 | +Secteur Aylmer (réf. Hull) & 0.08542 & 0.02314 & 8.9 & 0 \\ | ||||
| 234 | +Secteur Buckingham (réf. Hull) & -0.25036 & 0.07177 & -22.1 & 0 \\ | ||||
| 235 | +Secteur Masson-Angers (réf. Hull) & -0.26314 & 0.06718 & -23.1 & 0 \\ | ||||
| 236 | +Tendance du marché (par mois) & 0.00364 & 0.00027 & 0.4 & 57385 \\ | ||||
| 237 | +\bottomrule | ||||
| 238 | +\end{tabular} | ||||
| 239 | +\tabsource{\synth{analysis/python/cases/ch01\_valeur\_prix.py ; $n = 600$, $R^2 = 0{,}853$, $\hat\sigma = 0{,}083$ ; contributions par l'\cref{eq:1:contribution} à partir de la valeur estimée de \dollars{635821} ; le sujet a une qualité de 3, pas de piscine et se trouve à Hull, d'où des contributions nulles ; coefficients du secteur Gatineau et de la distance au centre omis}} | ||||
| 240 | +\end{table} | ||||
| 241 | + | ||||
| 242 | +\subsection{Le bien comme actif : flux, capitalisation et coût d'usage}\label{sec:1:actif} | ||||
| 243 | + | ||||
| 244 | +La seconde description regarde le même immeuble du point de vue de celui qui le détient pour les flux qu'il procure. Un immeuble locatif verse des loyers nets ; une maison occupée par son propriétaire lui verse un loyer implicite, le loyer qu'il n'a pas à payer. Par le principe d'anticipation, la valeur de l'actif est la somme actualisée de ces flux : | ||||
| 245 | +\begin{equation}\label{eq:1:dcf} | ||||
| 246 | +V_0 = \sum_{t=1}^{\infty} \frac{CF_t}{(1 + r)^t}, | ||||
| 247 | +\end{equation} | ||||
| 248 | +où $r$ est le taux de rendement exigé par le détenteur marginal, qui rémunère le temps, le risque et l'illiquidité. Si les flux croissent au taux constant $g < r$ à partir de $CF_1$, la somme se réduit à la formule de \textcite{gordonShapiro1956}, que les évaluateurs connaissent sous la forme de la capitalisation directe : | ||||
| 249 | +\begin{equation}\label{eq:1:gordon} | ||||
| 250 | +V_0 = \frac{CF_1}{r - g} = \frac{CF_1}{R}, \qquad R = r - g, | ||||
| 251 | +\end{equation} | ||||
| 252 | +où $R$ est le taux de capitalisation global. La dérivation et les hypothèses qui la fondent sont données au \cref{ch:29}, et le \cref{ch:30} traite du cas où les flux ne croissent pas régulièrement. Il suffit ici de retenir que le taux de capitalisation n'est pas un paramètre arbitraire : il est la différence entre le rendement exigé et la croissance attendue, et il baisse lorsque les taux d'intérêt baissent ou que les anticipations de croissance montent. | ||||
| 253 | + | ||||
| 254 | +Pour le propriétaire occupant, la même logique conduit au \motcle{coût d'usage} du logement, que \textcite{poterba1984} a formalisé. Détenir une maison de valeur $V$ pendant un an coûte l'intérêt sur le capital immobilisé (ou renoncé) au taux $i$, les taxes foncières au taux $\tau$, l'entretien et la dépréciation au taux $\delta$, moins la plus-value attendue au taux $g$ : | ||||
| 255 | +\begin{equation}\label{eq:1:cout-usage} | ||||
| 256 | +u = V\,(i + \tau + \delta - g). | ||||
| 257 | +\end{equation} | ||||
| 258 | +À l'équilibre entre louer et acheter, le coût d'usage égale le loyer de marché $L$ d'un logement équivalent, d'où $V = L / (i + \tau + \delta - g)$ : la formule de Gordon réapparaît, avec le loyer pour flux et le coût d'usage unitaire pour taux de capitalisation. \textcite{himmelbergMayerSinai2005} ont montré que c'est ce ratio, et non le ratio brut prix/revenu, qui permet de juger si un marché est « cher ». Le \cref{ch:3} développe ce cadre et le relie au modèle à quatre quadrants de \textcite{dipasqualeWheaton1992}, qui articule le marché de l'espace, où se forment les loyers, et le marché des actifs, où se forment les prix. | ||||
| 259 | + | ||||
| 260 | +Les deux descriptions se rejoignent. Les attributs du panier de Lancaster sont ce qui détermine le loyer, explicite ou implicite, que le logement peut commander ; la capitalisation de ce loyer donne le prix ; et les prix implicites de Rosen ne sont rien d'autre que les loyers implicites marginaux des attributs, capitalisés. Lorsque les deux approches donnent des valeurs différentes pour un même immeuble, ce n'est pas que la théorie est incohérente : c'est que le marché de l'espace et le marché des actifs ne sont pas, à cet instant, en équilibre, et la réconciliation du \cref{ch:20} doit alors dire lequel des deux l'évaluateur croit. | ||||
| 261 | + | ||||
| 262 | +\section{Prix d'équilibre et dispersion}\label{sec:1:dispersion} | ||||
| 263 | + | ||||
| 264 | +\subsection{Deux biens identiques, deux prix} | ||||
| 265 | + | ||||
| 266 | +Si le marché était celui des manuels de microéconomie, un bien donné aurait un prix et un seul, et l'évaluation se réduirait à une lecture. Le marché immobilier n'est pas ainsi, et la \cref{fig:1:prix-valeur} le montre sur le cas~1 : pour une valeur estimée donnée, les prix observés se répartissent de part et d'autre de la diagonale, et l'écart dépasse dix pour cent dans un quart des ventes. La \cref{fig:1:residus} décrit cette dispersion : les résidus de l'\cref{eq:1:semilog} ont un écart-type de 0,082, une distribution à peu près symétrique (asymétrie $-0{,}07$) et des queues à peine plus légères que la normale (aplatissement en excès $-0{,}25$) ; \pct{74.5} des ventes se situent à moins de dix pour cent de leur valeur estimée et \pct{44.8} à moins de cinq pour cent. Dans un marché réel, où les attributs sont mesurés avec erreur et où le modèle est nécessairement incomplet, l'écart-type résiduel des modèles hédoniques bien spécifiés se situe couramment entre 0,10 et 0,20 selon le segment et le territoire ; le chiffre du cas~1 est volontairement optimiste, parce que le jeu a été généré sans variables omises. | ||||
| 267 | + | ||||
| 268 | +\begin{figure}[htbp] | ||||
| 269 | +\centering | ||||
| 270 | +\includegraphics[width=\textwidth]{ch01/ch01-fig-prix-valeur.pdf} | ||||
| 271 | +\caption{Prix observé et valeur estimée par le modèle hédonique de référence pour les 600 ventes du cas~1. Les points se dispersent autour de la diagonale « prix = valeur » ; les lignes pointillées marquent des écarts de $\pm 10$ \%. Les cinq comparables du \cref{ch:16} sont encerclés et la ligne verticale indique la valeur estimée du sujet.}\label{fig:1:prix-valeur} | ||||
| 272 | +\figsource{\synth{analysis/python/figures/ch01\_figures.py, graine 20261031}} | ||||
| 273 | +\end{figure} | ||||
| 274 | + | ||||
| 275 | +\begin{figure}[htbp] | ||||
| 276 | +\centering | ||||
| 277 | +\includegraphics[width=\textwidth]{ch01/ch01-fig-residus.pdf} | ||||
| 278 | +\caption{Distribution des écarts entre le prix observé et la valeur estimée, $P/\hat V - 1$, pour les 600 ventes du cas~1, et densité log-normale d'écart-type $\hat\sigma = 0{,}083$. Les trois quarts des ventes se situent à moins de dix pour cent de leur valeur estimée.}\label{fig:1:residus} | ||||
| 279 | +\figsource{\synth{analysis/python/figures/ch01\_figures.py}} | ||||
| 280 | +\end{figure} | ||||
| 281 | + | ||||
| 282 | +D'où vient cette dispersion ? Une part tient à ce que l'observateur ne voit pas : l'état réel de la toiture, la luminosité, le bruit de la rue, la qualité des finitions. Mais une part irréductible tient à la nature même de l'échange immobilier, et c'est elle qu'il faut comprendre pour savoir ce que la valeur mesure. Le marché du logement est un marché de \motcle{recherche et d'appariement} : les biens sont hétérogènes, les acheteurs sont peu nombreux à un instant donné pour un bien donné, la rencontre est coûteuse et lente, et chaque transaction est une négociation bilatérale dans laquelle aucune des parties ne connaît le prix « du marché » autrement que par les ventes passées de biens différents. Dans un tel marché, le prix de transaction dépend de qui a rencontré qui, et quand. | ||||
| 283 | + | ||||
| 284 | +\subsection{Un modèle de recherche du vendeur} | ||||
| 285 | + | ||||
| 286 | +Le modèle le plus simple suffit à produire la dispersion et à en révéler les déterminants. Un vendeur met en vente un bien et reçoit, à chaque période (le mois), avec probabilité $p$, une offre $O$ tirée d'une loi de distribution $F$ centrée sur $m$, le centre des enchères des acheteurs pour ce bien ; les offres diffèrent parce que les acheteurs diffèrent par leurs goûts, leur information et leurs alternatives. Tant qu'il n'a pas vendu, le vendeur supporte un coût de détention $c$ par période (intérêts, taxes, entretien, coût d'opportunité du capital, inconfort d'une double résidence), et il actualise l'avenir au facteur $\delta = 1/(1 + i/12)$. Soit $W$ la valeur, pour le vendeur, du fait de continuer à chercher. Face à une offre $O$, il vend si $O \geq W$ et poursuit sinon ; $W$ est donc son \motcle{prix de réserve}, et il satisfait l'équation de point fixe | ||||
| 287 | +\begin{equation}\label{eq:1:reserve} | ||||
| 288 | +W = -c + \delta\left[\, p\, \E\!\left[\max(O, W)\right] + (1 - p)\, W \right]. | ||||
| 289 | +\end{equation} | ||||
| 290 | +L'équation dit que la valeur d'attendre est le coût de la période, plus la valeur actualisée de ce que la période apportera : une offre que l'on acceptera si elle dépasse $W$, ou le droit de continuer. Elle a une solution unique, parce que le membre de droite est une contraction en $W$, et cette solution décroît avec $c$ et croît avec la dispersion des offres : plus attendre coûte cher, plus on se contente de peu ; plus les offres sont dispersées, plus il vaut la peine d'attendre la bonne. Le délai de vente espéré et le prix de vente espéré s'en déduisent : | ||||
| 291 | +\begin{equation}\label{eq:1:delai} | ||||
| 292 | +\E[T] = \frac{1}{p\,[1 - F(W)]}, \qquad \E[P] = \E[O \mid O \geq W] > m . | ||||
| 293 | +\end{equation} | ||||
| 294 | +Deux résultats méritent qu'on s'y arrête. D'abord, les prix de transaction de biens identiques se dispersent : chaque vendeur vend à la première offre qui dépasse son prix de réserve, et cette offre est un tirage aléatoire dans la queue supérieure de $F$. Ensuite, le prix espéré est \emph{supérieur} au centre des enchères, parce que le vendeur sélectionne les offres ; et il est d'autant plus élevé que le vendeur est patient, c'est-à-dire que $c$ est faible. Il existe donc un arbitrage entre le prix et le délai, qui est la définition même de la \motcle{liquidité} : un vendeur pressé vend vite et moins cher, un vendeur patient vend plus cher et plus tard, et aucun des deux prix n'est « faux ». La définition professionnelle de la valeur marchande, qui exige une « période suffisante » de mise en vente et des parties non contraintes \parencite{oeaqNormes}, désigne précisément le prix espéré d'un vendeur \emph{non pressé} : elle exclut par construction les ventes de vendeurs dont le $c$ est anormalement élevé, successions liquidées à la hâte, reprises de finance, divorces, et c'est pourquoi ces ventes sont écartées ou ajustées au \cref{ch:16}. | ||||
| 295 | + | ||||
| 296 | +\begin{figure}[htbp] | ||||
| 297 | +\centering | ||||
| 298 | +\includegraphics[width=\textwidth]{ch01/ch01-fig-recherche.pdf} | ||||
| 299 | +\caption{Simulation étiquetée du modèle de recherche (\num{20000} vendeurs de biens identiques ; offres log-normales d'écart-type 6 \% autour du centre $m$, probabilité d'offre mensuelle 0,6, coût de détention 0,4 \% par mois, taux annuel 5 \%). À gauche, la distribution de toutes les offres reçues et celle des prix acceptés, tronquée au prix de réserve ; à droite, la distribution du délai de vente.}\label{fig:1:recherche} | ||||
| 300 | +\figsource{simulation de l'auteur, hypothèses déclarées, \texttt{analysis/python/cases/ch01\_valeur\_prix.py}, graine 20261031.} | ||||
| 301 | +\end{figure} | ||||
| 302 | + | ||||
| 303 | +La \cref{fig:1:recherche} simule ce modèle avec des paramètres déclarés et choisis pour l'illustration, non estimés : écart-type des offres de six pour cent autour de $m$, une offre par mois avec probabilité 0,6, coût de détention de 0,4 pour cent de $m$ par mois et taux annuel de cinq pour cent. Le prix de réserve se fixe \pct{2.7} au-dessus du centre des enchères ; les prix acceptés ont une moyenne de \pct{6.8} au-dessus de $m$ et un coefficient de variation de \pct{3.2}, c'est-à-dire que des biens rigoureusement identiques vendus par des vendeurs rigoureusement identiques se vendent à des prix dont l'écart-type est de plus de trois pour cent, du seul fait du hasard des rencontres ; le délai moyen est de 5,1 mois. Le \cref{tab:1:recherche} fait varier le coût de détention : un vendeur dont le coût mensuel passe de 0,2 à 1,5 pour cent abaisse son prix de réserve de \pct{3.8} au-dessus du centre à \pct{1.3} au-dessous, vend en 2,9 mois plutôt qu'en 6,2 et obtient un prix moyen inférieur de trois points et demi. L'évaluateur qui compare une vente de succession liquidée en trois semaines à une vente ordinaire ne compare pas deux réalisations du même prix : il compare deux prix espérés différents, et la différence est de l'ordre de grandeur que le tableau indique. | ||||
| 304 | + | ||||
| 305 | +\begin{table}[htbp] | ||||
| 306 | +\caption{Effet du coût de détention du vendeur sur le prix de réserve, le délai et le prix de vente (simulation étiquetée, \num{10000} vendeurs par ligne)}\label{tab:1:recherche} | ||||
| 307 | +\centering | ||||
| 308 | +\small | ||||
| 309 | +\begin{tabular}{S[table-format=1.1]S[table-format=1.4]S[table-format=1.2]S[table-format=1.4]S[table-format=1.4]} | ||||
| 310 | +\toprule | ||||
| 311 | +{\makecell{Coût de détention\\(\% de $m$ par mois)}} & {\makecell{Prix de\\réserve $/m$}} & {\makecell{Délai moyen\\(mois)}} & {\makecell{Prix\\moyen $/m$}} & {\makecell{Coefficient de\\variation du prix}} \\ | ||||
| 312 | +\midrule | ||||
| 313 | +0.2 & 1.0377 & 6.22 & 1.0764 & 0.0299 \\ | ||||
| 314 | +0.4 & 1.0267 & 5.06 & 1.0681 & 0.0316 \\ | ||||
| 315 | +0.8 & 1.0095 & 3.83 & 1.0557 & 0.0344 \\ | ||||
| 316 | +1.5 & 0.9869 & 2.88 & 1.0412 & 0.0388 \\ | ||||
| 317 | +\bottomrule | ||||
| 318 | +\end{tabular} | ||||
| 319 | +\tabsource{simulation de l'auteur, \texttt{analysis/python/cases/ch01\_valeur\_prix.py}, graine 20261031 ; autres paramètres comme à la \cref{fig:1:recherche}.} | ||||
| 320 | +\end{table} | ||||
| 321 | + | ||||
| 322 | +\subsection{Ce que la dispersion enseigne} | ||||
| 323 | + | ||||
| 324 | +Trois enseignements découlent de ce qui précède, et ils structurent le reste de l'ouvrage. Premièrement, un prix isolé n'est pas une mesure de la valeur, mais une observation bruitée dont l'écart-type est de l'ordre de huit à vingt pour cent selon les marchés ; il faut plusieurs observations pour estimer la valeur avec précision, et le nombre nécessaire dépend de la dispersion (\cref{sec:1:sensibilite}). Deuxièmement, la dispersion n'est pas une imperfection que de meilleures données feraient disparaître : une part en est structurelle, et la fourchette de valeur que l'évaluateur rapporte au \cref{ch:20} doit en rendre compte. Troisièmement, le délai de vente est une information sur le prix : une vente conclue en quelques jours à un prix élevé et une vente conclue après dix mois d'exposition à un prix bas ne sont pas deux observations équivalentes du même marché, et les conditions de vente font partie des éléments de comparaison. \textcite{geltner1993} et \textcite{claytonGeltnerHamilton2001} ont montré que les évaluations elles-mêmes, en lissant les prix bruités, introduisent une dispersion d'une autre nature, que le \cref{ch:20} examine. | ||||
| 325 | + | ||||
| 326 | +\section{La valeur marchande comme espérance conditionnelle}\label{sec:1:esperance} | ||||
| 327 | + | ||||
| 328 | +\subsection{Définition} | ||||
| 329 | + | ||||
| 330 | +La dispersion des prix oblige à préciser ce que « prix le plus probable » veut dire. La définition que l'ouvrage adopte, et qui est celle que les \cref{ch:16,ch:18} mettent en œuvre, est la suivante. | ||||
| 331 | + | ||||
| 332 | +\begin{definition}{Valeur marchande comme espérance conditionnelle}{1:esperance} | ||||
| 333 | +La valeur marchande d'un bien de caractéristiques $\mathbf{x}$ à la date $t$ est le prix espéré d'une vente de ce bien, conditionnellement à ses caractéristiques et à la date, sous les conditions de la base de valeur (parties informées et non contraintes, exposition suffisante, paiement comptant) : | ||||
| 334 | +\begin{equation}\label{eq:1:esperance} | ||||
| 335 | +V(\mathbf{x}, t) = \E\left[P \mid \mathbf{x}, t\right]. | ||||
| 336 | +\end{equation} | ||||
| 337 | +\end{definition} | ||||
| 338 | + | ||||
| 339 | +Cette définition a trois mérites. Elle fait de la valeur un objet \emph{défini} indépendamment de la méthode qui l'estime : la comparaison, le coût et le revenu sont trois estimateurs de la même quantité, et la réconciliation (\cref{ch:20}) est la combinaison de trois estimateurs, non le choix entre trois valeurs. Elle rend la valeur \emph{estimable} : l'espérance conditionnelle est ce qu'une régression estime, et les méthodes de la partie~IV sont des régressions, locales ou globales. Elle rend enfin la valeur \emph{incertaine de façon mesurable} : l'écart entre un prix et la valeur a une distribution, celle de $\varepsilon$ dans l'\cref{eq:1:bruit}, et l'incertitude sur l'estimation de la valeur a une autre distribution, qui dépend du nombre et de la qualité des observations. | ||||
| 340 | + | ||||
| 341 | +Il faut toutefois préciser de quelle « espérance » il s'agit, parce que le choix importe lorsque la distribution est asymétrique. Si $\ln P \mid \mathbf{x}, t \sim \mathcal{N}(\mu, \sigma^2)$, comme l'\cref{eq:1:bruit} le suppose, le prix lui-même suit une loi log-normale dont les trois mesures de tendance centrale diffèrent : | ||||
| 342 | +\begin{equation}\label{eq:1:lognormale} | ||||
| 343 | +\text{médiane} = e^{\mu}, \qquad \text{moyenne} = e^{\mu + \sigma^2/2}, \qquad \text{mode} = e^{\mu - \sigma^2}. | ||||
| 344 | +\end{equation} | ||||
| 345 | +La prédiction $\exp(\mathbf{x}\T\hat{\boldsymbol\beta})$ d'un modèle semi-logarithmique estime la \emph{médiane} conditionnelle ; la moyenne conditionnelle lui est supérieure du facteur $e^{\sigma^2/2}$, que la correction de Duan estime par la moyenne des $e^{\hat\varepsilon_i}$ sans supposer la normalité (\cref{app:conventions-calcul}) ; et le « prix le plus probable » au sens littéral, le mode, lui est inférieur du facteur $e^{-\sigma^2}$. Pour $\sigma = 0{,}083$, les trois mesures sont à moins d'un pour cent l'une de l'autre et la distinction est académique ; pour $\sigma = 0{,}20$, l'écart entre le mode et la moyenne atteint six pour cent et la distinction compte. La convention de l'ouvrage est de rapporter la médiane conditionnelle comme valeur ponctuelle, de signaler la moyenne lorsque la dispersion la rend différente, et d'accompagner toujours la valeur d'un intervalle. On peut lire les définitions professionnelles comme visant le mode (« le plus probable ») ; on peut aussi les lire comme visant le prix attendu. L'important est de savoir que la différence existe, et de ne pas la confondre avec une erreur de méthode. | ||||
| 346 | + | ||||
| 347 | +\subsection{Exemple intégral : du prix à la valeur pour le sujet du cas~1} | ||||
| 348 | + | ||||
| 349 | +\begin{exemple}{La valeur du sujet du cas~1 comme espérance conditionnelle}{1:sujet} | ||||
| 350 | +Le sujet est la maison fictive décrite dans l'encadré de la \cref{sec:1:principes} ; la date d'évaluation est le 1\textsuperscript{er} septembre 2026. Le modèle hédonique de référence (\cref{tab:1:implicites}) donne, pour ses caractéristiques, $\mathbf{x}_s\T\hat{\boldsymbol\beta} = 13{,}3627$, d'où une médiane conditionnelle de $e^{13{,}3627} = \dollars{635821}$. Le facteur de Duan, moyenne des exponentielles des 600 résidus, vaut 1,00335, ce qui donne une moyenne conditionnelle de \dollars{637953}, pratiquement confondue avec la valeur $e^{\mu + \sigma^2/2} = \dollars{638016}$ qu'implique la normalité ; le mode est de \dollars{631455}. L'écart-type de la prédiction en logarithme, qui combine la dispersion des prix $\hat\sigma^2$ et l'incertitude d'estimation des coefficients $\mathbf{x}_s\T\hat{\mathbf{V}}\mathbf{x}_s$, est de 0,0836, d'où un intervalle de prédiction à 95 \% de \dollars{539682} à \dollars{749087} : c'est la fourchette dans laquelle le prix d'une vente effective du sujet tomberait dix-neuf fois sur vingt si le modèle est juste. Le \cref{tab:1:sujet} rassemble ces résultats et les met en regard des prix observés des cinq comparables du \cref{ch:16} et de la valeur au rôle fictive du dossier. | ||||
| 351 | + | ||||
| 352 | +Trois lectures s'imposent. La première est que les prix des cinq comparables, de \dollars{506500} à \dollars{624500}, sont tous inférieurs à la valeur estimée du sujet, mais que leurs \emph{propres} valeurs estimées le sont aussi : G0574 s'est vendu \pct{0.7} au-dessus de sa valeur estimée, G0404 \pct{14.9} au-dessous, G0468 \pct{9.9} au-dessous, G0477 \pct{10.5} au-dessous et G0575 \pct{8.0} au-dessous. Quatre des cinq comparables sont des ventes « bon marché » au sens du modèle, c'est-à-dire des réalisations de $\varepsilon_j$ négatives ; un évaluateur qui s'en tiendrait à leurs prix bruts hériterait de ce hasard. Le \cref{ch:17} montrera comment les ajustements corrigent les différences d'attributs, et le \cref{ch:20} comment la pondération atténue le bruit résiduel. La deuxième lecture concerne la valeur au rôle : \dollars{468000} pour une date de référence du 1\textsuperscript{er} juillet 2024, contre une valeur estimée de \dollars{578436} à cette même date. L'écart ne signifie pas que le rôle est « faux » : le jeu synthétique a été généré avec un rapport rôle/valeur centré sur 0,93 et dispersé, et un rôle réel est établi en masse, avec une date de référence et des conventions propres (\cref{ch:9}) ; il signifie que la valeur au rôle n'est pas une estimation de la valeur marchande à la date d'évaluation et ne doit jamais être présentée comme telle. La troisième lecture est la largeur de l'intervalle : de $-\pct{15.1}$ à $+\pct{17.8}$ autour de la médiane, pour un modèle qui explique 85 \% de la variance sur un jeu sans variables omises. L'évaluateur qui conclut à une valeur « de \dollars{635000} » sans fourchette affirme une précision que la nature du marché ne permet pas ; celui qui conclut à une fourchette de \dollars{600000} à \dollars{670000}, comme il est d'usage, affirme un intervalle plus étroit que l'intervalle de prédiction, ce qui n'est défendable que si les comparables apportent une information que le modèle global n'a pas, par exemple sur la rue ou l'état précis du bien. C'est tout l'enjeu de la réconciliation. | ||||
| 353 | +\end{exemple} | ||||
| 354 | + | ||||
| 355 | +\begin{table}[htbp] | ||||
| 356 | +\caption{La valeur du sujet du cas~1 : mesures de tendance centrale, intervalle, et comparaison avec les prix observés (données synthétiques)}\label{tab:1:sujet} | ||||
| 357 | +\centering | ||||
| 358 | +\footnotesize\setlength{\tabcolsep}{4pt} | ||||
| 359 | +\begin{tabular}{L{74mm}S[table-format=6.0]L{36mm}} | ||||
| 360 | +\toprule | ||||
| 361 | +Quantité & {Montant (\$)} & Nature \\ | ||||
| 362 | +\midrule | ||||
| 363 | +Médiane conditionnelle $e^{\mathbf{x}_s\T\hat{\boldsymbol\beta}}$ & 635821 & valeur estimée (convention de l'ouvrage) \\ | ||||
| 364 | +Moyenne conditionnelle (correction de Duan, facteur 1,00335) & 637953 & valeur estimée \\ | ||||
| 365 | +Mode conditionnel $e^{\mu - \sigma^2}$ & 631455 & valeur estimée \\ | ||||
| 366 | +Borne basse de l'intervalle de prédiction à 95 \% & 539682 & valeur estimée (incertitude) \\ | ||||
| 367 | +Borne haute de l'intervalle de prédiction à 95 \% & 749087 & valeur estimée (incertitude) \\ | ||||
| 368 | +Valeur estimée à la date de référence du rôle (1\textsuperscript{er} juillet 2024) & 578436 & valeur estimée, autre date \\ | ||||
| 369 | +Valeur au rôle fictive du dossier (référence 1\textsuperscript{er} juillet 2024) & 468000 & valeur au rôle (synthétique) \\ | ||||
| 370 | +\addlinespace | ||||
| 371 | +Prix observé du comparable G0574 (juin 2026 ; valeur estimée \num{593866}) & 598000 & prix \\ | ||||
| 372 | +Prix observé du comparable G0404 (mai 2025 ; valeur estimée \num{595030}) & 506500 & prix \\ | ||||
| 373 | +Prix observé du comparable G0468 (sept. 2025 ; valeur estimée \num{693218}) & 624500 & prix \\ | ||||
| 374 | +Prix observé du comparable G0477 (nov. 2025 ; valeur estimée \num{601336}) & 538000 & prix \\ | ||||
| 375 | +Prix observé du comparable G0575 (juin 2026 ; valeur estimée \num{558242}) & 513500 & prix \\ | ||||
| 376 | +\bottomrule | ||||
| 377 | +\end{tabular} | ||||
| 378 | +\tabsource{\synth{analysis/python/cases/ch01\_valeur\_prix.py, graine 20261031 ; les valeurs estimées des comparables sont celles du même modèle à leur date de vente}} | ||||
| 379 | +\end{table} | ||||
| 380 | + | ||||
| 381 | +\subsection{Combien de ventes faut-il pour connaître la valeur ?} | ||||
| 382 | + | ||||
| 383 | +L'\cref{eq:1:esperance} a une conséquence quantitative immédiate. Si l'on disposait de $n$ ventes d'immeubles identiques au sujet, conclues à la date d'évaluation, la moyenne de leurs logarithmes de prix estimerait $\mu$ avec un écart-type de $\sigma / \sqrt{n}$. Pour que la demi-largeur d'un intervalle à 95 \% sur la valeur soit de deux pour cent, il faut $n \geq (1{,}96\,\sigma / \ln 1{,}02)^2$, soit 68 ventes identiques pour $\sigma = 0{,}083$, et 251 pour $\sigma = 0{,}16$. Ces ventes identiques n'existent pas, et l'évaluateur travaille avec cinq comparables différents du sujet : la précision de sa conclusion dépend donc moins du nombre de comparables que de la précision des ajustements qui les ramènent au sujet, ce que \textcite{vandell1991} a formalisé et que le \cref{ch:16} développe. Mais l'ordre de grandeur mérite d'être retenu : avec cinq ventes bruitées à huit pour cent, l'écart-type de la moyenne est de 3,6 pour cent, et aucune conclusion de valeur fondée sur la comparaison ne peut prétendre à une précision supérieure sans information supplémentaire. | ||||
| 384 | + | ||||
| 385 | +\section{Sensibilité à la dispersion des prix}\label{sec:1:sensibilite} | ||||
| 386 | + | ||||
| 387 | +Le paramètre $\sigma$ gouverne tout ce qui précède : l'écart entre médiane, moyenne et mode, la largeur de l'intervalle de prédiction, la probabilité qu'un prix observé s'écarte sensiblement de la valeur, et le nombre d'observations nécessaires. Le \cref{tab:1:sensibilite} et la \cref{fig:1:sensibilite} en font varier la valeur de 0,04, qui correspondrait à un marché de copropriétés très homogènes dans un même immeuble, à 0,16, qui correspond à des marchés ruraux ou à des biens atypiques. La probabilité qu'une vente s'écarte de plus de dix pour cent de la valeur, donnée par | ||||
| 388 | +\begin{equation}\label{eq:1:proba} | ||||
| 389 | +\Pr\left(\left|\tfrac{P}{V} - 1\right| > d\right) \approx 2\left[1 - \Phi\!\left(\frac{\ln(1 + d)}{\sigma}\right)\right], | ||||
| 390 | +\end{equation} | ||||
| 391 | +passe de moins de deux pour cent à plus de cinquante-cinq pour cent sur cet intervalle. Dans le premier marché, un prix isolé est une bonne mesure de la valeur et deux comparables suffisent presque ; dans le second, un prix isolé ne dit presque rien, et la méthode de comparaison ne peut conclure qu'à une fourchette large, à moins d'être complétée par le coût ou le revenu. La dispersion du marché est donc une caractéristique que l'évaluateur doit mesurer avant de choisir sa méthode, et non après ; le \cref{ch:15} en fait une étape de l'étude de marché. | ||||
| 392 | + | ||||
| 393 | +\begin{table}[htbp] | ||||
| 394 | +\caption{Sensibilité à la dispersion $\sigma$ des prix à caractéristiques données}\label{tab:1:sensibilite} | ||||
| 395 | +\centering | ||||
| 396 | +\footnotesize\setlength{\tabcolsep}{3.5pt} | ||||
| 397 | +\begin{tabular}{S[table-format=1.3]S[table-format=1.2]S[table-format=-1.2]S[table-format=-2.1]S[table-format=2.1]S[table-format=2.1]S[table-format=2.1]S[table-format=3.0]} | ||||
| 398 | +\toprule | ||||
| 399 | +{$\sigma$} & {\makecell{Moyenne/\\médiane\\$-1$ (\%)}} & {\makecell{Mode/\\médiane\\$-1$ (\%)}} & {\makecell{Borne basse\\IP 95 \%\\(\%)}} & {\makecell{Borne haute\\IP 95 \%\\(\%)}} & {\makecell{$\Pr(|\text{écart}|$\\$> 5\,\%)$ (\%)}} & {\makecell{$\Pr(|\text{écart}|$\\$> 10\,\%)$ (\%)}} & {\makecell{$n$ pour\\$\pm 2$ \%}} \\ | ||||
| 400 | +\midrule | ||||
| 401 | +0.040 & 0.08 & -0.16 & -7.5 & 8.2 & 22.3 & 1.7 & 16 \\ | ||||
| 402 | +0.060 & 0.18 & -0.36 & -11.1 & 12.5 & 41.6 & 11.2 & 36 \\ | ||||
| 403 | +0.083 & 0.35 & -0.69 & -15.0 & 17.7 & 55.7 & 25.1 & 68 \\ | ||||
| 404 | +0.120 & 0.72 & -1.43 & -21.0 & 26.5 & 68.4 & 42.7 & 142 \\ | ||||
| 405 | +0.160 & 1.29 & -2.53 & -26.9 & 36.8 & 76.0 & 55.1 & 251 \\ | ||||
| 406 | +\bottomrule | ||||
| 407 | +\end{tabular} | ||||
| 408 | +\tabsource{calculs de l'auteur par les \cref{eq:1:lognormale,eq:1:proba}, \texttt{analysis/python/cases/ch01\_valeur\_prix.py} ; la ligne $\sigma = 0{,}083$ correspond au cas~1 ; $n$ = nombre de ventes identiques pour une demi-largeur de 2 \% à 95 \%.} | ||||
| 409 | +\end{table} | ||||
| 410 | + | ||||
| 411 | +\begin{figure}[htbp] | ||||
| 412 | +\centering | ||||
| 413 | +\includegraphics[width=\textwidth]{ch01/ch01-fig-sensibilite-sigma.pdf} | ||||
| 414 | +\caption{Sensibilité à la dispersion $\sigma$ : à gauche, les bornes de l'intervalle de prédiction à 95 \% en pourcentage de la valeur ; à droite, la probabilité qu'un prix observé s'écarte de la valeur de plus de 5, 10 ou 20 \%. La ligne verticale marque le $\sigma$ du cas~1.}\label{fig:1:sensibilite} | ||||
| 415 | +\figsource{calculs de l'auteur, \texttt{analysis/python/figures/ch01\_figures.py}.} | ||||
| 416 | +\end{figure} | ||||
| 417 | + | ||||
| 418 | +\section{Biais comportementaux : l'ancrage et ses conséquences}\label{sec:1:ancrage} | ||||
| 419 | + | ||||
| 420 | +Tout ce qui précède suppose un évaluateur qui infère la valeur des prix observés selon une procédure explicite. Or l'évaluateur est un être humain soumis aux heuristiques de jugement que la psychologie cognitive a documentées, et la plus dangereuse pour lui est l'\motcle{ancrage} : la tendance à former une estimation en partant d'une valeur initiale, l'ancre, puis en l'ajustant insuffisamment. \textcite{northcraftNeale1987} ont conduit l'expérience fondatrice en contexte immobilier : des étudiants et des professionnels de l'immobilier ont visité une même propriété avec un dossier complet, dans lequel seul le prix demandé différait d'un groupe à l'autre ; les estimations de valeur des deux groupes ont suivi le prix demandé, et les professionnels, qui niaient en avoir tenu compte, n'ont pas été sensiblement moins influencés que les amateurs. \textcite{diaz1990} a ensuite observé que les évaluateurs résidentiels experts ne suivent pas le processus normatif enseigné, mais une procédure abrégée dans laquelle les indices saillants du dossier pèsent plus que la grille, et \textcite{diaz1997} a montré que l'estimation antérieure d'un autre expert ancre le jugement des évaluateurs lorsqu'ils travaillent dans un marché qui ne leur est pas familier, alors que l'effet s'estompe sur leur propre marché. \textcite{diazHansz2002} font la synthèse de ce courant de recherche comportementale, qui a aussi documenté l'effet du prix demandé, de l'estimation du client et des rétroactions des prêteurs. | ||||
| 421 | + | ||||
| 422 | +Un modèle descriptif simple rend compte de ces résultats et permet d'en mesurer l'effet. Si $V$ est la valeur que l'évaluateur conclurait sans ancre et $A$ l'ancre qui lui est présentée, l'estimation ancrée s'écrit | ||||
| 423 | +\begin{equation}\label{eq:1:ancrage} | ||||
| 424 | +\hat V_A = \lambda A + (1 - \lambda)\, V, \qquad 0 \leq \lambda \leq 1, | ||||
| 425 | +\end{equation} | ||||
| 426 | +où $\lambda$ mesure le poids de l'ancre. Un $\lambda$ de 0,4, qui n'est pas hors de l'ordre de grandeur des études citées, signifie qu'un prix demandé supérieur de \dollars{50000} à la valeur déplace la conclusion de \dollars{20000}. L'\cref{ex:1:7} montre comment estimer $\lambda$ sur un ensemble de dossiers. Le biais est d'autant plus grave que l'ancre est corrélée aux intérêts d'une partie : le prix demandé est fixé par le vendeur, le prix convenu par les deux parties à la transaction que le prêteur demande d'évaluer, l'estimation antérieure par un confrère qui pouvait lui-même être ancré. Il se propage alors de rapport en rapport et de transaction en transaction, et il contribue au lissage des indices fondés sur les évaluations qu'ont étudié \textcite{geltner1993} et \textcite{claytonGeltnerHamilton2001}. | ||||
| 427 | + | ||||
| 428 | +\begin{pratique} | ||||
| 429 | +Quatre règles de méthode limitent l'ancrage, et elles sont toutes des applications de ce chapitre. Premièrement, fixer les critères de sélection des comparables et les paramètres d'ajustement \emph{avant} de consulter les prix du sujet (prix demandé, prix convenu, valeur au rôle, évaluation antérieure), et consigner cet ordre au dossier. Deuxièmement, estimer la valeur par au moins deux méthodes indépendantes et comparer les résultats avant de connaître l'ancre, plutôt que d'ajuster une méthode jusqu'à ce qu'elle rejoigne l'autre. Troisièmement, exprimer la conclusion sous forme de fourchette dérivée de la dispersion observée (\cref{sec:1:sensibilite}), ce qui rend visible la part de jugement et empêche de présenter une coïncidence avec l'ancre comme une précision. Quatrièmement, lorsque l'ancre est inévitable, comme le prix convenu dans une évaluation hypothécaire, la traiter explicitement comme une observation de plus, dont la représentativité doit être vérifiée au même titre que celle d'un comparable, et non comme un point d'arrivée. Les Normes de pratique professionnelle exigent d'ailleurs que le rapport expose le raisonnement qui conduit à la conclusion \parencite{oeaqNormes}, ce qui est incompatible avec une conclusion formée d'abord et justifiée ensuite. | ||||
| 430 | +\end{pratique} | ||||
| 431 | + | ||||
| 432 | +\begin{erreurs} | ||||
| 433 | +\begin{itemize} | ||||
| 434 | +\item Écrire « la valeur de la maison est de \dollars{598000} » pour une vente à ce prix : c'est un prix, particulier à une transaction ; la valeur est une estimation, et elle est en général différente. | ||||
| 435 | +\item Présenter la valeur au rôle comme une estimation de la valeur marchande à la date d'évaluation : elle décrit le marché à une date de référence antérieure de deux à quatre ans, en masse, selon des conventions propres \parencite[art.~43, 46]{lfm}. | ||||
| 436 | +\item Confondre le coût d'une composante et sa contribution : une piscine à \dollars{65000} n'ajoute à la valeur que ce que le marché paie pour une piscine, soit \pct{2.7} dans le cas~1. | ||||
| 437 | +\item Ajuster la superficie au prix moyen du mètre carré : le prix marginal vaut $\beta_S$ fois le prix moyen, soit à peu près la moitié dans le cas~1 ; l'ajustement est surestimé d'un facteur deux. | ||||
| 438 | +\item Conclure à une valeur ponctuelle sans fourchette, ou à une fourchette plus étroite que ce que la dispersion du marché autorise. | ||||
| 439 | +\item Interpréter l'écart entre une vente rapide et une vente lente comme un ajustement de « conditions de vente » symétrique : la vente rapide d'un vendeur pressé est un prix espéré \emph{différent}, non un prix bruité. | ||||
| 440 | +\item Consulter le prix demandé, le prix convenu ou l'évaluation antérieure avant d'avoir fixé la procédure, puis « vérifier » que la conclusion s'en approche. | ||||
| 441 | +\end{itemize} | ||||
| 442 | +\end{erreurs} | ||||
| 443 | + | ||||
| 444 | +\begin{limites} | ||||
| 445 | +Le cadre de ce chapitre est celui d'un marché où des ventes de biens comparables sont observables et où la valeur peut être définie comme un prix espéré ; il s'applique mal aux biens sans marché (immeubles institutionnels, infrastructures), pour lesquels la Loi sur la fiscalité municipale prévoit une fiction, le prix qu'une personne « serait justifiée de payer et d'exiger si elle était à la fois l'acheteur et le vendeur » \parencite[art.~44]{lfm}, et pour lesquels la méthode du coût devient principale. Le modèle de recherche de la \cref{sec:1:dispersion} est le plus simple possible : il ignore la stratégie du prix demandé, la négociation, l'apprentissage du vendeur sur la distribution des offres et la concurrence entre vendeurs, qui modifient les grandeurs mais non les conclusions qualitatives ; ses paramètres sont déclarés, non estimés. La dispersion $\hat\sigma = 0{,}083$ du cas~1 provient d'un jeu synthétique sans variables omises et sous-estime celle des marchés réels. Les études comportementales citées portent sur des échantillons restreints de professionnels américains des années 1980 et 1990 ; leur ampleur numérique n'a pas été revérifiée sur les textes originaux pour ce chapitre, et le coefficient $\lambda$ de l'\cref{eq:1:ancrage} est un paramètre descriptif dont l'ordre de grandeur, non la valeur, est documenté. Enfin, les textes normatifs sont cités dans leur version en vigueur au 31 octobre 2026 ; les définitions de la valeur marchande évoluent avec les éditions et doivent être revérifiées à chaque mission. | ||||
| 446 | +\end{limites} | ||||
| 447 | + | ||||
| 448 | +\begin{synthese} | ||||
| 449 | +\begin{itemize} | ||||
| 450 | +\item Le prix est un fait daté et particulier ; la valeur est une opinion motivée sur un prix probable, toujours relative à une base et à une date ; le coût est une dépense que seul le marché relie à la valeur. Au Québec, les NPP de l'OEAQ, la Loi sur la fiscalité municipale (art.~43 et 46) et le Code des professions (art.~37~j)) fixent ce vocabulaire. | ||||
| 451 | +\item La valeur naît de la conjonction de l'utilité, de la rareté, de la désirabilité et du pouvoir d'achat ; le crédit est le canal par lequel les taux d'intérêt agissent sur les prix. | ||||
| 452 | +\item Sept principes gouvernent les méthodes : substitution, anticipation, contribution, équilibre, conformité, rendements décroissants et plus haute et meilleure utilisation. Dans le cas~1, le garage contribue \dollars{20291}, la tendance vaut \pct{4.46} par an, le prix marginal du mètre carré est la moitié du prix moyen et la localisation déplace la valeur de $-\pct{23}$ à $+\pct{9}$. | ||||
| 453 | +\item Le logement est un panier d'attributs dont la fonction de prix est l'enveloppe des enchères et des offres (Rosen) ; il est aussi un actif dont la valeur est la somme actualisée des flux ; les deux descriptions coïncident à l'équilibre. | ||||
| 454 | +\item Les prix de biens identiques se dispersent parce que le marché est un marché de recherche : le vendeur vend à la première offre qui dépasse son prix de réserve, et le prix s'échange contre le délai. La valeur marchande est le prix espéré d'un vendeur non pressé. | ||||
| 455 | +\item La valeur marchande est l'espérance conditionnelle du prix, $V = \E[P \mid \mathbf{x}, t]$ ; la prédiction semi-logarithmique en estime la médiane ; moyenne et mode s'en écartent de $\pm\sigma^2$ ; l'intervalle de prédiction et le nombre d'observations nécessaires dépendent de $\sigma$. | ||||
| 456 | +\item L'ancrage sur le prix demandé, le prix convenu ou une évaluation antérieure est documenté chez les professionnels ; la parade est procédurale : fixer la méthode avant de regarder l'ancre, croiser les méthodes, conclure en fourchette. | ||||
| 457 | +\end{itemize} | ||||
| 458 | +\end{synthese} | ||||
| 459 | + | ||||
| 460 | +\section*{Exercices} | ||||
| 461 | +\addcontentsline{toc}{section}{Exercices} | ||||
| 462 | + | ||||
| 463 | +\begin{exercice}[1]{Prix, valeur ou coût ?}{ex:1:1} | ||||
| 464 | +Pour chacune des phrases suivantes, dites si le montant cité est un prix, une valeur (et laquelle : marchande, au rôle, d'investissement, d'usage) ou un coût, et reformulez la phrase si le terme employé est impropre : (a) « La maison vaut \dollars{598000}, c'est ce qu'elle s'est vendue en juin. » (b) « La Ville évalue l'immeuble à \dollars{468000}. » (c) « Pour nous, ce triplex vaut \dollars{900000}, parce que nous pouvons y loger nos parents au deuxième. » (d) « Le constructeur demande \dollars{470000} pour une maison semblable. » (e) « L'évaluateur conclut à \dollars{635000}. » (f) « Avec la piscine, la propriété vaut \dollars{65000} de plus. » | ||||
| 465 | +\end{exercice} | ||||
| 466 | + | ||||
| 467 | +\begin{exercice}[1]{Contribution et coût}{ex:1:2} | ||||
| 468 | +Dans le marché du cas~1, le coefficient hédonique de la piscine est de 0,02633 et celui d'une place de garage de 0,03243 (\cref{tab:1:implicites}). Pour une maison dont la valeur estimée sans ces attributs est de \dollars{635821}, calculez la contribution d'une piscine creusée, puis celle d'un garage simple, par la formule $V(e^{\beta} - 1)$. Une piscine coûte \dollars{65000} et un garage \dollars{45000} : que conclut le principe de contribution dans chaque cas, et que devrait en déduire un propriétaire qui envisage ces travaux ? | ||||
| 469 | +\end{exercice} | ||||
| 470 | + | ||||
| 471 | +\begin{exercice}[2]{Rendements décroissants}{ex:1:3} | ||||
| 472 | +Le sujet du cas~1 a \msq{165} et une valeur estimée de \dollars{635821} ; l'élasticité du prix à la superficie est de 0,539. Calculez le prix moyen et le prix marginal du mètre carré par l'\cref{eq:1:marginal}. Un agrandissement portant la superficie à \msq{190} est envisagé : calculez la valeur ajoutée exacte, $V[(190/165)^{\beta_S} - 1]$, puis le prix moyen de chaque mètre carré ajouté. Quelle élasticité rendrait le prix marginal égal au prix moyen, et pourquoi cette situation n'est-elle presque jamais observée ? | ||||
| 473 | +\end{exercice} | ||||
| 474 | + | ||||
| 475 | +\begin{exercice}[2]{Médiane, moyenne, mode et intervalle}{ex:1:4} | ||||
| 476 | +Un modèle semi-logarithmique estimé sur un marché de maisons de banlieue a un écart-type résiduel de 0,12 et prédit pour un sujet une médiane conditionnelle de \dollars{500000}. Calculez la moyenne et le mode conditionnels par l'\cref{eq:1:lognormale}, les bornes de l'intervalle de prédiction à 95 \% en négligeant l'incertitude des coefficients, et la probabilité qu'une vente effective s'écarte de plus de dix pour cent de la médiane par l'\cref{eq:1:proba}. Commentez la différence avec le cas~1 ($\sigma = 0{,}083$). | ||||
| 477 | +\end{exercice} | ||||
| 478 | + | ||||
| 479 | +\begin{exercice}[2]{Le bien comme actif : Gordon et coût d'usage}{ex:1:5} | ||||
| 480 | +Un duplex produit un revenu net d'exploitation de première année de \dollars{24000} ; les investisseurs exigent un rendement de \pct{6} et anticipent une croissance de \pct{2} par an. Calculez sa valeur par l'\cref{eq:1:gordon}. Une maison de \dollars{600000} est détenue par son propriétaire : avec un taux d'intérêt de \pct{4.5}, des taxes de \pct{1}, un entretien et une dépréciation de \pct{1.5} et une plus-value attendue de \pct{2}, calculez le coût d'usage annuel et mensuel par l'\cref{eq:1:cout-usage}. Que devient-il si le taux d'intérêt passe à \pct{6} ? À quel loyer mensuel un ménage devrait-il être indifférent entre louer et acheter dans chaque cas ? | ||||
| 481 | +\end{exercice} | ||||
| 482 | + | ||||
| 483 | +\begin{exercice}[3]{Prix de réserve et délai de vente}{ex:1:6} | ||||
| 484 | +Un vendeur reçoit chaque mois exactement une offre, tirée uniformément entre 0,9 et 1,1 fois le centre des enchères $m$ (normalisé à 1). Il supporte un coût de détention de 0,5 \% de $m$ par mois et n'actualise pas ($\delta = 1$). (a) Montrez que l'\cref{eq:1:reserve} se réduit à $c = \E[(O - W)^+]$ et que, pour une loi uniforme sur $[a, b]$, $\E[(O - W)^+] = (b - W)^2 / [2(b - a)]$. (b) Déduisez-en la forme fermée $W = b - \sqrt{2c(b - a)}$ et calculez le prix de réserve, le délai de vente espéré par l'\cref{eq:1:delai} et le prix de vente espéré $\E[O \mid O \geq W] = (W + b)/2$. (c) Refaites le calcul pour un vendeur pressé dont le coût est de 2 \% par mois. (d) Expliquez pourquoi les deux prix espérés sont tous deux des « prix de marché » et lequel correspond à la définition professionnelle de la valeur marchande. | ||||
| 485 | +\end{exercice} | ||||
| 486 | + | ||||
| 487 | +\begin{exercice}[3]{Mesurer l'ancrage}{ex:1:7} | ||||
| 488 | +Un cabinet veut mesurer l'ancrage de ses évaluateurs sur le prix demandé. Pour six dossiers, il dispose de la valeur $V$ conclue \emph{a posteriori} par un comité qui ignorait le prix demandé, de l'écart entre le prix demandé et cette valeur, $A - V$, et de l'écart entre la conclusion de l'évaluateur et cette valeur, $\hat V_A - V$ (en milliers de dollars) : $A - V = (+40, -30, +25, +60, -20, +15)$ et $\hat V_A - V = (+18, -12, +9, +27, -10, +6)$. (a) Montrez que l'\cref{eq:1:ancrage} implique $\hat V_A - V = \lambda (A - V)$ et estimez $\lambda$ par les moindres carrés sans constante, $\hat\lambda = \sum x_i y_i / \sum x_i^2$. (b) De combien un prix demandé supérieur de \dollars{50000} à la valeur déplace-t-il, en moyenne, la conclusion de ce cabinet ? (c) Proposez un protocole de travail, en cinq lignes, qui ramènerait $\lambda$ vers zéro, et dites comment le cabinet pourrait vérifier qu'il fonctionne. (d) À l'aide du script \texttt{analysis/python/cases/ch01\_valeur\_prix.py}, faites varier l'écart-type des offres du modèle de recherche de 0,03 à 0,12 et décrivez l'effet sur le coefficient de variation des prix acceptés ; en quoi la dispersion du marché aggrave-t-elle le risque d'ancrage ? | ||||
| 489 | +\end{exercice} | ||||
| 490 | + | ||||
| 491 | +\section*{Pour aller plus loin} | ||||
| 492 | +\addcontentsline{toc}{section}{Pour aller plus loin} | ||||
| 493 | + | ||||
| 494 | +Les fondements classiques de la théorie de la valeur foncière se lisent encore avec profit chez \textcite{ricardo1817}, pour qui la rente naît de la rareté et de la qualité relative des terres et non de leur coût, et chez \textcite{vonthunen1826}, qui a le premier dérivé un gradient de rente décroissant avec la distance au marché ; le \cref{ch:5} en donne les développements modernes. La théorie des caractéristiques de \textcite{lancaster1966} et l'équilibre hédonique de \textcite{rosen1974} sont les deux textes fondateurs de la \cref{sec:1:attributs} ; \textcite{sheppard1999} et \textcite{malpezzi2003} en offrent des revues accessibles appliquées au logement, et \textcite{kuminoffParmeterPope2010} examinent quelles spécifications permettent de retrouver les dispositions marginales à payer. Sur le bien comme actif, \textcite{poterba1984} et \textcite{himmelbergMayerSinai2005} sont les références sur le coût d'usage, \textcite{dipasqualeWheaton1992} et le manuel de \textcite{dipasqualeWheaton1996} sur l'articulation des marchés de l'espace et des actifs, et \textcite{geltnerMillerClaytonEichholtz2014} sur la distinction entre valeur marchande, valeur d'investissement et prix de transaction comme réalisation bruitée. \textcite{shiller2015} reste l'exposé le plus lisible sur l'écart entre prix et valeur fondamentale. Sur les principes et le vocabulaire professionnels, le manuel de l'Appraisal Institute \parencite{appraisal2026}, son édition canadienne \parencite{appraisalCdn} et le dictionnaire \parencite{aiDictionary2022} sont les références nord-américaines, et \textcite{achour1992} demeure le seul manuel québécois francophone qui fixe le vocabulaire des bases de valeur. Sur les biais de jugement, on lira dans l'ordre \textcite{northcraftNeale1987}, \textcite{diaz1990}, \textcite{diaz1997} et la synthèse de \textcite{diazHansz2002}. | ||||
modified
manuscript/chapters/ch02.tex
+543 −1
@@ -1,2 +1,544 @@ | |||||
| 1 | \chapter{Droits immobiliers et bases de valeur}\label{ch:02} | 1 | \chapter{Droits immobiliers et bases de valeur}\label{ch:02} | ||
| 2 | −\stubchapter | 2 | + | ||
| 3 | +Avant de chercher combien vaut un immeuble, il faut dire \emph{quoi} l'on évalue et \emph{quelle valeur} on cherche. Un même terrain bâti de douze logements n'a pas la même valeur pour celui qui le détient en pleine propriété libre de toute occupation, pour celui qui l'achète grevé de douze baux reconduits à des loyers inférieurs au marché, pour la municipalité qui l'inscrit au rôle d'évaluation foncière, pour l'assureur qui doit le reconstruire ou pour l'investisseur qui le compare à son propre coût du capital. Ces écarts ne sont pas des erreurs d'évaluation : ils tiennent à ce que le droit évalué et la base de valeur diffèrent d'un mandat à l'autre. Le présent chapitre pose ce vocabulaire fondamental. Il décrit d'abord le faisceau de droits que le Code civil du Québec attache à la propriété et à ses démembrements, puis il montre comment ce faisceau se partage entre le locateur et ses locataires et comment chaque part se mesure par l'actualisation des revenus qu'elle procure. Il compare ensuite les définitions de la valeur marchande en vigueur au Québec, au Canada et dans les normes internationales, les distingue de la valeur réelle aux fins du rôle, de la valeur d'investissement, de la valeur assurable et des autres bases, et il rappelle pourquoi le prix, la valeur et le coût ne se confondent jamais. L'exemple intégral mesure, sur l'immeuble de douze logements du cas 3, l'écart entre la valeur du droit du locateur et celle de la pleine propriété ; le chapitre se clôt sur deux questions que tout rapport doit trancher explicitement, celle des hypothèses extraordinaires et celle des dates. | ||||
| 4 | + | ||||
| 5 | +\begin{objectifs} | ||||
| 6 | +\begin{itemize} | ||||
| 7 | +\item Identifier, à partir du Code civil du Québec, le droit réel ou personnel qui fait l'objet d'une évaluation et les charges qui le grèvent. | ||||
| 8 | +\item Décomposer la valeur de la pleine propriété d'un immeuble locatif entre le droit du locateur et les droits des locataires, et calculer chaque composante par actualisation. | ||||
| 9 | +\item Comparer les définitions de la valeur marchande de l'OEAQ, des IVS 2025, des CUSPAP 2026 et de la Loi sur la fiscalité municipale, et en dégager les éléments communs et les différences. | ||||
| 10 | +\item Distinguer la valeur marchande de la valeur réelle au rôle, de la valeur d'investissement, de la valeur équitable, de la valeur de liquidation, de la valeur assurable et de la valeur d'usage, et choisir la base adaptée au mandat. | ||||
| 11 | +\item Distinguer prix, valeur et coût, et repérer dans un acte de vente ce qui relève de chacun. | ||||
| 12 | +\item Formuler et divulguer une hypothèse extraordinaire conformément aux Normes de pratique professionnelle, en indiquant son incidence sur la valeur. | ||||
| 13 | +\item Situer correctement la date d'évaluation, la date de référence au marché du rôle et la date de la promesse d'achat, et corriger une indication de valeur d'une date à l'autre. | ||||
| 14 | +\end{itemize} | ||||
| 15 | +\end{objectifs} | ||||
| 16 | + | ||||
| 17 | +\section{Le bien, le droit et la valeur : ce que l'on évalue}\label{sec:2:bien} | ||||
| 18 | + | ||||
| 19 | +\subsection{L'immeuble au sens du Code civil} | ||||
| 20 | + | ||||
| 21 | +Le Code civil du Québec définit l'objet matériel de l'évaluation. Sont immeubles « les fonds de terre, les constructions et ouvrages à caractère permanent qui s'y trouvent et tout ce qui en fait partie intégrante » \parencite[art.~900]{ccq}. Font partie intégrante les meubles incorporés qui perdent leur individualité et assurent l'utilité de l'immeuble \parencite[art.~901]{ccq} ; les meubles qui sont attachés à demeure sans être incorporés sont immeubles tant qu'ils y restent, sauf s'ils servent à l'exploitation d'une entreprise \parencite[art.~903]{ccq}. Ces trois articles délimitent ce qu'un acte de vente transmet avec le terrain : le bâtiment, ses systèmes incorporés, et les équipements fixés à demeure, à l'exclusion des biens meubles que les parties peuvent inclure dans le prix sans qu'ils fassent partie de l'immeuble. La distinction a des conséquences pratiques immédiates. Les électroménagers et les meubles compris dans un prix de vente ne sont pas de l'immeuble et doivent être retranchés avant toute comparaison (\cref{ch:16}) ; à l'inverse, un système de chauffage central, une piscine creusée ou un abri d'auto fixé au sol en font partie et sont réputés transmis avec le fonds. | ||||
| 22 | + | ||||
| 23 | +La propriété du sol « emporte celle du dessus et du dessous », sous réserve des droits publics sur les mines, les hydrocarbures et les eaux souterraines \parencite[art.~951]{ccq}, et les constructions, ouvrages et plantations qui se trouvent sur un immeuble sont présumés faits par le propriétaire du fonds, à ses frais, et lui appartenir \parencite[art.~955]{ccq}. Cette présomption fonde l'habitude de traiter le terrain et le bâtiment comme un tout appartenant à une même personne. Elle n'est qu'une présomption : un titre distinct peut établir une propriété superficiaire, et c'est l'une des raisons pour lesquelles l'évaluateur consulte le registre foncier avant d'attribuer la valeur du bâtiment au propriétaire du sol. | ||||
| 24 | + | ||||
| 25 | +\begin{quebec}[L'immeuble et le propriétaire au sens de la fiscalité municipale] | ||||
| 26 | +La Loi sur la fiscalité municipale retient une définition propre, plus large que celle du Code civil pour les biens : est un immeuble aux fins du rôle tout immeuble au sens de l'article 900 C.c.Q. ainsi que « tout meuble, sous réserve du troisième alinéa, qui est attaché à demeure à un immeuble », le troisième alinéa excluant les meubles servant à l'exploitation d'une entreprise pour certaines catégories d'immeubles \parencite[art.~1, par.~2\textdegree]{lfm}. La notion de « propriétaire » y est aussi étendue : elle couvre le titulaire du droit de propriété, mais aussi le possesseur, l'emphytéote, l'usufruitier et l'occupant d'une terre de l'État \parencite[art.~1]{lfm}. L'unité d'évaluation, enfin, est définie à l'article 34 comme le plus grand ensemble possible d'immeubles appartenant à un même propriétaire, contigus, voués à une même fin prédominante et normalement cessibles globalement compte tenu de l'utilisation la plus probable \parencite[art.~34]{lfm}. Le \cref{ch:9} développe ces notions ; il suffit ici de retenir que l'objet inscrit au rôle n'est pas toujours l'objet d'un acte de vente, ce qui compte lorsqu'on compare une valeur au rôle à un prix. | ||||
| 27 | +\end{quebec} | ||||
| 28 | + | ||||
| 29 | +\subsection{La pleine propriété et le faisceau de droits} | ||||
| 30 | + | ||||
| 31 | +La propriété est « le droit d'user, de jouir et de disposer librement et complètement d'un bien, sous réserve des limites et des conditions d'exercice fixées par la loi », et elle « est susceptible de modalités et de démembrements » \parencite[art.~947]{ccq}. La tradition anglo-américaine décrit ce droit comme un \terme{faisceau de droits}{bundle of rights} : l'usage, la jouissance des fruits, la disposition, le droit d'exclure, le droit de donner à bail, le droit d'hypothéquer, chacun pouvant être détaché et cédé séparément. Le droit civil québécois dit la même chose avec d'autres mots : les modalités (indivision, copropriété divise, propriété superficiaire) répartissent la propriété entre plusieurs titulaires sans la démembrer, tandis que les démembrements (usufruit, usage, servitude, emphytéose) en détachent une partie au profit d'un tiers. À ces droits réels s'ajoutent des droits personnels qui en limitent l'exercice, le bail au premier chef, des sûretés qui le grèvent, l'hypothèque, et des restrictions de droit public, zonage, protection du territoire agricole, protection de l'environnement, qui ne figurent dans aucun titre mais s'imposent à tous. La \cref{fig:2:faisceau} schématise cet ensemble et renvoie aux articles qui fondent chaque branche. | ||||
| 32 | + | ||||
| 33 | +\begin{figure}[htbp] | ||||
| 34 | +\centering | ||||
| 35 | +\begin{tikzpicture}[ | ||||
| 36 | + centre/.style={draw=brandPrimary, fill=brandPrimary, text=white, rounded corners=2pt, text width=38mm, align=center, font=\sffamily\small\bfseries, minimum height=14mm}, | ||||
| 37 | + groupe/.style={draw, rounded corners=2pt, text width=36mm, align=left, font=\sffamily\footnotesize, line width=0.6pt, inner sep=4pt}, | ||||
| 38 | + modal/.style={groupe, fill=brandLight, draw=brandPrimary}, | ||||
| 39 | + demem/.style={groupe, fill=blue!3!white, draw=brandDark}, | ||||
| 40 | + perso/.style={groupe, fill=green!4!white, draw=brandGreen}, | ||||
| 41 | + public/.style={groupe, fill=orange!6!white, draw=brandAmber}, | ||||
| 42 | + titre/.style={font=\sffamily\footnotesize\bfseries}, | ||||
| 43 | + fl/.style={-{Stealth[length=1.8mm]}, line width=0.6pt, color=brandGray}] | ||||
| 44 | + \node[centre] (c) at (0,0) {Pleine propriété\\ \normalfont\footnotesize user, jouir, disposer\\ art.~947 ; accession 948, 951, 955}; | ||||
| 45 | + \node[modal, above left=9mm and 4mm of c.north] (m) {\textbf{Modalités} (partage entre titulaires)\\ indivision : 1010, 1014, 1015, 1019\\ copropriété divise : 1038 et s., 1041\\ propriété superficiaire : 955 et s.}; | ||||
| 46 | + \node[demem, above right=9mm and 4mm of c.north] (d) {\textbf{Démembrements} (droits réels détachés)\\ usufruit : 1120, 1123\\ usage : 1172\\ servitude : 1177, 1181\\ emphytéose : 1195, 1197, 1208}; | ||||
| 47 | + \node[perso, below left=9mm and 4mm of c.south] (p) {\textbf{Droits personnels et sûretés}\\ bail : 1851 ; maintien dans les lieux 1936--1937\\ hypothèque : 2660, 2693 ; loyers 2695\\ publicité des droits : 2934, 2943}; | ||||
| 48 | + \node[public, below right=9mm and 4mm of c.south] (u) {\textbf{Restrictions de droit public}\\ zonage et lotissement (LAU)\\ zone agricole (LPTAA)\\ environnement, zones inondables (LQE)\\ fiscalité : LFM, droits de mutation}; | ||||
| 49 | + \draw[fl] (c.north west) -- (m.south east); | ||||
| 50 | + \draw[fl] (c.north east) -- (d.south west); | ||||
| 51 | + \draw[fl] (c.south west) -- (p.north east); | ||||
| 52 | + \draw[fl] (c.south east) -- (u.north west); | ||||
| 53 | + \node[titre, color=brandGray, below=1mm of c.south, yshift=-1mm, text width=60mm, align=center] {}; | ||||
| 54 | +\end{tikzpicture} | ||||
| 55 | +\caption{Le faisceau de droits en droit civil québécois : la pleine propriété de l'article 947 C.c.Q. peut être partagée entre plusieurs titulaires (modalités), amputée d'un droit réel au profit d'un tiers (démembrements), limitée par des droits personnels et des sûretés, et encadrée par des restrictions de droit public. Chaque branche modifie ce qui est transmis par une vente et, par conséquent, la valeur recherchée.}\label{fig:2:faisceau} | ||||
| 56 | +\figsource{schéma de l'auteur d'après le Code civil du Québec, texte à jour au 15 octobre 2026 \parencite{ccq}, et les lois citées (consultation du 31 octobre 2026).} | ||||
| 57 | +\end{figure} | ||||
| 58 | + | ||||
| 59 | +\begin{definition}{Droit évalué}{droit-evalue} | ||||
| 60 | +Le \motcle{droit évalué} est l'ensemble des prérogatives, réelles ou personnelles, dont la valeur est recherchée dans un mandat : pleine propriété libre de charges, pleine propriété grevée de baux (droit du locateur), droit du locataire, part indivise, fraction de copropriété divise, usufruit ou nue-propriété, droit de l'emphytéote ou du propriétaire du tréfonds. Le droit évalué se décrit par ce qu'il comprend, par les charges qui le grèvent et par la durée pendant laquelle il procure ses avantages. Les Normes de pratique professionnelle de l'OEAQ exigent que les démembrements et les restrictions au droit de propriété soient identifiés dans la substance de toute évaluation et que les droits évalués soient énoncés dans tout rapport écrit \parencite[règle~1.2, éléments~8 et 9 ; règle~2.3, élément~2]{oeaqNormes}. | ||||
| 61 | +\end{definition} | ||||
| 62 | + | ||||
| 63 | +La formalisation du \cref{ch:1}, qui définit la valeur marchande comme l'espérance du prix conditionnellement aux caractéristiques du bien et à la date, doit donc être complétée. Si l'on note $d$ le droit évalué et $b$ la base de valeur retenue, la valeur recherchée s'écrit | ||||
| 64 | +\begin{equation}\label{eq:2:droit} | ||||
| 65 | +V^{(d,b)} = \E\!\left[P \mid \mathbf{x},\ t,\ d,\ b\right], | ||||
| 66 | +\end{equation} | ||||
| 67 | +et deux évaluations du même immeuble à la même date ne sont comparables que si $d$ et $b$ coïncident. La plus grande part des malentendus entre un propriétaire, son prêteur et sa municipalité vient de ce que chacun raisonne sur un couple $(d, b)$ différent sans le dire. | ||||
| 68 | + | ||||
| 69 | +\subsection{Les modalités de la propriété} | ||||
| 70 | + | ||||
| 71 | +La \motcle{copropriété} est la propriété de plusieurs personnes sur un même bien ; elle est indivise lorsque le droit de chacun porte sur l'ensemble sans division matérielle, divise lorsque le droit de chacun porte sur une fraction composée d'une partie privative et d'une quote-part des parties communes \parencite[art.~1010]{ccq}. L'indivision conventionnelle sur un immeuble doit être publiée pour être opposable aux tiers \parencite[art.~1014]{ccq} ; les parts sont présumées égales et chaque indivisaire a sur sa part les droits d'un propriétaire exclusif, qu'il peut aliéner ou hypothéquer \parencite[art.~1015]{ccq}, et il contribue aux charges à proportion de sa part \parencite[art.~1019]{ccq}. Pour l'évaluateur, une part indivise est un bien distinct de la fraction d'un immeuble entier : elle se négocie sur un marché plus étroit, l'acheteur ne peut ni hypothéquer l'immeuble entier ni l'occuper sans l'accord des autres indivisaires, et la convention d'indivision peut contenir des droits de préemption ou d'usage exclusif qui en modifient la valeur. Il est d'usage d'observer une décote par rapport à la quote-part arithmétique de la valeur de l'immeuble ; sa mesure relève du \cref{ch:7}. | ||||
| 72 | + | ||||
| 73 | +La copropriété divise est établie par la publication d'une déclaration \parencite[art.~1038]{ccq}. La valeur relative de chaque fraction, qui détermine la quote-part des parties communes et la contribution aux charges, est établie « en fonction de la nature, de la destination, des dimensions et de la situation de la partie privative de chaque fraction, mais sans tenir compte de son utilisation » \parencite[art.~1041]{ccq}. Cette valeur relative n'est pas une valeur marchande : elle est fixée au moment de la déclaration, selon une méthode que l'acte constitutif doit indiquer, et elle ne suit pas le marché. L'évaluateur qui évalue une fraction évalue donc un droit composé, et il tient compte de l'état financier du syndicat, du fonds de prévoyance et des charges (\cref{ch:7,ch:42}). La copropriété divise peut aussi être établie sur un droit d'emphytéose ou de propriété superficiaire, à condition que la durée non écoulée de ce droit soit d'au moins cinquante ans \parencite[art.~1040]{ccq} ; dans ce cas la fraction a une durée de vie finie, ce qui modifie profondément son évaluation. | ||||
| 74 | + | ||||
| 75 | +\subsection{Les démembrements} | ||||
| 76 | + | ||||
| 77 | +L'usufruit, l'usage, la servitude et l'emphytéose sont les démembrements du droit de propriété nommés par le Code \parencite[art.~1119]{ccq}. Le \cref{tab:2:demembrements} en résume les caractères pertinents pour l'évaluation. L'\motcle{usufruit} est le droit d'user et de jouir, pendant un certain temps, d'un bien dont un autre a la propriété, à charge d'en conserver la substance ; sa durée ne peut excéder cent ans, et un usufruit sans terme est viager, ou de trente ans s'il est constitué en faveur d'une personne morale \parencite[art.~1120 et 1123]{ccq}. L'\motcle{usage} est le droit de se servir temporairement du bien d'autrui et d'en percevoir les fruits et revenus jusqu'à concurrence des besoins de l'usager et des personnes qui habitent avec lui \parencite[art.~1172]{ccq}. La \motcle{servitude} est une charge imposée sur un immeuble, le fonds servant, en faveur d'un autre immeuble, le fonds dominant, appartenant à un propriétaire différent ; elle s'établit par contrat, par testament, par destination du propriétaire ou par l'effet de la loi, et jamais par la seule possession \parencite[art.~1177 et 1181]{ccq}. L'\motcle{emphytéose} permet à une personne d'utiliser pleinement un immeuble appartenant à autrui pendant un certain temps, à charge d'y faire des constructions, ouvrages ou plantations qui en augmentent la valeur de façon durable ; sa durée est de dix à cent ans et elle prend fin, notamment, par l'arrivée du terme \parencite[art.~1195, 1197 et 1208]{ccq}. | ||||
| 78 | + | ||||
| 79 | +\begin{table}[htbp] | ||||
| 80 | +\caption{Modalités et démembrements du droit de propriété : caractères utiles à l'évaluation}\label{tab:2:demembrements} | ||||
| 81 | +\centering | ||||
| 82 | +\small | ||||
| 83 | +\begin{tabularx}{\textwidth}{lYYY} | ||||
| 84 | +\toprule | ||||
| 85 | +Droit & Fondement (C.c.Q.) & Durée & Ce que l'évaluateur mesure \\ | ||||
| 86 | +\midrule | ||||
| 87 | +Pleine propriété & art.~947 ; 948, 951, 955 & perpétuelle & référence ; valeur de l'ensemble du faisceau \\ | ||||
| 88 | +Part indivise & art.~1010, 1014, 1015, 1019 & perpétuelle & quote-part de la valeur, corrigée d'une décote d'indivision ; effet de la convention publiée \\ | ||||
| 89 | +Fraction divise & art.~1038 et s., 1041, 1064 & perpétuelle (finie si établie sur emphytéose ou superficie, art.~1040) & valeur de la partie privative et de la quote-part des communs ; charges et fonds de prévoyance \\ | ||||
| 90 | +Usufruit / nue-propriété & art.~1120, 1123 & $\leq 100$ ans ; viager si sans terme ; 30 ans pour une personne morale & valeur actualisée des revenus pendant la durée (usufruit) ; valeur actualisée de la réversion (nue-propriété) \\ | ||||
| 91 | +Usage & art.~1172 & temporaire, souvent viager & décote de la pleine propriété occupée ; revenus limités aux besoins de l'usager \\ | ||||
| 92 | +Servitude & art.~1177, 1181 & perpétuelle sauf stipulation & perte de valeur du fonds servant, gain du fonds dominant ; mesure par ventes appariées (\cref{ch:7}) \\ | ||||
| 93 | +Emphytéose & art.~1195, 1197, 1208 & 10 à 100 ans & droit de l'emphytéote sur la durée restante ; droit du propriétaire : rente et réversion des constructions \\ | ||||
| 94 | +\bottomrule | ||||
| 95 | +\end{tabularx} | ||||
| 96 | +\tabsource{synthèse de l'auteur d'après le Code civil du Québec, texte à jour au 15 octobre 2026 \parencite{ccq} ; dispositions relevées dans \texttt{sources/normes-A.csv}.} | ||||
| 97 | +\end{table} | ||||
| 98 | + | ||||
| 99 | +Ce que ces démembrements ont en commun, du point de vue de l'évaluation, est qu'ils découpent la propriété \emph{dans le temps} ou \emph{dans l'usage}. L'usufruit et l'emphytéose attribuent à un titulaire les avantages du bien pendant une durée déterminée et laissent au propriétaire une réversion à l'échéance ; la servitude et le droit d'usage retranchent à la propriété une utilité particulière. Cette observation est le fil conducteur de la \cref{sec:2:droits} : tout droit temporaire se mesure par l'actualisation des avantages qu'il procure pendant sa durée, et la réversion par l'actualisation de la valeur qui revient à l'échéance. | ||||
| 100 | + | ||||
| 101 | +\subsection{Les droits personnels, les sûretés et les restrictions publiques} | ||||
| 102 | + | ||||
| 103 | +Le \motcle{bail} est le contrat par lequel le locateur s'engage à procurer au locataire, moyennant un loyer, la jouissance d'un bien pendant un certain temps \parencite[art.~1851]{ccq}. Il confère un droit personnel, non un droit réel, mais son effet sur la valeur est aussi concret que celui d'un démembrement : il détermine les revenus que le propriétaire percevra et la durée pendant laquelle il ne pourra ni occuper le bien ni en modifier les conditions d'occupation. Pour un logement, le Code ajoute un droit au maintien dans les lieux \parencite[art.~1936]{ccq}, et l'aliénation volontaire ou forcée de l'immeuble « ne permet pas au nouveau locateur de résilier le bail », qui est continué et peut être reconduit \parencite[art.~1937]{ccq}. L'acquéreur d'un immeuble locatif achète donc les baux en cours : ce sont les loyers en place, non les loyers de marché, qui forment la base de son revenu immédiat, et c'est ce qui distingue le droit du locateur de la pleine propriété libre de baux. | ||||
| 104 | + | ||||
| 105 | +L'hypothèque est un droit réel accessoire qui grève l'immeuble en garantie d'une obligation \parencite[art.~2660]{ccq} ; elle doit, pour un immeuble, être constituée par acte notarié en minute à peine de nullité absolue \parencite[art.~2693]{ccq}, et l'hypothèque des loyers est immobilière et publiée au registre foncier \parencite[art.~2695]{ccq}. L'hypothèque ne réduit pas la valeur de l'immeuble : elle réduit l'avoir net du propriétaire, et l'évaluateur qui évalue la pleine propriété l'évalue libre d'hypothèque, le financement étant traité séparément (\cref{ch:31}). Elle doit néanmoins être connue, parce que la vente d'un immeuble hypothéqué suppose la quittance, et parce qu'un préavis d'exercice d'un droit hypothécaire inscrit au registre signale une vente possiblement forcée (\cref{ch:16}). Tous ces droits sont opposables aux tiers par leur inscription au registre foncier \parencite[art.~2934 et 2941]{ccq}, et un droit inscrit « est présumé connu de celui qui acquiert ou publie un droit sur le même bien » \parencite[art.~2943]{ccq} : l'évaluateur ne peut invoquer son ignorance d'une servitude ou d'une hypothèque publiée, et la consultation de l'index aux immeubles fait partie de la vérification des titres (\cref{ch:6,ch:7}). | ||||
| 106 | + | ||||
| 107 | +Les restrictions de droit public, enfin, n'apparaissent dans aucun titre mais déterminent ce que le propriétaire peut faire de son bien : règlements de zonage et de lotissement adoptés sous la Loi sur l'aménagement et l'urbanisme \parencite{lau}, interdiction d'utiliser un lot de la zone agricole à une fin autre que l'agriculture sans autorisation \parencite[art.~26]{lptaa}, restrictions liées aux terrains contaminés et aux zones inondables \parencite{lqe,zonesInond2026}. L'état juridique de l'immeuble, que la Loi sur la fiscalité municipale inclut expressément dans l'état de l'unité d'évaluation \parencite[art.~46, al.~3]{lfm}, fait donc partie du droit évalué, même si aucun acte ne le constate. La fiscalité des transferts s'y ajoute : aux fins des droits sur les mutations immobilières, la notion de « transfert » comprend l'établissement d'une emphytéose et le bail dont la durée, prolongations comprises, excède quarante ans \parencite[art.~1]{ldmi}, ce qui rappelle que le législateur lui-même assimile à une mutation la cession d'un droit temporaire assez long. | ||||
| 108 | + | ||||
| 109 | +\section{Le droit évalué : pleine propriété, droit du locateur, droit du locataire}\label{sec:2:droits} | ||||
| 110 | + | ||||
| 111 | +\subsection{L'additivité des droits} | ||||
| 112 | + | ||||
| 113 | +Considérons un immeuble locatif dont les loyers contractuels, pour la période à venir, sont inférieurs aux loyers que le marché accorderait aujourd'hui à des logements équivalents. Trois droits coexistent. La \motcle{pleine propriété libre de baux} est le droit d'un propriétaire qui pourrait louer chaque logement au loyer de marché dès demain ; en anglais, la tradition l'appelle \emph{fee simple}. Le \terme{droit du locateur}{leased fee} est le droit du propriétaire tel qu'il est : il perçoit les loyers contractuels tant que les baux courent, puis retrouve la disposition du bien ou la faculté de relouer au marché à leur échéance. Le \terme{droit du locataire}{leasehold} est l'avantage que procure au locataire un loyer inférieur au marché pendant la durée de son occupation ; il peut avoir une valeur positive, lorsque le loyer est en deçà du marché, nulle, ou négative dans le cas inverse. | ||||
| 114 | + | ||||
| 115 | +\begin{proposition}{Additivité des droits sur un immeuble locatif}{additivite} | ||||
| 116 | +Si le locateur et les locataires actualisent leurs flux au même taux $r$, si les loyers de marché $L^m_t$ sont ceux qu'un propriétaire libre de baux obtiendrait à chaque période et si la réversion à l'échéance des baux est la même pour le propriétaire libre de baux et pour le locateur, alors la valeur de la pleine propriété libre de baux est la somme de la valeur du droit du locateur et des valeurs des droits des locataires : | ||||
| 117 | +\begin{equation}\label{eq:2:additivite} | ||||
| 118 | +V_{\text{pleine}} = V_{\text{locateur}} + \sum_{j} V_{\text{locataire},\,j} . | ||||
| 119 | +\end{equation} | ||||
| 120 | +\end{proposition} | ||||
| 121 | +\begin{proof} | ||||
| 122 | +La pleine propriété libre de baux donne droit, à chaque période $t = 1, \dots, T$, au revenu net que procurent les loyers de marché, puis à la réversion $V_T$ ; sa valeur est $V_{\text{pleine}} = \sum_{t=1}^{T} N(L^m_t)\,(1+r)^{-t} + V_T\,(1+r)^{-T}$, où $N(\cdot)$ désigne le revenu net correspondant à un niveau de loyers. Le droit du locateur donne droit au revenu net des loyers contractuels $L^c_t$ et à la même réversion : $V_{\text{locateur}} = \sum_{t=1}^{T} N(L^c_t)\,(1+r)^{-t} + V_T\,(1+r)^{-T}$. Le droit du locataire $j$ est l'avantage $L^m_{jt} - L^c_{jt}$ pendant son occupation. Si le revenu net est additif dans les loyers, ce qui est le cas lorsque les dépenses ne dépendent pas du niveau des loyers, la différence $V_{\text{pleine}} - V_{\text{locateur}} = \sum_t \sum_j (L^m_{jt} - L^c_{jt})(1+r)^{-t}$ est exactement la somme des droits des locataires, et la réversion s'élimine. | ||||
| 123 | +\end{proof} | ||||
| 124 | + | ||||
| 125 | +Les hypothèses de la proposition méritent d'être lues avec attention, parce que c'est leur violation qui explique les écarts observés en pratique. Le locataire d'un logement n'actualise pas au taux d'un investisseur, et il ne peut pas vendre son avantage : au Québec, le locataire qui cède son bail « ne peut exiger de contrepartie » \parencite[art.~1978.3]{ccq}, de sorte que la valeur du bail pour le locataire est une \emph{valeur d'usage} pour lui, non une valeur de marché. Les dépenses dépendent parfois du revenu, par exemple les honoraires de gestion imputés en pourcentage du revenu brut effectif, ce qui rend $N(\cdot)$ légèrement non additif. Et la réversion n'est identique que si l'on suppose qu'à l'échéance des baux le locateur retrouve effectivement le marché, ce que le régime du bail de logement, par la reconduction de plein droit et la fixation du loyer, rend progressif plutôt qu'instantané. L'additivité est donc un cadre de référence qui permet de nommer et de mesurer les écarts, non une identité comptable que l'on observerait dans les prix. | ||||
| 126 | + | ||||
| 127 | +\subsection{La valeur du droit du locateur et la valeur du bail} | ||||
| 128 | + | ||||
| 129 | +Le droit du locateur est la somme des loyers contractuels actualisés, nets des dépenses, et de la réversion actualisée : | ||||
| 130 | +\begin{equation}\label{eq:2:locateur} | ||||
| 131 | +V_{\text{locateur}} = \sum_{t=1}^{T} \frac{N(L^c_t)}{(1+r)^t} + \frac{V_T}{(1+r)^T}, | ||||
| 132 | +\end{equation} | ||||
| 133 | +où $T$ est l'horizon au-delà duquel les baux en place ne contraignent plus les revenus et $V_T$ la valeur de l'immeuble à cette date, généralement obtenue en capitalisant le revenu net de l'année $T+1$ (\cref{ch:30}). C'est la structure même du modèle des flux actualisés ; la seule particularité tient à ce que les flux des premières années sont dictés par les baux. Le droit du locataire $j$ se mesure, lui, par l'écart de loyer actualisé pendant la durée $n_j$ de son occupation prévisible : | ||||
| 134 | +\begin{equation}\label{eq:2:locataire} | ||||
| 135 | +V_{\text{locataire},\,j} = \sum_{t=1}^{n_j} \frac{L^m_{jt} - L^c_{jt}}{(1+r)^t} . | ||||
| 136 | +\end{equation} | ||||
| 137 | +Lorsque l'écart est constant, $\Delta_j = L^m_j - L^c_j$ par an, la somme se réduit à l'annuité | ||||
| 138 | +\begin{equation}\label{eq:2:annuite} | ||||
| 139 | +V_{\text{locataire},\,j} = \Delta_j\,\frac{1 - (1+r)^{-n_j}}{r}, | ||||
| 140 | +\end{equation} | ||||
| 141 | +qui croît avec la durée d'occupation et tend vers $\Delta_j / r$ si celle-ci devenait perpétuelle. La durée $n_j$ est la variable décisive. Pour un bail commercial, elle est la durée résiduelle du bail, options comprises si elles sont dans la monnaie. Pour un bail de logement au Québec, elle n'est pas la durée du bail, qui est généralement d'un an : elle est la durée pendant laquelle le locataire exercera son droit au maintien dans les lieux, puisque le bail est reconduit de plein droit \parencite[art.~1941]{ccq} et que le loyer, en cas de désaccord, est fixé par le Tribunal administratif du logement selon des normes réglementaires qui ne font aucune place à la valeur locative de marché \parencite[art.~1952 et 1953]{ccq}. Le Tribunal lui-même l'énonce dans ses résumés de décisions : « La valeur marchande locative n'est pas un critère » de fixation \parencite{talResumesDecisions}. Le \cref{ch:26} détaille ce régime et le \cref{ch:34} ses conséquences sur les trajectoires de loyers. | ||||
| 142 | + | ||||
| 143 | +\subsection{Un même schéma : droit temporaire et réversion} | ||||
| 144 | + | ||||
| 145 | +L'\cref{eq:2:locateur} n'est qu'un cas particulier d'un schéma général qui s'applique à tout droit temporaire. Si un droit procure un revenu net $R_t$ pendant $n$ périodes et qu'à l'échéance la pleine propriété, d'une valeur $V_n$, revient à un autre titulaire, alors | ||||
| 146 | +\begin{equation}\label{eq:2:temporaire} | ||||
| 147 | +V_{\text{droit temporaire}} = \sum_{t=1}^{n} \frac{R_t}{(1+r)^t}, \qquad V_{\text{réversion}} = \frac{V_n}{(1+r)^n}, \qquad V_{\text{pleine}} = V_{\text{droit temporaire}} + V_{\text{réversion}} . | ||||
| 148 | +\end{equation} | ||||
| 149 | +L'usufruit et la nue-propriété se partagent la pleine propriété selon cette formule, la durée $n$ étant le terme de l'usufruit ou, pour un usufruit viager, l'espérance de vie de l'usufruitier ; l'emphytéote et le propriétaire du tréfonds de même, le second recevant en outre la rente emphytéotique ; le locateur et le locataire d'un bail commercial à long terme également. Lorsque le revenu net croît à un taux constant $g$ et que la valeur de réversion est elle-même la capitalisation du revenu suivant au taux $r - g$, la somme des deux termes redonne exactement $R_1 / (r - g)$, ce qui est l'identité de Gordon que le \cref{ch:30} démontre ; l'\cref{ex:2:4} le vérifie numériquement. L'intérêt pratique de cette identité est de fournir un test de cohérence : si la somme des droits partiels, évalués séparément, s'écarte sensiblement de la valeur de la pleine propriété, c'est que les hypothèses de taux, de durée ou de réversion ne sont pas cohérentes d'un droit à l'autre. | ||||
| 150 | + | ||||
| 151 | +\subsection{La durée des baux de logement : rotation et convergence vers le marché} | ||||
| 152 | + | ||||
| 153 | +Dans un immeuble de logements, la durée $n_j$ de chaque occupation est inconnue. On la modélise. Si une fraction $\rho$ des logements se libère chaque année et que chaque logement libéré est reloué au loyer de marché, la probabilité qu'un locataire en place le soit encore après $t$ années est $(1-\rho)^t$, et le loyer espéré d'un logement à la date $t$ est un mélange du loyer contractuel indexé et du loyer de marché : | ||||
| 154 | +\begin{equation}\label{eq:2:rotation-esperance} | ||||
| 155 | +\E[L_t] = (1-\rho)^{t}\,L^c_0\,(1+g_c)^{t} + \left[1 - (1-\rho)^{t}\right] L^m_0\,(1+g_m)^{t}, | ||||
| 156 | +\end{equation} | ||||
| 157 | +où $g_c$ est le taux d'indexation des loyers en place, que le régime québécois de fixation borne de fait, et $g_m$ le taux de croissance des loyers de marché. Si l'on suppose pour simplifier que l'écart croît au taux $g$ et que le premier écart, net de l'inoccupation, vaut $\Delta_1$, la valeur actuelle de l'ensemble des écarts futurs vaut, à horizon infini, | ||||
| 158 | +\begin{equation}\label{eq:2:rotation-va} | ||||
| 159 | +\sum_{t=1}^{\infty} \frac{\Delta_1\,[(1-\rho)(1+g)]^{\,t-1}}{(1+r)^{t}} = \frac{\Delta_1}{r - g + \rho\,(1+g)}, \qquad (1-\rho)(1+g) < 1 + r . | ||||
| 160 | +\end{equation} | ||||
| 161 | +La démonstration est celle d'une série géométrique de raison $q = (1-\rho)(1+g)/(1+r)$ : la somme vaut $\Delta_1 /[(1+r)(1-q)]$, et le dénominateur se simplifie en $r - g + \rho(1+g)$. Le résultat se lit comme une capitalisation à un taux augmenté de la rotation : sans rotation ($\rho = 0$), l'écart est capitalisé au taux $r - g$ comme s'il était perpétuel ; avec une rotation de 15 \% par an, le dénominateur est plus que quintuplé pour les paramètres du cas 3, et la valeur de l'écart est divisée d'autant. Ce que cette formule enseigne est que la décote d'un immeuble pour loyers inférieurs au marché dépend bien moins du niveau de l'écart que de sa \emph{durée}, c'est-à-dire de la rotation attendue des locataires. L'\cref{sec:2:exemple} compare cette formule fermée à la projection logement par logement du module partagé du cas 3, et la \cref{sec:2:sensibilite} fait varier $\rho$. | ||||
| 162 | + | ||||
| 163 | +\begin{quebec}[Le droit du locateur au rôle d'évaluation foncière] | ||||
| 164 | +La Loi sur la fiscalité municipale tranche la question du droit évalué pour le rôle d'une manière qui surprend souvent les propriétaires d'immeubles locatifs. Aux fins de l'établissement de la valeur réelle, « le vendeur est réputé détenir tous les droits du locataire », sauf pour les logements à loyer modique, les logements abordables faisant l'objet d'une convention avec la Société d'habitation du Québec, une municipalité ou la Société canadienne d'hypothèques et de logement, et les logements inscrits au nom d'un office d'habitation \parencite[art.~45.1, mod.\ 2025, c.~33]{lfm}. Autrement dit, la valeur réelle au rôle d'un immeuble locatif ordinaire est celle de la pleine propriété libre de baux, alors que la valeur marchande que l'évaluateur estime pour une vente ou un prêt est celle du droit du locateur. Pour un immeuble dont les loyers sont très inférieurs au marché, la valeur au rôle peut donc excéder légitimement le prix auquel l'immeuble se vendrait, sans qu'il y ait erreur du côté municipal ni du côté de l'évaluateur privé ; les deux mesurent des droits différents. Le \cref{ch:9} en tire les conséquences pour la contestation et l'exemple de la \cref{sec:2:exemple} en donne la mesure sur le cas 3. Texte consulté le 31 octobre 2026, à jour au 15 octobre 2026. | ||||
| 165 | +\end{quebec} | ||||
| 166 | + | ||||
| 167 | +\section{Les bases de valeur}\label{sec:2:bases} | ||||
| 168 | + | ||||
| 169 | +Une \motcle{base de valeur} est l'énoncé des hypothèses fondamentales sous lesquelles une valeur est estimée : qui sont les parties présumées, dans quelles conditions elles négocient, avec quelle information, dans quel délai, et à quelle date. Les Normes internationales d'évaluation consacrent à cette notion la norme IVS 102, dont l'annexe définit les bases reconnues \parencite[IVS~102, annexe]{ivs2025}. Le choix de la base précède toute méthode : la méthode de comparaison, la méthode du coût et la méthode du revenu sont des moyens d'estimer une valeur dont la base a été fixée d'avance, et une même méthode conduit à des résultats différents selon la base, parce que les intrants admissibles ne sont pas les mêmes. | ||||
| 170 | + | ||||
| 171 | +\subsection{La valeur marchande : quatre textes, une même idée} | ||||
| 172 | + | ||||
| 173 | +Le \cref{tab:2:definitions} met en regard les quatre définitions que l'évaluateur québécois rencontre. Les Normes de pratique professionnelle de l'OEAQ définissent la valeur marchande comme « le prix sincère le plus probable, de la vente réelle ou présumée d'un immeuble, à une date donnée », sur « un marché libre et ouvert à la concurrence », et elles l'assortissent de quatre conditions : des parties bien informées de l'état de l'immeuble, des conditions du marché et de l'usage le plus probable ; une mise en vente d'une durée suffisante ; un paiement en argent comptant, en dollars canadiens, ou l'équivalent ; un prix épuré de l'incidence des mesures incitatives, des conditions et du financement avantageux \parencite[p.~Intro-11]{oeaqNormes}. Les IVS 2025 définissent la \emph{market value} comme le montant estimé auquel un actif ou un passif devrait s'échanger, à la date d'évaluation, entre un acheteur et un vendeur consentants, dans une transaction sans lien de dépendance, après une mise en marché appropriée, les parties ayant chacune agi en connaissance de cause, avec prudence et sans contrainte\footnote{Texte original : « Market value is the estimated amount for which an asset and/or liability should exchange on the valuation date between a willing buyer and a willing seller in an arm's-length transaction, after proper marketing and where the parties had each acted knowledgeably, prudently and without compulsion. » \parencite[IVS~102, annexe, A10.01]{ivs2025}. L'édition 2025 écrit « an asset and/or liability » là où l'édition de 2022 écrivait « an asset or liability » ; la numérotation IVS 104 pour les bases de valeur, souvent citée, est celle de l'édition de 2022.} \parencite[A10.01]{ivs2025}. Les CUSPAP 2026 de l'Institut canadien des évaluateurs parlent du « prix le plus probable, à une date déterminée, en argent comptant ou en termes équivalents à l'argent comptant, ou en d'autres termes précisément révélés », auquel les droits spécifiés devraient se vendre après une exposition raisonnable sur un marché concurrentiel\footnote{« The most probable price, as of a specified date, in cash, or in terms equivalent to cash, or in other precisely revealed terms, for which the specified property rights should sell after reasonable exposure in a competitive market… » \parencite[s.~3, Definitions]{cuspap2026}.} \parencite[s.~3]{cuspap2026}. La Loi sur la fiscalité municipale, enfin, définit la valeur réelle d'une unité d'évaluation comme « sa valeur d'échange sur un marché libre et ouvert à la concurrence, soit le prix le plus probable » d'une vente de gré à gré, entre parties qui n'y sont pas obligées et qui sont raisonnablement informées de l'état de l'unité, de l'utilisation qui peut le plus probablement en être faite et des conditions du marché \parencite[art.~43]{lfm}. | ||||
| 174 | + | ||||
| 175 | +\begin{table}[htbp] | ||||
| 176 | +\caption{Définitions comparées de la valeur marchande et de la valeur réelle (textes en vigueur au 31 octobre 2026)}\label{tab:2:definitions} | ||||
| 177 | +\centering | ||||
| 178 | +\footnotesize | ||||
| 179 | +\begin{tabularx}{\textwidth}{lYYYY} | ||||
| 180 | +\toprule | ||||
| 181 | +Élément & OEAQ, NPP (en vigueur depuis le 1\textsuperscript{er} février 2024) & IVS 2025 (en vigueur le 31 janvier 2025), IVS~102 A10.01 & CUSPAP 2026 (en vigueur le 1\textsuperscript{er} avril 2026), s.~3 & LFM, art.~43 (à jour au 15 octobre 2026) \\ | ||||
| 182 | +\midrule | ||||
| 183 | +Grandeur estimée & prix sincère le plus probable & montant estimé (\emph{estimated amount}) & prix le plus probable & valeur d'échange, soit le prix le plus probable \\ | ||||
| 184 | +Objet & immeuble & actif ou passif & droits spécifiés (\emph{specified property rights}) & unité d'évaluation \\ | ||||
| 185 | +Date & « à une date donnée » & « on the valuation date » & « as of a specified date » & date de référence du rôle (art.~46) \\ | ||||
| 186 | +Marché & libre et ouvert à la concurrence & transaction sans lien de dépendance & marché concurrentiel & libre et ouvert à la concurrence ; vente de gré à gré \\ | ||||
| 187 | +Parties & bien informées de l'état, du marché et de l'usage le plus probable & consentantes, agissant en connaissance de cause, avec prudence et sans contrainte & implicites dans le marché concurrentiel ; acheteur et vendeur typiquement motivés dans les commentaires & non obligées ; raisonnablement informées de l'état, de l'utilisation la plus probable et du marché \\ | ||||
| 188 | +Exposition & mise en vente d'une durée suffisante & après une mise en marché appropriée & après une exposition raisonnable & implicite \\ | ||||
| 189 | +Paiement & comptant (dollars canadiens) ou équivalent & implicite dans « montant » & comptant, équivalent, ou autres termes précisément révélés & implicite ; incidence objective des avantages et désavantages (art.~45) \\ | ||||
| 190 | +Épuration & incitatifs, conditions et financement avantageux exclus & implicite dans « sans lien de dépendance » & termes révélés & — \\ | ||||
| 191 | +\bottomrule | ||||
| 192 | +\end{tabularx} | ||||
| 193 | +\tabsource{paraphrases de l'auteur d'après \textcite{oeaqNormes}, \textcite{ivs2025}, \textcite{cuspap2026} et \textcite{lfm}, consultés le 31 octobre 2026 ; les textes ne sont pas reproduits in extenso.} | ||||
| 194 | +\end{table} | ||||
| 195 | + | ||||
| 196 | +Les quatre textes convergent sur l'essentiel. Tous décrivent une transaction \emph{hypothétique} à une date donnée, entre des parties informées et non contraintes, après une exposition normale au marché, et tous désignent la grandeur recherchée comme la plus probable, non comme la plus élevée ni comme celle qu'un acheteur particulier paierait. Le \cref{ch:1} a montré que cette « probabilité la plus grande » se formalise comme l'espérance du prix conditionnellement aux caractéristiques du bien et à la date, et le \cref{ch:16} en déduit les critères de sélection des ventes comparables. Trois différences méritent cependant attention. La première tient à l'objet : les CUSPAP évaluent des « droits spécifiés », les IVS un « actif », l'OEAQ un « immeuble » et la LFM une « unité d'évaluation » ; seule la formulation canadienne rend explicite, dans la définition même, que le droit évalué doit être nommé, ce que les NPP exigent ailleurs, dans le contenu du rapport. La deuxième tient au paiement : l'OEAQ et les CUSPAP imposent un prix comptant ou équivalent et l'épuration des conditions de financement, ce qui fonde l'ajustement de financement de la méthode de comparaison (\cref{ch:17}) ; les IVS l'absorbent dans la notion de transaction sans lien de dépendance. La troisième tient à la date et à la fiscalité : la LFM fixe la date par la loi et non par le mandat, et elle ajoute, à l'article 45, que l'on tient compte de l'incidence des avantages ou désavantages de l'unité « en les considérant de façon objective », ce qui exclut les circonstances propres au propriétaire actuel \parencite[art.~45]{lfm}. | ||||
| 197 | + | ||||
| 198 | +\begin{pratique} | ||||
| 199 | +Le rapport d'évaluation reproduit la définition de la valeur qu'il applique, avec sa source et sa date : c'est le quatrième des douze éléments que tout rapport écrit doit contenir selon les NPP \parencite[règle~2.3, élément~4]{oeaqNormes}. Lorsque le mandat est régi par les CUSPAP, par exemple pour un prêteur fédéral, ou lorsque le client est une entité qui publie des états financiers selon les IFRS, l'évaluateur précise laquelle des définitions il retient et, si les définitions diffèrent sur un point qui compte pour le bien évalué, il le signale. Au Québec, pour un mandat ordinaire de valeur marchande, la définition des NPP s'impose au membre de l'Ordre. | ||||
| 200 | +\end{pratique} | ||||
| 201 | + | ||||
| 202 | +\subsection{La valeur réelle aux fins du rôle} | ||||
| 203 | + | ||||
| 204 | +La valeur réelle des articles 42 à 46 de la Loi sur la fiscalité municipale est une base de valeur à part entière, proche de la valeur marchande par son texte, distincte par trois traits que le \cref{ch:9} détaille et qu'il faut nommer ici. Le premier est la date : la valeur est établie en fonction de l'état de l'unité et des conditions du marché « tels qu'ils existent le 1\textsuperscript{er} juillet du deuxième exercice financier qui précède le premier de ceux pour lesquels le rôle est fait » \parencite[art.~46, al.~1]{lfm}, soit le 1\textsuperscript{er} juillet 2024 pour le rôle 2026-2028 de Montréal et le 1\textsuperscript{er} juillet 2025 pour le rôle 2027-2029 de Gatineau. Le deuxième est le droit évalué : la pleine propriété libre de baux, sauf exceptions, par l'effet de l'article 45.1 rappelé plus haut. Le troisième est la proportionnalité : les valeurs inscrites au rôle « doivent, dans l'ensemble, tendre à représenter une même proportion des valeurs réelles » \parencite[art.~42, al.~2]{lfm}, et l'évaluateur municipal mesure cette proportion médiane et son inverse, le facteur comparatif \parencite[art.~264]{lfm}. Il en résulte qu'une valeur au rôle ne se compare à une valeur marchande qu'après deux corrections, celle de la proportion et celle de la date : | ||||
| 205 | +\begin{equation}\label{eq:2:facteur} | ||||
| 206 | +V^{\text{unif.}}_{\text{rôle}}(t_{\text{réf}}) = F \times V_{\text{rôle}}, \qquad F = \frac{1}{\text{proportion médiane}}, | ||||
| 207 | +\end{equation} | ||||
| 208 | +la valeur uniformisée ainsi obtenue étant une estimation de la valeur réelle à la date de référence, non à la date d'évaluation. Lorsque l'immeuble ne peut faire l'objet d'une vente de gré à gré, la loi substitue au prix le plus probable celui qu'une personne « serait justifiée de payer et d'exiger si elle était à la fois l'acheteur et le vendeur » \parencite[art.~44]{lfm}, ce qui est une définition de valeur d'usage objectivée et non de valeur d'échange. | ||||
| 209 | + | ||||
| 210 | +\subsection{Les autres bases de valeur} | ||||
| 211 | + | ||||
| 212 | +Le \cref{tab:2:bases} présente les bases que l'évaluateur résidentiel et multirésidentiel rencontre, avec leur fondement et la méthode qui leur convient. La \motcle{valeur d'investissement} est, selon les IVS, la valeur d'un actif pour un propriétaire ou un propriétaire éventuel donné, en fonction de ses objectifs propres d'investissement ou d'exploitation ; c'est une base propre à l'entité \parencite[A40.01--A40.02]{ivs2025}. Elle se calcule par le même modèle de flux actualisés que la valeur marchande, mais avec les flux, le taux d'actualisation, la fiscalité et l'horizon de cet investisseur particulier : | ||||
| 213 | +\begin{equation}\label{eq:2:investissement} | ||||
| 214 | +V_{\text{inv}} = \sum_{t=1}^{T} \frac{CF^{\,i}_t}{(1+r_i)^t} + \frac{V^{\,i}_T}{(1+r_i)^T}, \qquad V_{\text{inv}} - V_{\text{marché}} = \text{prime ou décote propre à l'investisseur}, | ||||
| 215 | +\end{equation} | ||||
| 216 | +et la différence entre les deux est la raison même pour laquelle une transaction a lieu : l'acheteur achète parce que sa valeur d'investissement excède le prix, le vendeur vend parce que la sienne lui est inférieure. \textcite{geltnerMillerClaytonEichholtz2014} et \textcite{baumCrosbyDevaney2021} développent cette distinction, qui est au cœur du \cref{ch:30}. La \motcle{valeur équitable} est le prix estimé pour le transfert d'un actif entre des parties identifiées, informées et consentantes, qui reflète les intérêts respectifs de ces parties \parencite[A30.01]{ivs2025} ; elle sert, par exemple, au rachat d'une part indivise entre coïndivisaires ou au partage d'un patrimoine, lorsque la transaction n'est pas ouverte au marché. La \motcle{valeur synergique} résulte de la combinaison de deux actifs ou droits dont la valeur réunie excède la somme des valeurs séparées \parencite[A50.01]{ivs2025} ; l'assemblage de terrains en vue d'un redéveloppement (\cref{ch:41}) et la réunion de l'usufruit et de la nue-propriété en sont des exemples. La \motcle{valeur de liquidation} est le montant qui serait réalisé lors d'une vente de liquidation, le vendeur étant contraint de vendre à une date donnée, selon l'une de deux prémisses, la transaction ordonnée avec un délai de commercialisation typique ou la transaction forcée avec un délai raccourci \parencite[A60.01]{ivs2025} ; c'est la base pertinente pour une reprise hypothécaire ou une vente sous contrôle de justice, et c'est pourquoi ces ventes sont exclues ou ajustées comme comparables de valeur marchande (\cref{ch:16}). La \motcle{juste valeur} au sens de l'IFRS 13 est le prix qui serait reçu pour la vente d'un actif lors d'une transaction normale entre des intervenants du marché à la date d'évaluation, telle que les IVS la rapportent \parencite[A70.01]{ivs2025} ; elle est très proche de la valeur marchande mais relève de la comptabilité, et c'est elle que les sociétés immobilières appliquent à leurs immeubles de placement. | ||||
| 217 | + | ||||
| 218 | +\begin{table}[htbp] | ||||
| 219 | +\caption{Bases de valeur rencontrées en évaluation résidentielle et multirésidentielle au Québec}\label{tab:2:bases} | ||||
| 220 | +\centering | ||||
| 221 | +\footnotesize | ||||
| 222 | +\begin{tabularx}{\textwidth}{lYYY} | ||||
| 223 | +\toprule | ||||
| 224 | +Base & Fondement (source, date de consultation 2026-10-31) & Emploi typique & Méthode et intrants \\ | ||||
| 225 | +\midrule | ||||
| 226 | +Valeur marchande & NPP OEAQ, Intro-11 ; IVS~102 A10 ; CUSPAP 2026 s.~3 & vente, financement hypothécaire, litige, expropriation (règles propres) & trois méthodes ; intrants de marché ; droit du locateur pour un immeuble loué \\ | ||||
| 227 | +Valeur réelle (rôle) & LFM art.~42--46, 45.1 & rôle d'évaluation foncière, taxation & évaluation de masse ; date de référence légale ; libre de baux sauf exceptions \\ | ||||
| 228 | +Loyer de marché & IVS~102 A20 & méthode du revenu, bail commercial, état locatif & loyers de logements comparables, conditions de bail appropriées \\ | ||||
| 229 | +Valeur d'investissement & IVS~102 A40 & décision d'achat ou de conservation d'un investisseur & flux actualisés avec les paramètres de l'investisseur \\ | ||||
| 230 | +Valeur équitable & IVS~102 A30 & rachat entre indivisaires, partage, transfert intrafamilial & négociation hypothétique entre parties identifiées \\ | ||||
| 231 | +Valeur synergique & IVS~102 A50 & assemblage de terrains, réunion de droits démembrés & valeur de l'ensemble moins somme des parties \\ | ||||
| 232 | +Valeur de liquidation & IVS~102 A60 (prémisses ordonnée / forcée) & reprise hypothécaire, faillite, vente sous contrôle de justice & valeur marchande corrigée du délai de commercialisation réduit \\ | ||||
| 233 | +Juste valeur (IFRS~13) & IVS~102 A70 & états financiers des sociétés immobilières & proche de la valeur marchande ; hiérarchie des intrants comptables \\ | ||||
| 234 | +Valeur assurable (coût de reconstruction) & C.c.Q. art.~1073 ; CCQ, r.~4.1, art.~3 ; NPP, normes 13 et 14 & assurance des copropriétés divises, polices immobilières, fonds de prévoyance (art.~1791) & méthode du coût ; bâtiment seul, sans terrain ni dépréciation économique \\ | ||||
| 235 | +Valeur d'usage & \textcite{aiDictionary2022} ; LFM art.~44 (sans vente possible) & propriétaire-occupant, immeuble à vocation unique & flux ou coût pour l'usage actuel ; non transférable \\ | ||||
| 236 | +\bottomrule | ||||
| 237 | +\end{tabularx} | ||||
| 238 | +\tabsource{synthèse de l'auteur d'après \textcite{oeaqNormes,ivs2025,cuspap2026,lfm,ccq,reglAssuranceCopropriete,aiDictionary2022}.} | ||||
| 239 | +\end{table} | ||||
| 240 | + | ||||
| 241 | +Deux bases de valeur d'origine québécoise complètent le tableau. La \motcle{valeur assurable} est le coût de reconstruction du bâtiment : le Code civil impose au syndicat d'une copropriété divise une assurance d'un montant permettant « la reconstruction de l'immeuble conformément aux normes, usages et règles de l'art », montant qui doit être évalué au moins tous les cinq ans par un membre d'un ordre professionnel désigné par règlement \parencite[art.~1073]{ccq}, et le règlement désigne à cette fin les seuls membres de l'Ordre des évaluateurs agréés du Québec \parencite[art.~3]{reglAssuranceCopropriete}. Les Normes de pratique professionnelle consacrent leurs normes 13 et 14 à l'évaluation aux fins d'assurance \parencite[table des matières]{oeaqNormes}. La valeur assurable exclut le terrain et, en principe, la dépréciation économique ; elle relève de la méthode du coût (\cref{ch:21}) et n'est jamais une indication de valeur marchande. La \motcle{valeur d'usage}, enfin, est la valeur qu'un bien a pour un usage déterminé ou pour un utilisateur particulier, indépendamment de son prix d'échange ; le \emph{Dictionary of Real Estate Appraisal} la définit par la valeur que procure un usage spécifique à un utilisateur spécifique \parencite{aiDictionary2022}. Elle apparaît en filigrane dans l'article 44 de la LFM et dans la valeur qu'un propriétaire-occupant attache à sa maison ; elle explique pourquoi un propriétaire refuse souvent une offre égale à la valeur marchande sans que l'un ou l'autre ait tort. | ||||
| 242 | + | ||||
| 243 | +\subsection{Base, prémisse et usage le meilleur et le plus profitable} | ||||
| 244 | + | ||||
| 245 | +Une base de valeur s'accompagne d'une \motcle{prémisse de valeur}, qui décrit les circonstances de la transaction présumée : utilisation actuelle, usage le meilleur et le plus profitable, liquidation ordonnée ou forcée. Les IVS définissent l'usage le meilleur et le plus profitable comme l'usage, du point de vue d'un participant au marché, qui produirait la valeur la plus élevée pour l'actif \parencite[A90.01]{ivs2025}, et les NPP en font le onzième élément de la substance de toute évaluation et le neuvième de tout rapport \parencite[règles~1.2 et 2.3]{oeaqNormes}. La Loi sur la fiscalité municipale en retient l'équivalent par l'« utilisation qui peut le plus probablement en être faite » \parencite[art.~43, par.~2\textdegree]{lfm}. Le \cref{ch:41} y consacre un développement complet ; ce qui importe ici est que la prémisse fait partie de la définition de ce que l'on évalue, au même titre que le droit et la base, et qu'elle doit être énoncée. | ||||
| 246 | + | ||||
| 247 | +\section{Prix, valeur et coût}\label{sec:2:prix} | ||||
| 248 | + | ||||
| 249 | +Le \motcle{prix} est un fait : la somme convenue entre un acheteur et un vendeur à l'occasion d'une transaction particulière, constatée dans un acte. La \motcle{valeur} est une opinion : l'estimation, à une date donnée et pour une base donnée, du prix le plus probable. Le \motcle{coût} est une dépense : ce qu'il faut débourser pour produire un bien, qu'il s'agisse de l'acquérir, de le construire ou de le reproduire. Le \cref{ch:1} a établi les fondements économiques de cette triple distinction ; le \cref{ch:16} montre comment les prix observés servent à estimer la valeur ; le \cref{ch:21} montre à quelles conditions le coût en est une indication. Il reste à souligner trois conséquences juridiques et pratiques. | ||||
| 250 | + | ||||
| 251 | +La première est que le prix inscrit à un acte de vente n'est pas nécessairement le prix de l'immeuble au sens du Code civil. Il peut comprendre des biens meubles, dont la contrepartie doit être retranchée ; il peut refléter des conditions de financement consenties par le vendeur, qui ne sont pas de l'argent comptant ; il peut résulter d'une vente entre personnes liées, d'une succession pressée ou d'une reprise hypothécaire, auquel cas il relève d'une autre base que la valeur marchande. La loi fiscale québécoise en tire elle-même les conséquences : la base d'imposition des droits sur les mutations immobilières est le plus élevé de la contrepartie fournie, de la contrepartie stipulée et de la valeur marchande de l'immeuble au moment de son transfert \parencite[art.~2]{ldmi}, ce qui revient à dire que le législateur ne présume pas que le prix convenu égale la valeur. | ||||
| 252 | + | ||||
| 253 | +La deuxième est que la valeur n'est jamais observée, même lorsqu'une vente du sujet vient d'avoir lieu. Un prix récent du sujet est la meilleure des informations, mais il reste la réalisation d'une transaction particulière dont l'écart à la valeur est inconnu ; les modèles du \cref{ch:16} en font une observation parmi d'autres, dotée d'un poids élevé. C'est pourquoi les définitions professionnelles parlent de prix « présumé » ou de montant « estimé », et pourquoi un rapport d'évaluation conclut par une opinion motivée, non par une constatation. | ||||
| 254 | + | ||||
| 255 | +La troisième est que le coût ne devient une valeur qu'à travers un marché. Le coût de construction d'un bâtiment neuf fixe un plafond au prix que paiera un acheteur rationnel, parce qu'il pourrait construire lui-même (\cref{ch:21}) ; mais la valeur d'un bâtiment existant dépend de ce que le marché est prêt à payer pour ses services, et les dépréciations du \cref{ch:24} mesurent précisément l'écart entre le coût et cette valeur. À l'inverse, des travaux de rénovation payés \dollars{100000} ne valent \dollars{100000} aux yeux du marché que si des acheteurs sont disposés à payer cette somme de plus pour en bénéficier, ce que la méthode des ventes appariées du \cref{ch:17} permet de vérifier. Les confusions entre prix, valeur et coût se retrouvent dans trois formulations à proscrire : « l'immeuble vaut ce qu'il s'est vendu », « la valeur au rôle est la valeur », « j'ai investi tant, donc il vaut au moins tant ». | ||||
| 256 | + | ||||
| 257 | +\section{Exemple intégral : le droit du locateur et la pleine propriété sur le cas 3}\label{sec:2:exemple} | ||||
| 258 | + | ||||
| 259 | +\begin{synthetique} | ||||
| 260 | +L'immeuble de douze logements du cas 3 est fictif. Son état locatif (\texttt{data/synthetic/cas3\_montreal\_etat\_locatif.csv}), son historique de dépenses, ses quarante ventes comparables et ses hypothèses de projection (\texttt{cas3\_montreal\_hypotheses\_dcf.json}) ont été générés par \texttt{analysis/python/traite/synth.py} (graine 20261031) selon les lois déclarées dans \texttt{data/synthetic/README.md} ; les loyers contractuels y sont tirés de la loi « loyer de marché $\times\ 0{,}98^{\text{ancienneté}}$ », et les loyers de marché sont calibrés sur les loyers moyens de la zone Rosemont publiés par la SCHL pour octobre 2025 \parencite{schlLocatif2025}. Tous les chiffres de cette section et de la suivante sont reproduits par \texttt{analysis/python/cases/ch02\_droits.py}, qui n'appelle que les fonctions du module partagé \texttt{traite.cas3} et de \texttt{traite.finance} ; les valeurs de base (revenu net \dollars{89956}, valeur par flux actualisés \dollars{2208566}) sont celles des \cref{ch:29,ch:30,ch:47}. | ||||
| 261 | +\end{synthetique} | ||||
| 262 | + | ||||
| 263 | +\begin{exemple}{Valeur du droit du locateur, valeur des baux et valeur de la pleine propriété d'un immeuble de douze logements à Montréal}{cas3-droits} | ||||
| 264 | +L'immeuble, construit en 1962 dans Rosemont, comprend quatre logements de 3½, six de 4½ et deux de 5½, tous loués par des baux de douze mois échéant le 30 juin 2027. La date d'évaluation est le 1\textsuperscript{er} septembre 2026. Les hypothèses de projection sont celles du cas 3 : taux d'actualisation de \pct{7.25}, indexation des loyers en place à \pct{3.1} par an, croissance des loyers de marché de \pct{3.5}, rotation de 15 \% des logements par an, inoccupation et mauvaises créances de \pct{3.9}, taux terminal de \pct{5.00} et coûts de vente de \pct{2.5} à l'horizon de dix ans. L'analyse procède en cinq étapes. | ||||
| 265 | + | ||||
| 266 | +\emph{Étape 1 : l'écart contractuel.} Le \cref{tab:2:ecarts} compare, pour chaque logement, le loyer contractuel et le loyer de marché estimé. Le revenu brut potentiel contractuel est de \dollars{165540} par an ; au marché, il serait de \dollars{186036} ; l'écart est de \dollars{20496} par an, soit \pct{11.0} du revenu de marché, et de \dollars{19697} une fois déduite l'inoccupation de \pct{3.9}. L'écart est très inégalement réparti. Le locataire du logement 103, en place depuis 2008, paie \dollars{728} pour un logement dont le marché demanderait \dollars{1047}, soit \dollars{319} de moins par mois et un ratio de 0,70 ; les locataires arrivés en 2025 paient 98 \% du marché. Le ratio moyen est de 0,884, et la \cref{fig:2:ecarts}(a) montre que l'écart suit l'ancienneté, ce qui est la loi de génération du jeu synthétique mais aussi, dans un régime de loyers encadrés, une régularité observée. | ||||
| 267 | + | ||||
| 268 | +\emph{Étape 2 : la valeur de chaque bail pour son locataire.} L'\cref{eq:2:annuite} donne la valeur de l'avantage locatif selon la durée pendant laquelle le locataire se maintiendra dans les lieux. Pour le logement 103, l'écart annuel de \dollars{3828} vaut \dollars{15591} si le locataire reste cinq ans et \dollars{26578} s'il reste dix ans, au taux de \pct{7.25} ; perpétuel, il vaudrait \dollars{52800}. La \cref{fig:2:ecarts}(b) trace ces courbes pour quatre logements. Ces montants sont des valeurs d'usage pour les locataires : la loi leur interdit de les monnayer par une cession \parencite[art.~1978.3]{ccq}, et le locateur ne peut les racheter qu'en négociant un départ. Leur somme, sur l'ensemble de l'immeuble et pour une durée donnée, mesure l'avantage que le marché locatif réglementé transfère des propriétaires aux occupants en place. | ||||
| 269 | + | ||||
| 270 | +\emph{Étape 3 : la décomposition par les flux actualisés.} Le module du cas 3 projette le revenu net sur onze ans en reconduisant les baux au taux d'indexation, en relouant chaque année deux logements au loyer de marché et en déduisant les dépenses normalisées et les dépenses en capital prévues. La valeur du droit du locateur ainsi obtenue est $V_{\text{locateur}} = \dollars{2208566}$, dont \dollars{662410} pour les dix flux et \dollars{1546156} pour la valeur terminale actualisée (\cref{ch:30}). Pour obtenir la valeur de la pleine propriété libre de baux, on refait la même projection en supposant chaque logement loué au marché dès la première année ; tout le reste étant égal, elle donne $V_{\text{pleine}} = \dollars{2235712}$. La différence, \dollars{27146}, est la valeur agrégée des droits des locataires, soit \pct{1.21} de la pleine propriété. Le \cref{tab:2:decomposition} détaille les deux projections. La \cref{fig:2:decomposition}(a) montre que l'écart de revenu net, de \dollars{18909} la première année, tombe à \dollars{3692} la quatrième et disparaît la sixième, lorsque tous les logements ont été reloués une fois ; au-delà, les deux trajectoires coïncident à quelques centaines de dollars près, et les valeurs terminales ne diffèrent que de \pct{0.7}. | ||||
| 271 | + | ||||
| 272 | +\emph{Étape 4 : l'erreur de la capitalisation naïve.} Un raisonnement fréquent consiste à capitaliser la différence de revenu net de la première année au taux de capitalisation du marché, comme si l'écart devait durer toujours. Avec le taux médian extrait des ventes comparables, \pct{4.42} (\cref{ch:29}), le revenu net contractuel de \dollars{89956} donne \dollars{2037503} et le revenu net au marché de \dollars{108865} donne \dollars{2465788} : l'écart capitalisé est de \dollars{428285}, seize fois la valeur obtenue par la projection. La formule fermée \eqref{eq:2:rotation-va} explique l'ordre de grandeur : sans rotation, l'écart net de \dollars{19697}, croissant à \pct{3.5}, vaut $19\,697 / (0{,}0725 - 0{,}035) = \dollars{525244}$ ; avec une rotation de 15 \%, le dénominateur passe à $0{,}0375 + 0{,}15 \times 1{,}035 = 0{,}19275$ et la valeur à \dollars{102188}. La projection logement par logement donne moins encore, \dollars{27146}, parce qu'elle reloue d'abord les logements les plus éloignés du marché, ce qui ferme l'écart plus vite qu'une rotation aléatoire, et parce que les honoraires de gestion, calculés en pourcentage du revenu, absorbent une part de l'écart. Les trois chiffres ne sont pas contradictoires : ils correspondent à trois hypothèses sur la \emph{durée} de l'avantage locatif, perpétuelle, décroissante au hasard, ou ciblée sur les logements les plus sous-évalués, et c'est cette hypothèse, bien plus que le niveau de l'écart, qui fixe la décote du droit du locateur. | ||||
| 273 | + | ||||
| 274 | +\emph{Étape 5 : le rôle et le marché.} La valeur inscrite au rôle fictif de l'immeuble pour l'exercice 2026 est de \dollars{2200000}, pour une date de référence au marché du 1\textsuperscript{er} juillet 2024. Elle n'est comparable ni à $V_{\text{locateur}}$ ni à $V_{\text{pleine}}$ sans deux précisions. Par l'effet de l'article 45.1 de la LFM, la valeur réelle au rôle est établie comme si le vendeur détenait tous les droits des locataires, c'est-à-dire sur la base de $V_{\text{pleine}}$ ; et elle est établie à une date antérieure de vingt-six mois à la date d'évaluation. Si l'écart entre les deux valeurs est ici modeste, c'est parce que la rotation présumée est rapide ; pour un immeuble dont les locataires sont très anciens et dont la rotation attendue serait d'un logement par an, la \cref{sec:2:sensibilite} montre que l'écart approcherait \dollars{60000}, et sans aucune rotation \dollars{400000}. L'évaluateur qui compare la valeur au rôle à son estimation de valeur marchande doit donc toujours se demander quel droit chacune mesure. | ||||
| 275 | +\end{exemple} | ||||
| 276 | + | ||||
| 277 | +\begin{table}[htbp] | ||||
| 278 | +\caption{État locatif du cas 3 : loyers contractuels, loyers de marché et écarts par logement (données synthétiques, au 1\textsuperscript{er} septembre 2026)}\label{tab:2:ecarts} | ||||
| 279 | +\centering | ||||
| 280 | +\small | ||||
| 281 | +\begin{tabular}{lcS[table-format=2.0]S[table-format=4.0]S[table-format=4.0]S[table-format=3.0]S[table-format=4.0]S[table-format=1.3]} | ||||
| 282 | +\toprule | ||||
| 283 | +Logement & Type & {Ancienneté (ans)} & {Loyer contractuel (\$/mois)} & {Loyer de marché (\$/mois)} & {Écart (\$/mois)} & {Écart (\$/an)} & {Ratio contrat/marché} \\ | ||||
| 284 | +\midrule | ||||
| 285 | +101 & 3½ & 5 & 917 & 1015 & 98 & 1176 & 0.903 \\ | ||||
| 286 | +102 & 3½ & 12 & 788 & 1004 & 216 & 2592 & 0.785 \\ | ||||
| 287 | +103 & 3½ & 18 & 728 & 1047 & 319 & 3828 & 0.695 \\ | ||||
| 288 | +104 & 3½ & 1 & 1068 & 1090 & 22 & 264 & 0.980 \\ | ||||
| 289 | +201 & 4½ & 8 & 1144 & 1345 & 201 & 2412 & 0.851 \\ | ||||
| 290 | +202 & 4½ & 2 & 1191 & 1240 & 49 & 588 & 0.960 \\ | ||||
| 291 | +203 & 4½ & 8 & 1167 & 1372 & 205 & 2460 & 0.851 \\ | ||||
| 292 | +204 & 4½ & 8 & 1064 & 1251 & 187 & 2244 & 0.851 \\ | ||||
| 293 | +301 & 4½ & 1 & 1328 & 1356 & 28 & 336 & 0.979 \\ | ||||
| 294 | +302 & 4½ & 8 & 1258 & 1478 & 220 & 2640 & 0.851 \\ | ||||
| 295 | +303 & 5½ & 3 & 1526 & 1622 & 96 & 1152 & 0.941 \\ | ||||
| 296 | +304 & 5½ & 2 & 1616 & 1683 & 67 & 804 & 0.960 \\ | ||||
| 297 | +\midrule | ||||
| 298 | +Total annuel & & & 165540 & 186036 & {---} & 20496 & 0.890 \\ | ||||
| 299 | +\bottomrule | ||||
| 300 | +\end{tabular} | ||||
| 301 | +\tabsource{\synth{\texttt{analysis/python/cases/ch02\_droits.py} (fonction \texttt{traite.cas3.revenus}), graine 20261031 ; loyers mensuels totalisés sur douze mois.}} | ||||
| 302 | +\end{table} | ||||
| 303 | + | ||||
| 304 | +\begin{figure}[htbp] | ||||
| 305 | +\centering | ||||
| 306 | +\includegraphics[width=\textwidth]{ch02/ch02-fig-ecart-logements.pdf} | ||||
| 307 | +\caption{Cas 3 : (a) ratio du loyer contractuel au loyer de marché des douze logements selon l'ancienneté du locataire ; la ligne pointillée est la loi de génération du jeu synthétique. (b) Valeur du bail pour le locataire, par l'\cref{eq:2:annuite}, selon la durée de maintien dans les lieux, au taux de \pct{7.25} : l'avantage du locataire le plus ancien dépasse \dollars{26000} s'il reste dix ans.}\label{fig:2:ecarts} | ||||
| 308 | +\figsource{\synth{\texttt{analysis/python/figures/ch02\_ecart\_logements.py}, graine 20261031}} | ||||
| 309 | +\end{figure} | ||||
| 310 | + | ||||
| 311 | +\begin{table}[htbp] | ||||
| 312 | +\caption{Décomposition de la pleine propriété du cas 3 entre le droit du locateur et les droits des locataires (flux actualisés à \pct{7.25}, données synthétiques)}\label{tab:2:decomposition} | ||||
| 313 | +\centering | ||||
| 314 | +\small | ||||
| 315 | +\begin{tabular}{lS[table-format=7.0]S[table-format=7.0]S[table-format=6.0]} | ||||
| 316 | +\toprule | ||||
| 317 | +Grandeur & {Droit du locateur (baux en place) (\$)} & {Pleine propriété libre de baux (\$)} & {Écart (\$)} \\ | ||||
| 318 | +\midrule | ||||
| 319 | +Revenu brut potentiel, année 1 & 165540 & 186036 & 20496 \\ | ||||
| 320 | +Revenu brut effectif, année 1 & 168444 & 188141 & 19697 \\ | ||||
| 321 | +Revenu net d'exploitation, année 1 & 89956 & 108865 & 18909 \\ | ||||
| 322 | +Revenu net, année 2 & 99512 & 112678 & 13166 \\ | ||||
| 323 | +Revenu net, année 3 & 107915 & 116735 & 8821 \\ | ||||
| 324 | +Revenu net, année 4 & 117368 & 121060 & 3692 \\ | ||||
| 325 | +Revenu net, année 5 & 124388 & 125629 & 1241 \\ | ||||
| 326 | +Revenu net, année 6 & 130890 & 130496 & -394 \\ | ||||
| 327 | +Revenu net, année 11 (valeur terminale) & 159658 & 158583 & -1075 \\ | ||||
| 328 | +\midrule | ||||
| 329 | +Valeur présente des flux (10 ans) & 662410 & 699966 & 37556 \\ | ||||
| 330 | +Valeur présente de la valeur terminale nette & 1546156 & 1535746 & -10410 \\ | ||||
| 331 | +Valeur ($V_0$) & 2208566 & 2235712 & 27146 \\ | ||||
| 332 | +\midrule | ||||
| 333 | +Capitalisation directe du RNE de l'année 1 à \pct{4.42} & 2037503 & 2465788 & 428285 \\ | ||||
| 334 | +\bottomrule | ||||
| 335 | +\end{tabular} | ||||
| 336 | +\tabsource{\synth{\texttt{analysis/python/cases/ch02\_droits.py} (fonctions \texttt{traite.cas3.projection\_dcf} et \texttt{valeur\_dcf}), graine 20261031 ; l'écart négatif des années 6 à 11 provient de la règle discrète de relocation du module, qui reloue deux logements par an dans les deux scénarios.}} | ||||
| 337 | +\end{table} | ||||
| 338 | + | ||||
| 339 | +\begin{figure}[htbp] | ||||
| 340 | +\centering | ||||
| 341 | +\includegraphics[width=\textwidth]{ch02/ch02-fig-decomposition-droits.pdf} | ||||
| 342 | +\caption{Cas 3 : (a) revenu net d'exploitation projeté sous les baux en place et libre de baux ; la surface entre les deux courbes est le revenu cédé aux locataires, qui s'éteint en six ans au rythme de deux relocations par an. (b) Valeur agrégée des baux pour les locataires, $V_{\text{pleine}} - V_{\text{locateur}}$, selon le nombre de logements reloués au marché chaque année et le taux d'actualisation, en échelle logarithmique : la rotation, non le taux, gouverne la décote.}\label{fig:2:decomposition} | ||||
| 343 | +\figsource{\synth{\texttt{analysis/python/figures/ch02\_decomposition.py}, graine 20261031}} | ||||
| 344 | +\end{figure} | ||||
| 345 | + | ||||
| 346 | +\section{Sensibilité : rotation et taux d'actualisation}\label{sec:2:sensibilite} | ||||
| 347 | + | ||||
| 348 | +La décomposition de la \cref{sec:2:exemple} repose sur deux paramètres que l'évaluateur ne lit nulle part et qu'il doit estimer : la rotation des locataires et le taux d'actualisation. Le \cref{tab:2:sensibilite} refait la décomposition pour zéro, un, deux, trois et six logements reloués au marché par an, et pour des taux d'actualisation de \pct{6.25}, \pct{7.25} et \pct{8.25} ; la \cref{fig:2:decomposition}(b) en donne l'image. Deux résultats se dégagent. Le premier est que la rotation domine tout : la valeur agrégée des baux pour les locataires passe de \dollars{397186} sans rotation à \dollars{59858} avec un logement reloué par an, \dollars{27146} avec deux, \dollars{17360} avec trois et \dollars{5195} avec six, au taux de \pct{7.25}. Entre l'hypothèse d'immobilité complète et celle d'un renouvellement de la moitié des locataires chaque année, la décote varie d'un facteur 76. Le second est que le taux d'actualisation ne change presque rien à la décote, bien qu'il change beaucoup les deux valeurs : entre \pct{6.25} et \pct{8.25}, $V_{\text{locateur}}$ varie de \dollars{2396754} à \dollars{2037842}, soit de 15 \%, alors que l'écart ne bouge que de \dollars{26673} à \dollars{27527}. La raison est que l'écart de revenu est concentré sur les cinq premières années, où l'actualisation pèse peu, tandis que la valeur terminale, très sensible au taux, est commune aux deux droits et s'élimine dans la différence. La part des locataires dans la pleine propriété s'étage ainsi de \pct{18.4} à \pct{0.2} selon la rotation, pour un taux donné. | ||||
| 349 | + | ||||
| 350 | +\begin{table}[htbp] | ||||
| 351 | +\caption{Sensibilité de la décomposition du cas 3 à la rotation des locataires et au taux d'actualisation (données synthétiques)}\label{tab:2:sensibilite} | ||||
| 352 | +\centering | ||||
| 353 | +\small | ||||
| 354 | +\begin{tabular}{S[table-format=1.0]S[table-format=1.2]S[table-format=7.0]S[table-format=7.0]S[table-format=6.0]S[table-format=2.2]} | ||||
| 355 | +\toprule | ||||
| 356 | +{Logements reloués par an} & {Taux $r$ (\%)} & {$V_{\text{locateur}}$ (\$)} & {$V_{\text{pleine}}$ (\$)} & {$V_{\text{pleine}} - V_{\text{locateur}}$ (\$)} & {Part des locataires (\%)} \\ | ||||
| 357 | +\midrule | ||||
| 358 | +0 & 6.25 & 1904506 & 2333543 & 429037 & 18.39 \\ | ||||
| 359 | +0 & 7.25 & 1756414 & 2153600 & 397186 & 18.44 \\ | ||||
| 360 | +0 & 8.25 & 1622053 & 1990287 & 368234 & 18.50 \\ | ||||
| 361 | +1 & 6.25 & 2324041 & 2385200 & 61159 & 2.56 \\ | ||||
| 362 | +1 & 7.25 & 2140916 & 2200774 & 59858 & 2.72 \\ | ||||
| 363 | +1 & 8.25 & 1974821 & 2033408 & 58586 & 2.88 \\ | ||||
| 364 | +2 & 6.25 & 2396754 & 2423427 & 26673 & 1.10 \\ | ||||
| 365 | +2 & 7.25 & 2208566 & 2235712 & 27146 & 1.21 \\ | ||||
| 366 | +2 & 8.25 & 2037842 & 2065369 & 27527 & 1.33 \\ | ||||
| 367 | +3 & 6.25 & 2421311 & 2437930 & 16619 & 0.68 \\ | ||||
| 368 | +3 & 7.25 & 2231655 & 2249015 & 17360 & 0.77 \\ | ||||
| 369 | +3 & 8.25 & 2059582 & 2077584 & 18003 & 0.87 \\ | ||||
| 370 | +6 & 6.25 & 2447803 & 2451879 & 4075 & 0.17 \\ | ||||
| 371 | +6 & 7.25 & 2256667 & 2261862 & 5195 & 0.23 \\ | ||||
| 372 | +6 & 8.25 & 2083236 & 2089431 & 6195 & 0.30 \\ | ||||
| 373 | +\bottomrule | ||||
| 374 | +\end{tabular} | ||||
| 375 | +\tabsource{\synth{\texttt{analysis/python/cases/ch02\_droits.py}, graine 20261031 ; le module \texttt{traite.cas3} arrondit la rotation à un nombre entier de logements par an, de sorte que les rotations de 5 et 10 \% donnent le même résultat qu'un logement par an. Sans rotation, les loyers relancés au marché n'existent pas : les deux scénarios ne diffèrent que par le niveau initial des loyers, indexés ensuite au même taux.}} | ||||
| 376 | +\end{table} | ||||
| 377 | + | ||||
| 378 | +La leçon dépasse le cas 3. Lorsqu'un acheteur et un évaluateur divergent sur la valeur d'un immeuble à loyers déprimés, la divergence porte rarement sur les loyers de marché, que tous deux connaissent, mais sur le rythme auquel les loyers en place les rejoindront. Cette question est empirique et locale : la rotation observée dans le quartier, l'ancienneté des locataires en place, la part des locataires âgés protégés par l'article 1959.1 C.c.Q. \parencite[art.~1959.1]{ccq}, le moratoire sur certaines évictions en vigueur jusqu'au 6 juin 2027 \parencite[art.~1]{loi65_2024}, et la pratique de fixation du Tribunal administratif du logement (\cref{ch:34}) en sont les déterminants. L'évaluateur documente l'hypothèse de rotation qu'il retient et en montre l'incidence, exactement comme il le ferait pour une hypothèse extraordinaire. | ||||
| 379 | + | ||||
| 380 | +\section{Hypothèses, conditions limitatives et hypothèses extraordinaires}\label{sec:2:hypotheses} | ||||
| 381 | + | ||||
| 382 | +Toute évaluation repose sur des hypothèses. Les \motcle{hypothèses de base} sont celles que tout lecteur accepterait sans vérification particulière : les titres sont valides, les informations fournies par le client sont exactes sauf indication contraire, l'immeuble respecte la réglementation applicable sauf constatation contraire, aucune contamination n'est présente sauf indice. Les \motcle{réserves} ou conditions limitatives bornent la portée du travail : l'évaluateur n'est pas arpenteur, ni inspecteur en bâtiment, ni expert en environnement, et il ne garantit pas les mesures, l'état des composantes cachées ni l'absence de contaminants. Les Normes de pratique professionnelle exigent que tout rapport mentionne « les réserves limitant la portée de son acte et les hypothèses de base » \parencite[règle~2.3, élément~7]{oeaqNormes}, et le Code de déontologie interdit à l'évaluateur d'exclure sa responsabilité civile par de telles réserves \parencite[art.~32]{deontOEAQ} : elles informent le lecteur, elles ne protègent pas l'auteur contre sa propre négligence. | ||||
| 383 | + | ||||
| 384 | +Une \motcle{hypothèse extraordinaire} est d'une autre nature : c'est une hypothèse portant sur un fait incertain, propre au mandat, dont la fausseté changerait la conclusion. Évaluer un immeuble en supposant qu'une contamination signalée n'existe pas, qu'un changement de zonage demandé sera accordé, que des travaux en cours seront achevés, que les loyers déclarés par le propriétaire sont ceux des baux que l'on n'a pas vus, qu'une servitude non publiée n'existe pas : chacune de ces hypothèses, si elle se révélait fausse, modifierait la valeur de façon importante. Le \cref{tab:2:hypotheses} met en regard le vocabulaire des NPP et celui des CUSPAP. | ||||
| 385 | + | ||||
| 386 | +\begin{table}[htbp] | ||||
| 387 | +\caption{Hypothèses, réserves et hypothèses extraordinaires : vocabulaire des NPP de l'OEAQ et des CUSPAP 2026}\label{tab:2:hypotheses} | ||||
| 388 | +\centering | ||||
| 389 | +\footnotesize | ||||
| 390 | +\begin{tabularx}{\textwidth}{lYYY} | ||||
| 391 | +\toprule | ||||
| 392 | +Notion & NPP OEAQ (en vigueur depuis le 1\textsuperscript{er} février 2024) & CUSPAP 2026 (en vigueur le 1\textsuperscript{er} avril 2026) & Obligation \\ | ||||
| 393 | +\midrule | ||||
| 394 | +Hypothèse de base & « hypothèses de base » (règle~2.3, élément~7 ; modèle à l'annexe E) & \emph{Assumption} & mentionnée dans tout rapport \\ | ||||
| 395 | +Réserve, condition limitative & « réserves limitant la portée de son acte » (règle~2.3, élément~7) & \emph{Limiting Condition} & mentionnée dans tout rapport ; ne peut exclure la responsabilité civile (Code de déontologie, art.~32) \\ | ||||
| 396 | +Hypothèse extraordinaire & « hypothèse … extraordinaire pouvant avoir une influence directe sur l'évaluation » (règles~1.2 él.~6 et 2.1 c)) & \emph{Extraordinary Assumption} : hypothèse propre au mandat dont la fausseté pourrait modifier substantiellement les conclusions (s.~3) & prise en compte dans la substance ; divulguée avec son incidence sur la valeur ; rappelée à chaque énoncé de la conclusion (règle~2.3, élément~7) \\ | ||||
| 397 | +Condition hypothétique & englobée dans « hypothèse … extraordinaire » & \emph{Hypothetical Condition} : information « simulée mais fausse » sur l'état physique, juridique ou économique (s.~3) & idem ; la fiction doit être nommée comme telle \\ | ||||
| 398 | +Réserve extraordinaire & « réserve extraordinaire » (règle~2.1 c)) & \emph{Extraordinary Limiting Condition} : modification ou exclusion d'une règle, pouvant réduire la fiabilité du rapport (s.~3) & divulguée avec son incidence \\ | ||||
| 399 | +Inspection & « Tout immeuble évalué doit faire l'objet d'une inspection, à moins de circonstances exceptionnelles » (règle~2.4) & règles d'inspection de la norme \emph{Real Property Appraisal} & l'absence d'inspection est expliquée au rapport \\ | ||||
| 400 | +\bottomrule | ||||
| 401 | +\end{tabularx} | ||||
| 402 | +\tabsource{paraphrases et extraits de moins de vingt-cinq mots d'après \textcite{oeaqNormes}, \textcite{cuspap2026} et \textcite{deontOEAQ}, consultés le 31 octobre 2026.} | ||||
| 403 | +\end{table} | ||||
| 404 | + | ||||
| 405 | +\begin{encadre}{Les hypothèses extraordinaires dans les Normes de pratique professionnelle}{hyp-extra} | ||||
| 406 | +Les NPP traitent l'hypothèse extraordinaire à trois endroits, et les trois obligations se cumulent. Au stade de la substance de l'évaluation, « l'évaluateur doit tenir compte de toute réserve et hypothèse extraordinaires pouvant avoir une influence directe sur l'évaluation de l'immeuble » \parencite[règle~1.2, élément~6]{oeaqNormes}. Au stade de la communication, le rapport doit divulguer clairement « toute hypothèse ou toute réserve extraordinaire pouvant avoir une influence directe sur l'évaluation et en indiquer l'incidence sur la valeur » \parencite[règle~2.1~c)]{oeaqNormes}. Enfin, dans le contenu minimal du rapport, les hypothèses extraordinaires doivent être décrites et rappelées à chaque fois que l'évaluateur indique sa conclusion de valeur \parencite[règle~2.3, élément~7]{oeaqNormes}. Ces règles sont coercitives : un membre ne peut s'en écarter, même avec l'accord du client. | ||||
| 407 | + | ||||
| 408 | +L'exigence d'indiquer « l'incidence sur la valeur » est la plus souvent négligée et la plus utile. Elle oblige l'évaluateur à calculer la valeur sous l'hypothèse et, au moins en ordre de grandeur, hors de l'hypothèse. Supposons que l'immeuble du cas 3 soit évalué en supposant, à la demande du client, qu'une étude environnementale de phase II en cours ne révélera aucune contamination. La valeur du droit du locateur sous cette hypothèse est de \dollars{2208566}. Si l'étude révélait une contamination dont la réhabilitation coûterait \dollars{150000} et qui laisserait une décote de stigmate de 5 \% (chiffres pédagogiques), la valeur deviendrait $(2\,208\,566 - 150\,000) \times 0{,}95 = \dollars{1955638}$, soit une incidence de \dollars{252928}, ou \pct{11.5}. Le rapport écrira alors, à chaque énoncé de la conclusion, une phrase du type : « Cette conclusion repose sur l'hypothèse extraordinaire que l'étude environnementale en cours ne révélera aucune contamination ; si cette hypothèse se révélait fausse, la valeur pourrait être réduite d'un montant de l'ordre de \dollars{250000} selon l'ampleur des travaux. » Le \cref{ch:43} traite de la mesure des stigmates environnementaux ; le \cref{ch:10} de la rédaction du rapport. Textes consultés le 31 octobre 2026. | ||||
| 409 | +\end{encadre} | ||||
| 410 | + | ||||
| 411 | +La frontière entre une hypothèse extraordinaire et une condition hypothétique mérite un mot. L'hypothèse extraordinaire porte sur un fait \emph{incertain} que l'évaluateur tient pour vrai sans l'avoir vérifié ; la condition hypothétique porte sur un fait que l'on \emph{sait} contraire à la réalité et que l'on suppose néanmoins, par exemple évaluer un immeuble comme s'il était achevé alors qu'il est en construction, ou comme s'il était libre de baux alors qu'il est loué. La valeur réelle au rôle d'un immeuble locatif, établie en réputant que le vendeur détient tous les droits des locataires (\cref{sec:2:droits}), est en ce sens une valeur sous condition hypothétique imposée par la loi, ce qui est parfaitement légitime dès lors que la base est connue de tous. Dans un mandat privé, en revanche, une condition hypothétique doit être nommée, justifiée par l'usage prévu du rapport, et ne doit pas conduire à une conclusion trompeuse pour le lecteur. | ||||
| 412 | + | ||||
| 413 | +\section{Les dates : évaluation, référence au marché, promesse d'achat}\label{sec:2:dates} | ||||
| 414 | + | ||||
| 415 | +La date est le quatrième élément de la substance de toute évaluation et le cinquième du contenu minimal de tout rapport \parencite[règles~1.2 et 2.3]{oeaqNormes} ; elle figure dans chacune des définitions de la valeur marchande du \cref{tab:2:definitions}. Il ne s'agit pourtant pas d'une seule date mais d'une famille de dates qu'il faut distinguer, parce que la valeur varie dans le temps et que plusieurs d'entre elles peuvent être séparées de plusieurs années. Le \cref{tab:2:dates} les énumère et la \cref{fig:2:chronologie} les situe sur le calendrier du cas 3. | ||||
| 416 | + | ||||
| 417 | +\begin{table}[htbp] | ||||
| 418 | +\caption{Les dates d'une évaluation et leur rôle}\label{tab:2:dates} | ||||
| 419 | +\centering | ||||
| 420 | +\footnotesize | ||||
| 421 | +\begin{tabularx}{\textwidth}{lYY} | ||||
| 422 | +\toprule | ||||
| 423 | +Date & Définition & Conséquence pour l'évaluateur \\ | ||||
| 424 | +\midrule | ||||
| 425 | +Date d'évaluation (date d'effet) & date à laquelle l'opinion de valeur s'applique ; fixée par le mandat (NPP, règle~1.2 él.~4 ; IVS, « valuation date ») & toutes les conditions du marché et l'état du bien sont ceux de cette date ; elle peut être passée (évaluation rétrospective), actuelle ou future (prospective, sous hypothèse extraordinaire) \\ | ||||
| 426 | +Date de l'inspection & date de la visite (NPP, règle~2.4) & l'état physique constaté est celui de cette date ; si elle diffère de la date d'évaluation, l'écart est expliqué \\ | ||||
| 427 | +Date du rapport & date de signature & postérieure à la date d'évaluation ; les faits connus entre les deux sont traités selon l'usage prévu et déclarés \\ | ||||
| 428 | +Date de référence au marché du rôle & 1\textsuperscript{er} juillet du deuxième exercice précédant le premier exercice du rôle (LFM, art.~46, al.~1) & la valeur au rôle décrit le marché à cette date ; elle précède de dix-huit à quarante-deux mois les exercices qu'elle sert \\ | ||||
| 429 | +Date de la promesse d'achat (acceptation) & date à laquelle le prix d'une vente a été convenu & c'est la date des conditions du marché pour un comparable (\cref{ch:16}) ; l'ajustement temporel se mesure à partir d'elle \\ | ||||
| 430 | +Date de l'acte de vente (signature, publication) & date de l'acte notarié et de son inscription au registre foncier & seule date visible au registre ; postérieure de un à trois mois à la promesse ; sert à la vérification, non à l'ajustement temporel \\ | ||||
| 431 | +Date d'échéance des baux & terme des baux en place & borne la période des loyers contractuels ; pour un logement, la reconduction de plein droit en relativise la portée \\ | ||||
| 432 | +Délai d'exposition et délai de commercialisation & durée présumée de mise en marché avant la date d'évaluation (rétrospectif) ; durée attendue pour vendre après celle-ci (prospectif) (CUSPAP 2026, s.~3 et règle~8.2) & la valeur marchande suppose une exposition raisonnable ; une valeur de liquidation suppose un délai raccourci \\ | ||||
| 433 | +\bottomrule | ||||
| 434 | +\end{tabularx} | ||||
| 435 | +\tabsource{synthèse de l'auteur d'après \textcite{oeaqNormes}, \textcite{ivs2025}, \textcite{cuspap2026} et \textcite{lfm}, consultés le 31 octobre 2026.} | ||||
| 436 | +\end{table} | ||||
| 437 | + | ||||
| 438 | +\begin{figure}[htbp] | ||||
| 439 | +\centering | ||||
| 440 | +\begin{tikzpicture}[x=10.6mm, y=1mm, | ||||
| 441 | + ev/.style={font=\sffamily\scriptsize, align=center}, | ||||
| 442 | + tick/.style={line width=0.6pt}, | ||||
| 443 | + role/.style={brandAmber}, eval/.style={brandPrimary}, marche/.style={brandGreen}, bail/.style={brandDark}] | ||||
| 444 | + % axe : 0 = juillet 2024, 1 unité = 6 mois ; jusqu'à septembre 2036 ≈ 24,3 unités, compressé après 2027 | ||||
| 445 | + \draw[-{Stealth[length=2.2mm]}, line width=0.8pt, brandGray] (-0.6,0) -- (12.4,0); | ||||
| 446 | + \foreach \x/\lab in {0/{juill.\\2024}, 1/{janv.\\2025}, 2/{juill.\\2025}, 3/{janv.\\2026}, 4/{juill.\\2026}, 5/{janv.\\2027}, 6/{juill.\\2027}} { | ||||
| 447 | + \draw[tick, brandGray] (\x,0) -- (\x,-1.5); \node[ev, below, text=brandGray] at (\x,-2) {\lab}; | ||||
| 448 | + } | ||||
| 449 | + \draw[tick, brandGray] (8,0) -- (8,-1.5); \node[ev, below, text=brandGray] at (8,-2) {2029}; | ||||
| 450 | + \draw[tick, brandGray] (10,0) -- (10,-1.5); \node[ev, below, text=brandGray] at (10,-2) {2032}; | ||||
| 451 | + \draw[tick, brandGray] (12,0) -- (12,-1.5); \node[ev, below, text=brandGray] at (12,-2) {sept.\\2036}; | ||||
| 452 | + \draw[line width=0.5pt, brandGray, dashed] (6.6,-1) -- (7.4,1); \draw[line width=0.5pt, brandGray, dashed] (6.8,-1) -- (7.6,1); | ||||
| 453 | + % fenêtre des ventes comparables : sept. 2024 → août 2026 | ||||
| 454 | + \fill[marche, opacity=0.18] (0.33,2) rectangle (4.17,8); | ||||
| 455 | + \node[ev, marche] at (2.25,10.5) {ventes comparables (40) : date de la \emph{promesse} ;\\ l'acte suit de 1 à 3 mois}; | ||||
| 456 | + % date de référence du rôle | ||||
| 457 | + \draw[role, line width=1.2pt] (0,0) -- (0,22); \node[ev, role, above, text width=30mm] at (0,22) {1\textsuperscript{er} juillet 2024\\ date de référence au marché\\ du rôle 2026--2028 (LFM 46 al.~1)\\ valeur au rôle : 2 200 000 \$}; | ||||
| 458 | + % date d'évaluation | ||||
| 459 | + \draw[eval, line width=1.4pt] (4.33,0) -- (4.33,30); \node[ev, eval, above, text width=34mm, font=\sffamily\scriptsize\bfseries] at (4.33,30) {1\textsuperscript{er} septembre 2026\\ date d'évaluation (NPP 1.2 él.~4)\\ inspection, puis rapport}; | ||||
| 460 | + % échéance des baux | ||||
| 461 | + \draw[bail, line width=1.0pt] (6,0) -- (6,16); \node[ev, bail, above, text width=28mm] at (6,16) {30 juin 2027\\ échéance des 12 baux\\ (reconduits de plein droit, art.~1941)}; | ||||
| 462 | + % date de référence du rôle suivant | ||||
| 463 | + \draw[role, line width=1.0pt, dashed] (6.0,0) -- (6.0,-9); \node[ev, role, below, text width=30mm] at (6.0,-9) {1\textsuperscript{er} juillet 2027 : date de référence\\ du rôle 2029--2031 (art.~46 al.~1)}; | ||||
| 464 | + % horizon DCF | ||||
| 465 | + \draw[eval, line width=1.0pt, dashed] (12,0) -- (12,16); \node[ev, eval, above, text width=30mm] at (12,16) {31 août 2036\\ fin de l'horizon de 10 ans ;\\ valeur terminale (ch.~30)}; | ||||
| 466 | + % CAPEX | ||||
| 467 | + \foreach \x/\lab in {5.5/{2027}, 9/{2029}, 11/{2032}} {\node[ev, brandGray, circle, fill=brandLight, draw=brandGray, inner sep=1pt, font=\sffamily\tiny] at (\x,5) {\lab}; } | ||||
| 468 | + \node[ev, brandGray, text width=30mm] at (9.6,10.5) {dépenses en capital prévues (ch.~30)}; | ||||
| 469 | +\end{tikzpicture} | ||||
| 470 | +\caption{Chronologie des dates du cas 3 : la date de référence au marché du rôle 2026-2028 de Montréal précède de vingt-six mois la date d'évaluation ; les ventes comparables sont datées de leur promesse d'achat ; les baux échoient le 30 juin 2027 mais sont reconduits de plein droit ; l'horizon des flux actualisés court jusqu'en 2036. Échelle compressée après 2027.}\label{fig:2:chronologie} | ||||
| 471 | +\figsource{schéma de l'auteur ; dates légales d'après \textcite[art.~46]{lfm} et \textcite[art.~1941]{ccq} ; dates du dossier synthétique du cas 3.} | ||||
| 472 | +\end{figure} | ||||
| 473 | + | ||||
| 474 | +Trois confusions reviennent sans cesse. La première est de prendre la date de l'acte notarié pour la date de la vente : le prix a été convenu à l'acceptation de la promesse d'achat, souvent un à trois mois plus tôt, et c'est de cette date que court l'ajustement de conditions du marché (\cref{ch:16,ch:17}). Le Règlement sur la proportion médiane applique d'ailleurs cette logique au rôle : les prix des ventes retenues sont rajustés aux conditions du marché prévalant au 1\textsuperscript{er} juillet du deuxième exercice précédent, ou exclus si le rajustement n'est pas possible \parencite[art.~11 à 13]{reglpropmed}. La deuxième est de comparer une valeur au rôle à une valeur marchande actuelle sans transporter l'une à la date de l'autre. Si un indice de prix $I$ est disponible pour le segment de marché, la correction la plus simple est proportionnelle : | ||||
| 475 | +\begin{equation}\label{eq:2:date-indice} | ||||
| 476 | +V(t_1) \approx V(t_0)\,\frac{I(t_1)}{I(t_0)} , | ||||
| 477 | +\end{equation} | ||||
| 478 | +mais elle suppose que le bien a évolué comme l'indice, ce qui n'est vrai qu'en moyenne ; la loi elle-même autorise l'évaluateur municipal à tenir compte « des transferts de propriété survenus avant et après » la date de référence pour établir la valeur à cette date \parencite[art.~46, al.~5]{lfm}, ce qui est une forme de cette correction appliquée en sens inverse. L'\cref{ex:2:5} l'applique au rôle fictif du cas 1. La troisième confusion est de laisser l'information postérieure à la date d'évaluation contaminer une évaluation rétrospective : une évaluation au 1\textsuperscript{er} juillet 2024 pour un litige successoral ne peut utiliser que les ventes conclues avant cette date, ou conclues peu après si l'on peut soutenir que le marché n'avait pas changé, et elle doit ignorer ce que l'on a appris depuis sur le bien lui-même, sauf à le déclarer comme hypothèse. La prospective, à l'inverse, suppose nécessairement une hypothèse extraordinaire, celle que l'état futur présumé se réalisera, et doit être divulguée comme telle. | ||||
| 479 | + | ||||
| 480 | +\begin{erreurs} | ||||
| 481 | +\begin{itemize} | ||||
| 482 | +\item Évaluer la pleine propriété d'un immeuble locatif sans tenir compte des baux en place, alors que l'acquéreur ne peut les résilier \parencite[art.~1937]{ccq} ; ou, inversement, comparer la valeur du droit du locateur à une valeur au rôle établie comme si le vendeur détenait les droits des locataires \parencite[art.~45.1]{lfm}, et conclure à une erreur de l'un ou de l'autre. | ||||
| 483 | +\item Capitaliser à perpétuité l'écart entre les loyers contractuels et les loyers de marché : la décote dépend de la durée de l'écart, donc de la rotation attendue, bien plus que de son niveau (\cref{sec:2:sensibilite}). | ||||
| 484 | +\item Traiter la valeur du bail pour un locataire de logement comme une valeur de marché, alors que la loi interdit au locataire d'en exiger une contrepartie lors d'une cession \parencite[art.~1978.3]{ccq} : c'est une valeur d'usage. | ||||
| 485 | +\item Citer la définition IVS de la valeur marchande sous la numérotation « IVS 104 », qui est celle de l'édition de 2022 ; l'édition en vigueur depuis le 31 janvier 2025 place les bases de valeur à l'annexe d'IVS 102, et aucune édition postérieure n'est en vigueur au 31 octobre 2026 \parencite{ivs2025,ivs2028ed}. | ||||
| 486 | +\item Confondre la valeur relative d'une fraction de copropriété (art.~1041 C.c.Q.), fixée dans la déclaration, avec sa valeur marchande. | ||||
| 487 | +\item Présenter la valeur assurable, qui est un coût de reconstruction sans terrain, comme une indication de valeur marchande, ou la valeur d'investissement d'un client comme la valeur marchande. | ||||
| 488 | +\item Omettre l'incidence chiffrée d'une hypothèse extraordinaire, ou ne la mentionner qu'une fois alors que les NPP exigent de la rappeler à chaque énoncé de la conclusion. | ||||
| 489 | +\item Dater un comparable de son acte notarié plutôt que de sa promesse d'achat, ou comparer une valeur au rôle à une valeur actuelle sans correction de date ni de proportion médiane. | ||||
| 490 | +\end{itemize} | ||||
| 491 | +\end{erreurs} | ||||
| 492 | + | ||||
| 493 | +\begin{limites} | ||||
| 494 | +Ce chapitre présente les droits et les bases de valeur du point de vue de l'évaluateur ; il ne constitue pas une analyse juridique et les articles cités, à jour au 15 octobre 2026, doivent être relus dans leur version en vigueur à la date d'un mandat. Les textes des normes professionnelles ne sont pas reproduits in extenso : les définitions sont paraphrasées ou citées par extraits courts, et le lecteur se reporte aux documents officiels. La proposition d'additivité repose sur des hypothèses, taux commun, revenu net additif, réversion identique, dont la \cref{sec:2:droits} a montré les limites ; dans un marché réel, la décote d'un immeuble à loyers déprimés dépend aussi de la fiscalité, de la liquidité et des anticipations réglementaires, que le modèle ignore. Les chiffres de l'exemple intégral proviennent d'un dossier synthétique dont la loi de génération lie mécaniquement l'écart au marché à l'ancienneté du locataire ; la règle de relocation du module partagé, qui reloue d'abord les logements les plus sous-évalués, est une convention déclarée et non une observation, et elle minore la décote par rapport à une rotation aléatoire. Aucune donnée publique sur la rotation des locataires par type d'immeuble n'a été mobilisée ici ; le \cref{ch:27} discute les taux de rotation publiés par la SCHL. Enfin, l'exemple de contamination de l'encadré sur les hypothèses extraordinaires utilise des montants pédagogiques, non des coûts observés. | ||||
| 495 | +\end{limites} | ||||
| 496 | + | ||||
| 497 | +\begin{synthese} | ||||
| 498 | +\begin{itemize} | ||||
| 499 | +\item Le Code civil définit l'immeuble (art.~900 à 903) et la propriété (art.~947) ; les modalités, les démembrements, le bail, l'hypothèque et les restrictions de droit public découpent ce faisceau de droits, et l'évaluateur doit nommer le droit qu'il évalue. | ||||
| 500 | +\item La pleine propriété libre de baux se décompose en droit du locateur et droits des locataires ; chaque droit temporaire vaut l'actualisation de ses avantages pendant sa durée, et la réversion l'actualisation de la valeur qui revient à l'échéance. Sous des hypothèses déclarées, les parts s'additionnent. | ||||
| 501 | +\item Pour un bail de logement au Québec, la durée pertinente est celle du maintien dans les lieux, non celle du bail ; la décote du droit du locateur dépend de la rotation attendue bien plus que du niveau de l'écart au marché. | ||||
| 502 | +\item Les définitions de la valeur marchande de l'OEAQ, des IVS 2025, des CUSPAP 2026 et de la LFM convergent sur une transaction hypothétique, datée, entre parties informées et non contraintes, après exposition normale ; elles diffèrent sur l'objet, le paiement et la date. | ||||
| 503 | +\item La valeur réelle au rôle est une base distincte : date de référence légale, pleine propriété réputée libre de baux (art.~45.1), proportion médiane. | ||||
| 504 | +\item Valeur d'investissement, valeur équitable, valeur synergique, valeur de liquidation, juste valeur, valeur assurable et valeur d'usage répondent à des questions différentes et ne sont pas interchangeables. | ||||
| 505 | +\item Le prix est un fait, la valeur une opinion, le coût une dépense ; aucun ne se déduit mécaniquement des autres. | ||||
| 506 | +\item Une hypothèse extraordinaire se divulgue avec son incidence chiffrée sur la valeur et se rappelle à chaque énoncé de la conclusion ; les dates d'évaluation, de référence au marché et de promesse d'achat ne se confondent pas. | ||||
| 507 | +\end{itemize} | ||||
| 508 | +\end{synthese} | ||||
| 509 | + | ||||
| 510 | +\section*{Exercices} | ||||
| 511 | +\addcontentsline{toc}{section}{Exercices} | ||||
| 512 | + | ||||
| 513 | +\begin{exercice}[1]{Quel droit évalue-t-on ?}{ex:2:1} | ||||
| 514 | +Pour chacune des situations suivantes, nommez le droit évalué et les articles du Code civil du Québec qui le fondent, puis indiquez quelle information il faut obtenir pour le décrire complètement : (a) un prêteur demande la valeur d'un triplex dont les trois logements sont loués ; (b) un notaire demande la valeur de la part d'un frère dans une maison détenue en indivision avec sa sœur, la convention d'indivision publiée accordant à celle-ci un droit d'usage exclusif ; (c) un syndicat de copropriété demande la valeur d'une fraction en vue d'une acquisition par le syndicat ; (d) une municipalité a consenti une emphytéose de soixante ans sur un terrain où un promoteur a construit un immeuble de logements, et le promoteur veut vendre son droit vingt ans après ; (e) une famille veut partager un immeuble entre un parent usufruitier et des enfants nus-propriétaires. | ||||
| 515 | +\end{exercice} | ||||
| 516 | + | ||||
| 517 | +\begin{exercice}[1]{Quelle base de valeur ?}{ex:2:2} | ||||
| 518 | +Indiquez la base de valeur appropriée, sa source et la définition applicable pour chacun des mandats suivants, et dites si la valeur obtenue devrait être supérieure, inférieure ou égale à la valeur marchande, en justifiant : (a) financement hypothécaire conventionnel d'un duplex ; (b) contestation de la valeur inscrite au rôle d'évaluation foncière d'un immeuble de huit logements dont les loyers sont très inférieurs au marché ; (c) états financiers d'une société de placement immobilier appliquant les IFRS ; (d) détermination du montant d'assurance d'une copropriété divise de vingt fractions ; (e) rachat par un coïndivisaire de la part de l'autre ; (f) vente d'un immeuble repris par un prêteur qui veut s'en départir dans les soixante jours ; (g) décision d'un investisseur d'acheter ou non à un prix demandé. | ||||
| 519 | +\end{exercice} | ||||
| 520 | + | ||||
| 521 | +\begin{exercice}[2]{La valeur du bail pour le locataire}{ex:2:3} | ||||
| 522 | +Le locataire du logement 103 du cas 3 paie \dollars{728} par mois pour un logement dont le loyer de marché est estimé à \dollars{1047}. Calculez l'écart annuel, puis la valeur du bail pour le locataire, par l'\cref{eq:2:annuite}, s'il se maintient dans les lieux cinq ans, puis dix ans, au taux de \pct{7.25} ; calculez enfin la valeur perpétuelle. Expliquez pourquoi cette valeur n'est pas une valeur marchande au Québec, en citant l'article pertinent, et discutez ce que le locateur pourrait légalement offrir au locataire pour obtenir son départ, compte tenu de ces montants. | ||||
| 523 | +\end{exercice} | ||||
| 524 | + | ||||
| 525 | +\begin{exercice}[2]{Usufruit et nue-propriété}{ex:2:4} | ||||
| 526 | +Un immeuble vaut \dollars{600000} en pleine propriété ; il procure un revenu net de \dollars{30000} la première année, croissant de \pct{1} par an, et le taux d'actualisation du marché est de \pct{6}, de sorte que $V_0 = R_1/(r-g) = \dollars{600000}$. Un usufruit de quinze ans est constitué. Calculez la valeur de l'usufruit comme valeur actuelle des quinze revenus, la valeur de l'immeuble à l'échéance $V_{15} = R_{16}/(r-g)$, la valeur de la nue-propriété comme valeur actuelle de cette réversion, et vérifiez que la somme redonne \dollars{600000}. Quelle part de la pleine propriété revient à l'usufruitier ? Que deviendrait cette part si l'usufruit était viager et que l'espérance de vie de l'usufruitier était de huit ans ? | ||||
| 527 | +\end{exercice} | ||||
| 528 | + | ||||
| 529 | +\begin{exercice}[2]{Valeur au rôle, date de référence et date d'évaluation}{ex:2:5} | ||||
| 530 | +La maison du cas 1 est inscrite au rôle fictif de Gatineau pour \dollars{468000}, avec une date de référence au marché du 1\textsuperscript{er} juillet 2024, et le facteur comparatif du rôle est de 1,00. La date d'évaluation est le 1\textsuperscript{er} septembre 2026. En supposant que les prix des unifamiliales du secteur ont progressé de \pct{4.43} par an (taux annuel composé) sur la période, transportez la valeur au rôle à la date d'évaluation par l'\cref{eq:2:date-indice}. Expliquez ensuite pourquoi le résultat n'est qu'un repère et non une indication de valeur marchande, en distinguant les trois corrections qui séparent une valeur au rôle d'une valeur marchande actuelle, et indiquez quelle disposition de la Loi sur la fiscalité municipale fixe la date de référence. | ||||
| 531 | +\end{exercice} | ||||
| 532 | + | ||||
| 533 | +\begin{exercice}[3]{Rotation, droit du locateur et valeur au rôle}{ex:2:6} | ||||
| 534 | +À l'aide du script \texttt{analysis/python/cases/ch02\_droits.py}, refaites la décomposition de la pleine propriété du cas 3 pour zéro, un, deux et trois logements reloués par an au taux de \pct{7.25}, et relevez la part des locataires dans chaque cas. (a) Expliquez, à partir de l'\cref{eq:2:rotation-va}, pourquoi la part décroît si vite avec la rotation et pourquoi elle est presque insensible au taux d'actualisation. (b) Calculez la valeur de l'écart par la formule fermée pour $\rho = 1/12$ et $\rho = 2/12$ avec $\Delta_1 = \dollars{19697}$, $r = \pct{7.25}$ et $g = \pct{3.5}$, et comparez aux résultats du module ; expliquez l'origine de l'écart. (c) Rédigez un paragraphe de rapport (150 mots) destiné à un propriétaire qui conteste sa valeur au rôle au motif qu'elle excède le prix auquel son immeuble s'est vendu, en vous appuyant sur l'article 45.1 de la Loi sur la fiscalité municipale. | ||||
| 535 | +\end{exercice} | ||||
| 536 | + | ||||
| 537 | +\begin{exercice}[3]{Rédiger et chiffrer une hypothèse extraordinaire}{ex:2:7} | ||||
| 538 | +Un client demande l'évaluation du droit du locateur sur l'immeuble du cas 3 en supposant que les travaux de réfection de la toiture et de la maçonnerie prévus en 2027 pour \dollars{85000} sont déjà réalisés à la date d'évaluation, alors qu'ils ne le sont pas. (a) S'agit-il d'une hypothèse extraordinaire ou d'une condition hypothétique au sens des CUSPAP 2026 ? Quelles règles des NPP s'appliquent ? (b) À partir de la valeur de \dollars{2208566} obtenue avec les travaux en 2027, calculez l'ordre de grandeur de la valeur sous l'hypothèse demandée en remarquant que la dépense de \dollars{85000} à la fin de la première année est actualisée à \pct{7.25} dans le modèle ; expliquez pourquoi la valeur sous l'hypothèse n'augmente pas exactement de \dollars{85000}. (c) Rédigez la divulgation complète exigée par la règle 2.1 c) et l'élément 7 de la règle 2.3 des NPP, telle qu'elle apparaîtrait dans la lettre de transmission et dans la section de conclusion du rapport. (d) Discutez l'usage que le client pourrait faire du rapport et les conditions auxquelles l'évaluateur devrait subordonner son acceptation du mandat. | ||||
| 539 | +\end{exercice} | ||||
| 540 | + | ||||
| 541 | +\section*{Pour aller plus loin} | ||||
| 542 | +\addcontentsline{toc}{section}{Pour aller plus loin} | ||||
| 543 | + | ||||
| 544 | +Les textes primaires sont le point de départ obligé : le Code civil du Québec pour les biens, la propriété, ses modalités et ses démembrements, le bail et l'hypothèque \parencite{ccq} ; la Loi sur la fiscalité municipale pour la valeur réelle, la date de référence et l'article 45.1 \parencite{lfm} ; les Normes de pratique professionnelle de l'OEAQ pour la définition de la valeur marchande, la substance de l'évaluation et les hypothèses extraordinaires \parencite{oeaqNormes} ; l'annexe de la norme IVS 102 pour les bases de valeur internationales \parencite{ivs2025} et les CUSPAP 2026 pour la pratique canadienne \parencite{cuspap2026}. Le seul manuel québécois francophone d'évaluation immobilière, celui de \textcite{achour1992}, fixe le vocabulaire français des droits et des bases de valeur et reste utile malgré son âge ; l'édition canadienne de \emph{The Appraisal of Real Estate} \parencite{appraisalCdn} et la seizième édition américaine \parencite{appraisal2026} exposent le faisceau de droits et les notions de \emph{fee simple}, \emph{leased fee} et \emph{leasehold} dans la tradition nord-américaine, et le \emph{Dictionary of Real Estate Appraisal} \parencite{aiDictionary2022} donne les définitions de référence de la valeur d'usage et de la valeur d'investissement. \textcite{wyatt2022} présente les bases de valeur du Red Book de la RICS et des IVS et compare les cinq méthodes d'évaluation ; \textcite{scarrettOsborn2014} en est le pendant pédagogique. Sur la distinction entre valeur marchande et valeur d'investissement et sur le prix comme réalisation bruitée de la valeur, les traités de \textcite{geltnerMillerClaytonEichholtz2014} et de \textcite{baumCrosbyDevaney2021} sont les références ; \textcite{pagourtzi2003} cartographient les méthodes traditionnelles et avancées que les parties IV à VII de cet ouvrage développent. Enfin, les résumés de décisions du Tribunal administratif du logement \parencite{talResumesDecisions} illustrent concrètement la coupure, propre au Québec, entre le loyer fixé et la valeur locative de marché, que le \cref{ch:34} approfondit. | ||||
modified
manuscript/chapters/ch04.tex
+215 −1
@@ -1,2 +1,216 @@ | |||||
| 1 | \chapter{Marchés résidentiels québécois}\label{ch:04} | 1 | \chapter{Marchés résidentiels québécois}\label{ch:04} | ||
| 2 | −\stubchapter | 2 | + | ||
| 3 | +Les trois premiers chapitres ont posé la théorie : ce qu'est la valeur, quels droits elle rémunère, comment l'offre, la demande et les cycles la font bouger. Le présent chapitre descend sur le terrain. Un évaluateur qui exerce au Québec n'évalue pas « un logement » en général : il évalue un plex de Rosemont dont les baux se renouvellent le 1\ier{} juillet, une copropriété divise de Sainte-Foy dont le fonds de prévoyance vient d'être réévalué, un cottage d'Aylmer dont le rôle triennal change le 1\ier{} janvier 2027. Chacun de ces biens s'échange sur un marché dont la structure, les institutions et les données sont propres au Québec et, souvent, à une région métropolitaine. Le chapitre décrit d'abord la structure du parc telle que la mesure le Recensement de 2021, puis la géographie des six régions métropolitaines de recensement (RMR) qui concentrent plus des deux tiers de la population. Il passe ensuite en revue les sources publiques et privées qui mesurent les prix et les loyers, en insistant sur ce que chacune mesure réellement, avant d'exposer les particularités institutionnelles qui façonnent la demande et l'offre : le plex, la copropriété divise, le 1\ier{} juillet, l'encadrement des loyers, les droits sur les mutations et le rôle d'évaluation. Il présente enfin les acteurs du marché et retrace le cycle des vingt-cinq dernières années. Toutes les données chiffrées de ce chapitre sont réelles, attribuées à leur source et à leur date ; aucune ne provient des dossiers synthétiques des chapitres de cas, qui ne font ici que recevoir leur calibration. | ||||
| 4 | + | ||||
| 5 | +\begin{objectifs} | ||||
| 6 | +À la fin de ce chapitre, le lecteur sait : | ||||
| 7 | +\begin{itemize} | ||||
| 8 | +\item décrire la structure du parc résidentiel québécois par type de construction et mode d'occupation, et mesurer en quoi elle diffère de celle du Canada ; | ||||
| 9 | +\item situer les six RMR du Québec par leur population, leur croissance récente et la place de la location dans leurs ménages ; | ||||
| 10 | +\item nommer les sources publiques et d'industrie qui mesurent les prix et les loyers, dire ce que chacune mesure et ne mesure pas, et éviter les comparaisons indues entre elles ; | ||||
| 11 | +\item calculer et interpréter les indicateurs de conjoncture d'un marché résidentiel : mois d'inventaire, délai de vente, taux d'inoccupation, variation « même échantillon » des loyers, multiplicateur implicite ; | ||||
| 12 | +\item expliquer les particularités institutionnelles du marché québécois et leurs conséquences sur la valeur : plex, copropriété divise, 1\ier{} juillet, encadrement des loyers, droits sur les mutations, cycle du rôle d'évaluation ; | ||||
| 13 | +\item identifier les acteurs du marché et le cadre légal qui régit leur intervention ; | ||||
| 14 | +\item lire le cycle 2000-2026 à travers les taux d'intérêt et les indices de prix, et mesurer la sensibilité du prix soutenable au taux hypothécaire. | ||||
| 15 | +\end{itemize} | ||||
| 16 | +\end{objectifs} | ||||
| 17 | + | ||||
| 18 | +\section{La structure du parc : ce que mesure le Recensement}\label{sec:4:parc} | ||||
| 19 | + | ||||
| 20 | +\subsection{Ménages, logements et modes d'occupation} | ||||
| 21 | + | ||||
| 22 | +La source de référence pour la structure du parc est le Recensement de la population, dont la plus récente édition complète date de 2021. Le Recensement ne dénombre pas les immeubles : il dénombre les \motcle{logements privés occupés} par des ménages, de sorte qu'un triplex y apparaît comme trois logements, et un immeuble de douze appartements comme douze. Cette convention a une conséquence qu'il faut garder à l'esprit tout au long de l'ouvrage : les parts que l'on calcule sont des parts de ménages, non des parts de bâtiments ni de valeur. Un parc où 40 \% des ménages habitent des appartements dans de petits immeubles peut ne compter que 10 \% de ses bâtiments dans cette catégorie, et la part de la valeur foncière qu'elle représente est encore différente. | ||||
| 23 | + | ||||
| 24 | +En 2021, le Québec comptait \num{3749035} ménages privés, dont \num{2245600} propriétaires et \num{1497005} locataires \parencite{statcanrec2021tenure}. Le \motcle{taux de propriété}, défini comme la proportion des ménages qui sont propriétaires de leur logement, | ||||
| 25 | +\begin{equation}\label{eq:4:taux-propriete} | ||||
| 26 | +\tau_P = \frac{H_P}{H} , | ||||
| 27 | +\end{equation} | ||||
| 28 | +où $H_P$ est le nombre de ménages propriétaires et $H$ le nombre total de ménages privés, s'établissait à \pct{59.9} au Québec contre \pct{66.5} au Canada (\num{9955970} propriétaires sur \num{14978945} ménages). Le solde n'est pas exactement composé de locataires : un petit nombre de ménages, \num{6430} au Québec, occupent un logement fourni par une administration locale ou une bande, et le Recensement les classe à part. L'écart de six points et demi entre le Québec et le reste du pays est l'un des traits les plus stables de la démographie du logement canadienne ; il s'est même légèrement creusé entre 2016 et 2021, le taux québécois reculant de 1,4 point selon la série « Perspective géographique » du Recensement \parencite{recensement2021perspective}. Pour l'évaluateur, cet écart signifie deux choses : le marché locatif est proportionnellement plus vaste au Québec qu'ailleurs au Canada, et les immeubles de revenu de petite taille, qui logent une bonne part de ces locataires, y constituent un segment de marché à part entière, avec ses acheteurs, ses prix et ses indicateurs. | ||||
| 29 | + | ||||
| 30 | +\subsection{Les types de construction} | ||||
| 31 | + | ||||
| 32 | +Le Recensement classe les logements en huit types de construction, que le \cref{tab:4:parc} présente pour le Québec et le Canada avec, pour chacun, la part des ménages et le taux de propriété. La lecture de ce tableau fixe les ordres de grandeur que tout le reste de l'ouvrage suppose connus. La \motcle{maison individuelle non attenante} loge \pct{44.6} des ménages québécois, soit huit points de moins qu'au Canada (\pct{52.6}). L'\motcle{appartement dans un immeuble de moins de cinq étages} en loge \pct{33.2}, près du double de la part canadienne (\pct{18.3}) : c'est la catégorie où se rangent les logements des triplex, des quadruplex, des quintuplex et des immeubles de six à trente logements qui forment le tissu des quartiers centraux de Montréal, de Québec et des villes moyennes. Le \motcle{duplex}, au sens du Recensement, désigne un appartement ou un plain-pied dans un bâtiment de deux logements superposés ; il loge \pct{7.2} des ménages québécois contre \pct{5.4} des ménages canadiens. Ensemble, duplex et appartements de moins de cinq étages abritent \num{1512395} ménages, soit \pct{40.3} du total québécois : c'est la mesure la plus directe du poids des « plex » et des petits immeubles locatifs dans le parc, et la raison pour laquelle la partie VI de cet ouvrage leur consacre neuf chapitres. À l'inverse, les appartements dans les tours de cinq étages ou plus ne logent que \pct{6.0} des ménages québécois contre \pct{10.7} au Canada, où la part de Toronto et de Vancouver pèse lourd, et la maison en rangée, forme dominante de la densification en Ontario, ne compte que pour \pct{2.6} des ménages québécois contre \pct{6.6} des ménages canadiens. | ||||
| 33 | + | ||||
| 34 | +\begin{table}[tbp] | ||||
| 35 | +\caption{Ménages privés selon le type de construction résidentielle, Québec et Canada, Recensement de 2021 : nombre, part des ménages et taux de propriété.}\label{tab:4:parc} | ||||
| 36 | +\centering\small | ||||
| 37 | +\begin{tabular}{@{}l S[table-format=7.0] S[table-format=2.1] S[table-format=2.1] S[table-format=2.1] S[table-format=2.1]@{}} | ||||
| 38 | +\toprule | ||||
| 39 | + & \multicolumn{3}{c}{Québec} & \multicolumn{2}{c}{Canada} \\ | ||||
| 40 | +\cmidrule(lr){2-4}\cmidrule(lr){5-6} | ||||
| 41 | +Type de construction & {Ménages} & {Part (\%)} & {Propriétaires (\%)} & {Part (\%)} & {Propriétaires (\%)} \\ | ||||
| 42 | +\midrule | ||||
| 43 | +Maison individuelle non attenante & 1672095 & 44.6 & 92.2 & 52.6 & 89.8 \\ | ||||
| 44 | +Appartement, immeuble de moins de cinq étages & 1242980 & 33.2 & 21.0 & 18.3 & 23.9 \\ | ||||
| 45 | +Appartement ou plain-pied dans un duplex & 269415 & 7.2 & 42.9 & 5.4 & 48.3 \\ | ||||
| 46 | +Appartement, immeuble de cinq étages ou plus & 225795 & 6.0 & 28.7 & 10.7 & 30.3 \\ | ||||
| 47 | +Maison jumelée & 200495 & 5.3 & 81.4 & 5.0 & 74.5 \\ | ||||
| 48 | +Maison en rangée & 99205 & 2.6 & 71.8 & 6.6 & 63.5 \\ | ||||
| 49 | +Logement mobile & 23640 & 0.6 & 87.0 & 1.3 & 82.8 \\ | ||||
| 50 | +Autre maison individuelle attenante & 15405 & 0.4 & 48.0 & 0.2 & 47.5 \\ | ||||
| 51 | +\midrule | ||||
| 52 | +Ensemble des ménages privés & 3749035 & 100.0 & 59.9 & 100.0 & 66.5 \\ | ||||
| 53 | +\bottomrule | ||||
| 54 | +\end{tabular} | ||||
| 55 | +\tabsource{Statistique Canada, Recensement de la population de 2021, tableau 98-10-0240-01 (extraction WDS du 31 octobre 2026, \texttt{data/raw/statcan\_recensement2021/}), licence ouverte de Statistique Canada ; parts et taux calculés par \texttt{analysis/python/cases/ch04\_marches.py}. Les effectifs sont soumis à l'arrondi aléatoire du Recensement (multiples de 5) ; la somme des types diffère du total de cinq ménages.} | ||||
| 56 | +\end{table} | ||||
| 57 | + | ||||
| 58 | +Le taux de propriété par type de construction, dans les deux dernières colonnes de chaque bloc, révèle la seconde particularité du Québec. La maison individuelle est presque toujours occupée par son propriétaire (\pct{92.2}), comme partout au Canada. Mais le duplex québécois est majoritairement locatif : \pct{42.9} seulement de ses occupants sont propriétaires, ce qui veut dire qu'un peu moins de la moitié des duplex sont habités par leur propriétaire, l'autre logement étant loué, et que les autres sont entièrement loués. Les appartements de moins de cinq étages ne sont occupés par un propriétaire que dans \pct{21.0} des cas ; ce cinquième correspond pour l'essentiel aux copropriétés divises de petite taille et aux propriétaires occupants de triplex et de quadruplex. L'évaluateur retient de ces chiffres que l'acheteur type d'un plex est, au Québec, tantôt un propriétaire occupant qui achète d'abord un logement et accessoirement un revenu, tantôt un petit investisseur qui achète d'abord un revenu ; le \cref{ch:32} montre que cette dualité de la demande explique pourquoi la méthode de comparaison et la méthode du revenu y conduisent souvent à des indications différentes. | ||||
| 59 | + | ||||
| 60 | +\begin{figure}[tbp] | ||||
| 61 | +\centering | ||||
| 62 | +\includegraphics[width=\linewidth]{ch04/ch04-fig-parc-types.pdf} | ||||
| 63 | +\caption{Structure du parc en 2021. À gauche, part des ménages privés par type de construction au Québec et au Canada : la maison individuelle domine partout, mais le Québec se distingue par le poids des appartements dans de petits immeubles et des duplex, et par la faiblesse des tours et des maisons en rangée. À droite, partage propriétaires-locataires de chaque type au Québec : les duplex et les petits immeubles sont majoritairement locatifs.}\label{fig:4:parc} | ||||
| 64 | +\figsource{Statistique Canada, Recensement de 2021, tableau 98-10-0240-01 (licence ouverte), consulté le 31 octobre 2026 ; script \texttt{analysis/python/figures/ch04\_parc.py}.} | ||||
| 65 | +\end{figure} | ||||
| 66 | + | ||||
| 67 | +\subsection{Mesurer l'écart de structure} | ||||
| 68 | + | ||||
| 69 | +Dire que le Québec « a plus de plex » est une impression ; la mesurer est une autre affaire. L'outil le plus simple est l'\motcle{indice de dissimilarité}, emprunté à la démographie, qui compare deux distributions de parts $s_i^{A}$ et $s_i^{B}$ sur les mêmes catégories $i = 1, \dots, K$ : | ||||
| 70 | +\begin{equation}\label{eq:4:dissimilarite} | ||||
| 71 | +D = \frac{1}{2}\sum_{i=1}^{K} \abs{s_i^{A} - s_i^{B}}, \qquad 0 \le D \le 1 . | ||||
| 72 | +\end{equation} | ||||
| 73 | +L'indice s'interprète comme la proportion des ménages de l'une des deux populations qu'il faudrait reclasser dans un autre type pour que les deux structures coïncident. Il vaut zéro si les structures sont identiques et un si elles n'ont aucune catégorie en commun. Appliqué aux huit types du \cref{tab:4:parc}, il donne $D = 0{,}1715$ entre le Québec et le Canada : il faudrait déplacer 17 \% des ménages québécois d'un type vers un autre, essentiellement des appartements de petits immeubles vers des maisons individuelles, des tours et des maisons en rangée, pour retrouver la structure canadienne. Cet ordre de grandeur sert de référence pour les comparaisons entre régions au \cref{ch:15}, où le même indice mesure l'écart entre un quartier et sa RMR, et il rappelle que les barèmes et les ratios importés du reste du Canada, de l'Ontario en particulier, s'appliquent à un parc dont la composition est sensiblement différente. | ||||
| 74 | + | ||||
| 75 | +\section{Les régions métropolitaines}\label{sec:4:rmr} | ||||
| 76 | + | ||||
| 77 | +\subsection{Six RMR, les trois quarts de la population} | ||||
| 78 | + | ||||
| 79 | +Le Québec compte sept régions métropolitaines de recensement depuis que Drummondville a accédé à ce statut en 2021. Le présent ouvrage en retient six, celles qui disposent d'une couverture statistique complète pour les prix et les loyers : Montréal, Québec, la partie québécoise d'Ottawa-Gatineau, Sherbrooke, Trois-Rivières et Saguenay. Le \cref{tab:4:rmr} rassemble pour chacune les indicateurs structurels et conjoncturels dont le chapitre fait usage, avec la source et la date de chaque colonne ; la \cref{fig:4:carte} les situe. Au 1\ier{} juillet 2025, les estimations démographiques de Statistique Canada attribuaient \num{4597837} habitants à la RMR de Montréal, \num{903607} à celle de Québec, \num{374226} à la partie québécoise d'Ottawa-Gatineau, \num{243911} à Sherbrooke, \num{174316} à Trois-Rivières et \num{170192} à Saguenay \parencite{statcanpoprmr}. Ensemble, ces six RMR regroupent \pct{71.4} de la population provinciale estimée à \num{9058297} personnes pour 2025 par l'Institut de la statistique du Québec \parencite{isqmunicipalites2026} ; avec Drummondville, l'ensemble des RMR en regroupe \pct{72.6}. Montréal seule en représente la moitié. Cette concentration a une conséquence directe pour la disponibilité des données : les sources industrielles et la SCHL publient des indicateurs trimestriels ou annuels pour ces six territoires, tandis que les municipalités hors RMR ne disposent souvent que des médianes de JLR par région administrative, du rôle d'évaluation et des ventes du registre foncier. | ||||
| 80 | + | ||||
| 81 | +\begin{figure}[tbp] | ||||
| 82 | +\centering | ||||
| 83 | +\includegraphics[width=0.92\linewidth]{ch04/ch04-fig-carte-rmr.pdf} | ||||
| 84 | +\caption{Les six régions métropolitaines de recensement retenues dans l'ouvrage, situées par les coordonnées de leur ville centre ; la surface de chaque cercle est proportionnelle à la population au 1\ier{} juillet 2025. Montréal pèse cinq fois Québec et douze fois Gatineau ; les trois RMR de l'axe du Saint-Laurent regroupent l'essentiel de la population urbaine. Schéma sans fond de carte.}\label{fig:4:carte} | ||||
| 85 | +\figsource{positions : Ressources naturelles Canada, Base de données toponymiques du Canada (service \emph{geonames}, consulté le 31 octobre 2026) ; population : Statistique Canada, tableau 17-10-0148-01 (licence ouverte) ; script \texttt{analysis/python/figures/ch04\_carte.py}.} | ||||
| 86 | +\end{figure} | ||||
| 87 | + | ||||
| 88 | +\subsection{Croissance démographique et demande de logements} | ||||
| 89 | + | ||||
| 90 | +La demande de logements est d'abord une affaire de ménages, et les ménages suivent la population. Le \motcle{taux de croissance annuel composé} (TCAC) entre deux années $t_0$ et $t_1$, | ||||
| 91 | +\begin{equation}\label{eq:4:tcac} | ||||
| 92 | +g = \left(\frac{N_{t_1}}{N_{t_0}}\right)^{1/(t_1 - t_0)} - 1 , | ||||
| 93 | +\end{equation} | ||||
| 94 | +permet de comparer des RMR de tailles très différentes. Entre le 1\ier{} juillet 2020 et le 1\ier{} juillet 2025, il s'est établi à \pct{1.08} par année pour Montréal, \pct{1.46} pour Québec, \pct{1.18} pour Gatineau, \pct{1.55} pour Sherbrooke, \pct{1.56} pour Trois-Rivières et \pct{0.96} pour Saguenay, soit \pct{1.17} pour l'ensemble des RMR \parencite{statcanpoprmr}. Deux faits ressortent. Montréal est la seule RMR dont la population a reculé en 2021 (de \num{4356853} à \num{4330143}), effet des départs vers les couronnes et les villes moyennes pendant la pandémie, avant de rebondir fortement en 2023 et 2024 avec la reprise de l'immigration ; les villes moyennes, Sherbrooke et Trois-Rivières en tête, ont connu la croissance la plus rapide de la période. Le ralentissement est net en 2025 : la croissance annuelle n'est plus que de \pct{0.55} à Montréal, \pct{1.00} à Québec et \pct{0.95} à Gatineau. Les projections démographiques de l'ISQ publiées le 9 juillet 2026 prolongent ce ralentissement : le scénario de référence prévoit un recul de la population québécoise d'environ \num{50000} personnes, soit \pct{0.6}, entre 2025 et 2029, puis une stabilisation, avec des trajectoires régionales divergentes à l'horizon 2051, de $-3$ \% pour la RMR de Montréal et $-6$ \% pour Saguenay à $+16$ \% pour la RMR de Québec \parencite{isqprojections2026}. Pour l'évaluateur, ces projections ne sont pas des prédictions de prix : elles indiquent dans quelles RMR la demande structurelle soutient la valeur à long terme et dans lesquelles l'analyse de la plus haute et meilleure utilisation d'un terrain doit intégrer un risque de demande (\cref{ch:41}). | ||||
| 95 | + | ||||
| 96 | +\subsection{La place de la location dans les RMR} | ||||
| 97 | + | ||||
| 98 | +Le tableau 98-10-0231-01 du Recensement donne le mode d'occupation des ménages par RMR. En 2021, la RMR de Montréal comptait \num{1835705} ménages dont \num{837470} locataires, soit \pct{45.6} ; celle de Québec \num{387955} ménages dont \num{161800} locataires (\pct{41.7}) ; la RMR d'Ottawa-Gatineau, mesurée dans son ensemble puisque l'extraction ne sépare pas ses deux parties, \num{604720} ménages dont \num{208995} locataires (\pct{34.6}) \parencite{recensement2021mode}. La part des locataires dans la RMR de Montréal est ainsi supérieure de près de six points à la moyenne provinciale (\pct{39.9}) et de treize points à la moyenne canadienne (\pct{33.1}). Le parc locatif que suit la SCHL en donne une autre mesure : son univers d'appartements d'initiative privée dans les immeubles de trois logements et plus comptait, en octobre 2025, \num{667266} logements dans la RMR de Montréal, \num{118693} dans celle de Québec, \num{33553} dans la partie québécoise de Gatineau, \num{41949} à Sherbrooke, \num{22505} à Trois-Rivières et \num{16241} à Saguenay \parencite{schlrmltables2025}. Ces effectifs fixent la taille du marché sur lequel s'appliquent les méthodes de la partie VI et, pour le praticien, le nombre de comparables potentiels dont il dispose. | ||||
| 99 | + | ||||
| 100 | +\begin{table}[tbp] | ||||
| 101 | +\caption{Indicateurs par RMR : population, croissance, parc locatif, prix médians, conjoncture et loyers. Chaque colonne indique sa source et sa période ; les chiffres de l'APCIQ sont cités avec attribution et ne constituent pas une reproduction de ses tableaux.}\label{tab:4:rmr} | ||||
| 102 | +\centering\footnotesize\setlength{\tabcolsep}{3.2pt} | ||||
| 103 | +\begin{tabular}{@{}l S[table-format=7.0] S[table-format=1.2] S[table-format=6.0] S[table-format=6.0] S[table-format=6.0] S[table-format=6.0] S[table-format=1.1] S[table-format=1.1] S[table-format=4.0] S[table-format=3.1]@{}} | ||||
| 104 | +\toprule | ||||
| 105 | + & {Pop.} & {TCAC} & {Univers} & {Unifam.} & {Copro.} & {Plex} & {Mois} & {Inocc.} & {Loyer} & {IPLN} \\ | ||||
| 106 | +RMR & {2025} & {20-25 (\%)} & {SCHL} & {(\$)} & {(\$)} & {(\$)} & {d'inv.} & {(\%)} & {2 ch. (\$)} & {09-2026} \\ | ||||
| 107 | +\midrule | ||||
| 108 | +Montréal & 4597837 & 1.08 & 667266 & 645500 & 435000 & 860500 & 6.6 & 2.9 & 1346 & 159.5 \\ | ||||
| 109 | +Québec & 903607 & 1.46 & 118693 & 463500 & 334900 & 600000 & 3.1 & 2.4 & 1277 & 144.2 \\ | ||||
| 110 | +Gatineau (partie QC) & 374226 & 1.18 & 33553 & 480000 & 297450 & 617500 & 6.5 & 3.8 & 1460 & 116.6 \\ | ||||
| 111 | +Sherbrooke & 243911 & 1.55 & 41949 & 490750 & 327000 & 544500 & 4.4 & 2.7 & 1062 & 112.1 \\ | ||||
| 112 | +Trois-Rivières & 174316 & 1.56 & 22505 & 395000 & 287000 & 420000 & 3.6 & 2.7 & 1016 & 119.4 \\ | ||||
| 113 | +Saguenay & 170192 & 0.96 & 16241 & 365500 & {n.~d.} & 373500 & 4.0 & 1.3 & 985 & {---} \\ | ||||
| 114 | +\midrule | ||||
| 115 | +Province & 9058297 & {---} & {---} & 500000 & 400000 & 699000 & 6.1 & {---} & {---} & 150.0 \\ | ||||
| 116 | +\bottomrule | ||||
| 117 | +\end{tabular} | ||||
| 118 | +\tabsource{Population au 1\ier{} juillet 2025 et TCAC 2020-2025 : Statistique Canada, tableau 17-10-0148-01 (province : ISQ, 2025 provisoire). Univers SCHL (appartements d'initiative privée, immeubles de 3 logements et plus), taux d'inoccupation (tous les logements) et loyer moyen des logements de deux chambres : SCHL, Enquête sur les logements locatifs, octobre 2025, tableaux 1.1.1 à 1.1.3, publiés le 11 décembre 2025. Prix médians (unifamiliale, copropriété, plex de 2 à 5 logements) et mois d'inventaire (inscriptions en vigueur divisées par les ventes mensuelles moyennes du trimestre) : APCIQ par le système Centris, 3\ieme{} trimestre 2026, communiqué du 14 octobre 2026 et baromètres FSMI ; n.~d. : médiane non publiée (27 ventes). IPLN, total maison et terrain, déc.~2016 = 100 : Statistique Canada, tableau 18-10-0205-01, septembre 2026 (Saguenay non couvert). Toutes sources consultées le 31 octobre 2026 ; calculs \texttt{analysis/python/cases/ch04\_marches.py}.} | ||||
| 119 | +\end{table} | ||||
| 120 | + | ||||
| 121 | +\section{Prix et loyers : les séries publiques et leurs limites}\label{sec:4:prix} | ||||
| 122 | + | ||||
| 123 | +\subsection{Six sources, six objets de mesure} | ||||
| 124 | + | ||||
| 125 | +Le marché résidentiel québécois est mesuré par plusieurs producteurs de données qui ne mesurent ni la même chose, ni au même moment, ni sur le même périmètre. Confondre leurs chiffres est l'erreur la plus fréquente dans les rapports d'évaluation et dans la presse. Le \cref{tab:4:sources} compare les six sources principales ; les paragraphes qui suivent précisent ce que chacune mesure. | ||||
| 126 | + | ||||
| 127 | +\begin{table}[tbp] | ||||
| 128 | +\caption{Sources de mesure des prix et des loyers résidentiels au Québec : objet mesuré, périmètre, périodicité, conditions d'utilisation.}\label{tab:4:sources} | ||||
| 129 | +\centering\small | ||||
| 130 | +\begin{tabularx}{\textwidth}{@{}L{24mm}YYL{30mm}@{}} | ||||
| 131 | +\toprule | ||||
| 132 | +Source & Ce qu'elle mesure & Périmètre et périodicité & Conditions \\ | ||||
| 133 | +\midrule | ||||
| 134 | +APCIQ (système Centris) & Prix médians et nombre de ventes conclues par l'entremise d'un courtier, inscriptions en vigueur, délais de vente, par catégorie (unifamiliale, copropriété, plex de 2 à 5 logements) & Province, RMR, secteurs Centris ; mensuel et trimestriel ; ventes signées (promesse acceptée) & Attribution obligatoire « par le système Centris » ; usage commercial soumis à consentement ; tableaux non reproductibles \\ | ||||
| 135 | +JLR (Equifax) & Prix médians de toutes les ventes publiées au Registre foncier, après exclusion des ventes liées, reprises et montants inférieurs à \dollars{5000} ; seuil de 30 transactions & Province, RMR, régions administratives ; mensuel ; date de l'acte & Rapport mensuel gratuit, citation « Source : JLR.ca » ; données détaillées par abonnement \\ | ||||
| 136 | +Teranet--Banque Nationale & Indice de prix par ventes répétées (juin 2005 = 100), désaisonnalisé & Onze RMR canadiennes dont Montréal et Québec ; mensuel & Rapport mensuel public ; données C11 téléchargeables \\ | ||||
| 137 | +Statistique Canada, IPLN (18-10-0205-01) & Prix de vente des logements neufs des constructeurs, à qualité constante, maison et terrain séparés (déc.~2016 = 100) & Provinces et RMR dont Montréal, Québec, Ottawa-Gatineau (partie QC), Sherbrooke, Trois-Rivières ; mensuel & Licence ouverte \\ | ||||
| 138 | +SCHL, Enquête sur les logements locatifs & Taux d'inoccupation, loyers moyens, univers, variation « même échantillon », rotation, par taille de logement et d'immeuble, zone & Centres de \num{10000} habitants et plus ; immeubles d'initiative privée de 3 logements et plus ; octobre, publié en décembre & Chiffres citables avec attribution ; fichiers non redistribuables \\ | ||||
| 139 | +Rôle d'évaluation foncière (MAMH, données ouvertes) & Valeur réelle de chaque unité à la date de référence du rôle (terrain, bâtiment), superficies, âge, nombre de logements & Toutes les municipalités ; triennal, date de référence au 1\ier{} juillet du 2\ieme{} exercice précédent & CC BY 4.0 ; interdiction de réidentifier \\ | ||||
| 140 | +\bottomrule | ||||
| 141 | +\end{tabularx} | ||||
| 142 | +\tabsource{synthèse de l'auteur d'après \textcite{apciqconditions,jlr202609,teranet202609,statcanipln,schlLocatif2025,dqroles}, consultés le 31 octobre 2026.} | ||||
| 143 | +\end{table} | ||||
| 144 | + | ||||
| 145 | +Les \motcle{prix médians de l'APCIQ} sont les plus cités. Ils portent sur les ventes conclues par l'entremise d'un courtier inscrit au système Centris, datées de l'acceptation de la promesse d'achat, et sont publiés par catégorie de propriété pour la province, les RMR et des secteurs infra-métropolitains. Au troisième trimestre de 2026, l'APCIQ rapportait \num{20935} ventes résidentielles au Québec, en recul de 7 \% sur un an, \num{42408} inscriptions en vigueur, en hausse de 20 \%, et des prix médians de \dollars{500000} pour l'unifamiliale, \dollars{400000} pour la copropriété et \dollars{699000} pour le plex de deux à cinq logements \parencite{apciqt32026}. Ces chiffres excluent les ventes sans courtier, qui représentent une part variable du marché selon les régions et les segments, et une médiane ne corrige pas la composition : si les ventes de maisons plus grandes ou mieux situées augmentent, la médiane monte sans qu'aucun prix individuel n'ait bougé. Les \motcle{médianes de JLR} reposent au contraire sur l'ensemble des actes publiés au Registre foncier, datés de la signature chez le notaire, donc postérieurs d'un à trois mois à la promesse d'achat ; pour les douze mois se terminant en septembre 2026, JLR rapportait une médiane provinciale de \dollars{483000} pour l'unifamiliale et de \dollars{622000} pour les immeubles de deux à cinq logements \parencite{jlr202609}. L'écart avec les médianes de l'APCIQ tient à la période, au périmètre et à la définition des catégories, non à une erreur de l'une ou de l'autre. L'\motcle{indice Teranet--Banque Nationale}, enfin, est le seul indice de prix au sens strict pour le marché de la revente : il repose sur les ventes répétées d'un même immeuble, méthode présentée au \cref{ch:35}, et il neutralise ainsi l'effet de composition. En septembre 2026, il s'établissait à 310,62 pour Montréal (juin 2005 = 100), en hausse de 1,4 \% sur un an et à 1,8 \% sous son sommet de mars 2026, et à 327,56 pour Québec, en hausse de 7,7 \% sur un an et à son sommet \parencite{teranet202609}. | ||||
| 146 | + | ||||
| 147 | +Du côté des logements neufs, l'\motcle{Indice des prix des logements neufs} (IPLN) de Statistique Canada mesure chaque mois l'évolution du prix de vente demandé par les constructeurs pour des maisons neuves de caractéristiques constantes, en distinguant la composante maison et la composante terrain. Il ne mesure pas le prix des reventes, et il ne doit pas être confondu avec l'indice des prix de la construction de bâtiments (IPCB), qui mesure un coût et que le \cref{ch:21} utilise ; l'un est un prix de marché, l'autre un coût de production, et leur écart est précisément ce que l'évaluateur appelle l'incitatif ou, selon le cycle, la prime de rareté. Du côté des loyers, l'\motcle{Enquête sur les logements locatifs} (ELL) de la SCHL, conduite chaque octobre et publiée en décembre, est la source officielle ; sa méthodologie est détaillée plus bas, parce qu'elle conditionne l'usage que l'on peut faire de ses chiffres. | ||||
| 148 | + | ||||
| 149 | +\subsection{Les prix des logements neufs : une décennie de divergence régionale} | ||||
| 150 | + | ||||
| 151 | +La \cref{fig:4:ipln} trace l'IPLN total de cinq RMR québécoises et du Canada de janvier 2010 à septembre 2026. Trois enseignements s'en dégagent. Le premier est la divergence régionale : jusqu'en 2016, les cinq RMR évoluent presque de concert ; à partir de 2020, Montréal décroche vers le haut, Québec suit avec retard, tandis que Gatineau, Sherbrooke et Trois-Rivières progressent beaucoup moins. En septembre 2026, l'indice atteint 159,5 à Montréal, soit une hausse de \pct{59.5} depuis décembre 2016, 144,2 à Québec (\pct{44.2}), 119,4 à Trois-Rivières, 116,6 dans la partie québécoise de Gatineau et 112,1 à Sherbrooke, contre 120,2 pour le Canada \parencite{statcanipln}. Le deuxième enseignement est la concentration de la hausse dans l'épisode pandémique : entre janvier 2020 et décembre 2022, l'indice montréalais a gagné \pct{35.6}, celui de Québec \pct{25.0}, celui de la province \pct{30.2}, alors que Gatineau ne gagnait que \pct{9.2} et Sherbrooke \pct{7.3}. Le troisième est la désynchronisation récente entre le Québec et le reste du pays : l'indice canadien culmine en août 2022 à 126,1 et recule depuis, de \pct{2.0} sur les douze mois se terminant en septembre 2026, tandis que les indices de Montréal et de Québec atteignent leur sommet historique en 2026, avec des hausses annuelles de \pct{1.2} et \pct{1.9}. | ||||
| 152 | + | ||||
| 153 | +\begin{figure}[tbp] | ||||
| 154 | +\centering | ||||
| 155 | +\includegraphics[width=\linewidth]{ch04/ch04-fig-ipln-rmr.pdf} | ||||
| 156 | +\caption{Indice des prix des logements neufs, total maison et terrain (déc.~2016 = 100), janvier 2010 à septembre 2026. Les cinq RMR québécoises couvertes par l'indice évoluent de concert jusqu'en 2016, puis divergent fortement : Montréal et Québec poursuivent leur hausse jusqu'en 2026, Gatineau, Sherbrooke et Trois-Rivières plafonnent, et l'indice canadien recule depuis son sommet d'août 2022. La bande grisée marque l'épisode pandémique.}\label{fig:4:ipln} | ||||
| 157 | +\figsource{Statistique Canada, tableau 18-10-0205-01 (vecteurs v111955484, v111955475, v111955487, v111955478, v111955481, v111955442), diffusé le 22 octobre 2026, consulté le 31 octobre 2026, licence ouverte ; fichier brut \texttt{data/raw/statcan\_18100205/18100205.csv} ; script \texttt{analysis/python/figures/ch04\_ipln.py}.} | ||||
| 158 | +\end{figure} | ||||
| 159 | + | ||||
| 160 | +La décomposition entre maison et terrain, propre à l'IPLN, éclaire la nature de la hausse. À Montréal, la composante maison est passée de 100 à 169,9 depuis décembre 2016 et la composante terrain à 132,6 ; pour l'ensemble de la province, 158,3 et 128,0. Le prix du bâtiment neuf a donc progressé près de deux fois plus vite que celui du terrain sur la période, ce qui est cohérent avec la poussée des coûts de construction mesurée par l'IPCB au \cref{ch:21} et avec le relâchement de la demande foncière dans les couronnes après 2022. L'évaluateur qui applique la méthode du coût à une maison récente de la région de Montréal y trouve une confirmation indépendante que la part du terrain dans la valeur a reculé pendant cette période, contrairement à l'intuition courante selon laquelle « c'est le terrain qui monte ». | ||||
| 161 | + | ||||
| 162 | +\subsection{Le marché locatif selon la SCHL : lire correctement l'Enquête} | ||||
| 163 | + | ||||
| 164 | +L'Enquête sur les logements locatifs porte sur les appartements d'initiative privée situés dans des immeubles d'au moins trois logements, dans les centres de \num{10000} habitants et plus ; elle exclut donc les duplex, les logements loués dans des maisons, les copropriétés offertes en location, qui font l'objet d'une enquête distincte, et les logements sociaux. Elle est menée en octobre, à un moment où le marché locatif québécois est au creux de son cycle saisonnier, trois mois après la vague des déménagements du 1\ier{} juillet. Le \motcle{taux d'inoccupation} est la proportion des logements de l'univers qui sont physiquement inoccupés et offerts en location le jour de l'enquête ; il ne mesure ni la vacance économique d'un immeuble, qui inclut les loyers impayés et les logements vacants entre deux baux (\cref{ch:27}), ni la disponibilité, qui ajoute les logements dont le locataire a donné son avis de départ. | ||||
| 165 | + | ||||
| 166 | +La SCHL publie deux mesures de l'évolution des loyers qu'il ne faut jamais confondre. La \motcle{variation brute} compare le loyer moyen de l'année à celui de l'année précédente : | ||||
| 167 | +\begin{equation}\label{eq:4:var-brute} | ||||
| 168 | +\Delta^{\text{brut}} = \frac{\bar L_{t}}{\bar L_{t-1}} - 1 , | ||||
| 169 | +\end{equation} | ||||
| 170 | +où $\bar L_t$ est le loyer moyen de tous les logements enquêtés en $t$. La \motcle{variation estimative sur logements comparables}, dite « même échantillon », compare les loyers des mêmes logements d'une année à l'autre : | ||||
| 171 | +\begin{equation}\label{eq:4:var-meme} | ||||
| 172 | +\Delta^{\text{même}} = \frac{\sum_{j \in \mathcal{S}} L_{j,t}}{\sum_{j \in \mathcal{S}} L_{j,t-1}} - 1 , | ||||
| 173 | +\end{equation} | ||||
| 174 | +où $\mathcal{S}$ est l'ensemble des logements présents dans l'enquête aux deux dates. La première mesure mêle la hausse des loyers et le changement de composition de l'univers, puisque les logements neufs, plus chers, y entrent chaque année et que les immeubles démolis ou convertis en sortent ; la seconde isole la hausse à composition constante. Pour la RMR de Montréal, le loyer moyen des logements de deux chambres est passé de \dollars{1176} en octobre 2024 à \dollars{1346} en octobre 2025, soit une variation brute de \pct{14.5}, alors que la variation sur logements comparables n'est que de \pct{7.2} \parencite{schlrmltables2025} : la moitié de la hausse apparente tient à l'entrée de logements neufs dans l'univers. L'effet de composition joue dans les deux sens : à Sherbrooke, la variation brute des loyers de deux chambres (\pct{6.0}) est inférieure à la variation sur logements comparables (\pct{9.8}). C'est la seconde mesure qui renseigne sur ce qu'un propriétaire a pu obtenir de ses locataires existants et sur la croissance $g$ des revenus dans un modèle de flux actualisés (\cref{ch:30}) ; la première renseigne sur le niveau de loyer d'un immeuble neuf par rapport au parc existant. | ||||
| 175 | + | ||||
| 176 | +\begin{figure}[tbp] | ||||
| 177 | +\centering | ||||
| 178 | +\includegraphics[width=\linewidth]{ch04/ch04-fig-schl-rmr.pdf} | ||||
| 179 | +\caption{Marché locatif des six RMR, appartements d'initiative privée de trois logements et plus. À gauche, taux d'inoccupation de l'ensemble des logements en octobre 2024 et en octobre 2025 : la détente est générale sauf à Saguenay, et Gatineau franchit le seuil de 3 \%. À droite, loyer moyen des logements de deux chambres en octobre 2025 : Gatineau est la RMR la plus chère, devant Montréal et Québec ; les trois villes moyennes se situent autour de \dollars{1000}.}\label{fig:4:schl} | ||||
| 180 | +\figsource{SCHL, Enquête sur les logements locatifs, octobre 2025 (Rapport sur le marché locatif publié le 11 décembre 2025), tableaux 1.1.1 et 1.1.2 des tableaux de données par centre, consultés le 31 octobre 2026 ; chiffres cités avec attribution conformément aux conditions d'utilisation de la SCHL ; script \texttt{analysis/python/figures/ch04\_schl.py}.} | ||||
| 181 | +\end{figure} | ||||
| 182 | + | ||||
| 183 | +La \cref{fig:4:schl} résume la situation d'octobre 2025. Le taux d'inoccupation de l'ensemble des logements s'établissait à \pct{2.9} dans la RMR de Montréal (\pct{2.1} un an plus tôt), \pct{2.4} à Québec (\pct{0.9}), \pct{3.8} dans la partie québécoise de Gatineau (\pct{1.9}), \pct{2.7} à Sherbrooke (\pct{1.4}) et à Trois-Rivières (\pct{0.9}), et \pct{1.3} à Saguenay (\pct{1.6}) \parencite{schlrmltables2025}. La détente est générale et rapide, après plusieurs années de taux historiquement bas ; elle s'explique par les livraisons de logements neufs de 2023-2025 et par le ralentissement démographique, et elle s'accompagne d'une hausse des loyers sur logements comparables qui reste vive, de \pct{4.5} à Gatineau à \pct{12.5} à Saguenay pour l'ensemble des logements. Le seuil de 3 \% a une portée juridique précise au Québec : la Loi 65, qui suspend les évictions pour subdivision, agrandissement ou changement d'affectation jusqu'au 6 juin 2027, prévoit à son article 11 une fin anticipée du moratoire si le taux d'inoccupation des centres de \num{10000} habitants et plus mesuré par la SCHL atteint 3 \% \parencite{loi65_2024} ; à la date de rédaction, aucun avis de fin anticipée n'avait été publié. | ||||
| 184 | + | ||||
| 185 | +\subsection{Les indicateurs de conjoncture} | ||||
| 186 | + | ||||
| 187 | +Trois indicateurs simples, calculables à partir des chiffres publiés, résument l'état d'un marché de la revente. Les \motcle{mois d'inventaire} rapportent le stock d'inscriptions en vigueur au rythme des ventes : | ||||
| 188 | +\begin{equation}\label{eq:4:mois-inventaire} | ||||
| 189 | +M = \frac{I}{V_{\text{trim}} / 3} , | ||||
| 190 | +\end{equation} | ||||
| 191 | +où $I$ est le nombre d'inscriptions en vigueur à la fin du trimestre et $V_{\text{trim}}$ le nombre de ventes du trimestre ; $M$ est le nombre de mois qu'il faudrait pour écouler le stock au rythme courant. Au troisième trimestre de 2026, il valait 6,1 mois pour la province, 6,6 pour Montréal, 3,1 pour Québec, 6,5 pour Gatineau, 4,4 pour Sherbrooke, 3,6 pour Trois-Rivières et 4,0 pour Saguenay, d'après les ventes et inscriptions publiées par l'APCIQ \parencite{apciqt32026}. La pratique nord-américaine qualifie de favorable aux vendeurs un marché sous quatre mois environ, d'équilibré un marché de quatre à six mois et de favorable aux acheteurs un marché au-delà ; ces bornes sont des usages, non des normes, et elles dépendent du segment. Elles disent néanmoins que, fin 2026, les marchés de Montréal et de Gatineau sont revenus à l'équilibre ou l'ont dépassé, alors que Québec et Trois-Rivières restent tendus, ce que confirment les délais de vente médians de l'unifamiliale, 40 jours à Montréal, 34 à Gatineau et 29 à Québec. Le \motcle{délai de vente}, second indicateur, est la durée médiane entre l'inscription et la promesse d'achat acceptée ; il croît avec les mois d'inventaire et il entre dans la définition de la valeur marchande par la condition d'une « mise en vente d'une durée suffisante » (\cref{ch:2}). | ||||
| 192 | + | ||||
| 193 | +Le troisième indicateur relie le marché de la propriété à celui de la location. Le \motcle{ratio prix sur loyer annuel} et son inverse, le rendement locatif brut, s'écrivent | ||||
| 194 | +\begin{equation}\label{eq:4:prix-loyer} | ||||
| 195 | +\frac{P}{12\,L} \qquad\text{et}\qquad y = \frac{12\,L}{P} , | ||||
| 196 | +\end{equation} | ||||
| 197 | +où $P$ est le prix d'un logement et $L$ son loyer mensuel de marché. Pour un immeuble de revenu, le même rapport est le multiplicateur du revenu brut (MRB), que le \cref{ch:29} relie au taux de capitalisation. En l'absence de prix et de loyers appariés, on peut en construire un ordre de grandeur à partir des séries publiques : le prix médian d'un plex de deux à cinq logements dans la RMR de Montréal au troisième trimestre de 2026, \dollars{860500}, rapporté au revenu annuel de trois logements loués au loyer moyen des deux chambres d'octobre 2025, \dollars{1346}, donne un MRB implicite de 17,8 ; le même calcul donne 13,1 à Québec, 11,8 à Gatineau, 14,2 à Sherbrooke, 11,5 à Trois-Rivières et 10,5 à Saguenay. Ces chiffres sont des illustrations, non des mesures : le plex médian n'a pas trois logements de deux chambres loués au loyer moyen du parc, et ses loyers en place sont souvent inférieurs au marché. Mais leur dispersion est instructive : à Montréal, l'acheteur d'un plex paie près de dix-huit années de loyers bruts, ce que seul un propriétaire occupant, ou un investisseur qui anticipe une hausse des loyers et de la valeur, peut justifier ; à Saguenay ou à Trois-Rivières, le même immeuble se paie dix à onze années de loyers et se finance presque par ses revenus. C'est la première raison pour laquelle le \cref{ch:32} refuse d'appliquer un MRB montréalais à un plex de région. | ||||
| 198 | + | ||||
| 199 | +\section{Exemple intégral : la fiche de marché de deux RMR}\label{sec:4:exemple} | ||||
| 200 | + | ||||
| 201 | +\begin{exemple}{Fiche de marché comparée, RMR de Montréal et RMR de Québec, automne 2026}{fiche} | ||||
| 202 | +L'évaluateur qui ouvre un dossier doit situer le bien dans son marché avant de choisir ses comparables. L'exemple construit, à partir des seules sources publiques et pour la date d'évaluation du 31 octobre 2026, la fiche de marché de deux RMR, en suivant les six étapes que le \cref{ch:15} systématisera. Tous les chiffres sont reproduits par \texttt{analysis/python/cases/ch04\_marches.py} à partir des fichiers bruts de \texttt{data/raw} et des valeurs citées de l'APCIQ consignées dans \texttt{data/synthetic/calibration.json}. | ||||
| 203 | + | ||||
| 204 | +\emph{Étape 1 : demande structurelle.} Population au 1\ier{} juillet 2025 de \num{4597837} à Montréal et \num{903607} à Québec ; croissance annuelle composée 2020-2025 de \pct{1.08} et \pct{1.46} par l'\cref{eq:4:tcac} ; croissance 2024-2025 ralentie à \pct{0.55} et \pct{1.00}. Part des ménages locataires en 2021 : \pct{45.6} et \pct{41.7}. Projection ISQ 2025-2051 : $-3$ \% et $+16$ \%. La demande de fond est donc plus dynamique à Québec, malgré une taille cinq fois moindre. | ||||
| 205 | + | ||||
| 206 | +\emph{Étape 2 : prix et volumes.} Médianes du troisième trimestre de 2026 : unifamiliale \dollars{645500} (Montréal) et \dollars{463500} (Québec) ; copropriété \dollars{435000} et \dollars{334900} ; plex \dollars{860500} et \dollars{600000}. Les rapports plex sur unifamiliale, 1,33 et 1,29, et copropriété sur unifamiliale, 0,67 et 0,72, sont du même ordre dans les deux RMR, ce qui suggère une hiérarchie des segments comparable malgré un niveau de prix de 28 \% inférieur à Québec pour l'unifamiliale. Ventes trimestrielles : \num{9265} ($-12$ \%) et \num{2161} ($-1$ \%). | ||||
| 207 | + | ||||
| 208 | +\emph{Étape 3 : conjoncture de la revente.} Mois d'inventaire par l'\cref{eq:4:mois-inventaire} : $20\,350 / (9\,265/3) = 6{,}6$ mois à Montréal et $2\,204 / (2\,161/3) = 3{,}1$ mois à Québec ; délais de vente médians de l'unifamiliale de 40 et 29 jours. Montréal est passée en marché équilibré, avec une offre en hausse de 17 \% sur un an ; Québec reste en marché de vendeurs, même si l'offre y progresse de 27 \%. | ||||
| 209 | + | ||||
| 210 | +\emph{Étape 4 : tendance des prix.} IPLN de septembre 2026 : 159,5 et 144,2, en hausse de \pct{1.2} et \pct{1.9} sur douze mois, tous deux à leur sommet. Teranet--Banque Nationale : $+1{,}4$ \% et $+7{,}7$ \% sur un an. Les deux sources concordent : la hausse ralentit à Montréal et reste soutenue à Québec. | ||||
| 211 | + | ||||
| 212 | +\emph{Étape 5 : marché locatif.} Inoccupation d'octobre 2025 : \pct{2.9} et \pct{2.4} ; loyer moyen des deux chambres \dollars{1346} et \dollars{1277} ; variation sur logements comparables de l'ensemble des logements \pct{7.4} et \pct{6.4}. MRB implicite d'un plex à trois logements : 17,8 et 13,1. | ||||
| 213 | + | ||||
| 214 | +\emph{Étape 6 : lecture.} À Montréal, un marché de la revente revenu à l'équilibre, des prix qui plafonnent et des loyers qui montent encore de 7 \% réduisent le ratio prix sur loyer et rapprochent lentement le marché de ses fondamentaux ; l'évaluateur y resserre la fenêtre temporelle de ses comparables et accorde du poids à la tendance des inscriptions. À Québec, la tension persistante de la revente et la croissance démographique soutiennent des prix en hausse ; l'ajustement de conditions du marché y reste positif et doit être mesuré sur des ventes très récentes. Dans les deux cas, la détente du marché locatif annonce une normalisation de la vacance économique à prévoir dans les projections de revenus (\cref{ch:27}). | ||||
| 215 | +\end{exemple} | ||||
| 216 | + | ||||
modified
manuscript/chapters/ch10.tex
+207 −20
@@ -36,7 +36,7 @@ Trois diplômes universitaires québécois donnent accès au permis selon la pag | |||||
| 36 | \caption{Règlements de l'OEAQ encadrant la pratique (RLRQ, c. C-26) et dispositions clés}\label{tab:10:reglements} | 36 | \caption{Règlements de l'OEAQ encadrant la pratique (RLRQ, c. C-26) et dispositions clés}\label{tab:10:reglements} | ||
| 37 | \centering | 37 | \centering | ||
| 38 | \small | 38 | \small | ||
| 39 | −\begin{tabularx}{\textwidth}{lYY} | 39 | +\begin{tabularx}{\textwidth}{L{34mm}YY} | ||
| 40 | \toprule | 40 | \toprule | ||
| 41 | Règlement & Objet & Disposition clé (paraphrase) \\ | 41 | Règlement & Objet & Disposition clé (paraphrase) \\ | ||
| 42 | \midrule | 42 | \midrule | ||
@@ -71,7 +71,7 @@ Les \motcle{Normes de pratique professionnelle} (NPP) de l'OEAQ sont le texte de | |||||
| 71 | \caption{Structure des Normes de pratique professionnelle de l'OEAQ (édition en vigueur depuis le 1\textsuperscript{er} février 2024)}\label{tab:10:structure} | 71 | \caption{Structure des Normes de pratique professionnelle de l'OEAQ (édition en vigueur depuis le 1\textsuperscript{er} février 2024)}\label{tab:10:structure} | ||
| 72 | \centering | 72 | \centering | ||
| 73 | \small | 73 | \small | ||
| 74 | −\begin{tabular}{llp{62mm}} | 74 | +\begin{tabularx}{\textwidth}{L{26mm}YY} | ||
| 75 | \toprule | 75 | \toprule | ||
| 76 | Normes & Objet & Remarques \\ | 76 | Normes & Objet & Remarques \\ | ||
| 77 | \midrule | 77 | \midrule | ||
@@ -87,7 +87,7 @@ Normes & Objet & Remarques \\ | |||||
| 87 | 19 ; 20 à 20.3 & Rôle d'évaluation foncière et locative ; documents, évaluation municipale, révision & Voir \cref{ch:9} \\ | 87 | 19 ; 20 à 20.3 & Rôle d'évaluation foncière et locative ; documents, évaluation municipale, révision & Voir \cref{ch:9} \\ | ||
| 88 | 21 et 22 & Recours & Contestation et expertise devant le TAQ \\ | 88 | 21 et 22 & Recours & Contestation et expertise devant le TAQ \\ | ||
| 89 | \bottomrule | 89 | \bottomrule | ||
| 90 | −\end{tabular} | 90 | +\end{tabularx} | ||
| 91 | \tabsource{table des matières des NPP \parencite{oeaqNormes}, consultée le 31 octobre 2026 ; annexes A à F non reproduites.} | 91 | \tabsource{table des matières des NPP \parencite{oeaqNormes}, consultée le 31 octobre 2026 ; annexes A à F non reproduites.} | ||
| 92 | \end{table} | 92 | \end{table} | ||
| 93 | 93 | ||||
@@ -234,7 +234,7 @@ Ces règles répondent à un risque documenté par la recherche. \textcite{lentz | |||||
| 234 | 234 | ||||
| 235 | \subsection{Honoraires} | 235 | \subsection{Honoraires} | ||
| 236 | 236 | ||||
| 237 | −L'article 24.1 interdit les \motcle{honoraires conditionnels}, c'est-à-dire les honoraires « dont le montant dépend des résultats », sous réserve de trois exceptions limitées à des services de consultation : la vérification de l'inscription au rôle d'évaluation, la négociation d'indemnités d'expropriation et la vérification des frais d'exploitation d'un bail ; même dans ces cas, les honoraires conditionnels sont interdits lorsque l'évaluateur témoigne devant un tribunal \parencite[art.~24.1--24.3]{deontOEAQ}. La règle, modifiée par la loi de 2025 réformant le système professionnel, a une conséquence nette : un rapport d'évaluation ne peut jamais être rémunéré en fonction de la valeur conclue, de l'obtention du prêt ou du succès d'une contestation. Le raisonnement est le même que pour l'indépendance : une rémunération liée au résultat crée un intérêt dans le résultat, et un intérêt dans le résultat est incompatible avec une opinion neutre et objective, celle-là même que l'attestation de la règle 2.3 fait déclarer. | 237 | +L'article 24.1 interdit les \motcle{honoraires conditionnels}, c'est-à-dire les honoraires « dont le montant dépend des résultats », sous réserve de trois exceptions limitées à des services de consultation : la vérification de l'inscription au rôle d'évaluation, la négociation d'indemnités d'expropriation et la vérification des frais d'exploitation d'un bail ; même dans ces cas, les honoraires conditionnels sont interdits lorsque l'évaluateur témoigne devant un tribunal \parencite[art.~24.1--24.3]{deontOEAQ}. La règle, modifiée en 2025 (L.Q. 2025, c.~32), a une conséquence nette : un rapport d'évaluation ne peut jamais être rémunéré en fonction de la valeur conclue, de l'obtention du prêt ou du succès d'une contestation. Le raisonnement est le même que pour l'indépendance : une rémunération liée au résultat crée un intérêt dans le résultat, et un intérêt dans le résultat est incompatible avec une opinion neutre et objective, celle-là même que l'attestation de la règle 2.3 fait déclarer. | ||
| 238 | 238 | ||||
| 239 | \subsection{Rapport, signature, supervision et secret} | 239 | \subsection{Rapport, signature, supervision et secret} | ||
| 240 | 240 | ||||
@@ -269,7 +269,7 @@ La déontologie protège l'évaluateur des pressions extérieures ; elle ne le p | |||||
| 269 | \end{equation} | 269 | \end{equation} | ||
| 270 | où $\lambda$ mesure le poids de l'ancre ; $\lambda = 0$ correspond à l'indépendance parfaite et $\lambda = 1$ à l'abdication du jugement. Ce modèle n'est pas une norme, c'est une description ; mais il éclaire le sens des règles. Lorsque la norme exige que l'évaluateur définisse le but, la date et l'étendue du travail \emph{avant} de conclure, lorsque le Code de déontologie lui interdit de recevoir des instructions sur le résultat, lorsque le \cref{ch:16} recommande de fixer les critères de sélection des comparables avant de regarder les prix, il s'agit chaque fois de réduire $\lambda$ en retardant le moment où l'ancre est connue ou en retirant à l'ancre sa pertinence. L'éthique de l'estimation ne se réduit donc pas à l'honnêteté ; elle inclut une discipline de méthode qui protège le jugement contre ses propres raccourcis. Le \cref{ch:20} traite des conséquences de ces biais sur la réconciliation et l'incertitude. | 270 | où $\lambda$ mesure le poids de l'ancre ; $\lambda = 0$ correspond à l'indépendance parfaite et $\lambda = 1$ à l'abdication du jugement. Ce modèle n'est pas une norme, c'est une description ; mais il éclaire le sens des règles. Lorsque la norme exige que l'évaluateur définisse le but, la date et l'étendue du travail \emph{avant} de conclure, lorsque le Code de déontologie lui interdit de recevoir des instructions sur le résultat, lorsque le \cref{ch:16} recommande de fixer les critères de sélection des comparables avant de regarder les prix, il s'agit chaque fois de réduire $\lambda$ en retardant le moment où l'ancre est connue ou en retirant à l'ancre sa pertinence. L'éthique de l'estimation ne se réduit donc pas à l'honnêteté ; elle inclut une discipline de méthode qui protège le jugement contre ses propres raccourcis. Le \cref{ch:20} traite des conséquences de ces biais sur la réconciliation et l'incertitude. | ||
| 271 | 271 | ||||
| 272 | −\section{Normes internationales et canadiennes : convergences et écarts}\label{sec:10:international} | 272 | +\section{Cadres canadiens et internationaux : convergences et écarts}\label{sec:10:international} | ||
| 273 | 273 | ||||
| 274 | \subsection{Les International Valuation Standards (IVS 2025)} | 274 | \subsection{Les International Valuation Standards (IVS 2025)} | ||
| 275 | 275 | ||||
@@ -283,7 +283,7 @@ Les \motcle{Canadian Uniform Standards of Professional Appraisal Practice} (CUSP | |||||
| 283 | 283 | ||||
| 284 | \subsection{L'USPAP 2024 : une vérification partielle} | 284 | \subsection{L'USPAP 2024 : une vérification partielle} | ||
| 285 | 285 | ||||
| 286 | −Les \motcle{Uniform Standards of Professional Appraisal Practice} (USPAP) de The Appraisal Foundation sont la référence américaine. Selon les sources consultées, l'édition 2024 est entrée en vigueur le 1\textsuperscript{er} janvier 2024 sans date d'expiration, l'Appraisal Standards Board ayant abandonné le cycle biennal au profit de mises à jour « au besoin » ; aucune édition 2026 n'existe, les documents de 2026 étant un manuel de référence et le cours de mise à jour \parencite{uspap2024,isauspap2026}. Le lecteur doit savoir que cette information est \emph{partiellement vérifiée} : le site de The Appraisal Foundation était inaccessible lors de la vérification des sources, le 31 octobre 2026, et l'état de l'édition repose sur des sources secondaires ; la structure interne de l'USPAP (dix normes et règles d'éthique, de tenue des dossiers, de compétence, d'étendue du travail et d'exception juridictionnelle) n'a pas été revérifiée sur le document lui-même. L'ouvrage cite donc l'USPAP pour situer la pratique québécoise, non pour en exposer le contenu, et la \cref{sec:10:limites} le rappelle. | 286 | +Les \motcle{Uniform Standards of Professional Appraisal Practice} (USPAP) de The Appraisal Foundation sont la référence américaine. Selon les sources consultées, l'édition 2024 est entrée en vigueur le 1\textsuperscript{er} janvier 2024 sans date d'expiration, l'Appraisal Standards Board ayant abandonné le cycle biennal au profit de mises à jour « au besoin » ; aucune édition 2026 n'existe, les documents de 2026 étant un manuel de référence et le cours de mise à jour \parencite{uspap2024,isauspap2026}. Le lecteur doit savoir que cette information est \emph{partiellement vérifiée} : le site de The Appraisal Foundation était inaccessible lors de la vérification des sources, le 31 octobre 2026, et l'état de l'édition repose sur des sources secondaires ; la structure interne de l'USPAP (dix normes et règles d'éthique, de tenue des dossiers, de compétence, d'étendue du travail et d'exception juridictionnelle) n'a pas été revérifiée sur le document lui-même. L'ouvrage cite donc l'USPAP pour situer la pratique québécoise, non pour en exposer le contenu, et l'encadré « Limites et mises en garde » en fin de chapitre le rappelle. | ||
| 287 | 287 | ||||
| 288 | \subsection{Le Red Book de la RICS et les normes de l'IAAO} | 288 | \subsection{Le Red Book de la RICS et les normes de l'IAAO} | ||
| 289 | 289 | ||||
@@ -295,22 +295,23 @@ Les normes de l'\motcle{International Association of Assessing Officers} (IAAO) | |||||
| 295 | 295 | ||||
| 296 | Le \cref{tab:10:cadres} compare les cinq cadres sur les dimensions vérifiées : éditeur, édition en vigueur, date d'effet, structure, statut de la vérification et portée pour l'évaluateur québécois. La \cref{fig:10:chronologie} en donne la chronologie documentaire. Trois observations se dégagent. D'abord, les cadres convergent : le CUSPAP se déclare conforme aux IVS, le Red Book les incorpore, et les NPP, bien qu'antérieures dans leur rédaction de fond, partagent avec eux la même définition fonctionnelle de la valeur marchande, la même exigence de divulgation des hypothèses et la même structure rapport--attestation. Ensuite, les rythmes de révision diffèrent : les IVS et le Red Book suivent un cycle de trois ans environ, le CUSPAP un cycle de deux ans, l'USPAP a abandonné son cycle, et les NPP sont révisées norme par norme, de sorte que leur « édition » est un assemblage de textes de dates différentes. Enfin, les écarts portent moins sur le fond que sur le degré d'explicitation : les cadres récents (IVS 104-105, Red Book VPS 5, CUSPAP) disent davantage sur les données, les modèles et le délai d'exposition que les NPP, dont la modernisation annoncée pourrait combler cette distance. | 296 | Le \cref{tab:10:cadres} compare les cinq cadres sur les dimensions vérifiées : éditeur, édition en vigueur, date d'effet, structure, statut de la vérification et portée pour l'évaluateur québécois. La \cref{fig:10:chronologie} en donne la chronologie documentaire. Trois observations se dégagent. D'abord, les cadres convergent : le CUSPAP se déclare conforme aux IVS, le Red Book les incorpore, et les NPP, bien qu'antérieures dans leur rédaction de fond, partagent avec eux la même définition fonctionnelle de la valeur marchande, la même exigence de divulgation des hypothèses et la même structure rapport--attestation. Ensuite, les rythmes de révision diffèrent : les IVS et le Red Book suivent un cycle de trois ans environ, le CUSPAP un cycle de deux ans, l'USPAP a abandonné son cycle, et les NPP sont révisées norme par norme, de sorte que leur « édition » est un assemblage de textes de dates différentes. Enfin, les écarts portent moins sur le fond que sur le degré d'explicitation : les cadres récents (IVS 104-105, Red Book VPS 5, CUSPAP) disent davantage sur les données, les modèles et le délai d'exposition que les NPP, dont la modernisation annoncée pourrait combler cette distance. | ||
| 297 | 297 | ||||
| 298 | −\begin{table}[htbp] | 298 | +\begin{table}[p] | ||
| 299 | \caption{Comparaison des cadres normatifs (état au 31 octobre 2026)}\label{tab:10:cadres} | 299 | \caption{Comparaison des cadres normatifs (état au 31 octobre 2026)}\label{tab:10:cadres} | ||
| 300 | \centering | 300 | \centering | ||
| 301 | −\footnotesize | 301 | +\scriptsize | ||
| 302 | −\begin{tabularx}{\textwidth}{lYYYYY} | 302 | +\renewcommand{\arraystretch}{1.08} | ||
| 303 | +\begin{tabularx}{\textwidth}{L{17mm}YYYYY} | ||||
| 303 | \toprule | 304 | \toprule | ||
| 304 | & NPP (OEAQ) & CUSPAP 2026 (ICE) & IVS 2025 (IVSC) & USPAP 2024 (TAF) & Red Book (RICS) \\ | 305 | & NPP (OEAQ) & CUSPAP 2026 (ICE) & IVS 2025 (IVSC) & USPAP 2024 (TAF) & Red Book (RICS) \\ | ||
| 305 | \midrule | 306 | \midrule | ||
| 306 | −Nature & Normes d'un ordre professionnel (Code des professions) ; portée disciplinaire & Normes d'une association professionnelle nationale & Normes internationales d'application volontaire, adoptées par renvoi & Normes américaines, rendues obligatoires par les lois des États et les organismes fédéraux & Normes d'une association professionnelle internationale \\ | 307 | +Nature & Normes d'un ordre professionnel ; portée disciplinaire & Normes d'une association professionnelle nationale & Normes internationales adoptées par renvoi & Normes américaines, obligatoires par renvoi des lois des États & Normes d'une association professionnelle internationale \\ | ||
| 307 | −Édition en vigueur & « En vigueur depuis le 1\textsuperscript{er} février 2024 » ; textes de fond 1998--2016 ; PDF du 24 mars 2025 & Édition 2026, en vigueur le 1\textsuperscript{er} avril 2026 & Publiées le 31 janvier 2024, en vigueur le 31 janvier 2025 & Édition 2024, en vigueur le 1\textsuperscript{er} janvier 2024, sans date d'expiration & Publié en déc. 2024, en vigueur le 31 janvier 2025 \\ | 308 | +Édition en vigueur & « En vigueur depuis le 1\textsuperscript{er} février 2024 » ; textes de fond 1998--2016 & Édition 2026, en vigueur le 1\textsuperscript{er} avril 2026 & Publiées le 31 janv. 2024, en vigueur le 31 janv. 2025 & Édition 2024, en vigueur le 1\textsuperscript{er} janv. 2024, sans expiration & Publié en déc. 2024, en vigueur le 31 janv. 2025 \\ | ||
| 308 | −Structure & 22 normes par paires acte/communication ; annexes A--F & Définitions + 8 normes (règles et commentaires) ; annexe 20 & IVS 100--106 (générales) ; 200--500 (actifs) ; bases de valeur en annexe d'IVS 102 & 10 normes et règles (éthique, dossiers, compétence, étendue du travail) & PS 1--2 ; VPS 1--6 \\ | 309 | +Structure & 22 normes par paires acte/communication ; annexes A--F & Définitions + 8 normes (règles et commentaires) & IVS 100--106 ; 200--500 ; bases de valeur en annexe d'IVS 102 & 10 normes et règles (non revérifié) & PS 1--2 ; VPS 1--6 \\ | ||
| 309 | −Valeur marchande & « prix sincère le plus probable » (Intro-11) & « most probable price » (s.~3) & « estimated amount … should exchange » (IVS 102, A10.01) & non revérifié & renvoie aux IVS \\ | 310 | +Valeur marchande & « prix sincère le plus probable » & « most probable price » & « estimated amount … should exchange » & non revérifié & renvoie aux IVS \\ | ||
| 310 | −Hypothèses & Hypothèses extraordinaires et réserves ; incidence sur la valeur (2.1 c), 2.3 él.~7) & Extraordinary assumption, hypothetical condition, extraordinary limiting condition & Hypothèses et hypothèses spéciales (IVS 101) & non revérifié & VPS 1 (conditions du mandat) \\ | 311 | +Hypothèses & Extraordinaires et réserves ; incidence sur la valeur & Extraordinary assumption, hypothetical condition, extraordinary limiting condition & Hypothèses et hypothèses spéciales (IVS 101) & non revérifié & VPS 1 \\ | ||
| 311 | −Rapport & 12 éléments (2.3) ; 3 formes ; attestation ; inspection (2.4) ; signature (2.5) & Reporting Standard ; analyse du délai d'exposition (8.2) & IVS 106 Documentation and Reporting & Standard 2 (non revérifié) & VPS 6 Valuation reports \\ | 312 | +Rapport & 12 éléments (2.3) ; 3 formes ; attestation ; inspection (2.4) ; signature (2.5) & Reporting Standard ; délai d'exposition (8.2) & IVS 106 & Standard 2 (non revérifié) & VPS 6 \\ | ||
| 312 | −Prochaine édition & Modernisation annoncée (rapport annuel 2024-2025) & Cycle biennal (2028 probable) & Projet en vigueur le 31 janvier 2028 (exposure draft, janv. 2026) & Mises à jour au besoin & « Red Book 2028 » annoncé \\ | 313 | +Prochaine édition & Modernisation annoncée & Cycle biennal & Projet en vigueur le 31 janv. 2028 & Au besoin & « Red Book 2028 » \\ | ||
| 313 | −Vérification & Vérifiée (PDF officiel) & Vérifiée (PDF officiel) & Vérifiée (PDF officiel) & \textbf{Partielle} (site inaccessible ; sources secondaires) & Vérifiée (page RICS ; PDF non téléchargé) \\ | 314 | +Vérification & PDF officiel & PDF officiel & PDF officiel & \textbf{Partielle} (sources secondaires) & Page RICS ; PDF non téléchargé \\ | ||
| 314 | \bottomrule | 315 | \bottomrule | ||
| 315 | \end{tabularx} | 316 | \end{tabularx} | ||
| 316 | \tabsource{synthèse de l'auteur d'après \textcite{oeaqNormes,oeaqra2025,cuspap2026,ivs2025,ivs2028ed,uspap2024,isauspap2026,rics2025}, sources consultées le 31 octobre 2026 ; registre \texttt{sources/registry-C.csv}.} | 317 | \tabsource{synthèse de l'auteur d'après \textcite{oeaqNormes,oeaqra2025,cuspap2026,ivs2025,ivs2028ed,uspap2024,isauspap2026,rics2025}, sources consultées le 31 octobre 2026 ; registre \texttt{sources/registry-C.csv}.} | ||
@@ -325,13 +326,13 @@ Vérification & Vérifiée (PDF officiel) & Vérifiée (PDF officiel) & Vérifi | |||||
| 325 | 326 | ||||
| 326 | \subsection{Ce que la matrice des dispositions révèle} | 327 | \subsection{Ce que la matrice des dispositions révèle} | ||
| 327 | 328 | ||||
| 328 | −Le dépôt de cet ouvrage recense dans un fichier, \texttt{sources/normes-C.csv}, chacune des dispositions normatives, déontologiques, réglementaires et prudentielles vérifiées pour le domaine des normes et de la finance, avec sa référence précise, sa version, sa date de consultation et les chapitres qui la mobilisent. Ce fichier n'est pas un objet d'étude en soi, mais ses statistiques descriptives, calculées par le script \texttt{analysis/python/cases/ch10\_matrice\_normes.py}, disent quelque chose de la structure du cadre normatif tel que ce traité le mobilise. Le \cref{tab:10:matrice} et la \cref{fig:10:matrice} les résument. Sur 100 dispositions réparties en 17 domaines, 43 proviennent de l'OEAQ et du Code des professions, 27 des cadres hors Québec (IVS, CUSPAP, USPAP, RICS, IAAO), 20 des autorités financières et prudentielles et 10 des diffuseurs de données de marché. Le présent chapitre est visé par 51 dispositions, plus que tout autre, devant le \cref{ch:31} (15) et le \cref{ch:20} (14) ; chaque disposition vise en moyenne 1,70 chapitre, 51 \% en visent plus d'un, et aucune n'en vise plus de quatre. La lecture de ces chiffres est simple : les règles professionnelles forment un socle concentré dans ce chapitre, tandis que les règles de finance et de données se dispersent dans les chapitres techniques ; et la moitié des dispositions servent à plusieurs endroits, ce qui justifie qu'elles soient tenues dans un registre unique plutôt que recopiées de chapitre en chapitre. | 329 | +Le dépôt de cet ouvrage recense dans un fichier, \texttt{sources/normes-C.csv}, chacune des dispositions normatives, déontologiques, réglementaires et prudentielles vérifiées pour le domaine des normes et de la finance, avec sa référence précise, sa version, sa date de consultation et les chapitres qui la mobilisent. Ce fichier n'est pas un objet d'étude en soi, mais ses statistiques descriptives, calculées par le script \texttt{ch10\_matrice\_normes.py} du dossier \texttt{analysis/python/cases/}, disent quelque chose de la structure du cadre normatif tel que ce traité le mobilise. Le \cref{tab:10:matrice} et la \cref{fig:10:matrice} les résument. Sur 100 dispositions réparties en 17 domaines, 43 proviennent de l'OEAQ et du Code des professions, 27 des cadres hors Québec (IVS, CUSPAP, USPAP, RICS, IAAO), 20 des autorités financières et prudentielles et 10 des diffuseurs de données de marché. Le présent chapitre est visé par 51 dispositions, plus que tout autre, devant le \cref{ch:31} (15) et le \cref{ch:20} (14) ; chaque disposition vise en moyenne 1,70 chapitre, 51 \% en visent plus d'un, et aucune n'en vise plus de quatre. La lecture de ces chiffres est simple : les règles professionnelles forment un socle concentré dans ce chapitre, tandis que les règles de finance et de données se dispersent dans les chapitres techniques ; et la moitié des dispositions servent à plusieurs endroits, ce qui justifie qu'elles soient tenues dans un registre unique plutôt que recopiées de chapitre en chapitre. | ||
| 329 | 330 | ||||
| 330 | \begin{table}[htbp] | 331 | \begin{table}[htbp] | ||
| 331 | \caption{Statistiques descriptives de la matrice des dispositions du domaine C (\texttt{sources/normes-C.csv}, 100 dispositions vérifiées le 31 octobre 2026)}\label{tab:10:matrice} | 332 | \caption{Statistiques descriptives de la matrice des dispositions du domaine C (\texttt{sources/normes-C.csv}, 100 dispositions vérifiées le 31 octobre 2026)}\label{tab:10:matrice} | ||
| 332 | \centering | 333 | \centering | ||
| 333 | \small | 334 | \small | ||
| 334 | −\begin{tabular}{lS[table-format=3.0]S[table-format=2.0]} | 335 | +\begin{tabular}{p{78mm}S[table-format=3.0]S[table-format=2.0]} | ||
| 335 | \toprule | 336 | \toprule | ||
| 336 | Famille de sources & {Dispositions} & {dont visant le ch.~10} \\ | 337 | Famille de sources & {Dispositions} & {dont visant le ch.~10} \\ | ||
| 337 | \midrule | 338 | \midrule | ||
@@ -339,7 +340,7 @@ OEAQ --- normes de pratique (NPP) & 15 & 12 \\ | |||||
| 339 | OEAQ --- déontologie (C-26, r.~123) & 14 & 14 \\ | 340 | OEAQ --- déontologie (C-26, r.~123) & 14 & 14 \\ | ||
| 340 | OEAQ --- règlements et Code des professions & 14 & 14 \\ | 341 | OEAQ --- règlements et Code des professions & 14 & 14 \\ | ||
| 341 | Cadres hors Québec (IVS, CUSPAP, USPAP, RICS, IAAO) & 27 & 10 \\ | 342 | Cadres hors Québec (IVS, CUSPAP, USPAP, RICS, IAAO) & 27 & 10 \\ | ||
| 342 | −Finance et prudentiel (Banque du Canada, BSIF, Finances Canada, SCHL) & 20 & 1 \\ | 343 | +Finance et prudentiel (BdC, BSIF, Finances Canada, SCHL) & 20 & 1 \\ | ||
| 343 | Données de marché (Statistique Canada, APCIQ, JLR, Teranet) & 10 & 0 \\ | 344 | Données de marché (Statistique Canada, APCIQ, JLR, Teranet) & 10 & 0 \\ | ||
| 344 | \midrule | 345 | \midrule | ||
| 345 | Total & 100 & 51 \\ | 346 | Total & 100 & 51 \\ | ||
@@ -354,3 +355,189 @@ Total & 100 & 51 \\ | |||||
| 354 | \caption{La matrice des dispositions du domaine C : à gauche, répartition des 100 dispositions par famille de sources (les familles OEAQ en couleur) ; à droite, les dix chapitres les plus visés, une disposition pouvant viser plusieurs chapitres. Le chapitre 10 concentre les règles professionnelles ; les règles financières et de données se dispersent dans les chapitres techniques.}\label{fig:10:matrice} | 355 | \caption{La matrice des dispositions du domaine C : à gauche, répartition des 100 dispositions par famille de sources (les familles OEAQ en couleur) ; à droite, les dix chapitres les plus visés, une disposition pouvant viser plusieurs chapitres. Le chapitre 10 concentre les règles professionnelles ; les règles financières et de données se dispersent dans les chapitres techniques.}\label{fig:10:matrice} | ||
| 355 | \figsource{\texttt{sources/normes-C.csv} (consultation du 31 octobre 2026) ; script \texttt{analysis/python/figures/ch10\_figures.py}.} | 356 | \figsource{\texttt{sources/normes-C.csv} (consultation du 31 octobre 2026) ; script \texttt{analysis/python/figures/ch10\_figures.py}.} | ||
| 356 | \end{figure} | 357 | \end{figure} | ||
| 358 | + | ||||
| 359 | +\section{Révision et contrôle de la qualité}\label{sec:10:revision} | ||||
| 360 | + | ||||
| 361 | +\subsection{Trois niveaux de contrôle} | ||||
| 362 | + | ||||
| 363 | +La conformité d'un rapport se construit à trois niveaux. Le premier est l'\motcle{autocontrôle} de l'évaluateur, qui relit son rapport à l'aide de la grille du \cref{tab:10:elements} et vérifie que chaque élément est présent et que chaque chiffre du texte correspond au dossier. Le deuxième est la \motcle{révision} par un pair, interne au cabinet ou externe ; lorsqu'elle est formalisée et qu'elle donne lieu à un rapport d'examen, elle relève des normes 3 et 4 des NPP, qui régissent l'examen d'un rapport d'évaluation et la communication de ses résultats \parencite{oeaqNormes}, et du \emph{Review Standard} du CUSPAP \parencite{cuspap2026}. L'examinateur ne refait pas l'évaluation ; il vérifie que le rapport est complet, que le raisonnement est cohérent et que les conclusions sont soutenues par les données, et il le dit dans un rapport distinct qui engage sa propre responsabilité. Le troisième niveau est l'\motcle{inspection professionnelle} de l'Ordre, qui porte sur la pratique du membre à travers ses dossiers \parencite{inspectionoeaq}. Les trois niveaux sont complémentaires parce qu'ils ne voient pas la même chose : l'autocontrôle connaît le dossier mais partage les angles morts de l'auteur ; le réviseur apporte un regard neuf mais ne connaît que ce qu'on lui montre ; l'inspection voit la pratique dans la durée mais arrive longtemps après le rapport. | ||||
| 364 | + | ||||
| 365 | +On peut représenter l'effet d'une chaîne de révisions par un modèle élémentaire. Supposons qu'un rapport comporte une lacune et que chaque révision indépendante la détecte avec une probabilité $d$, identique d'une révision à l'autre. La probabilité qu'au moins une de $n$ révisions la relève est | ||||
| 366 | +\begin{equation}\label{eq:10:detection} | ||||
| 367 | +P_n = 1 - (1 - d)^n . | ||||
| 368 | +\end{equation} | ||||
| 369 | +Le \cref{tab:10:detection} donne $P_n$ pour quelques valeurs. Deux leçons en ressortent. D'une part, une seule révision de puissance moyenne ($d = 0{,}7$) laisse passer trois lacunes sur dix, et il faut en ajouter une deuxième pour descendre sous une sur dix ; c'est l'argument en faveur de la révision par un pair même pour les rapports courants. D'autre part, le gain marginal de la troisième révision est faible dès que $d$ est élevé, ce qui plaide pour investir dans la qualité de chaque révision plutôt que dans leur nombre. Le modèle suppose l'indépendance des révisions, hypothèse optimiste : deux réviseurs formés à la même école, utilisant la même liste de contrôle, partagent une part de leurs angles morts, et la probabilité réelle est inférieure à $P_n$. C'est précisément pourquoi un contrôle automatique, qui ne partage aucun angle mort humain, a sa place en première ligne, à condition d'en connaître les limites. | ||||
| 370 | + | ||||
| 371 | +\begin{table}[htbp] | ||||
| 372 | +\caption{Analyse de sensibilité : probabilité $P_n$ qu'une lacune soit détectée par au moins une de $n$ révisions indépendantes de puissance $d$}\label{tab:10:detection} | ||||
| 373 | +\centering | ||||
| 374 | +\begin{tabular}{S[table-format=1.1]S[table-format=1.3]S[table-format=1.3]S[table-format=1.3]} | ||||
| 375 | +\toprule | ||||
| 376 | +{$d$} & {$n = 1$} & {$n = 2$} & {$n = 3$} \\ | ||||
| 377 | +\midrule | ||||
| 378 | +0.5 & 0.500 & 0.750 & 0.875 \\ | ||||
| 379 | +0.7 & 0.700 & 0.910 & 0.973 \\ | ||||
| 380 | +0.9 & 0.900 & 0.990 & 0.999 \\ | ||||
| 381 | +\bottomrule | ||||
| 382 | +\end{tabular} | ||||
| 383 | +\tabsource{\cref{eq:10:detection} ; \texttt{analysis/python/cases/ch10\_controle\_rapport.py} ; modèle de l'auteur, révisions supposées indépendantes.} | ||||
| 384 | +\end{table} | ||||
| 385 | + | ||||
| 386 | +\subsection{Exemple intégral : un contrôle automatique des douze éléments}\label{sec:10:exemple} | ||||
| 387 | + | ||||
| 388 | +\begin{exemple}{Contrôle lexical de quatre extraits de rapports fictifs}{controle} | ||||
| 389 | +Les quatre extraits analysés dans cet exemple sont \emph{fictifs} : ils ont été rédigés par l'auteur pour le traité, ne concernent aucun immeuble, aucun client ni aucun évaluateur réels, et leurs chiffres sont arbitraires. Leur texte intégral figure dans le script \texttt{analysis/python/cases/ch10\_controle\_rapport.py}, qui produit tous les résultats de cette section. L'extrait A imite un rapport abrégé de financement hypothécaire ; l'extrait B, la section des réserves et de la conclusion d'un rapport narratif ; l'extrait C, un rapport de mise à jour pour un immeuble de douze logements ; l'extrait D, le sommaire d'un rapport narratif complet rédigé pour être conforme. | ||||
| 390 | +\end{exemple} | ||||
| 391 | + | ||||
| 392 | +Le principe du contrôle est le suivant. À chacun des douze éléments de la règle 2.3 est associé un \motcle{lexique}, c'est-à-dire un ensemble $L_k$ de formulations caractéristiques, exprimées sous forme de motifs : « date d'évaluation », « pleine propriété », « usage le meilleur et le plus profitable », « j'atteste », et ainsi de suite. Le texte $T$ du rapport est normalisé (minuscules, sans accents) et l'élément $k$ est réputé présent si l'un de ses motifs apparaît : | ||||
| 393 | +\begin{equation}\label{eq:10:lexical} | ||||
| 394 | +\hat c_k = \mathbf{1}\bigl\{\exists\, m \in L_k : m \text{ apparaît dans } T\bigr\}, | ||||
| 395 | +\end{equation} | ||||
| 396 | +d'où un taux de conformité estimé $\hat\tau = \frac{1}{12}\sum_k \hat c_k$ qui approche le taux $\tau$ de l'\cref{eq:10:taux}. Deux lexiques ont été constitués : un lexique \emph{strict}, qui n'admet que des formulations propres à chaque élément, et un lexique \emph{souple}, qui y ajoute des termes plus généraux (« adresse », « visite », « signature ») au prix d'un risque accru de détection à tort. Le \cref{tab:10:controle} et la \cref{fig:10:grille} donnent les résultats. | ||||
| 397 | + | ||||
| 398 | +\begin{table}[htbp] | ||||
| 399 | +\caption{Résultat du contrôle lexical des douze éléments de la règle 2.3 sur quatre extraits de rapports fictifs}\label{tab:10:controle} | ||||
| 400 | +\centering | ||||
| 401 | +\footnotesize | ||||
| 402 | +\begin{tabular}{lcS[table-format=2.0]S[table-format=1.3]p{40mm}} | ||||
| 403 | +\toprule | ||||
| 404 | +Extrait (fictif) & Lexique & {Éléments détectés} & {$\hat\tau$} & Éléments non détectés \\ | ||||
| 405 | +\midrule | ||||
| 406 | +A --- rapport abrégé & strict & 2 & 0.167 & 1, 2, 4, 5, 6, 7, 9, 10, 11, 12 \\ | ||||
| 407 | + & souple & 5 & 0.417 & 2, 4, 5, 7, 9, 10, 11 \\ | ||||
| 408 | +B --- réserves et conclusion & strict & 10 & 0.833 & 6, 10 \\ | ||||
| 409 | + & souple & 10 & 0.833 & 6, 10 \\ | ||||
| 410 | +C --- mise à jour & strict & 6 & 0.500 & 2, 3, 4, 9, 11, 12 \\ | ||||
| 411 | + & souple & 6 & 0.500 & 2, 3, 4, 9, 11, 12 \\ | ||||
| 412 | +D --- sommaire complet & strict & 12 & 1.000 & aucun \\ | ||||
| 413 | + & souple & 12 & 1.000 & aucun \\ | ||||
| 414 | +\bottomrule | ||||
| 415 | +\end{tabular} | ||||
| 416 | +\tabsource{\texttt{analysis/python/cases/ch10\_controle\_rapport.py} ; extraits fictifs rédigés par l'auteur ; test \texttt{analysis/python/tests/test\_ch10.py}.} | ||||
| 417 | +\end{table} | ||||
| 418 | + | ||||
| 419 | +\begin{figure}[htbp] | ||||
| 420 | +\centering | ||||
| 421 | +\includegraphics[width=\textwidth]{ch10/ch10-fig-grille-controle.pdf} | ||||
| 422 | +\caption{Grille de détection des douze éléments de la règle 2.3 dans quatre extraits de rapports fictifs. Les carrés pleins sont détectés par le lexique strict, les carrés creux seulement par le lexique souple, les croix ne sont pas détectées. Le lexique souple n'ajoute des détections que pour l'extrait A, et chacune de ces détections est discutable.}\label{fig:10:grille} | ||||
| 423 | +\figsource{\texttt{analysis/python/cases/ch10\_controle\_rapport.py} ; script de figure \texttt{analysis/python/figures/ch10\_figures.py} ; extraits fictifs.} | ||||
| 424 | +\end{figure} | ||||
| 425 | + | ||||
| 426 | +La lecture des résultats est plus instructive que les chiffres eux-mêmes. L'extrait A, qui ressemble à bien des rapports abrégés hâtifs, n'atteint que 2 éléments sur 12 avec le lexique strict : il identifie la fin (financement hypothécaire) et expose un raisonnement sommaire, mais il ne donne ni désignation cadastrale, ni droits évalués, ni définition de la valeur, ni date d'évaluation (il indique une « période de validité », ce qui n'est pas la même chose), ni étendue du travail (une « visite extérieure » n'est pas une inspection au sens de la règle 2.4, et son caractère partiel n'est pas expliqué), ni réserves, ni usage le meilleur et le plus profitable, ni attestation. Le lexique souple en « détecte » trois de plus, l'adresse, la visite et la signature, et c'est ici que la limite de l'outil apparaît : une adresse n'est pas une identification légale, une visite extérieure n'est pas une étendue du travail décrite, et une ligne de signature n'est pas l'attestation de la règle 2.3. Les détections du lexique souple sont des détections à tort, et c'est pourquoi la \cref{fig:10:grille} les distingue. | ||||
| 427 | + | ||||
| 428 | +L'extrait B est presque complet et illustre deux erreurs plus subtiles. Il contient bien une hypothèse (« nous présumons que le permis… a été obtenu »), que le contrôle détecte, mais cette hypothèse n'est ni qualifiée d'extraordinaire, ni accompagnée de son incidence sur la valeur, ni rappelée dans la conclusion : l'élément 7 est formellement présent et matériellement défaillant, et le contrôle lexical ne peut pas le voir. Il indique que la méthode du coût a « également été appliquée » sans dire ce qu'il est advenu de la méthode du revenu ni pourquoi la comparaison n'est pas mentionnée ; le contrôle signale l'élément 10 comme absent, mais il ne peut pas savoir si une méthode a réellement été écartée, de sorte que ce signal doit être interprété par un lecteur humain. L'extrait C, rapport de mise à jour, détecte 6 éléments sur 12 : il renvoie au rapport original pour les réserves et décrit les changements, ce que la forme autorise, mais il ne \emph{mentionne} ni les droits évalués, ni le but, ni la définition de la valeur, ni l'usage le meilleur et le plus profitable, ni la conformité, ni l'attestation ; or la forme de mise à jour exige que chaque élément soit au moins mentionné. L'extrait D, enfin, atteint 12 sur 12 parce qu'il a été écrit pour cela ; il montre qu'un sommaire d'une demi-page peut être formellement conforme, et rappelle en creux que la conformité formelle n'est qu'une condition nécessaire. | ||||
| 429 | + | ||||
| 430 | +\begin{pratique} | ||||
| 431 | +Un contrôle lexical de ce type est un outil de première ligne, à placer avant la relecture humaine et non à sa place. Il détecte sûrement les omissions grossières, qui sont fréquentes dans les rapports abrégés et les mises à jour ; il ne détecte ni les éléments mal traités, ni les hypothèses sans incidence, ni les incohérences entre la conclusion et le raisonnement. Sa calibration est une décision : un lexique strict produit des alertes dont presque toutes sont fondées mais en manque certaines ; un lexique souple n'en manque guère mais en produit de fausses. Dans un cabinet, on gagne à conserver un lexique strict et à traiter chaque alerte comme une question posée au rédacteur plutôt que comme un verdict. L'\cref{ex:10:6} invite le lecteur à étendre le lexique et à mesurer ce qu'il gagne et ce qu'il perd. | ||||
| 432 | +\end{pratique} | ||||
| 433 | + | ||||
| 434 | +\section{Rédiger le rapport}\label{sec:10:redaction} | ||||
| 435 | + | ||||
| 436 | +\subsection{Le plan du rapport narratif} | ||||
| 437 | + | ||||
| 438 | +Le rapport narratif complet n'a pas de plan imposé ; il a un contenu imposé, celui de la règle 2.3, et un ordre d'usage, qui suit celui du processus de la \cref{fig:10:processus} et que l'on retrouve dans les manuels de référence \parencite{appraisal2026,appraisalCdn}. Il est d'usage d'ouvrir par une lettre d'envoi qui identifie le client, l'immeuble, le but, la date d'évaluation et la conclusion, en rappelant les hypothèses extraordinaires ; de poursuivre par un sommaire des faits saillants et des conclusions ; puis d'exposer, dans l'ordre, les prémisses de l'évaluation (identification, droits évalués, but et fin, définition de la valeur, date, étendue du travail, réserves et hypothèses), la présentation des données (secteur et marché, terrain, bâtiment, données fiscales et de zonage), l'analyse (usage le meilleur et le plus profitable, méthodes retenues et écartées, application de chaque méthode, réconciliation), la conclusion de valeur et l'attestation ; et de clore par les annexes (photographies, plans, titres, fiches des comparables, qualifications du signataire). Trois remarques de rédaction complètent ce plan. Chaque chiffre du texte doit se retrouver dans un tableau ou une annexe, et chaque tableau doit indiquer sa source ; un rapport dont les chiffres ne peuvent pas être retracés n'est pas un rapport motivé. Le rapport s'adresse à un lecteur qui n'a pas vu l'immeuble et qui n'est pas évaluateur ; le vocabulaire technique est défini à sa première occurrence, et les sigles sont développés. Enfin, le rapport dit ce qui n'a pas été fait avec la même netteté que ce qui l'a été : la section de l'étendue du travail est la plus importante pour la protection du lecteur et la plus souvent escamotée. | ||||
| 439 | + | ||||
| 440 | +\subsection{Le langage de la certitude} | ||||
| 441 | + | ||||
| 442 | +Une évaluation est une estimation, et son langage doit le dire sans l'affaiblir. \textcite{frenchGabrielli2004} ont soutenu que l'incertitude est inhérente à toute évaluation et que l'évaluateur a le devoir de la communiquer, parce qu'un lecteur qui prend une estimation pour une mesure prend une décision mal informée. La pratique québécoise, comme la pratique nord-américaine, conclut à une valeur ponctuelle ; rien dans les NPP n'interdit d'y adjoindre une fourchette, et le \cref{ch:20} montre comment la construire. Si l'on dispose d'une distribution prédictive de la valeur, la fourchette à $1 - \alpha$ est l'intervalle entre les quantiles | ||||
| 443 | +\begin{equation}\label{eq:10:fourchette} | ||||
| 444 | +\bigl[\hat V_{\alpha/2},\ \hat V_{1 - \alpha/2}\bigr], \qquad \text{par exemple } \alpha = 0{,}10 \text{ pour une fourchette à } 90\ \%, | ||||
| 445 | +\end{equation} | ||||
| 446 | +et la valeur ponctuelle en est la médiane ou l'espérance, selon la convention déclarée. L'important est de ne pas mêler les registres. Les faits observés (le prix d'une vente, la superficie mesurée, le loyer d'un bail) s'écrivent à l'indicatif et sans modalisation : « l'immeuble s'est vendu \dollars{598000} le 22 juin 2026 ». Les estimations s'écrivent comme des opinions : « nous estimons », « l'indication de valeur est », « la valeur marchande est estimée à ». Les hypothèses s'écrivent comme des hypothèses : « sous l'hypothèse extraordinaire que… ». Et l'on bannit trois familles de formules : la fausse précision, qui donne une valeur au dollar près quand les données n'autorisent que le millier ; la fausse certitude, qui écrit « la valeur est de » pour une estimation ou « le marché va » pour une prévision ; et la fausse prudence, qui multiplie les réserves générales (« sous toutes réserves », « à titre indicatif seulement ») au point de vider la conclusion de son sens, alors que le Code de déontologie interdit justement d'exclure sa responsabilité par ce moyen. Le terme même de « valeur » est réservé à l'estimation ; un prix observé est un prix, et le \cref{ch:16} a rappelé pourquoi la distinction importe. | ||||
| 447 | + | ||||
| 448 | +\subsection{Divulguer les données, les modèles et les données synthétiques} | ||||
| 449 | + | ||||
| 450 | +Les cadres normatifs récents convergent vers une exigence que les NPP n'énoncent qu'implicitement à travers les éléments 6 et 8 de la règle 2.3 : la divulgation des \emph{données} et des \emph{modèles} sur lesquels la conclusion repose. IVS 104 traite des données et des intrants, IVS 105 des modèles d'évaluation \parencite{ivs2025} ; la norme VPS 5 du Red Book porte sur les modèles \parencite{rics2025} ; et le CUSPAP consacre une norme à l'évaluation de masse \parencite{cuspap2026}. Pour l'évaluateur qui utilise un modèle hédonique (\cref{ch:18}), un modèle spatial (\cref{ch:19}) ou un algorithme d'apprentissage (\cref{ch:37}), la règle de conduite est la suivante, et elle découle autant de l'article 41 du Code de déontologie que des normes internationales : nommer le modèle et sa forme ; décrire les données d'estimation (source, période, territoire, nombre d'observations, filtres appliqués) ; donner les mesures d'ajustement et de validation ; expliquer comment le modèle a été utilisé (pour dériver des ajustements, pour prédire, pour vérifier) et quel poids il a reçu dans la réconciliation ; et conserver au dossier le code ou les paramètres qui permettent de reproduire le résultat. Un modèle dont le rapport ne dit que « selon notre analyse statistique » n'est pas un modèle divulgué. | ||||
| 451 | + | ||||
| 452 | +Le présent ouvrage applique à lui-même une règle plus exigeante encore, qui a valeur d'exemple pour la pratique. Toutes les données simulées y sont identifiées comme telles à leur première apparition, dans un encadré qui nomme le fichier, le script, la graine aléatoire et les sources de calibration ; chaque tableau et chaque figure qui en dépend porte la mention « données synthétiques » ; et chaque chiffre cité provient d'un script reproductible, testé, dont le nom est donné. Cette discipline, décrite à l'annexe~\ref{app:conventions-calcul}, transpose à l'écriture d'un traité ce que la règle 2.3 exige d'un rapport : que le lecteur puisse remonter de la conclusion aux données. Un évaluateur qui simule des scénarios, qui complète des données manquantes par imputation ou qui calibre un modèle sur des données partiellement construites doit, de la même façon, le dire dans l'étendue du travail et dans les hypothèses, et distinguer dans ses tableaux ce qui est observé de ce qui est construit. Le \cref{ch:40} revient sur la présentation des simulations de Monte-Carlo dans un rapport. | ||||
| 453 | + | ||||
| 454 | +\subsection{L'attestation} | ||||
| 455 | + | ||||
| 456 | +Le douzième élément de la règle 2.3 est l'attestation, dont les NPP imposent le modèle ; elle commence par les mots « J'atteste par la présente, au mieux de ma connaissance et de ma conviction » \parencite[règle 2.3, élément 12]{oeaqNormes} et se poursuit par une série de déclarations que l'on peut paraphraser sans les reproduire : les faits énoncés sont vrais et exacts ; les analyses et conclusions sont neutres et objectives et ne sont restreintes que par les hypothèses et réserves énoncées ; le signataire n'a aucun intérêt actuel ou éventuel dans l'immeuble et aucun intérêt personnel envers les parties ; ses honoraires ne dépendent pas de la valeur conclue ; il a ou n'a pas inspecté l'immeuble personnellement ; il a reçu ou non l'aide de tiers, qu'il nomme ; le rapport est conforme aux normes de pratique de l'Ordre. L'attestation est datée et signée. Sa valeur tient à ce qu'elle fait converger en un seul paragraphe les obligations des \cref{sec:10:npp,sec:10:deonto} : l'indépendance de l'article 17, l'interdiction des honoraires conditionnels de l'article 24.1, l'inspection de la règle 2.4, la supervision de l'article 33, la conformité de l'article 4. Celui qui la signe sans que chacune de ces déclarations soit vraie commet, en un geste, plusieurs manquements. | ||||
| 457 | + | ||||
| 458 | +\section{Responsabilité civile et assurance}\label{sec:10:responsabilite} | ||||
| 459 | + | ||||
| 460 | +\subsection{Le régime de droit commun} | ||||
| 461 | + | ||||
| 462 | +L'évaluateur agréé répond de ses actes selon le droit commun du Code civil du Québec, dont les dispositions ont été consultées à jour le 31 octobre 2026 \parencite{ccq}. Envers son client, la relation est un contrat de service : l'article 2098 définit le contrat d'entreprise ou de service comme celui par lequel le prestataire s'engage envers le client à fournir un service moyennant un prix, et l'article 2099 précise que le prestataire a le libre choix des moyens d'exécution et n'est pas subordonné au client \parencite[art.~2098--2099]{ccq}. L'article 2100 énonce la norme de conduite : le prestataire est tenu « d'agir au mieux des intérêts de [son] client, avec prudence et diligence » et, suivant la nature du service, « conformément aux usages et règles de leur art » \parencite[art.~2100]{ccq}. Cette disposition a deux conséquences pour l'évaluateur. D'une part, son obligation est en principe une obligation de \emph{moyens} : il ne garantit pas que l'immeuble se vendra au prix estimé, il garantit d'avoir mis en œuvre, avec prudence et diligence, les règles de l'art ; et les règles de l'art, pour un évaluateur agréé, sont les NPP et la méthodologie qu'elles supposent, de sorte que la conformité aux normes devient le critère de la faute civile. D'autre part, l'article 2102 oblige le prestataire à fournir au client, avant la conclusion du contrat, toute information utile sur la nature de la tâche, les biens et le temps nécessaires \parencite[art.~2102]{ccq} : la définition du mandat, première étape du processus de la \cref{fig:10:processus}, est aussi une obligation civile. | ||||
| 463 | + | ||||
| 464 | +Envers les tiers qui se fient au rapport sans être parties au contrat, le prêteur par exemple lorsque le rapport a été commandé par l'emprunteur, la responsabilité est extracontractuelle et relève de l'article 1457 : toute personne a le devoir de respecter les règles de conduite qui s'imposent à elle de manière à ne pas causer de préjudice à autrui, et répond du préjudice causé par sa faute \parencite[art.~1457]{ccq}. La question de savoir qui peut se fier au rapport est précisément celle que l'élément 3 de la règle 2.3 règle en amont, en identifiant le destinataire et l'usage prévu : un rapport qui précise qu'il est destiné au client aux fins d'une décision d'achat n'autorise pas un tiers à s'en servir pour un financement, et cette précision est la première défense de l'évaluateur. Le délai de prescription de l'action en responsabilité est de trois ans \parencite[art.~2925]{ccq} ; lorsque le préjudice se manifeste graduellement ou tardivement, il court du jour où il se manifeste pour la première fois \parencite[art.~2926]{ccq}, ce qui explique que la conservation des dossiers pendant au moins cinq ans soit un minimum et que beaucoup de cabinets conservent plus longtemps. | ||||
| 465 | + | ||||
| 466 | +\subsection{Les réserves ne sont pas des clauses d'exonération} | ||||
| 467 | + | ||||
| 468 | +L'article 32 du Code de déontologie interdit à l'évaluateur d'exclure ou de limiter sa responsabilité civile par contrat \parencite[art.~32]{deontOEAQ}. La règle clarifie le statut des réserves et des hypothèses de la règle 2.3 : elles délimitent l'\emph{étendue} de ce que l'évaluateur affirme, elles n'exonèrent pas de la responsabilité pour ce qu'il affirme. Une réserve selon laquelle les titres n'ont pas été vérifiés signifie que l'évaluateur ne répond pas d'un vice de titre ; elle ne signifie pas qu'il ne répond pas d'une erreur de superficie ou d'un comparable mal vérifié. Une hypothèse extraordinaire dûment énoncée, avec son incidence, protège l'évaluateur si l'hypothèse se révèle fausse ; une hypothèse vague ne protège de rien, parce qu'elle ne permet pas au lecteur de mesurer ce qu'il risque. La discipline rédactionnelle de la \cref{sec:10:hypotheses} est donc aussi une discipline de gestion du risque. | ||||
| 469 | + | ||||
| 470 | +\subsection{L'assurance responsabilité professionnelle} | ||||
| 471 | + | ||||
| 472 | +Comme tous les ordres professionnels québécois, l'OEAQ impose à ses membres une garantie de responsabilité professionnelle. Le rapport annuel 2024-2025 indique que la couverture a été portée à \dollars{2000000} à compter du 1\textsuperscript{er} avril 2025 \parencite{oeaqra2025} ; le fonds d'assurance de la responsabilité professionnelle, qui publiait des rapports distincts de 2010 à 2019, a été intégré à l'Ordre le 1\textsuperscript{er} avril 2020. L'assurance ne dispense d'aucune des obligations qui précèdent : elle indemnise le client ou le tiers lésé, elle protège le patrimoine de l'évaluateur, mais elle n'efface ni la faute déontologique, qui relève de la discipline de l'Ordre, ni le préjudice réputationnel. Les sinistres typiques en évaluation résidentielle tiennent à des erreurs de superficie ou de désignation, à des comparables non vérifiés, à des hypothèses non divulguées et à des rapports utilisés par des tiers pour un usage non prévu ; chacun de ces cas renvoie à un élément de la règle 2.3 mal traité, ce qui ramène, une dernière fois, à la grille du \cref{tab:10:elements}. Il n'a pas été possible, dans le cadre de la vérification des sources de cet ouvrage, de consulter des décisions judiciaires ou disciplinaires récentes concernant des évaluateurs agréés ; le chapitre s'en tient donc aux textes et renvoie le lecteur à la jurisprudence pour les illustrations. | ||||
| 473 | + | ||||
| 474 | +\begin{quebec} | ||||
| 475 | +Trois traits distinguent le régime québécois des régimes voisins. Le premier est l'ancrage dans le Code des professions : les NPP ne sont pas les normes d'une association à laquelle on adhère librement, mais celles d'un ordre dont le mandat légal est la protection du public, et leur violation est passible de discipline. Le deuxième est la place de l'évaluation foncière municipale, visée expressément par le champ d'exercice de l'article 37 j) du Code des professions \parencite{codeProfessions}, dotée de normes propres (normes 19 à 22) et d'une règle déontologique particulière sur les conflits d'intérêts entre la confection du rôle et l'expertise privée \parencite[art.~19]{deontOEAQ} ; le \cref{ch:9} en détaille les conséquences. Le troisième est la langue : les NPP, le Code de déontologie et les règlements existent en français et constituent la terminologie officielle, ce qui n'est pas anodin lorsqu'il faut traduire \emph{extraordinary assumption}, \emph{exposure time} ou \emph{scope of work} ; l'ouvrage emploie les termes des NPP (hypothèse extraordinaire, délai d'exposition, étendue du travail) et donne l'anglais une fois entre parenthèses. Toutes les dispositions citées ont été consultées le 31 octobre 2026 ; les textes réglementaires sont à jour au 1\textsuperscript{er} juillet 2026 et le Code des professions au 15 octobre 2026. | ||||
| 476 | +\end{quebec} | ||||
| 477 | + | ||||
| 478 | +\begin{erreurs} | ||||
| 479 | +\begin{itemize} | ||||
| 480 | +\item Confondre la date d'évaluation avec la date de l'inspection ou celle du rapport, ou remplacer la date d'évaluation par une « période de validité » : l'élément 5 de la règle 2.3 exige une date à laquelle l'opinion s'applique. | ||||
| 481 | +\item Énoncer une hypothèse extraordinaire sans en indiquer l'incidence sur la valeur ni la rappeler à chaque énoncé de la conclusion ; la règle 2.1 c) et l'élément 7 de la règle 2.3 l'exigent. | ||||
| 482 | +\item Croire qu'un rapport abrégé ou une mise à jour autorise l'omission d'éléments : les trois formes traitent les douze éléments, à des degrés de détail différents. | ||||
| 483 | +\item Omettre l'inspection sans l'expliquer au rapport, ou laisser croire qu'une visite extérieure est une inspection complète. | ||||
| 484 | +\item Signer un rapport préparé par un stagiaire sans l'avoir révisé : la règle 2.5 et l'article 33 font porter au signataire l'entière responsabilité. | ||||
| 485 | +\item Accepter des honoraires liés au résultat pour un rapport d'évaluation, ou une rétribution de référencement ; les articles 21 et 24.1 l'interdisent. | ||||
| 486 | +\item Écrire « la valeur est de » pour une estimation, ou « l'immeuble vaut » pour un prix observé ; le registre de la certitude doit correspondre à la nature de l'énoncé. | ||||
| 487 | +\item Utiliser des réserves générales comme clauses d'exonération ; l'article 32 l'interdit et les tribunaux n'y voient pas une défense. | ||||
| 488 | +\item Citer la numérotation des IVS 2022 (IVS 104 pour les bases de valeur, IVS 105 pour les approches) alors que l'édition 2025 les place en IVS 102 et IVS 103. | ||||
| 489 | +\end{itemize} | ||||
| 490 | +\end{erreurs} | ||||
| 491 | + | ||||
| 492 | +\begin{limites} | ||||
| 493 | +Ce chapitre décrit l'état des textes au 31 octobre 2026. Les NPP sont en cours de modernisation selon le rapport annuel 2024-2025 de l'Ordre, et un projet de permis dédié aux évaluateurs résidentiels est à l'étude ; l'une et l'autre pourraient modifier la structure des normes et les conditions d'accès décrites ici. L'USPAP n'a été vérifié que partiellement, par des sources secondaires, le site de The Appraisal Foundation étant inaccessible lors de la vérification ; sa structure interne n'est pas décrite et il ne faut pas s'appuyer sur ce chapitre pour un mandat américain. Le Red Book de la RICS a été vérifié par sa page officielle, non par le document complet. Le CUSPAP 2024 n'a pas été ouvert ; sa date d'effet est confirmée par la page de l'Institut et par l'annexe 20 de l'édition 2026. La date exacte d'adoption de la version courante des NPP n'est pas affichée par l'Ordre, et le règlement sur les diplômes donnant ouverture au permis n'a pas été consulté : la liste des trois diplômes provient de la page d'information de l'Ordre. Aucune décision judiciaire ou disciplinaire concernant un évaluateur agréé n'a été vérifiée ; la section sur la responsabilité s'en tient aux dispositions du Code civil et du Code de déontologie. Le contrôle lexical de l'exemple intégral est un outil pédagogique : il détecte des formulations, non la qualité du contenu, et ses lexiques sont ceux de l'auteur. Le modèle de détection de l'\cref{eq:10:detection} suppose des révisions indépendantes, hypothèse optimiste. Enfin, la matrice des dispositions dont la \cref{sec:10:international} donne les statistiques est celle du dépôt de cet ouvrage ; elle décrit l'usage que le traité fait des normes, non le corpus normatif lui-même. | ||||
| 494 | +\end{limites} | ||||
| 495 | + | ||||
| 496 | +\begin{synthese} | ||||
| 497 | +\begin{itemize} | ||||
| 498 | +\item L'évaluation est au Québec une profession à titre réservé encadrée par le Code des professions ; l'évaluateur agréé formule « une opinion dûment motivée de la valeur » et engage un code de déontologie, des normes de pratique, une inspection professionnelle et une assurance. | ||||
| 499 | +\item Les NPP distinguent règles coercitives et directives ; la règle 1.2 fixe douze éléments de substance, la règle 2.3 douze éléments que tout rapport écrit doit contenir, quelle que soit sa forme (narratif complet, abrégé, mise à jour). Le seul taux de conformité acceptable est $\tau = 1$. | ||||
| 500 | +\item Une hypothèse extraordinaire est énoncée, justifiée, accompagnée de son incidence sur la valeur et rappelée à chaque conclusion ; elle délimite l'opinion, elle n'exonère pas. | ||||
| 501 | +\item Le Code de déontologie protège l'indépendance (art.~17), encadre le double rôle et les conflits d'intérêts (art.~18--19), interdit commissions et honoraires conditionnels pour un rapport (art.~21, 24.1), impose la supervision (art.~33), la transparence méthodologique (art.~41) et le secret (art.~51), et interdit d'exclure sa responsabilité (art.~32). | ||||
| 502 | +\item IVS 2025, CUSPAP 2026 et Red Book 2025 convergent entre eux et avec les NPP sur la définition fonctionnelle de la valeur marchande et la divulgation des hypothèses ; ils sont plus explicites sur les données, les modèles et le délai d'exposition. L'USPAP 2024 n'est que partiellement vérifié. | ||||
| 503 | +\item La qualité se construit par autocontrôle, révision et inspection ; un contrôle automatique des douze éléments est un bon premier filtre, dont les limites sont connues. | ||||
| 504 | +\item Le rapport distingue les faits, les estimations et les hypothèses par son langage ; il divulgue données, modèles et données construites ; l'attestation fait converger toutes les obligations en un paragraphe signé. | ||||
| 505 | +\item L'évaluateur est tenu à une obligation de moyens selon les règles de l'art (art.~2100 C.c.Q.), répond envers les tiers selon l'article 1457, et l'assurance responsabilité (\dollars{2000000} depuis le 1\textsuperscript{er} avril 2025) complète sans remplacer ces obligations. | ||||
| 506 | +\end{itemize} | ||||
| 507 | +\end{synthese} | ||||
| 508 | + | ||||
| 509 | +\section*{Exercices} | ||||
| 510 | +\addcontentsline{toc}{section}{Exercices} | ||||
| 511 | + | ||||
| 512 | +\begin{exercice}[1]{Règles coercitives, directives et titres}{ex:10:1} | ||||
| 513 | +Pour chacune des affirmations suivantes, dites si elle est exacte et justifiez-la en citant la disposition pertinente : (a) un rapport abrégé peut omettre la définition de la valeur si le client y consent ; (b) un évaluateur peut s'écarter d'une directive des NPP avec l'accord préalable du client, à condition de l'exposer au rapport ; (c) une personne qui n'est pas membre de l'Ordre ne peut pas exprimer d'opinion sur la valeur d'un immeuble ; (d) un évaluateur qui n'a pas inspecté l'immeuble doit l'expliquer au rapport ; (e) les normes 3 et 4 des NPP portent sur l'inspection professionnelle. | ||||
| 514 | +\end{exercice} | ||||
| 515 | + | ||||
| 516 | +\begin{exercice}[1]{Formation continue et conservation des dossiers}{ex:10:2} | ||||
| 517 | +(a) Une évaluatrice a accompli 26 heures de formation continue durant la période 2026-2027, dont 2 heures en éthique, déontologie et normes, et elle disposait d'un report de 5 heures de la période précédente. Sa période est-elle conforme ? Quel report transmet-elle à la période 2028-2029 ? Reprenez le calcul pour un confrère qui a accompli 33 heures dont 3 en éthique, sans report. (b) Un dossier d'évaluation est clos le 15 novembre 2026, date du dernier service rendu au client. Jusqu'à quelle date au moins doit-il être conservé selon le règlement sur la tenue des dossiers ? Expliquez pourquoi, compte tenu des articles 2925 et 2926 C.c.Q., cette durée est un minimum. | ||||
| 518 | +\end{exercice} | ||||
| 519 | + | ||||
| 520 | +\begin{exercice}[2]{Révision critique de l'extrait fictif A}{ex:10:3} | ||||
| 521 | +Relisez l'extrait fictif A, reproduit dans le script \texttt{analysis/python/cases/ch10\_controle\_rapport.py} et résumé à la \cref{sec:10:exemple}. Pour chacun des douze éléments de la règle 2.3, indiquez s'il est présent, présent mais insuffisant, ou absent, et rédigez pour chaque élément absent la phrase ou le paragraphe qui le rendrait conforme, en inventant les faits nécessaires et en les identifiant comme fictifs. Expliquez ensuite pourquoi la « période de validité de six mois » ne tient pas lieu de date d'évaluation et pourquoi la « visite extérieure » appelle une explication au titre de la règle 2.4. | ||||
| 522 | +\end{exercice} | ||||
| 523 | + | ||||
| 524 | +\begin{exercice}[2]{Situations déontologiques}{ex:10:4} | ||||
| 525 | +Qualifiez chacune des situations suivantes au regard du Code de déontologie et indiquez la conduite à tenir, avec les articles : (a) un prêteur demande à l'évaluateur de « confirmer » une valeur de \dollars{620000} nécessaire à l'approbation d'un prêt ; (b) un évaluateur, également courtier, est mandaté pour évaluer une maison qu'il a inscrite à la vente ; (c) l'évaluateur chargé du rôle d'une municipalité est sollicité par un propriétaire de cette municipalité pour contester son évaluation ; (d) un client propose de verser, à titre d'honoraires pour un rapport d'évaluation, 20 \% de l'économie de taxes obtenue ; (e) un gestionnaire d'immeubles offre un montant fixe pour chaque dossier d'évaluation qu'il réfère au cabinet ; (f) un confrère d'un autre cabinet demande copie des états financiers d'un immeuble évalué l'an dernier. | ||||
| 526 | +\end{exercice} | ||||
| 527 | + | ||||
| 528 | +\begin{exercice}[2]{Hypothèse extraordinaire et incidence sur la valeur}{ex:10:5} | ||||
| 529 | +L'extrait fictif B conclut à une valeur de \dollars{612000} en présumant qu'un permis d'agrandissement a été obtenu. Supposez que, sans permis, l'évaluateur aurait conclu à \dollars{575000}. (a) Rédigez l'hypothèse extraordinaire conformément aux quatre éléments de l'encadré « En pratique » de la \cref{sec:10:hypotheses}, puis la phrase de conclusion qui la rappelle. (b) Calculez l'incidence de l'hypothèse en dollars et en pourcentage. (c) Un acheteur attribue 60 \% de chances à l'existence du permis ; quelle valeur espérée devrait-il retenir pour sa décision, et pourquoi l'évaluateur ne doit-il pas lui-même conclure à cette valeur ? (d) Reprenez (c) avec 25 \% et commentez la sensibilité. | ||||
| 530 | +\end{exercice} | ||||
| 531 | + | ||||
| 532 | +\begin{exercice}[3]{Étendre et évaluer le contrôle automatique}{ex:10:6} | ||||
| 533 | +À l'aide du script \texttt{analysis/python/cases/ch10\_controle\_rapport.py} : (a) ajoutez au lexique strict de l'élément 10 un motif qui détecterait la formulation « la méthode du revenu n'est pas applicable à une résidence occupée par son propriétaire » et vérifiez l'effet sur les quatre extraits ; (b) rédigez un cinquième extrait fictif qui obtient 12 sur 12 au contrôle strict tout en étant manifestement non conforme sur le fond (par exemple une hypothèse extraordinaire sans incidence et une attestation contredite par le texte), et expliquez ce que cela enseigne sur les limites du contrôle lexical ; (c) en vous appuyant sur l'\cref{eq:10:detection}, estimez la probabilité qu'une lacune échappe à un contrôle automatique de puissance $d_1 = 0{,}95$ pour les omissions grossières suivi d'une révision humaine de puissance $d_2 = 0{,}7$, en supposant l'indépendance ; discutez cette hypothèse d'indépendance. | ||||
| 534 | +\end{exercice} | ||||
| 535 | + | ||||
| 536 | +\begin{exercice}[3]{Correspondance entre cadres normatifs}{ex:10:7} | ||||
| 537 | +Un cabinet québécois reçoit d'un investisseur canadien un rapport préparé par un membre de l'Institut canadien des évaluateurs selon le CUSPAP 2026, et doit l'intégrer à un dossier soumis aux NPP. (a) Dressez un tableau de correspondance entre les notions du CUSPAP (\emph{extraordinary assumption}, \emph{hypothetical condition}, \emph{extraordinary limiting condition}, \emph{exposure time}) et les notions des NPP, en indiquant celles qui n'ont pas d'équivalent exact. (b) Indiquez quels éléments de la règle 2.3 un examinateur devrait vérifier en priorité dans un rapport CUSPAP avant de le juger utilisable, et sous quelle norme des NPP il rendrait compte de son examen. (c) Expliquez pourquoi ce chapitre refuse de décrire le contenu de l'USPAP 2024 et ce qu'un rédacteur devrait faire avant de le citer. | ||||
| 538 | +\end{exercice} | ||||
| 539 | + | ||||
| 540 | +\section*{Pour aller plus loin} | ||||
| 541 | +\addcontentsline{toc}{section}{Pour aller plus loin} | ||||
| 542 | + | ||||
| 543 | +Les textes primaires sont la première lecture : les Normes de pratique professionnelle de l'OEAQ \parencite{oeaqNormes}, dont on lira en entier l'introduction, les normes 1 et 2 et les annexes B et E, puis le Code de déontologie \parencite{deontOEAQ} et les règlements du \cref{tab:10:reglements}. Pour les cadres voisins, le CUSPAP 2026 \parencite{cuspap2026} et les IVS 2025 \parencite{ivs2025}, tous deux diffusés gratuitement, se lisent avec profit en parallèle des NPP ; le Red Book \parencite{rics2025} est indispensable pour les mandats internationaux. Les manuels de référence de l'Appraisal Institute \parencite{appraisal2026} et son édition canadienne \parencite{appraisalCdn} consacrent des chapitres au processus d'évaluation et à la rédaction du rapport, et le dictionnaire de l'Institut \parencite{aiDictionary2022} fixe la terminologie anglaise. Sur les fondements comportementaux de l'éthique de l'estimation, on lira \textcite{northcraftNeale1987}, \textcite{diaz1990}, \textcite{diaz1997} et le bilan de \textcite{diazHansz2002} ; \textcite{lentzWang1998} situent ces questions dans le processus de prêt hypothécaire. Enfin, \textcite{frenchGabrielli2004} ont posé les termes du débat sur la communication de l'incertitude dans le rapport, que le \cref{ch:20} prolonge. | ||||
added
references/lib-ch17.bib
+41 −0
@@ -0,0 +1,41 @@ | |||||
| 1 | +% Nouvelles références du chapitre 17 — vérifiées dans l'API Crossref le 2026-10-31 ; à fusionner dans library.bib par l'orchestrateur. | ||||
| 2 | +% NON citées dans ch17.tex (règle : citer uniquement des clés déjà présentes dans library.bib). Le texte les mentionne en toutes lettres. | ||||
| 3 | + | ||||
| 4 | +@article{duan1983, | ||||
| 5 | + author = {Duan, Naihua}, | ||||
| 6 | + title = {Smearing Estimate: A Nonparametric Retransformation Method}, | ||||
| 7 | + journaltitle = {Journal of the American Statistical Association}, | ||||
| 8 | + year = {1983}, | ||||
| 9 | + volume = {78}, | ||||
| 10 | + number = {383}, | ||||
| 11 | + pages = {605--610}, | ||||
| 12 | + doi = {10.1080/01621459.1983.10478017}, | ||||
| 13 | + urldate = {2026-10-31}, | ||||
| 14 | + note = {Correction de retransformation (\emph{smearing}) appliquée par \texttt{traite.cas1.predire} ; vérifié Crossref 2026-10-31} | ||||
| 15 | +} | ||||
| 16 | + | ||||
| 17 | +@article{giles1982, | ||||
| 18 | + author = {Giles, David E. A.}, | ||||
| 19 | + title = {The Interpretation of Dummy Variables in Semilogarithmic Equations}, | ||||
| 20 | + journaltitle = {Economics Letters}, | ||||
| 21 | + year = {1982}, | ||||
| 22 | + volume = {10}, | ||||
| 23 | + number = {1--2}, | ||||
| 24 | + pages = {77--79}, | ||||
| 25 | + doi = {10.1016/0165-1765(82)90119-7}, | ||||
| 26 | + urldate = {2026-10-31}, | ||||
| 27 | + note = {Estimateur sans biais exact de $100[\exp(\beta)-1]$, prolongement de Kennedy (1981) ; vérifié Crossref 2026-10-31} | ||||
| 28 | +} | ||||
| 29 | + | ||||
| 30 | +@article{vanGarderenShah2002, | ||||
| 31 | + author = {van Garderen, Kees Jan and Shah, Chandra}, | ||||
| 32 | + title = {Exact Interpretation of Dummy Variables in Semilogarithmic Equations}, | ||||
| 33 | + journaltitle = {The Econometrics Journal}, | ||||
| 34 | + year = {2002}, | ||||
| 35 | + volume = {5}, | ||||
| 36 | + number = {1}, | ||||
| 37 | + pages = {149--159}, | ||||
| 38 | + doi = {10.1111/1368-423X.00078}, | ||||
| 39 | + urldate = {2026-10-31}, | ||||
| 40 | + note = {Estimateur exact à variance minimale et sa variance ; vérifié Crossref 2026-10-31} | ||||
| 41 | +} | ||||
modified
references/library.bib
+39 −0
@@ -4442,6 +4442,45 @@ | |||||
| 4442 | note = {Frais de gestion : forfait de 5~\%, frais réels admissibles jusqu'à 10~\% des revenus annuels de l'immeuble} | 4442 | note = {Frais de gestion : forfait de 5~\%, frais réels admissibles jusqu'à 10~\% des revenus annuels de l'immeuble} | ||
| 4443 | } | 4443 | } | ||
| 4444 | 4444 | ||||
| 4445 | +@article{duan1983, | ||||
| 4446 | + author = {Duan, Naihua}, | ||||
| 4447 | + title = {Smearing Estimate: A Nonparametric Retransformation Method}, | ||||
| 4448 | + journaltitle = {Journal of the American Statistical Association}, | ||||
| 4449 | + year = {1983}, | ||||
| 4450 | + volume = {78}, | ||||
| 4451 | + number = {383}, | ||||
| 4452 | + pages = {605--610}, | ||||
| 4453 | + doi = {10.1080/01621459.1983.10478017}, | ||||
| 4454 | + urldate = {2026-10-31}, | ||||
| 4455 | + note = {Correction de retransformation (\emph{smearing}) appliquée par \texttt{traite.cas1.predire} ; vérifié Crossref 2026-10-31} | ||||
| 4456 | +} | ||||
| 4457 | + | ||||
| 4458 | +@article{giles1982, | ||||
| 4459 | + author = {Giles, David E. A.}, | ||||
| 4460 | + title = {The Interpretation of Dummy Variables in Semilogarithmic Equations}, | ||||
| 4461 | + journaltitle = {Economics Letters}, | ||||
| 4462 | + year = {1982}, | ||||
| 4463 | + volume = {10}, | ||||
| 4464 | + number = {1--2}, | ||||
| 4465 | + pages = {77--79}, | ||||
| 4466 | + doi = {10.1016/0165-1765(82)90119-7}, | ||||
| 4467 | + urldate = {2026-10-31}, | ||||
| 4468 | + note = {Estimateur sans biais exact de $100[\exp(\beta)-1]$, prolongement de Kennedy (1981) ; vérifié Crossref 2026-10-31} | ||||
| 4469 | +} | ||||
| 4470 | + | ||||
| 4471 | +@article{vanGarderenShah2002, | ||||
| 4472 | + author = {van Garderen, Kees Jan and Shah, Chandra}, | ||||
| 4473 | + title = {Exact Interpretation of Dummy Variables in Semilogarithmic Equations}, | ||||
| 4474 | + journaltitle = {The Econometrics Journal}, | ||||
| 4475 | + year = {2002}, | ||||
| 4476 | + volume = {5}, | ||||
| 4477 | + number = {1}, | ||||
| 4478 | + pages = {149--159}, | ||||
| 4479 | + doi = {10.1111/1368-423X.00078}, | ||||
| 4480 | + urldate = {2026-10-31}, | ||||
| 4481 | + note = {Estimateur exact à variance minimale et sa variance ; vérifié Crossref 2026-10-31} | ||||
| 4482 | +} | ||||
| 4483 | + | ||||
| 4445 | @manual{arcRC4028, | 4484 | @manual{arcRC4028, | ||
| 4446 | author = {{Agence du revenu du Canada}}, | 4485 | author = {{Agence du revenu du Canada}}, | ||
| 4447 | title = {RC4028 --- Remboursement de la TPS/TVH pour habitations neuves}, | 4486 | title = {RC4028 --- Remboursement de la TPS/TVH pour habitations neuves}, | ||
modified
solutions/ch01.tex
+29 −0
@@ -1 +1,30 @@ | |||||
| 1 | % Solutions du chapitre 1 — Théorie de la valeur et prix immobiliers | 1 | % Solutions du chapitre 1 — Théorie de la valeur et prix immobiliers | ||
| 2 | +% Les chiffres sont vérifiés par analysis/python/tests/test_ch01.py (fonction test_solutions_exercices) | ||||
| 3 | + | ||||
| 4 | +\begin{solution}{ex:1:1}{Prix, valeur ou coût ?} | ||||
| 5 | +(a) \dollars{598000} est un \emph{prix} : la contrepartie convenue lors d'une vente datée. Reformulation : « La maison s'est vendue \dollars{598000} en juin ; sa valeur marchande à cette date était vraisemblablement voisine, mais elle n'est pas connue par ce seul prix. » (b) \dollars{468000} est une \emph{valeur au rôle} : une valeur réelle au sens de l'art.~43 LFM, établie à la date de référence du rôle (art.~46), non une valeur marchande à la date courante. Reformulation : « La valeur inscrite au rôle est de \dollars{468000}, pour une date de référence du 1\textsuperscript{er} juillet 2024. » (c) \dollars{900000} est une \emph{valeur d'investissement} (ou d'usage) : propre à ces acheteurs et à leur projet familial ; elle peut légitimement dépasser la valeur marchande, et c'est cette différence qui les décide à acheter. (d) \dollars{470000} est un \emph{coût} (le prix demandé par un constructeur pour produire un bien neuf, c'est-à-dire un coût de remplacement observé sur le marché de la construction) ; il n'informe sur la valeur du sujet qu'après déduction des dépréciations. (e) \dollars{635000} est une \emph{valeur marchande} estimée : une opinion motivée au sens de l'art.~37~j) du Code des professions ; la phrase est correcte si le rapport précise la base, la date et, idéalement, la fourchette. (f) \dollars{65000} est très probablement le \emph{coût} de la piscine ; sa contribution à la valeur est ce que le marché paie pour une piscine, en général beaucoup moins (\pct{2.7} dans le cas~1). Reformulation : « La piscine a coûté \dollars{65000} ; elle contribue à la valeur pour un montant que le marché détermine. » | ||||
| 6 | +\end{solution} | ||||
| 7 | + | ||||
| 8 | +\begin{solution}{ex:1:2}{Contribution et coût} | ||||
| 9 | +La contribution d'un attribut ajouté à une maison de valeur $V$ est $V(e^{\beta} - 1)$. Pour la piscine, $635\,821 \times (e^{0{,}02633} - 1) = 635\,821 \times 0{,}02668 = \dollars{16964}$ ; pour le garage, $635\,821 \times (e^{0{,}03243} - 1) = 635\,821 \times 0{,}03296 = \dollars{20958}$. Le principe de contribution conclut que la piscine, qui coûte \dollars{65000} et n'ajoute que \dollars{16964}, est une \emph{surconstruction} : près des trois quarts de la dépense ne se retrouvent pas dans la valeur, et la méthode du coût devrait la frapper d'une désuétude fonctionnelle d'environ \dollars{48000} (\cref{ch:24}). Le garage, qui coûte \dollars{45000} et ajoute \dollars{20958}, est lui aussi une surconstruction au sens strict, mais la perte est moindre (\dollars{24000} environ). Le propriétaire qui envisage ces travaux doit comprendre qu'il achète d'abord de l'utilité pour lui-même, non de la valeur de revente ; s'il ne compte pas jouir de la piscine, il ne devrait pas la construire. La leçon pour l'évaluateur est que les ajustements de la grille de comparaison se fondent sur les contributions marchandes, jamais sur les coûts déclarés par les parties. | ||||
| 10 | +\end{solution} | ||||
| 11 | + | ||||
| 12 | +\begin{solution}{ex:1:3}{Rendements décroissants} | ||||
| 13 | +Le prix moyen du mètre carré est $635\,821 / 165 = \parmsq{3853}$ ; le prix marginal est $\beta_S \times 3\,853 = 0{,}539 \times 3\,853 = \parmsq{2077}$ (\cref{eq:1:marginal}). La valeur ajoutée par l'agrandissement à \msq{190} est $635\,821 \times [(190/165)^{0{,}539} - 1] = 635\,821 \times 0{,}0790 = \dollars{50241}$, soit \parmsq{2010} pour chacun des 25 mètres carrés ajoutés : un peu moins que le prix marginal au point de départ (\parmsq{2077}), parce que le prix marginal décroît le long de l'agrandissement, et à peine plus de la moitié du prix moyen. Le prix marginal égalerait le prix moyen si l'élasticité valait exactement un, c'est-à-dire si le prix était proportionnel à la superficie. Cette situation n'est presque jamais observée parce qu'une part du prix rémunère des éléments qui ne croissent pas avec la surface habitable : le terrain, les raccordements, la cuisine et les salles de bain, le garage, l'emplacement. Un acheteur qui paie \parmsq{3853} en moyenne paie en réalité un montant fixe pour « être là » et un montant décroissant pour chaque mètre carré supplémentaire. Un ajustement de superficie au prix moyen surestimerait donc l'ajustement d'un facteur $1/0{,}539 \approx 1{,}86$. | ||||
| 14 | +\end{solution} | ||||
| 15 | + | ||||
| 16 | +\begin{solution}{ex:1:4}{Médiane, moyenne, mode et intervalle} | ||||
| 17 | +Avec $\sigma = 0{,}12$ et une médiane de \dollars{500000}, la moyenne conditionnelle est $500\,000 \times e^{0{,}0072} = \dollars{503613}$ et le mode $500\,000 \times e^{-0{,}0144} = \dollars{492852}$ (\cref{eq:1:lognormale}) : l'écart entre le mode et la moyenne atteint \pct{2.2}, alors qu'il n'est que de \pct{1.0} dans le cas~1. Les bornes de l'intervalle de prédiction à 95 \%, en négligeant l'incertitude des coefficients, sont $500\,000 \times e^{\mp 1{,}96 \times 0{,}12}$, soit \dollars{395206} et \dollars{632581}, c'est-à-dire de $-\pct{21.0}$ à $+\pct{26.5}$ autour de la médiane ; l'asymétrie des bornes en dollars vient de l'exponentielle. La probabilité qu'une vente s'écarte de plus de dix pour cent de la médiane est $2[1 - \Phi(\ln 1{,}1 / 0{,}12)] = 2[1 - \Phi(0{,}794)] = 0{,}427$ (\cref{eq:1:proba}) : près d'une vente sur deux, contre une sur quatre dans le cas~1. Dans un tel marché, un prix isolé est une mesure médiocre de la valeur, la fourchette rapportée doit être large, et le nombre de ventes identiques nécessaire pour une précision de $\pm 2$ \% passe de 68 à 142 (\cref{tab:1:sensibilite}). | ||||
| 18 | +\end{solution} | ||||
| 19 | + | ||||
| 20 | +\begin{solution}{ex:1:5}{Le bien comme actif : Gordon et coût d'usage} | ||||
| 21 | +Par l'\cref{eq:1:gordon}, la valeur du duplex est $24\,000 / (0{,}06 - 0{,}02) = \dollars{600000}$ ; le taux de capitalisation implicite est $R = r - g = \pct{4}$. Pour la maison, le coût d'usage annuel (\cref{eq:1:cout-usage}) est $600\,000 \times (0{,}045 + 0{,}01 + 0{,}015 - 0{,}02) = 600\,000 \times 0{,}05 = \dollars{30000}$, soit \dollars{2500} par mois. Si le taux d'intérêt passe à \pct{6}, le coût d'usage devient $600\,000 \times 0{,}065 = \dollars{39000}$, soit \dollars{3250} par mois : une hausse de 150 points de base du taux renchérit l'occupation de 30 \%. Le ménage est indifférent entre louer et acheter lorsque le loyer de marché d'un logement équivalent égale le coût d'usage : \dollars{2500} par mois dans le premier cas, \dollars{3250} dans le second. Si le loyer de marché reste à \dollars{2500}, la hausse du taux rend la location préférable, et le prix d'équilibre de la maison doit baisser jusqu'à ce que $V \times 0{,}065 = 30\,000$, soit $V = \dollars{461538}$, toutes choses égales d'ailleurs ; en pratique, la plus-value attendue $g$ et les loyers s'ajustent aussi, ce qui amortit le mouvement (\cref{ch:3}). | ||||
| 22 | +\end{solution} | ||||
| 23 | + | ||||
| 24 | +\begin{solution}{ex:1:6}{Prix de réserve et délai de vente} | ||||
| 25 | +(a) Avec $p = 1$ et $\delta = 1$, l'\cref{eq:1:reserve} s'écrit $W = -c + \E[\max(O, W)] = -c + W + \E[(O - W)^+]$, d'où $c = \E[(O - W)^+]$ : le vendeur fixe son prix de réserve de sorte que le coût d'attendre une période égale le gain espéré d'attendre une offre meilleure. Pour $O$ uniforme sur $[a, b]$ et $W \in [a, b]$, $\E[(O - W)^+] = \int_W^b (o - W)\,\dd o / (b - a) = (b - W)^2 / [2(b - a)]$. (b) En égalant à $c$ : $(b - W)^2 = 2c(b - a)$, donc $W = b - \sqrt{2c(b - a)}$. Avec $a = 0{,}9$, $b = 1{,}1$ et $c = 0{,}005$ : $W = 1{,}1 - \sqrt{0{,}002} = 1{,}1 - 0{,}0447 = 1{,}0553$. Le délai espéré est $1 / [1 - F(W)] = (b - a)/(b - W) = 0{,}2 / 0{,}0447 = 4{,}47$ mois, et le prix espéré $(W + b)/2 = 1{,}0776$, soit \pct{7.8} au-dessus du centre des enchères. (c) Avec $c = 0{,}02$ : $W = 1{,}1 - \sqrt{0{,}008} = 1{,}0106$, délai $0{,}2 / 0{,}0894 = 2{,}24$ mois, prix espéré $1{,}0553$. Le vendeur pressé vend deux fois plus vite et \pct{2.1} moins cher. (d) Les deux prix espérés sont des prix de marché : chacun est l'espérance du prix de transaction d'un vendeur rationnel face à la même distribution d'acheteurs ; ils diffèrent par la contrainte de temps du vendeur, non par le bien. La définition professionnelle de la valeur marchande exige des parties non contraintes et une exposition suffisante : elle désigne le prix espéré du vendeur \emph{non pressé}, celui du cas (b). Le prix du cas (c) est le prix espéré d'une vente « sous contrainte de temps », que l'évaluateur écarte ou ajuste lorsqu'il le rencontre parmi ses comparables ; l'écart de \pct{2.1} donne un ordre de grandeur de l'ajustement de conditions de vente dans ce marché simplifié. | ||||
| 26 | +\end{solution} | ||||
| 27 | + | ||||
| 28 | +\begin{solution}{ex:1:7}{Mesurer l'ancrage} | ||||
| 29 | +(a) En soustrayant $V$ des deux membres de l'\cref{eq:1:ancrage}, $\hat V_A - V = \lambda (A - V)$ : l'écart de la conclusion à la valeur est proportionnel à l'écart de l'ancre à la valeur, sans constante. Avec $x_i = A_i - V_i$ et $y_i = \hat V_{A,i} - V_i$, $\sum x_i y_i = 40 \times 18 + 30 \times 12 + 25 \times 9 + 60 \times 27 + 20 \times 10 + 15 \times 6 = 720 + 360 + 225 + 1\,620 + 200 + 90 = 3\,215$ et $\sum x_i^2 = 1\,600 + 900 + 625 + 3\,600 + 400 + 225 = 7\,350$, d'où $\hat\lambda = 3\,215 / 7\,350 = 0{,}437$. (b) Un prix demandé supérieur de \dollars{50000} à la valeur déplace la conclusion de $0{,}437 \times 50\,000 = \dollars{21900}$ en moyenne. (c) Protocole : (1) le dossier transmis à l'évaluateur est expurgé du prix demandé, du prix convenu et des évaluations antérieures jusqu'à la conclusion préliminaire ; (2) les filtres de sélection des comparables et les sources d'ajustement sont fixés par écrit avant toute consultation des prix ; (3) deux méthodes indépendantes sont menées à terme séparément ; (4) la conclusion préliminaire est consignée en fourchette avec sa date avant la levée de l'expurgation ; (5) l'écart entre la conclusion préliminaire et la conclusion finale, après prise de connaissance de l'ancre, est archivé. Vérification : le cabinet réestime $\lambda$ chaque année sur les écarts archivés, et il peut aussi comparer les conclusions aux prix de revente ultérieurs. (d) Dans le modèle de recherche, le coefficient de variation des prix acceptés croît avec l'écart-type des offres : avec les paramètres par défaut et $\sigma_o$ passant de 0,03 à 0,12, la dispersion des prix de biens identiques augmente à peu près proportionnellement (coefficient de variation de 1,8 \% à 5,5 \% environ, et le délai moyen passe de 3 à 9 mois parce que le vendeur attend davantage), parce que les prix acceptés sont des tirages dans la queue d'une distribution plus étalée. Plus le marché est dispersé, plus les comparables sont bruités, plus l'évaluateur est incertain, et plus une ancre « précise » comme le prix demandé exerce d'attraction : l'ancrage est le substitut psychologique d'une information que le marché ne fournit pas, et il est d'autant plus dangereux que la fourchette légitime est large. | ||||
| 30 | +\end{solution} | ||||
modified
solutions/ch10.tex
+53 −0
@@ -1 +1,54 @@ | |||||
| 1 | % Solutions du chapitre 10 — Normes OEAQ, éthique et rapports | 1 | % Solutions du chapitre 10 — Normes OEAQ, éthique et rapports | ||
| 2 | +% Les extraits de rapports, les situations et les chiffres des exercices sont fictifs. Calculs : analysis/python/cases/ch10_controle_rapport.py ; tests : analysis/python/tests/test_ch10.py. | ||||
| 3 | + | ||||
| 4 | +\begin{solution}{ex:10:1}{Règles coercitives, directives et titres} | ||||
| 5 | +(a) Inexact. La règle 2.3 des NPP est une règle coercitive : tous les rapports écrits, « de quelque forme qu'ils soient », doivent inclure les douze éléments, dont la définition de la valeur (élément 4). Le consentement du client ne permet d'écarter qu'une directive, jamais une règle coercitive (Intro-1). Le rapport abrégé \emph{résume} l'élément, il ne l'omet pas. | ||||
| 6 | +(b) Exact. L'introduction des NPP (Intro-1) prévoit que les directives peuvent être écartées avec l'accord préalable du client ; l'élément 11 de la règle 2.3 exige alors que l'écart soit exposé au rapport. | ||||
| 7 | +(c) Inexact. La profession est à titre réservé (art.~36~j) du Code des professions) : seuls les titres « évaluateur agréé », « estimateur agréé », « E.A. » et « C.App. » sont réservés. Le champ d'exercice de l'article 37~j) décrit l'acte professionnel sans en interdire l'exercice à autrui ; c'est le faisceau d'obligations (déontologie, normes, inspection, assurance) qui distingue l'opinion de l'évaluateur agréé. | ||||
| 8 | +(d) Exact. La règle 2.4 impose l'inspection « à moins de circonstances exceptionnelles lesquelles seront expliquées au rapport », et chaque signataire précise s'il a inspecté personnellement. | ||||
| 9 | +(e) Inexact. Les normes 3 et 4 portent sur l'\emph{examen d'un rapport} d'évaluation (révision par un tiers). L'inspection professionnelle relève du Règlement sur le comité d'inspection professionnelle (C-26, r.~124), et l'inspection de l'immeuble de la règle 2.4. | ||||
| 10 | +\end{solution} | ||||
| 11 | + | ||||
| 12 | +\begin{solution}{ex:10:2}{Formation continue et conservation des dossiers} | ||||
| 13 | +(a) \emph{Évaluatrice} : heures disponibles $= 26 + \min\{5, 5\} = 31 \geq 30$ ; le volume total est conforme. Les heures d'éthique, de déontologie et de normes sont de 2, inférieures au minimum de 3 heures de l'article 2 du règlement (C-26, r.~127.1) ; le report ne s'applique pas à ce minimum, qui doit être satisfait dans chaque période : déficit de 1 heure, période \emph{non conforme} tant que l'heure manquante n'est pas accomplie. Report transmis à 2028-2029 selon l'\cref{eq:10:report} : $\min\{5, \max\{0, 31 - 30\}\} = 1$ heure. \emph{Confrère} : $33 + 0 = 33 \geq 30$ et $3 \geq 3$ : conforme ; report $\min\{5, 33 - 30\} = 3$ heures. (Le script donne les mêmes résultats : \texttt{bilan\_formation(26, 2, 5)} et \texttt{bilan\_formation(33, 3, 0)}.) | ||||
| 14 | +(b) Le Règlement sur la tenue des dossiers (C-26, r.~133, art.~6) exige une conservation « pendant au moins 5 ans » après le dernier service : le dossier clos le 15 novembre 2026 est conservé au moins jusqu'au 15 novembre 2031. C'est un minimum parce que l'action en responsabilité se prescrit par trois ans (art.~2925 C.c.Q.), mais que, lorsque le préjudice se manifeste graduellement ou tardivement, le délai ne court qu'à compter de sa première manifestation (art.~2926) : une erreur découverte lors d'une revente quatre ans après le rapport peut donner lieu à une action jusqu'à sept ans après celui-ci, au-delà des cinq ans réglementaires. Beaucoup de cabinets conservent les dossiers dix ans ou plus pour cette raison. | ||||
| 15 | +\end{solution} | ||||
| 16 | + | ||||
| 17 | +\begin{solution}{ex:10:3}{Révision critique de l'extrait fictif A} | ||||
| 18 | +Le contrôle lexical strict relève 2 éléments sur 12 (\cref{tab:10:controle}) ; la lecture humaine confirme et nuance. | ||||
| 19 | +\begin{itemize} | ||||
| 20 | +\item \textbf{1. Identification} : insuffisant. Une adresse (fictive) sans désignation cadastrale ni description légale. Ajouter : « Lot [numéro fictif] du cadastre du Québec, circonscription foncière de Hull ; bâtiment résidentiel unifamilial isolé ; aucun bien meuble inclus. » | ||||
| 21 | +\item \textbf{2. Droits évalués} : absent. Ajouter : « Les droits évalués sont la pleine propriété, libre de toute charge autre que les servitudes d'utilité publique indiquées au certificat de localisation du [date fictive]. » | ||||
| 22 | +\item \textbf{3. But et fin} : présent (financement hypothécaire, prêteur destinataire), mais le but n'est pas nommé : préciser « estimer la valeur marchande ». | ||||
| 23 | +\item \textbf{4. Définition de la valeur} : absent. Ajouter la définition de la valeur marchande des NPP (prix sincère le plus probable, marché libre et ouvert, parties informées, exposition suffisante, paiement comptant ou équivalent, épuré des incitatifs), en la citant comme telle. | ||||
| 24 | +\item \textbf{5. Date d'évaluation} : absent. « Valable pour six mois » décrit une durée d'usage du rapport, non la date à laquelle l'opinion s'applique ; or la valeur est une espérance conditionnelle à une date (\cref{ch:16}), et le marché peut bouger en six mois. Ajouter : « Date d'évaluation : 1\textsuperscript{er} septembre 2026 ; date de l'inspection : [date fictive] ; date du rapport : [date fictive]. » | ||||
| 25 | +\item \textbf{6. Étendue du travail} : absent. La « visite extérieure » n'est pas une inspection au sens de la règle 2.4 ; son caractère partiel est une circonstance exceptionnelle à expliquer. Ajouter : « L'immeuble a fait l'objet d'une inspection extérieure seulement, le [date], l'occupant ayant refusé l'accès ; la description intérieure repose sur la fiche de courtage et les photographies fournies ; les titres n'ont pas été vérifiés ; trois ventes ont été vérifiées au registre foncier et auprès des courtiers. » | ||||
| 26 | +\item \textbf{7. Réserves et hypothèses} : absent. Ajouter les réserves (absence de vérification des titres, pas d'expertise en bâtiment) et l'hypothèse extraordinaire liée à l'absence d'inspection intérieure : « Il est posé comme hypothèse extraordinaire que l'intérieur est dans un état conforme aux photographies ; si tel n'était pas le cas, la valeur pourrait être inférieure d'un montant à déterminer après inspection. » Cette hypothèse est rappelée dans la conclusion. | ||||
| 27 | +\item \textbf{8. Raisonnement} : présent mais sommaire ; indiquer les comparables (adresses fictives, dates, prix), les ajustements et la pondération. | ||||
| 28 | +\item \textbf{9. Usage le meilleur et le plus profitable} : absent. Ajouter : « L'usage résidentiel unifamilial actuel, conforme au zonage, est l'usage le meilleur et le plus profitable du site, vacant et tel qu'aménagé. » | ||||
| 29 | +\item \textbf{10. Rejet d'une méthode} : absent. Ajouter : « La méthode du revenu n'a pas été appliquée, les unifamiliales du secteur n'étant pas acquises pour leur revenu ; la méthode du coût n'a pas été retenue comme indication principale compte tenu de l'âge du bâtiment, mais sert de vérification. » | ||||
| 30 | +\item \textbf{11. Conformité} : absent. Ajouter : « Le présent rapport abrégé est conforme à la substance de la norme 1 des NPP ; aucun écart aux directives. » | ||||
| 31 | +\item \textbf{12. Attestation} : absent. Une ligne de signature n'est pas l'attestation ; reproduire le modèle imposé (règle 2.3, élément 12), daté et signé, en précisant que l'inspection a été extérieure. | ||||
| 32 | +\end{itemize} | ||||
| 33 | +\end{solution} | ||||
| 34 | + | ||||
| 35 | +\begin{solution}{ex:10:4}{Situations déontologiques} | ||||
| 36 | +(a) Atteinte à l'indépendance (art.~17) : l'évaluateur ignore l'intervention, conclut selon son seul jugement et note la demande au dossier ; si la pression persiste, il décline le mandat. L'attestation déclare des analyses neutres et objectives ; « confirmer » une valeur imposée la rendrait fausse. (b) Double rôle et intérêt dans le résultat (art.~17 et 18) : la rémunération de courtage dépend de la vente, donc de la valeur ; la conduite prudente est de refuser le mandat d'évaluation ; à défaut, divulgation écrite du double rôle et de la rémunération, consentement du client, et mention qu'aucun acte de courtage ne constitue une opinion de valeur. (c) Conflit d'intérêts expressément visé par l'article 19 : l'évaluateur qui confectionne ou tient le rôle ne peut exécuter une expertise pour un tiers sur ce territoire sans divulgation écrite, consentement des clients et mention au rapport ; en pratique, le refus est la règle. (d) Honoraires conditionnels (art.~24.1) : interdits pour un rapport d'évaluation ; l'exception relative à la vérification de l'inscription au rôle ne vise qu'un service de consultation et ne s'applique jamais si l'évaluateur témoigne devant un tribunal ; l'évaluateur propose des honoraires forfaitaires ou horaires. (e) Avantage lié à l'exercice (art.~21) : refuser toute rétribution de référencement. (f) Secret professionnel (art.~51) : les états financiers reçus dans un mandat sont confidentiels ; ne pas les transmettre sans l'autorisation écrite du client, ou seulement sous forme agrégée et anonymisée qui ne permet pas d'identifier l'immeuble ni le client. | ||||
| 37 | +\end{solution} | ||||
| 38 | + | ||||
| 39 | +\begin{solution}{ex:10:5}{Hypothèse extraordinaire et incidence sur la valeur} | ||||
| 40 | +(a) Rédaction conforme (fictive) : « \emph{Hypothèse extraordinaire.} Le présent rapport pose comme hypothèse extraordinaire que le permis de construction relatif à l'agrandissement arrière a été délivré par la Ville et que les travaux sont conformes à ce permis et au Code de construction. Cette hypothèse n'a pu être vérifiée à la date du rapport, la Ville n'ayant pas donné suite à notre demande de consultation du dossier de permis. Si elle se révélait fausse, la valeur marchande serait inférieure d'environ \dollars{37000} (6,4 \%), soit \dollars{575000}, en raison du coût de régularisation et du risque de démolition partielle. » Conclusion : « Sous l'hypothèse extraordinaire énoncée à la section [X], la valeur marchande de l'immeuble au 1\textsuperscript{er} septembre 2026 est estimée à \dollars{612000}. » | ||||
| 41 | +(b) $\Delta V_H = 612\,000 - 575\,000 = \dollars{37000}$, soit $37\,000 / 575\,000 = 6{,}43\ \%$ de la valeur sans permis (\cref{eq:10:incidence}). | ||||
| 42 | +(c) $\E[V] = 0{,}6 \times 612\,000 + 0{,}4 \times 575\,000 = \dollars{597200}$ (\cref{eq:10:esperance}). L'évaluateur ne conclut pas à cette valeur parce que la valeur marchande est une estimation conditionnelle à un état du bien, et non un pari sur cet état ; c'est l'acheteur qui connaît ou apprécie $p$ et qui doit décider. L'évaluateur doit toutefois lui fournir $\Delta V_H$ pour rendre ce calcul possible. | ||||
| 43 | +(d) Avec $p = 0{,}25$ : $\E[V] = 575\,000 + 0{,}25 \times 37\,000 = \dollars{584250}$. L'espérance est linéaire en $p$ : chaque tranche de 10 points de probabilité vaut \dollars{3700}. Plus l'hypothèse est incertaine, plus la valeur conclue sous hypothèse s'éloigne de ce qu'un acheteur rationnel paierait, et plus l'indication de l'incidence est indispensable. | ||||
| 44 | +\end{solution} | ||||
| 45 | + | ||||
| 46 | +\begin{solution}{ex:10:6}{Étendre et évaluer le contrôle automatique} | ||||
| 47 | +(a) Le motif à ajouter au lexique strict de l'élément 10 doit couvrir « n'est pas applicable » ; par exemple \texttt{r"methode[\textasciicircum.]\{0,80\}n'est pas applicable"} (le texte étant normalisé sans accents). Sur les quatre extraits fournis, aucun ne contient cette formulation : les résultats du \cref{tab:10:controle} sont inchangés, ce qui est le comportement attendu (l'extension d'un lexique strict ne doit pas créer de fausses détections sur les textes existants). Le test \texttt{test\_extrait\_complet\_et\_lacunaires} doit rester vert après la modification. | ||||
| 48 | +(b) Un extrait qui énonce « Hypothèse extraordinaire : nous présumons l'absence de contamination » sans incidence, qui déclare dans l'attestation n'avoir aucun intérêt dans l'immeuble alors que le texte indique que le signataire en est copropriétaire, et qui reproduit mécaniquement les douze formulations attendues, obtiendra 12 sur 12 au contrôle strict. L'enseignement est que le contrôle lexical mesure $\hat\tau$, la présence de formulations, et non $\tau$ au sens matériel ; il ne détecte ni la qualité du traitement, ni les contradictions internes, ni les violations déontologiques. Il est une condition nécessaire, jamais suffisante, et doit être suivi d'une relecture humaine. | ||||
| 49 | +(c) Sous indépendance, la probabilité qu'une lacune échappe aux deux contrôles est $(1 - 0{,}95)(1 - 0{,}7) = 0{,}05 \times 0{,}3 = 0{,}015$, soit une détection de $98{,}5\ \%$. L'hypothèse d'indépendance est plausible entre un contrôle lexical et un réviseur humain, dont les angles morts sont de nature différente, mais seulement pour les omissions grossières : pour une hypothèse sans incidence, la puissance du contrôle lexical est nulle et la détection repose entièrement sur le réviseur ($70\ \%$). La puissance $d_1 = 0{,}95$ ne s'applique donc qu'à une catégorie de lacunes, et la probabilité globale dépend de la composition des lacunes. | ||||
| 50 | +\end{solution} | ||||
| 51 | + | ||||
| 52 | +\begin{solution}{ex:10:7}{Correspondance entre cadres normatifs} | ||||
| 53 | +(a) \emph{Extraordinary assumption} $\leftrightarrow$ hypothèse extraordinaire des NPP (règle 1.2, élément 6 ; règle 2.1 c) ; règle 2.3, élément 7) : équivalence étroite, les deux exigeant la divulgation et, pour les NPP, l'incidence sur la valeur. \emph{Hypothetical condition} : pas d'équivalent nommé dans les NPP ; elle est traitée comme une hypothèse extraordinaire dont la fausseté est connue à la date d'évaluation (évaluation « comme si ») ; la pratique prudente la désigne expressément. \emph{Extraordinary limiting condition} $\leftrightarrow$ réserve limitant la portée de l'acte (règle 2.3, élément 7) et, lorsqu'elle écarte une règle, écart aux directives (élément 11) ; mais une réserve ne peut jamais écarter une règle coercitive, ce qui est plus strict que la notion canadienne. \emph{Exposure time} : les NPP n'exigent pas d'analyse distincte du délai d'exposition ; la notion est implicite dans la condition d'exposition suffisante de la définition de la valeur marchande (Intro-11) ; le CUSPAP (règle 8.2) en fait une analyse obligatoire. (b) L'examinateur vérifie en priorité les éléments 3 et 4 (but, fin, définition de la valeur, pour s'assurer que la base de valeur est celle du mandat québécois), 5 (date), 7 (hypothèses, avec leur incidence, que le CUSPAP n'exprime pas toujours en dollars), 2 (droits, la terminologie des tenures différant hors Québec) et 12 (attestation, dont le modèle des NPP est imposé). Il rend compte de son examen sous les normes 3 et 4 des NPP (examen d'un rapport et communication de l'examen), dans un rapport distinct qu'il signe et qui engage sa responsabilité (règle 2.5). (c) Le chapitre ne décrit pas le contenu de l'USPAP parce que sa vérification est partielle : le site de The Appraisal Foundation était inaccessible le 31 octobre 2026 et l'état de l'édition 2024 repose sur des sources secondaires ; la structure interne n'a pas été relue sur le document. Conformément aux conventions de l'ouvrage, une norme non vérifiée n'est pas décrite ; elle est signalée comme telle. Avant de la citer, un rédacteur doit ouvrir le document officiel, noter l'édition, la date d'effet et la disposition exacte, inscrire la source au registre avec sa date de consultation et ne citer que ce qu'il a lu. | ||||
| 54 | +\end{solution} | ||||
added
tools/valider_chapitre.sh
+12 −0
@@ -0,0 +1,12 @@ | |||||
| 1 | +#!/usr/bin/env bash | ||||
| 2 | +# Validation d'un chapitre livré : compilation isolée, tests, fusion des registres, vérification, commit. | ||||
| 3 | +set -uo pipefail | ||||
| 4 | +N=$(printf "%02d" "$1"); ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT" | ||||
| 5 | +tools/compile_chapter.sh "$1" | head -1 | ||||
| 6 | +T="analysis/python/tests/test_ch$N.py"; [[ -f "$T" ]] && python3 -m pytest -q "$T" 2>&1 | tail -1 || echo "pas de test $T" | ||||
| 7 | +python3 -c "import re;t=open('manuscript/chapters/ch$N.tex').read();print('mots',len(re.sub(r'\\\\[a-zA-Z]+|[{}%\$&_^~]',' ',t).split()),'| stub' if '\\\\stubchapter' in t else '| rédigé','| figures',t.count('includegraphics')+t.count('begin{tikzpicture}'),'| tableaux',t.count('begin{table}')+t.count('begin{longtable}'),'| exercices',t.count('begin{exercice}'))" | ||||
| 8 | +python3 tools/merge_sources.py | tail -2 | ||||
| 9 | +python3 tools/check_manuscript.py --no-log | tail -2 | ||||
| 10 | +git add -A && git commit -qm "Ch. $1 livré et validé (compilation isolée, tests, fusion des registres) | ||||
| 11 | + | ||||
| 12 | +Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>" && git push -q && echo pushed | ||||
modified
verification/calculations.csv
+14 −0
@@ -78,3 +78,17 @@ CALC-47-023,47,Droits de mutation Montréal 2026 sur 2 060 000 (7 tranches),anal | |||||
| 78 | CALC-47-024,47,Valeur libre de baux (loyers de marché) : RNE 108 864,54 ; valeur 2 465 788,04,analysis/python/cases/ch47_dossier.py,test_ch47.py::test_valeurs_citees,2465788.04,2465788.04 | 78 | CALC-47-024,47,Valeur libre de baux (loyers de marché) : RNE 108 864,54 ; valeur 2 465 788,04,analysis/python/cases/ch47_dossier.py,test_ch47.py::test_valeurs_citees,2465788.04,2465788.04 | ||
| 79 | CALC-47-025,47,Financement à la valeur finale : mise de fonds 584 040,55 ; RPV 71,65 % ; TRI FP 13,83 % ; TRI sans levier 8,11 %,analysis/python/cases/ch47_dossier.py,test_ch47.py::test_valeurs_citees | 79 | CALC-47-025,47,Financement à la valeur finale : mise de fonds 584 040,55 ; RPV 71,65 % ; TRI FP 13,83 % ; TRI sans levier 8,11 %,analysis/python/cases/ch47_dossier.py,test_ch47.py::test_valeurs_citees | ||
| 80 | CALC-47-026,47,Exercices 1 à 7 (RNE 88 207,65 ; 88 949,51 ; V Q1/Q3 ; rotation 10/25 % ; prêt à 5,12 % 1 283 814,77 ; APH ; MC inoccupation 6 % P=0,9262),analysis/python/cases/ch47_dossier.py | 80 | CALC-47-026,47,Exercices 1 à 7 (RNE 88 207,65 ; 88 949,51 ; V Q1/Q3 ; rotation 10/25 % ; prêt à 5,12 % 1 283 814,77 ; APH ; MC inoccupation 6 % P=0,9262),analysis/python/cases/ch47_dossier.py | ||
| 81 | +CALC-01-01,1,Modèle hédonique de référence cas 1 : n ; k ; R² ; R² ajusté ; sigma,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_modele_et_dispersion,"600;16;0,853;0,849;0,083","600;16;0,8530;0,8492;0,0830",verifie,2026-10-31 | ||||
| 82 | +CALC-01-02,1,Résidus : écart-type ; part des ventes à ±10 % ; à ±5 % ; asymétrie ; aplatissement,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_modele_et_dispersion,"0,082;0,745;0,448;≈0;≈0","0,0820;0,745;0,448;-0,070;-0,247",verifie,2026-10-31 | ||||
| 83 | +CALC-01-03,1,Sujet : médiane ; moyenne (Duan 1,00335) ; mode ; IP 95 % (espérance conditionnelle log-normale),analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_esperance_conditionnelle_sujet,635 821;637 953;631 455;[539 682 ; 749 087],idem,verifie | ||||
| 84 | +CALC-01-04,1,P(|P/V−1| > 10 %) ; > 5 % ; > 20 % pour sigma = 0,083,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_probabilites_ecart,"0,251;0,557;0,028","0,251;0,557;0,0281",verifie | ||||
| 85 | +CALC-01-05,1,Contributions au sujet : garage ; sous-sol ; étages ; superficie ; âge (net) ; tendance ; identité const + Σβx = ln V,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_contributions,20 291;13 829;18 860;53 893;−84 497;57 385,idem,verifie,2026-10-31 | ||||
| 86 | +CALC-01-06,1,Rendements décroissants : élasticité ; prix moyen ; prix marginal ; +10 m² ; 10 m² suivants,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_rendements_decroissants,"0,539;3 853;2 077;20 491;19 958",idem,verifie,2026-10-31 | ||||
| 87 | +CALC-01-07,1,Anticipation : 0,364 %/mois ; 4,46 %/an ; 26,0 mois ; facteur 1,0992 ; valeur à la référence 578 436 vs rôle 468 000,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_anticipation | ||||
| 88 | +CALC-01-08,1,Conformité : sujet relocalisé Aylmer / Gatineau / Buckingham / Masson-Angers,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_conformite,"692 518 (+8,9 %);621 798 (−2,2 %);494 999 (−22,1 %);488 712 (−23,1 %)",idem,verifie,2026-10-31 | ||||
| 89 | +CALC-01-09,1,Comparables ch. 16 : écart prix/valeur estimée G0574 ; G0404 ; G0468 ; G0477 ; G0575,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_comparables_ch16,"+0,7 %;−14,9 %;−9,9 %;−10,5 %;−8,0 %",idem,verifie,2026-10-31 | ||||
| 90 | +CALC-01-10,1,Modèle de recherche (sim. 20 000) : prix de réserve/m ; prix moyen/m ; CV ; délai moyen (théorique) ; point fixe vérifié,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_recherche,"1,0267;1,068;0,0317;5,08 (5,05)",idem,verifie,2026-10-31 | ||||
| 91 | +CALC-01-11,1,Recherche : sensibilité au coût de détention 0,2/0,4/0,8/1,5 % (prix de réserve ; délai ; prix moyen ; CV),analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_recherche | ||||
| 92 | +CALC-01-12,1,PHMU (hypothèses déclarées) : valeur résiduelle unifamiliale / duplex / triplex,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_phmu,170 000;160 000;140 000,idem,verifie,2026-10-31 | ||||
| 93 | +CALC-01-13,1,Sensibilité à sigma (0,04–0,16) : moyenne/médiane ; mode/médiane ; bornes IP ; P(>5 %) ; P(>10 %) ; n pour ±2 %,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_sensibilite_sigma,tableau 1.8 ; n = 16/36/68/142/251,idem | ||||
| 94 | +CALC-01-14,1,Solutions des exercices 1.2 à 1.7 (contributions ; rendements ; log-normale ; Gordon/coût d'usage ; prix de réserve uniforme ; lambda d'ancrage),analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_solutions_exercices,"16 964/20 958 ; 3 853/2 077/50 241 ; 503 613/492 852/[395 206;632 581]/0,427 ; 600 000/30 000/39 000 ; W=1,0553, T=4,47 ; λ=0,437",idem,verifie,2026-10-31 | ||||
added
verification/chapters/ch01-calculations.csv
+15 −0
@@ -0,0 +1,15 @@ | |||||
| 1 | +id,chapitre,description,script,test,resultat_attendu,resultat_obtenu,statut,date | ||||
| 2 | +CALC-01-01,1,Modèle hédonique de référence cas 1 : n ; k ; R² ; R² ajusté ; sigma,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_modele_et_dispersion,"600;16;0,853;0,849;0,083","600;16;0,8530;0,8492;0,0830",verifie,2026-10-31 | ||||
| 3 | +CALC-01-02,1,Résidus : écart-type ; part des ventes à ±10 % ; à ±5 % ; asymétrie ; aplatissement,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_modele_et_dispersion,"0,082;0,745;0,448;≈0;≈0","0,0820;0,745;0,448;-0,070;-0,247",verifie,2026-10-31 | ||||
| 4 | +CALC-01-03,1,Sujet : médiane ; moyenne (Duan 1,00335) ; mode ; IP 95 % (espérance conditionnelle log-normale),analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_esperance_conditionnelle_sujet,"635 821;637 953;631 455;[539 682 ; 749 087]",idem,verifie,2026-10-31 | ||||
| 5 | +CALC-01-04,1,P(|P/V−1| > 10 %) ; > 5 % ; > 20 % pour sigma = 0,083,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_probabilites_ecart,"0,251;0,557;0,028","0,251;0,557;0,0281",verifie,2026-10-31 | ||||
| 6 | +CALC-01-05,1,Contributions au sujet : garage ; sous-sol ; étages ; superficie ; âge (net) ; tendance ; identité const + Σβx = ln V,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_contributions,"20 291;13 829;18 860;53 893;−84 497;57 385",idem,verifie,2026-10-31 | ||||
| 7 | +CALC-01-06,1,Rendements décroissants : élasticité ; prix moyen ; prix marginal ; +10 m² ; 10 m² suivants,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_rendements_decroissants,"0,539;3 853;2 077;20 491;19 958",idem,verifie,2026-10-31 | ||||
| 8 | +CALC-01-07,1,Anticipation : 0,364 %/mois ; 4,46 %/an ; 26,0 mois ; facteur 1,0992 ; valeur à la référence 578 436 vs rôle 468 000,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_anticipation,"0,003642;0,0446;26,0;1,0992;578 436",idem,verifie,2026-10-31 | ||||
| 9 | +CALC-01-08,1,Conformité : sujet relocalisé Aylmer / Gatineau / Buckingham / Masson-Angers,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_conformite,"692 518 (+8,9 %);621 798 (−2,2 %);494 999 (−22,1 %);488 712 (−23,1 %)",idem,verifie,2026-10-31 | ||||
| 10 | +CALC-01-09,1,Comparables ch. 16 : écart prix/valeur estimée G0574 ; G0404 ; G0468 ; G0477 ; G0575,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_comparables_ch16,"+0,7 %;−14,9 %;−9,9 %;−10,5 %;−8,0 %",idem,verifie,2026-10-31 | ||||
| 11 | +CALC-01-10,1,Modèle de recherche (sim. 20 000) : prix de réserve/m ; prix moyen/m ; CV ; délai moyen (théorique) ; point fixe vérifié,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_recherche,"1,0267;1,068;0,0317;5,08 (5,05)",idem,verifie,2026-10-31 | ||||
| 12 | +CALC-01-11,1,Recherche : sensibilité au coût de détention 0,2/0,4/0,8/1,5 % (prix de réserve ; délai ; prix moyen ; CV),analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_recherche,"1,0377/6,22;1,0267/5,06;1,0095/3,83;0,9869/2,88",idem,verifie,2026-10-31 | ||||
| 13 | +CALC-01-12,1,PHMU (hypothèses déclarées) : valeur résiduelle unifamiliale / duplex / triplex,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_phmu,"170 000;160 000;140 000",idem,verifie,2026-10-31 | ||||
| 14 | +CALC-01-13,1,Sensibilité à sigma (0,04–0,16) : moyenne/médiane ; mode/médiane ; bornes IP ; P(>5 %) ; P(>10 %) ; n pour ±2 %,analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_sensibilite_sigma,"tableau 1.8 ; n = 16/36/68/142/251",idem,verifie,2026-10-31 | ||||
| 15 | +CALC-01-14,1,Solutions des exercices 1.2 à 1.7 (contributions ; rendements ; log-normale ; Gordon/coût d'usage ; prix de réserve uniforme ; lambda d'ancrage),analysis/python/cases/ch01_valeur_prix.py,analysis/python/tests/test_ch01.py::test_solutions_exercices,"16 964/20 958 ; 3 853/2 077/50 241 ; 503 613/492 852/[395 206;632 581]/0,427 ; 600 000/30 000/39 000 ; W=1,0553, T=4,47 ; λ=0,437",idem,verifie,2026-10-31 | ||||
added
verification/chapters/ch01-claims.csv
+15 −0
@@ -0,0 +1,15 @@ | |||||
| 1 | +id,chapitre,affirmation,source_id,verification,date,statut,notes | ||||
| 2 | +CLM-01-01,1,Art. 1708 C.c.Q. : la vente transfère la propriété « moyennant un prix en argent »,SRC-A-001,"Registre A : art. 1708-1739 lus par le documentaliste (notes-A / registry.csv) ; LégisQuébec inaccessible (403) le 2026-10-31 pour relecture par le rédacteur",2026-10-31,verifie,texte paraphrasé (citation ≤ 5 mots) | ||||
| 3 | +CLM-01-02,1,Code des professions art. 37 j) : acte réservé = « formuler ... une opinion dûment motivée de la valeur d'un bien ou d'un droit immobilier »,SRC-C-009,notes-C.md §1.4 (texte à jour au 15 octobre 2026),2026-10-31,verifie, | ||||
| 4 | +CLM-01-03,1,Définition OEAQ de la valeur marchande (prix sincère le plus probable ; marché libre et ouvert ; quatre conditions),SRC-C-001,NPP OEAQ p. Intro-11 (notes-C.md §1.1),2026-10-31,verifie,conditions paraphrasées | ||||
| 5 | +CLM-01-04,1,LFM art. 43 : valeur réelle = valeur d'échange sur un marché libre et ouvert = prix le plus probable ; parties non obligées et raisonnablement informées ; « utilisation qui peut le plus probablement en être faite »,SRC-B-001,notes-B.md §9.2 (LégisQuébec F-2.1 à jour au 15 octobre 2026),2026-10-31,verifie, | ||||
| 6 | +CLM-01-05,1,LFM art. 44 : immeuble non susceptible de vente de gré à gré — prix qu'une personne « serait justifiée de payer et d'exiger si elle était à la fois l'acheteur et le vendeur »,SRC-B-001,notes-B.md §9.2,2026-10-31,verifie, | ||||
| 7 | +CLM-01-06,1,LFM art. 46 al. 1 : date de référence = 1er juillet du deuxième exercice précédant le premier exercice du rôle (rôle 2026-2028 → 1er juillet 2024),SRC-B-001,notes-B.md §9.2,2026-10-31,verifie, | ||||
| 8 | +CLM-01-07,1,IVS 2025 (IVS 102 A10.01) définition de Market Value ; (A90.01) Highest and Best Use ; édition en vigueur au 2026-10-31,SRC-C (ivs2025),notes-C.md §1.2 (PDF officiel IVSC),2026-10-31,verifie,citations en anglais ≤ 40 mots | ||||
| 9 | +CLM-01-08,1,CUSPAP 2026 s. 3 : Market Value = « the most probable price, as of a specified date, in cash, or in terms equivalent to cash »,SRC-C-018,notes-C.md §1.3,2026-10-31,verifie, | ||||
| 10 | +CLM-01-09,1,Northcraft & Neale (1987) : étudiants et professionnels visitant une même propriété ; prix demandé manipulé ; estimations suivent le prix demandé ; professionnels nient l'influence,lib-D northcraftNeale1987,"Entrée bibliographique vérifiée (DOI) ; résumé non relu (ScienceDirect 403 le 2026-10-31) ; description du protocole d'après la littérature secondaire (diazHansz2002)",2026-10-31,partiellement_verifie,ne pas citer de pourcentages ; ampleur non chiffrée dans le texte | ||||
| 11 | +CLM-01-10,1,Diaz (1990) : les évaluateurs experts suivent un processus abrégé plutôt que le processus normatif,lib-D diaz1990,Entrée vérifiée ; résumé non relu,2026-10-31,partiellement_verifie, | ||||
| 12 | +CLM-01-11,1,Diaz (1997) : ancrage sur l'estimation antérieure d'un expert en marché non familier ; effet atténué sur le marché familier,lib-D diaz1997,Entrée vérifiée ; résumé non relu (T&F 403 le 2026-10-31),2026-10-31,partiellement_verifie, | ||||
| 13 | +CLM-01-12,1,Écart-type résiduel des modèles hédoniques réels « couramment entre 0,10 et 0,20 » selon segment et territoire,—,Ordre de grandeur d'usage ; aucune source unique citée,2026-10-31,non_verifie,formulé comme ordre de grandeur ; à sourcer à l'harmonisation (p. ex. boginShui2020 au ch. 20) | ||||
| 14 | +CLM-01-13,1,Modèle de recherche du vendeur (prix de réserve comme point fixe ; délai = 1/[p(1−F)]) — dérivation propre ; aucune référence citée,—,Dérivation mathématique vérifiée par test (point fixe ; délai théorique vs simulation),2026-10-31,verifie,références classiques (Wheaton 1990 ; Krainer 2001) absentes de library.bib : non citées | ||||
| 15 | +CLM-01-14,1,Le logement québécois : prix publié au registre foncier et assiette des droits de mutation,SRC-A (registreFoncier) ; loi sur les droits de mutation,renvoi au ch. 13 ; non détaillé ici,2026-10-31,verifie,affirmation générale renvoyée au ch. 13 | ||||
added
verification/chapters/ch01-figures.csv
+7 −0
@@ -0,0 +1,7 @@ | |||||
| 1 | +fichier,chapitre,script,donnees,type_donnees,legende_courte,statut | ||||
| 2 | +ch01/ch01-fig-triangle (TikZ dans ch01.tex),1,manuscript/chapters/ch01.tex,aucune,schema,"Schéma prix / valeur / coût et leurs relations",verifie | ||||
| 3 | +ch01/ch01-fig-rosen.pdf,1,analysis/python/figures/ch01_figures.py,formes fonctionnelles illustratives déclarées dans le script,schema,"Équilibre hédonique de Rosen : enchères, offres, enveloppe des prix",verifie | ||||
| 4 | +ch01/ch01-fig-prix-valeur.pdf,1,analysis/python/figures/ch01_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix observé vs valeur estimée (modèle hédonique de référence), comparables du ch. 16 [données synthétiques]",verifie | ||||
| 5 | +ch01/ch01-fig-residus.pdf,1,analysis/python/figures/ch01_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Distribution des écarts prix/valeur (résidus) et loi log-normale ajustée [données synthétiques]",verifie | ||||
| 6 | +ch01/ch01-fig-recherche.pdf,1,analysis/python/figures/ch01_figures.py,simulation (paramètres déclarés : sigma_o 0.06 ; p 0.6 ; c 0.004/mois ; i 5 %),synthetique,"Modèle de recherche : offres, prix acceptés, délais de vente [simulation étiquetée]",verifie | ||||
| 7 | +ch01/ch01-fig-sensibilite-sigma.pdf,1,analysis/python/figures/ch01_figures.py,calcul analytique (loi log-normale),schema,"Sensibilité à sigma : bornes de l'IP 95 % et probabilité d'écart > 5/10/20 %",verifie | ||||
added
verification/chapters/ch01-registry.csv
+1 −0
@@ -0,0 +1 @@ | |||||
| 1 | +id,type,titre,organisme,version_ou_date,url,date_consultation,statut,utilise_dans,notes | ||||
added
verification/chapters/ch01.md
+9 −0
@@ -0,0 +1,9 @@ | |||||
| 1 | +# Chapitre 1 — Théorie de la valeur et prix immobiliers (bilan, 2026-10-31) | ||||
| 2 | + | ||||
| 3 | +- Rédigé en phase 4 (lot 4a). `tools/compile_chapter.sh 1` : **OK ch01 : 35 pages, 0 references/citations non definies, 0 overfull hbox**. `python3 -m pytest -q analysis/python/tests/test_ch01.py` : **12 tests verts**. `tools/check_manuscript.py --no-log` : seules remarques pour ch01 = figures non inscrites dans le `figures.csv` global (règle de collision : inscrites dans `verification/chapters/ch01-figures.csv`, à fusionner à l'harmonisation). | ||||
| 4 | +- Compteurs : ≈ 10 900 mots de prose (detex ≈ 11 600) ; 6 figures (1 schéma TikZ + 5 PDF Matplotlib : rosen, prix-valeur, residus, recherche, sensibilite-sigma) ; 8 tableaux ; 16 équations numérotées ; 1 définition, 1 exemple intégral (`exemple`) ; 7 exercices (2 × niveau 1, 3 × niveau 2, 2 × niveau 3) avec solutions dans `solutions/ch01.tex` ; encadrés : synthetique, quebec, pratique, erreurs, limites, synthese. | ||||
| 5 | +- Sections : 1.1 Valeur, prix, coût ; 1.2 Quatre facteurs ; 1.3 Sept principes (chacun illustré par un chiffre du cas 1 ; PHMU par hypothèses déclarées) ; 1.4 Panier d'attributs (Lancaster, Rosen, semi-log, prix implicites) et actif (DCF, Gordon, coût d'usage) ; 1.5 Dispersion et modèle de recherche du vendeur ; 1.6 Valeur = E[P | x, t] (log-normale, Duan, IP, exemple intégral) ; 1.7 Sensibilité à σ ; 1.8 Ancrage. | ||||
| 6 | +- Données : cas 1 (synthétique, graine 20261031) via `traite.cas1.hedonique` (n = 600, R² = 0,853, σ = 0,083) et `traite.cas1.selection` (mêmes 5 comparables que le ch. 16). Scripts : `analysis/python/cases/ch01_valeur_prix.py` (tous les chiffres), `analysis/python/figures/ch01_figures.py` (5 PDF). Registres : `verification/chapters/ch01-{figures,calculations,claims,registry}.csv` (registry vide : aucune nouvelle source ; aucune `lib-ch01.bib` : seules des clés existantes de `library.bib` sont citées). | ||||
| 7 | +- Chiffres clés à réutiliser ailleurs : valeur estimée du sujet 635 821 $ (médiane), 637 953 $ (Duan), IP 95 % [539 682 ; 749 087] ; tendance 0,364 %/mois = 4,46 %/an ; contributions garage 20 291 $, sous-sol 13 829 $, étages 18 860 $ ; élasticité superficie 0,539 (prix moyen 3 853 $/m², marginal 2 077 $/m²) ; effets de secteur Aylmer +8,9 %, Buckingham −22,1 %, Masson-Angers −23,1 % ; P(écart > 10 %) = 25,1 %. | ||||
| 8 | +- Points non vérifiés / partiellement vérifiés (voir ch01-claims.csv) : (i) résumés de Northcraft & Neale 1987, Diaz 1990 et Diaz 1997 non relus (éditeurs en 403 le 2026-10-31) : protocoles décrits qualitativement, aucun pourcentage cité ; (ii) art. 1708 C.c.Q. cité d'après le registre A (LégisQuébec inaccessible au rédacteur) ; (iii) « σ résiduel courant 0,10–0,20 » = ordre de grandeur d'usage, non sourcé ; (iv) modèle de recherche sans référence (Wheaton 1990, Krainer 2001, Genesove & Mayer absents de library.bib → suggérer leur vérification/ajout au lot D) ; (v) paramètres du modèle de recherche et du tableau PHMU = hypothèses pédagogiques déclarées, non calibrées. | ||||
| 9 | +- Suggestions pour l'harmonisation : le ch. 2 doit reprendre le tableau des bases de valeur annoncé ici (renvoi) ; le ch. 17 doit expliquer l'écart entre la valeur estimée du sujet (635 821 $) et l'indication brute du ch. 16 (551 029 $) par les ajustements (garage, date, taille) ; le ch. 18 réutilise les coefficients du tableau 1.5 ; le ch. 20 peut reprendre l'IP et la section « combien de ventes » ; l'éq. (1.13) V = E[P | x, t] est l'éq. (16.1) : harmoniser le renvoi (ch. 16 pourrait renvoyer à la définition 1.1). | ||||
modified
verification/claims.csv
+14 −0
@@ -103,3 +103,17 @@ CLM-47-034,47,IPC Québec +3,1 % (sept. 2026) ; tarif électricité domestique + | |||||
| 103 | CLM-47-035,47,Teranet–BN Montréal +1,4 % a/a (sept. 2026),SRC-C-0xx (teranet202609),notes-C §4.9,2026-10-31,verifie | 103 | CLM-47-035,47,Teranet–BN Montréal +1,4 % a/a (sept. 2026),SRC-C-0xx (teranet202609),notes-C §4.9,2026-10-31,verifie | ||
| 104 | CLM-47-036,47,Réserve de remplacement 650-675 $/logement et gestion imputée 4 % : conventions de l'ouvrage (aucune enquête officielle récente),—,data/synthetic/README.md ; notes-E ch. 28 (NON VÉRIFIÉ),2026-10-31,non_verifie,incohérence : docstring cas3.py « 650 $/logement » vs donnée 8 103 $ = 675 | 104 | CLM-47-036,47,Réserve de remplacement 650-675 $/logement et gestion imputée 4 % : conventions de l'ouvrage (aucune enquête officielle récente),—,data/synthetic/README.md ; notes-E ch. 28 (NON VÉRIFIÉ),2026-10-31,non_verifie,incohérence : docstring cas3.py « 650 $/logement » vs donnée 8 103 $ = 675 | ||
| 105 | CLM-47-037,47,Vacance économique 3,9 % ; rotation 15 % ; croissance loyers marché 3,5 % ; r 7,25 % ; R_T 5,0 % ; coûts de vente 2,5 % ; ajustement état 3 %/point : hypothèses de l'auteur | 105 | CLM-47-037,47,Vacance économique 3,9 % ; rotation 15 % ; croissance loyers marché 3,5 % ; r 7,25 % ; R_T 5,0 % ; coûts de vente 2,5 % ; ajustement état 3 %/point : hypothèses de l'auteur | ||
| 106 | +CLM-01-01,1,Art. 1708 C.c.Q. : la vente transfère la propriété « moyennant un prix en argent »,SRC-A-001,Registre A : art. 1708-1739 lus par le documentaliste (notes-A / registry.csv) ; LégisQuébec inaccessible (403) le 2026-10-31 pour relecture par le rédacteur,2026-10-31,verifie,texte paraphrasé (citation ≤ 5 mots) | ||||
| 107 | +CLM-01-02,1,Code des professions art. 37 j) : acte réservé = « formuler ... une opinion dûment motivée de la valeur d'un bien ou d'un droit immobilier »,SRC-C-009,notes-C.md §1.4 (texte à jour au 15 octobre 2026),2026-10-31,verifie, | ||||
| 108 | +CLM-01-03,1,Définition OEAQ de la valeur marchande (prix sincère le plus probable ; marché libre et ouvert ; quatre conditions),SRC-C-001,NPP OEAQ p. Intro-11 (notes-C.md §1.1),2026-10-31,verifie,conditions paraphrasées | ||||
| 109 | +CLM-01-04,1,LFM art. 43 : valeur réelle = valeur d'échange sur un marché libre et ouvert = prix le plus probable ; parties non obligées et raisonnablement informées ; « utilisation qui peut le plus probablement en être faite »,SRC-B-001,notes-B.md §9.2 (LégisQuébec F-2.1 à jour au 15 octobre 2026),2026-10-31,verifie, | ||||
| 110 | +CLM-01-05,1,LFM art. 44 : immeuble non susceptible de vente de gré à gré — prix qu'une personne « serait justifiée de payer et d'exiger si elle était à la fois l'acheteur et le vendeur »,SRC-B-001,notes-B.md §9.2,2026-10-31,verifie, | ||||
| 111 | +CLM-01-06,1,LFM art. 46 al. 1 : date de référence = 1er juillet du deuxième exercice précédant le premier exercice du rôle (rôle 2026-2028 → 1er juillet 2024),SRC-B-001,notes-B.md §9.2,2026-10-31,verifie, | ||||
| 112 | +CLM-01-07,1,IVS 2025 (IVS 102 A10.01) définition de Market Value ; (A90.01) Highest and Best Use ; édition en vigueur au 2026-10-31,SRC-C (ivs2025),notes-C.md §1.2 (PDF officiel IVSC),2026-10-31,verifie,citations en anglais ≤ 40 mots | ||||
| 113 | +CLM-01-08,1,CUSPAP 2026 s. 3 : Market Value = « the most probable price,as of a specified date,in cash,or in terms equivalent to cash »,SRC-C-018,notes-C.md §1.3 | ||||
| 114 | +CLM-01-09,1,Northcraft & Neale (1987) : étudiants et professionnels visitant une même propriété ; prix demandé manipulé ; estimations suivent le prix demandé ; professionnels nient l'influence,lib-D northcraftNeale1987,Entrée bibliographique vérifiée (DOI) ; résumé non relu (ScienceDirect 403 le 2026-10-31) ; description du protocole d'après la littérature secondaire (diazHansz2002),2026-10-31,partiellement_verifie,ne pas citer de pourcentages ; ampleur non chiffrée dans le texte | ||||
| 115 | +CLM-01-10,1,Diaz (1990) : les évaluateurs experts suivent un processus abrégé plutôt que le processus normatif,lib-D diaz1990,Entrée vérifiée ; résumé non relu,2026-10-31,partiellement_verifie, | ||||
| 116 | +CLM-01-11,1,Diaz (1997) : ancrage sur l'estimation antérieure d'un expert en marché non familier ; effet atténué sur le marché familier,lib-D diaz1997,Entrée vérifiée ; résumé non relu (T&F 403 le 2026-10-31),2026-10-31,partiellement_verifie, | ||||
| 117 | +CLM-01-12,1,Écart-type résiduel des modèles hédoniques réels « couramment entre 0,10 et 0,20 » selon segment et territoire,—,Ordre de grandeur d'usage ; aucune source unique citée,2026-10-31 | ||||
| 118 | +CLM-01-13,1,Modèle de recherche du vendeur (prix de réserve comme point fixe ; délai = 1/[p(1−F)]) — dérivation propre ; aucune référence citée,—,Dérivation mathématique vérifiée par test (point fixe ; délai théorique vs simulation),2026-10-31,verifie,références classiques (Wheaton 1990 ; Krainer 2001) absentes de library.bib : non citées | ||||
| 119 | +CLM-01-14,1,Le logement québécois : prix publié au registre foncier et assiette des droits de mutation,SRC-A (registreFoncier) ; loi sur les droits de mutation,renvoi au ch. 13 ; non détaillé ici,2026-10-31,verifie,affirmation générale renvoyée au ch. 13 | ||||
modified
verification/figures.csv
+6 −0
@@ -25,3 +25,9 @@ ch47/ch47-fig-flux-dcf.pdf,47,analysis/python/figures/ch47_dossier_figures.py,da | |||||
| 25 | ch47/ch47-fig-montecarlo.pdf,47,analysis/python/figures/ch47_dossier_figures.py,simulation 10 000 tirages graine 20261031 (ch47_dossier.monte_carlo),synthetique,Histogramme de la valeur simulée avec quantiles 5/50/95 DCF et capitalisation [données synthétiques],verifie | 25 | ch47/ch47-fig-montecarlo.pdf,47,analysis/python/figures/ch47_dossier_figures.py,simulation 10 000 tirages graine 20261031 (ch47_dossier.monte_carlo),synthetique,Histogramme de la valeur simulée avec quantiles 5/50/95 DCF et capitalisation [données synthétiques],verifie | ||
| 26 | ch47/ch47-fig-tornade.pdf,47,analysis/python/figures/ch47_dossier_figures.py,ch47_dossier.tornade (quantiles 10/90 des lois déclarées),synthetique,Tornade de la valeur DCF selon sept intrants [données synthétiques],verifie | 26 | ch47/ch47-fig-tornade.pdf,47,analysis/python/figures/ch47_dossier_figures.py,ch47_dossier.tornade (quantiles 10/90 des lois déclarées),synthetique,Tornade de la valeur DCF selon sept intrants [données synthétiques],verifie | ||
| 27 | ch47/ch47-fig-rcd-scenarios.pdf,47,analysis/python/figures/ch47_dossier_figures.py,ch47_dossier.scenarios_renouvellement,synthetique,RCD par année sous quatre scénarios de taux au renouvellement [données synthétiques],verifie | 27 | ch47/ch47-fig-rcd-scenarios.pdf,47,analysis/python/figures/ch47_dossier_figures.py,ch47_dossier.scenarios_renouvellement,synthetique,RCD par année sous quatre scénarios de taux au renouvellement [données synthétiques],verifie | ||
| 28 | +ch01/ch01-fig-triangle (TikZ dans ch01.tex),1,manuscript/chapters/ch01.tex,aucune,schema,Schéma prix / valeur / coût et leurs relations,verifie | ||||
| 29 | +ch01/ch01-fig-rosen.pdf,1,analysis/python/figures/ch01_figures.py,formes fonctionnelles illustratives déclarées dans le script,schema,"Équilibre hédonique de Rosen : enchères, offres, enveloppe des prix",verifie | ||||
| 30 | +ch01/ch01-fig-prix-valeur.pdf,1,analysis/python/figures/ch01_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,"Prix observé vs valeur estimée (modèle hédonique de référence), comparables du ch. 16 [données synthétiques]",verifie | ||||
| 31 | +ch01/ch01-fig-residus.pdf,1,analysis/python/figures/ch01_figures.py,data/synthetic/cas1_gatineau_ventes.csv,synthetique,Distribution des écarts prix/valeur (résidus) et loi log-normale ajustée [données synthétiques],verifie | ||||
| 32 | +ch01/ch01-fig-recherche.pdf,1,analysis/python/figures/ch01_figures.py,simulation (paramètres déclarés : sigma_o 0.06 ; p 0.6 ; c 0.004/mois ; i 5 %),synthetique,"Modèle de recherche : offres, prix acceptés, délais de vente [simulation étiquetée]",verifie | ||||
| 33 | +ch01/ch01-fig-sensibilite-sigma.pdf,1,analysis/python/figures/ch01_figures.py,calcul analytique (loi log-normale),schema,Sensibilité à sigma : bornes de l'IP 95 % et probabilité d'écart > 5/10/20 %,verifie | ||||
| 28 | 34 | ||||