Vérificateur : schémas TikZ sans fichier tolérés
17 changed files +599 −74
modified
analysis/python/figures/ch34_calcul_tal.py
+1 −1
@@ -27,7 +27,7 @@ def main(): | |||||
| 27 | ax.set_yticks(ys); ax.set_yticklabels([n for n, _ in comp], fontsize=7.5); ax.invert_yaxis() | 27 | ax.set_yticks(ys); ax.set_yticklabels([n for n, _ in comp], fontsize=7.5); ax.invert_yaxis() | ||
| 28 | ax.set_xlabel("Augmentation mensuelle (dollars par mois)") | 28 | ax.set_xlabel("Augmentation mensuelle (dollars par mois)") | ||
| 29 | ax.set_xlim(0, 78) | 29 | ax.set_xlim(0, 78) | ||
| 30 | − ax.text(30, 4.0, f"Repère : écart au loyer de marché du logement 103 = {ex['ecart_marche']:.0f} $/mois ({ex['ecart_marche_pct']*100:.1f} % du loyer), hors échelle.".replace(".", ","), | 30 | + ax.text(30, 4.0, f"Repère : écart au loyer de marché du logement 103 = {ex['ecart_marche']:.0f} $/mois ({ex['ecart_marche_pct']*100:.1f} % du loyer), hors échelle".replace(".", ","), | ||
| 31 | ha="left", va="center", fontsize=7, color=palette.ink2) | 31 | ha="left", va="center", fontsize=7, color=palette.ink2) | ||
| 32 | ax.legend(loc="upper right", bbox_to_anchor=(1.0, 0.70), fontsize=7) | 32 | ax.legend(loc="upper right", bbox_to_anchor=(1.0, 0.70), fontsize=7) | ||
| 33 | savefig(fig, "ch34/ch34-fig-calcul-tal.pdf") | 33 | savefig(fig, "ch34/ch34-fig-calcul-tal.pdf") | ||
added
analysis/python/tests/test_ch28.py
+260 −0
@@ -0,0 +1,260 @@ | |||||
| 1 | +"""Tests du chapitre 28 — dépenses, réserves, CAPEX et RNE (cas 3 et cas 2, données synthétiques). | ||||
| 2 | +Identités + valeurs citées dans manuscript/chapters/ch28.tex et solutions/ch28.tex (tolérances déclarées : 0,01 $ sur les | ||||
| 3 | +montants au cent, 1 $ sur les valeurs capitalisées, 1e-9 sur les identités).""" | ||||
| 4 | +import sys, pathlib | ||||
| 5 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) | ||||
| 6 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / "cases")) | ||||
| 7 | +import numpy as np | ||||
| 8 | +import pytest | ||||
| 9 | +from traite import cas3, cas2, finance as fin | ||||
| 10 | +from ch28_depenses import calculer, exercices, reserve_par_composantes, demonstration_reserve, ratio_iso_depenses, indexation_ipc | ||||
| 11 | + | ||||
| 12 | +ROOT = pathlib.Path(__file__).resolve().parents[3] | ||||
| 13 | + | ||||
| 14 | + | ||||
| 15 | +@pytest.fixture(scope="module") | ||||
| 16 | +def res(): | ||||
| 17 | + return calculer() | ||||
| 18 | + | ||||
| 19 | + | ||||
| 20 | +@pytest.fixture(scope="module") | ||||
| 21 | +def ex(res): | ||||
| 22 | + return exercices(res) | ||||
| 23 | + | ||||
| 24 | + | ||||
| 25 | +# ----------------------------------------------------------------------------- identités | ||||
| 26 | +def test_identite_rne(res): | ||||
| 27 | + b = res["base"] | ||||
| 28 | + assert b["rne"] == pytest.approx(b["rbe"] - b["depenses_hors_reserve"] - b["reserve"], abs=1e-9) | ||||
| 29 | + assert b["ratio_depenses"] == pytest.approx(b["depenses_totales"] / b["rbe"], abs=1e-12) | ||||
| 30 | + assert b["rne"] / b["rbe"] + b["ratio_depenses"] == pytest.approx(1.0, abs=1e-12) | ||||
| 31 | + | ||||
| 32 | + | ||||
| 33 | +def test_coherence_avec_cas3_partage(res): | ||||
| 34 | + """Les chiffres du chapitre 28 coïncident avec ceux que les chapitres 29, 30 et 47 tirent de traite.cas3.""" | ||||
| 35 | + t = cas3.tout() | ||||
| 36 | + assert res["base"]["rne"] == pytest.approx(t["base"]["rne"], rel=1e-12) | ||||
| 37 | + assert res["base"]["depenses_totales"] == pytest.approx(t["base"]["depenses_totales"], rel=1e-12) | ||||
| 38 | + assert res["R"] == pytest.approx(t["taux"]["mediane"], rel=1e-12) | ||||
| 39 | + assert res["V"] == pytest.approx(t["valeur_capitalisation"], rel=1e-12) | ||||
| 40 | + | ||||
| 41 | + | ||||
| 42 | +def test_classement_somme(res): | ||||
| 43 | + cl = res["classement"]; b = res["base"] | ||||
| 44 | + assert cl["fixes"] + cl["variables"] + cl["reserve"] == pytest.approx(b["depenses_totales"], abs=1e-9) | ||||
| 45 | + assert cl["variables_hors_gestion"] + cl["gestion"] == pytest.approx(cl["variables"], abs=1e-9) | ||||
| 46 | + assert float(cl["groupes"].sum()) == pytest.approx(b["depenses_totales"], abs=1e-9) | ||||
| 47 | + assert cl["part_fixes"] + cl["part_variables"] + cl["part_reserve"] == pytest.approx(1.0, abs=1e-12) | ||||
| 48 | + | ||||
| 49 | + | ||||
| 50 | +def test_detail_somme_et_regles(res): | ||||
| 51 | + d = res["detail"]; hyp = res["hyp"] | ||||
| 52 | + assert float(d["normalise"].sum()) == pytest.approx(res["base"]["depenses_totales"], abs=1e-9) | ||||
| 53 | + taxes = float(d.loc[d["poste"] == "Taxes municipales", "normalise"].iloc[0]) | ||||
| 54 | + assert taxes == pytest.approx(hyp["valeur_role_2026"] * hyp["taux_taxe_fonciere"], abs=1e-9) | ||||
| 55 | + ent = d.loc[d["poste"] == "Entretien et réparations"].iloc[0] | ||||
| 56 | + assert ent["normalise"] == pytest.approx(ent["historique_2025"] * 1.03, abs=1e-9) | ||||
| 57 | + gestion = float(d.loc[d["poste"].str.startswith("Gestion"), "normalise"].iloc[0]) | ||||
| 58 | + assert gestion == pytest.approx(0.04 * res["base"]["rbe"], abs=1e-9) | ||||
| 59 | + | ||||
| 60 | + | ||||
| 61 | +def test_historique(res): | ||||
| 62 | + h = res["historique"] | ||||
| 63 | + assert h.loc["Total", 2023] == 66992 and h.loc["Total", 2024] == 70438 and h.loc["Total", 2025] == 70693 | ||||
| 64 | + assert h.loc["Total", "var_2025_2023"] == pytest.approx(0.0552, abs=5e-4) | ||||
| 65 | + assert h.loc["Total", "tcac"] == pytest.approx(0.0273, abs=5e-4) | ||||
| 66 | + assert res["depenses_2025_declarees"] == 70693 | ||||
| 67 | + assert res["ecart_normalisation"] == pytest.approx(7795.19, abs=0.01) | ||||
| 68 | + assert res["rne_historique_2025"] == pytest.approx(97750.94, abs=0.01) | ||||
| 69 | + assert res["V_historique"] - res["V"] == pytest.approx(176561, abs=1) | ||||
| 70 | + | ||||
| 71 | + | ||||
| 72 | +def test_normalisation_alternative(res): | ||||
| 73 | + alt = res["alternative"] | ||||
| 74 | + a = alt.loc["Assurances"] | ||||
| 75 | + attendu = np.mean([11474 * 1.03 ** 3, 12614 * 1.03 ** 2, 11060 * 1.03]) | ||||
| 76 | + assert a["moyenne_indexee"] == pytest.approx(attendu, abs=1e-9) | ||||
| 77 | + assert a["derniere_indexee"] == pytest.approx(11391.80, abs=0.01) | ||||
| 78 | + assert a["ecart"] == pytest.approx(1045.51, abs=0.01) | ||||
| 79 | + assert alt.loc["Entretien et réparations", "ecart"] == pytest.approx(-130.75, abs=0.01) | ||||
| 80 | + | ||||
| 81 | + | ||||
| 82 | +# ----------------------------------------------------------------------------- réserve / taux | ||||
| 83 | +def test_demonstration_reserve(res): | ||||
| 84 | + d = res["demo_reserve"]; b = res["base"] | ||||
| 85 | + # R' = R + RR/V ; V − V' = RR/R' ; erreur relative = −RR/(RNE + RR) | ||||
| 86 | + assert d["R_avant"] == pytest.approx(d["R_apres"] + b["reserve"] / d["V"], abs=1e-12) | ||||
| 87 | + assert d["delta_V"] == pytest.approx(b["reserve"] / d["R_avant"], abs=1e-6) | ||||
| 88 | + assert d["erreur_relative"] == pytest.approx(-b["reserve"] / (b["rne"] + b["reserve"]), abs=1e-12) | ||||
| 89 | + assert d["V_err_inverse"] - d["V"] == pytest.approx(b["reserve"] / d["R_apres"], abs=1e-6) | ||||
| 90 | + # valeurs citées | ||||
| 91 | + assert d["R_avant"] == pytest.approx(0.048127, abs=5e-7) | ||||
| 92 | + assert d["ecart_taux_pb"] == pytest.approx(39.77, abs=0.01) | ||||
| 93 | + assert d["V_err"] == pytest.approx(1869136, abs=1) | ||||
| 94 | + assert d["delta_V"] == pytest.approx(168367, abs=1) | ||||
| 95 | + assert d["erreur_relative"] == pytest.approx(-0.0826, abs=5e-5) | ||||
| 96 | + assert d["erreur_relative_inverse"] == pytest.approx(0.0901, abs=5e-5) | ||||
| 97 | + | ||||
| 98 | + | ||||
| 99 | +def test_reserve_composantes(): | ||||
| 100 | + rc = reserve_par_composantes(taux=0.03) | ||||
| 101 | + assert rc["lineaire_par_logement"] == pytest.approx(687.62, abs=0.01) | ||||
| 102 | + assert rc["fonds_par_logement"] == pytest.approx(580.71, abs=0.01) | ||||
| 103 | + assert rc["lineaire_immeuble"] == pytest.approx(8251.43, abs=0.01) | ||||
| 104 | + assert rc["fonds_immeuble"] == pytest.approx(6968.47, abs=0.01) | ||||
| 105 | + # fonds d'amortissement → linéaire quand le taux → 0 | ||||
| 106 | + rc0 = reserve_par_composantes(taux=1e-9) | ||||
| 107 | + assert rc0["fonds_par_logement"] == pytest.approx(rc0["lineaire_par_logement"], rel=1e-6) | ||||
| 108 | + assert reserve_par_composantes(taux=0.05)["fonds_par_logement"] == pytest.approx(518.77, abs=0.01) | ||||
| 109 | + | ||||
| 110 | + | ||||
| 111 | +def test_equivalence_reserve_capex(): | ||||
| 112 | + """VA des remplacements perpétuels tous les N ans = VA d'une réserve perpétuelle au fonds d'amortissement.""" | ||||
| 113 | + C, N, i = 2200.0 * 12, 12, 0.03 | ||||
| 114 | + va_capex = C / ((1 + i) ** N - 1) | ||||
| 115 | + rr = C * fin.facteur_fonds_amortissement(i, N) | ||||
| 116 | + assert rr / i == pytest.approx(va_capex, rel=1e-12) | ||||
| 117 | + # vérification par sommation tronquée (2 000 cycles) | ||||
| 118 | + somme = sum(C / (1 + i) ** (j * N) for j in range(1, 2001)) | ||||
| 119 | + assert somme == pytest.approx(va_capex, rel=1e-9) | ||||
| 120 | + assert va_capex == pytest.approx(62006.64, abs=0.01) | ||||
| 121 | + assert rr == pytest.approx(1860.20, abs=0.01) | ||||
| 122 | + | ||||
| 123 | + | ||||
| 124 | +def test_equivalence_capex_dossier(res): | ||||
| 125 | + eq = res["equivalence_capex"] | ||||
| 126 | + assert eq["total"] == 245000 | ||||
| 127 | + va = 85000 / 1.0725 ** 2 + 40000 / 1.0725 ** 4 + 120000 / 1.0725 ** 7 | ||||
| 128 | + assert eq["va"] == pytest.approx(va, abs=1e-6) | ||||
| 129 | + assert eq["annuite_equivalente"] == pytest.approx(va * fin.facteur_recouvrement(0.0725, 10), abs=1e-6) | ||||
| 130 | + assert eq["va"] == pytest.approx(177647.94, abs=0.01) | ||||
| 131 | + assert eq["annuite_equivalente"] == pytest.approx(25586.15, abs=0.01) | ||||
| 132 | + | ||||
| 133 | + | ||||
| 134 | +# ----------------------------------------------------------------------------- valeurs citées | ||||
| 135 | +def test_valeurs_citees_cas3(res): | ||||
| 136 | + b = res["base"]; cl = res["classement"] | ||||
| 137 | + assert b["rbe"] == pytest.approx(168443.94, abs=0.01) | ||||
| 138 | + assert b["depenses_hors_reserve"] == pytest.approx(70385.19, abs=0.01) | ||||
| 139 | + assert b["depenses_totales"] == pytest.approx(78488.19, abs=0.01) | ||||
| 140 | + assert b["rne"] == pytest.approx(89955.75, abs=0.01) | ||||
| 141 | + assert b["ratio_depenses"] == pytest.approx(0.466, abs=5e-4) | ||||
| 142 | + assert res["rne_par_logement"] == pytest.approx(7496.31, abs=0.01) | ||||
| 143 | + assert res["rne_par_m2"] == pytest.approx(109.04, abs=0.01) | ||||
| 144 | + assert cl["fixes"] == pytest.approx(23317.78, abs=0.01) | ||||
| 145 | + assert cl["variables"] == pytest.approx(47067.41, abs=0.01) | ||||
| 146 | + assert cl["part_fixes"] == pytest.approx(0.297, abs=5e-4) | ||||
| 147 | + assert cl["part_variables"] == pytest.approx(0.600, abs=5e-4) | ||||
| 148 | + assert cl["part_reserve"] == pytest.approx(0.103, abs=5e-4) | ||||
| 149 | + assert cl["fixes_pct_rbe"] == pytest.approx(0.138, abs=5e-4) | ||||
| 150 | + assert cl["total_par_logement"] == pytest.approx(6540.68, abs=0.01) | ||||
| 151 | + assert cl["total_par_m2"] == pytest.approx(95.14, abs=0.01) | ||||
| 152 | + g = cl["groupes_pct_rbe"] | ||||
| 153 | + assert g["Conciergerie et services"] == pytest.approx(0.1011, abs=5e-4) | ||||
| 154 | + assert g["Taxes foncières"] == pytest.approx(0.0708, abs=5e-4) | ||||
| 155 | + assert g["Réserve de remplacement"] == pytest.approx(0.0481, abs=5e-4) | ||||
| 156 | + | ||||
| 157 | + | ||||
| 158 | +def test_valeurs_citees_marche_et_comparables(res): | ||||
| 159 | + m = res["marche"]; cs = res["comps_stats"] | ||||
| 160 | + assert m["rbe"] == pytest.approx(188140.60, abs=0.01) | ||||
| 161 | + assert m["rne"] == pytest.approx(108864.54, abs=0.01) | ||||
| 162 | + assert m["ratio"] == pytest.approx(0.421, abs=5e-4) | ||||
| 163 | + assert m["loyer_moyen_contrat"] == pytest.approx(1149.58, abs=0.01) | ||||
| 164 | + assert m["loyer_moyen"] == pytest.approx(1291.92, abs=0.01) | ||||
| 165 | + assert cs["n"] == 40 and cs["ratio_median"] == pytest.approx(0.3985, abs=5e-4) | ||||
| 166 | + assert cs["ratio_q1"] == pytest.approx(0.379, abs=1e-3) and cs["ratio_q3"] == pytest.approx(0.4185, abs=1e-3) | ||||
| 167 | + # courbe iso-dépenses : passe par les deux points du sujet | ||||
| 168 | + assert float(ratio_iso_depenses(m["loyer_moyen_contrat"], res["base"], res["hyp"])) == pytest.approx(res["base"]["ratio_depenses"], abs=1e-9) | ||||
| 169 | + assert float(ratio_iso_depenses(m["loyer_moyen"], res["base"], res["hyp"])) == pytest.approx(m["ratio"], abs=1e-9) | ||||
| 170 | + | ||||
| 171 | + | ||||
| 172 | +def test_sensibilites(res): | ||||
| 173 | + s = res["sensibilites"]; R = res["R"]; noi0 = res["base"]["rne"] | ||||
| 174 | + r = s["reserve"].set_index("reserve_par_logement") | ||||
| 175 | + assert r.loc[0, "rne"] == pytest.approx(98058.75, abs=0.01) and r.loc[0, "dV_pct"] == pytest.approx(0.090, abs=5e-4) | ||||
| 176 | + assert r.loc[100, "dV_pct"] == pytest.approx(0.077, abs=5e-4) and r.loc[1200, "dV_pct"] == pytest.approx(-0.070, abs=5e-4) | ||||
| 177 | + assert (np.diff(r["rne"].values) < 0).all() | ||||
| 178 | + t = s["taxe"].set_index("scenario") | ||||
| 179 | + assert t.iloc[1]["taxe"] == pytest.approx(11194.44, abs=0.01) and t.iloc[1]["dV_pct"] == pytest.approx(-0.011, abs=5e-4) | ||||
| 180 | + assert t.iloc[3]["dV_pct"] == pytest.approx(-0.057, abs=5e-4) and t.iloc[4]["dV_pct"] == pytest.approx(-0.075, abs=5e-4) | ||||
| 181 | + g = s["gestion"].set_index("gestion_pct") | ||||
| 182 | + assert g.loc[0.0, "dV_pct"] == pytest.approx(0.075, abs=5e-4) and g.loc[0.10, "dV_pct"] == pytest.approx(-0.112, abs=5e-4) | ||||
| 183 | + assert s["dV_dDE"] == pytest.approx(-1 / R, rel=1e-12) and abs(s["dV_dDE"]) == pytest.approx(22.65, abs=0.01) | ||||
| 184 | + assert s["elasticite_rne_depenses"] == pytest.approx(-0.873, abs=5e-4) | ||||
| 185 | + assert s["elasticite_rne_rbe"] == pytest.approx(1.80, abs=5e-3) | ||||
| 186 | + assert s["depenses_equiv_25pb"] * R == pytest.approx(4820.78, abs=0.01) | ||||
| 187 | + # pentes citées dans la légende de la figure : 12/R par dollar de réserve/logement ; 2 200/R par 10 pb ; RBE/100/R par point de gestion | ||||
| 188 | + assert 12 / R == pytest.approx(272, abs=1) | ||||
| 189 | + assert 2200 / R == pytest.approx(49830, abs=10) | ||||
| 190 | + assert res["base"]["rbe"] / 100 / R == pytest.approx(38153, abs=1) | ||||
| 191 | + | ||||
| 192 | + | ||||
| 193 | +def test_indexation_ipc(res): | ||||
| 194 | + ipc = res["ipc"] | ||||
| 195 | + assert ipc["facteur"] == pytest.approx(167.7 / 124.7, rel=1e-12) | ||||
| 196 | + assert ipc["variation"] == pytest.approx(0.345, abs=5e-4) | ||||
| 197 | + assert ipc["entretien_500"] == pytest.approx(672.4, abs=0.1) | ||||
| 198 | + assert ipc["salaires_300"] == pytest.approx(403.4, abs=0.1) | ||||
| 199 | + assert ipc["reserve_100"] == pytest.approx(134.5, abs=0.1) | ||||
| 200 | + | ||||
| 201 | + | ||||
| 202 | +def test_cas2(res): | ||||
| 203 | + c = res["cas2"]; b = c["base"] | ||||
| 204 | + t2 = cas2.tout() | ||||
| 205 | + assert b["rne"] == pytest.approx(t2["base"]["rne"], rel=1e-12) | ||||
| 206 | + assert b["rbe"] == pytest.approx(40577.04, abs=0.01) | ||||
| 207 | + assert c["gestion_imputee"] == pytest.approx(1623.08, abs=0.01) | ||||
| 208 | + assert b["depenses_hors_reserve"] == pytest.approx(16743.08, abs=0.01) | ||||
| 209 | + assert b["depenses_totales"] == pytest.approx(18543.08, abs=0.01) | ||||
| 210 | + assert b["rne"] == pytest.approx(22033.96, abs=0.01) | ||||
| 211 | + assert b["ratio_depenses"] == pytest.approx(0.457, abs=5e-4) | ||||
| 212 | + assert c["rne_par_logement"] == pytest.approx(7344.65, abs=0.01) | ||||
| 213 | + assert c["rne_par_m2"] == pytest.approx(84.10, abs=0.01) | ||||
| 214 | + assert c["classement"]["part_fixes"] == pytest.approx(0.527, abs=5e-4) | ||||
| 215 | + assert c["classement"]["total_par_logement"] == pytest.approx(6181.03, abs=0.01) | ||||
| 216 | + assert c["classement"]["total_par_m2"] == pytest.approx(70.78, abs=0.01) | ||||
| 217 | + tq = c["taxes_quebec_recalc"] | ||||
| 218 | + assert tq["taxe_generale"] == pytest.approx(495000 * 0.007464, abs=1e-9) | ||||
| 219 | + assert tq["total"] == pytest.approx(5437.68, abs=0.01) and tq["ecart"] == pytest.approx(462.32, abs=0.01) | ||||
| 220 | + assert tq["scolaire_recalc"] == pytest.approx(371.25, abs=0.01) | ||||
| 221 | + | ||||
| 222 | + | ||||
| 223 | +# ----------------------------------------------------------------------------- exercices | ||||
| 224 | +def test_exercices(ex, res): | ||||
| 225 | + e1 = ex["ex1"] | ||||
| 226 | + assert e1["rbe"] == pytest.approx(118800, abs=1e-9) | ||||
| 227 | + assert e1["fixes"] == pytest.approx(15260.31, abs=0.01) and e1["variables"] == pytest.approx(18740, abs=1e-9) | ||||
| 228 | + assert e1["rne"] == pytest.approx(79999.70, abs=0.01) and e1["ratio"] == pytest.approx(0.3266, abs=5e-5) | ||||
| 229 | + assert e1["part_fixes"] == pytest.approx(0.393, abs=5e-4) | ||||
| 230 | + e2 = ex["ex2"] | ||||
| 231 | + assert e2["ecart_total"] == pytest.approx(1046.00, abs=0.01) and e2["dV"] == pytest.approx(23692, abs=1) | ||||
| 232 | + e3 = ex["ex3"] | ||||
| 233 | + assert e3["ecart"] == pytest.approx(1006.24, abs=0.01) and e3["dV"] == pytest.approx(-22791, abs=1) | ||||
| 234 | + assert e3["ecart_exemption"] == pytest.approx(19.75, abs=0.01) | ||||
| 235 | + e4 = ex["ex4"] | ||||
| 236 | + assert e4["lineaire"] == pytest.approx(687.62, abs=0.01) and e4["fonds_5"] == pytest.approx(518.77, abs=0.01) | ||||
| 237 | + e5 = ex["ex5"] | ||||
| 238 | + assert e5["R_apres"] == pytest.approx(182000 / 4100000, rel=1e-12) | ||||
| 239 | + assert e5["ecart_pb"] == pytest.approx(32.93, abs=0.01) | ||||
| 240 | + assert e5["V_err"] == pytest.approx(1886540, abs=1) and e5["V_coherent"] == pytest.approx(2026476, abs=1) | ||||
| 241 | + assert e5["erreur_rel"] == pytest.approx(-0.0691, abs=5e-5) | ||||
| 242 | + assert e5["delta_V"] == pytest.approx(139936, abs=1) and e5["delta_formule_sujet"] == pytest.approx(169935, abs=1) | ||||
| 243 | + # l'écart exact n'égale RR/R' que si les parts de réserve coïncident | ||||
| 244 | + assert e5["ratio_reserve_comparable"] == pytest.approx(0.0691, abs=5e-5) and e5["ratio_reserve_sujet"] == pytest.approx(0.0826, abs=5e-5) | ||||
| 245 | + e6 = ex["ex6"] | ||||
| 246 | + assert e6["rne_sans"] == pytest.approx(23657.04, abs=0.01) and e6["ratio_sans"] == pytest.approx(0.417, abs=5e-4) | ||||
| 247 | + assert e6["rne_5"] == pytest.approx(21628.19, abs=0.01) | ||||
| 248 | + assert e6["V_avec"] == pytest.approx(695078, abs=1) and e6["V_sans"] == pytest.approx(746279, abs=1) | ||||
| 249 | + assert e6["surevaluation"] == pytest.approx(0.0737, abs=5e-5) | ||||
| 250 | + e7 = ex["ex7"] | ||||
| 251 | + assert e7["rne_double"] == pytest.approx(64369.60, abs=0.01) and e7["V_double"] == pytest.approx(1457975, abs=1) | ||||
| 252 | + assert e7["erreur_rel_double"] == pytest.approx(-0.284, abs=5e-4) | ||||
| 253 | + assert e7["va_capex_perpetuel"] == pytest.approx(e7["va_reserve_perpetuelle"], rel=1e-12) | ||||
| 254 | + | ||||
| 255 | + | ||||
| 256 | +# ----------------------------------------------------------------------------- figures | ||||
| 257 | +def test_figures_presentes(): | ||||
| 258 | + for slug in ["cascade", "structure", "evolution", "ratio-loyer", "sensibilite"]: | ||||
| 259 | + p = ROOT / "assets/figures/ch28" / f"ch28-fig-{slug}.pdf" | ||||
| 260 | + assert p.exists() and p.stat().st_size > 1000, p | ||||
added
analysis/python/tests/test_ch35.py
+127 −0
@@ -0,0 +1,127 @@ | |||||
| 1 | +"""Chapitre 35 — Indices immobiliers et ventes répétées : identités et valeurs citées dans le texte, les tableaux et les solutions. | ||||
| 2 | +Modèle de référence : traite.cas1 ; estimateurs : traite.hedonique (indice_dummies_temps, ventes_repetees_bmn, ventes_repetees_case_shiller). | ||||
| 3 | +Tolérances déclarées dans chaque assertion.""" | ||||
| 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 ch35_indices as c35 | ||||
| 8 | +from traite import hedonique as h | ||||
| 9 | + | ||||
| 10 | +@pytest.fixture(scope="module") | ||||
| 11 | +def res(): | ||||
| 12 | + return c35.main(verbose=False) | ||||
| 13 | + | ||||
| 14 | +def test_verite_et_donnees(res): | ||||
| 15 | + assert len(res["ventes"]) == 600 and res["naifs"]["n"].sum() == 600 and list(res["naifs"]["n"]) == [39, 39, 42, 40, 50, 44, 51, 39, 32, 43, 50, 30, 33, 46, 22] | ||||
| 16 | + assert c35.BETA_VRAI == pytest.approx(math.log(1 + ((1 + 0.0906) ** 0.5 - 1)) / 12, rel=1e-9) | ||||
| 17 | + assert (math.exp(12 * c35.BETA_VRAI) - 1) * 100 == pytest.approx(4.43, abs=0.005) | ||||
| 18 | + assert res["vrai"][0] == 100 and res["vrai"][-1] == pytest.approx(116.37, abs=0.005) | ||||
| 19 | + | ||||
| 20 | +def test_indice_hedonique_identites(res): | ||||
| 21 | + td = res["td"] | ||||
| 22 | + assert td["k"] == 29 and td["sigma"] == pytest.approx(0.0830, abs=0.0005) and td["r2_ajuste"] == pytest.approx(0.849, abs=0.001) | ||||
| 23 | + assert td["indice"][0] == 100.0 and np.all(td["bas"] <= td["indice"]) and np.all(td["indice"] <= td["haut"]) | ||||
| 24 | + # exp(τ_t) = indice / 100 | ||||
| 25 | + assert np.allclose(td["indice"], 100 * np.exp(td["tau"])) | ||||
| 26 | + assert td["indice"][-1] == pytest.approx(122.04, abs=0.005) and td["indice"][9] == pytest.approx(112.13, abs=0.005) | ||||
| 27 | + assert res["precision"]["hedonique"]["largeur_ic_finale_pct"] == pytest.approx(7.47, abs=0.01) | ||||
| 28 | + # imputation géométrique (Laspeyres = Paasche = Fisher) = indice à indicatrices quand les coefficients sont communs | ||||
| 29 | + imp = res["imputation"] | ||||
| 30 | + assert imp["ecart_max_vs_td"] < 1e-9 and np.allclose(imp["laspeyres"], imp["paasche"], atol=1e-9) | ||||
| 31 | + # chaînage : I_t = I_{t-1} exp(δ_t) | ||||
| 32 | + ch = res["chaine"]; assert np.allclose(ch["indice"], 100 * np.exp(np.cumsum(ch["delta"]))) and ch["indice"][-1] == pytest.approx(121.69, abs=0.005) | ||||
| 33 | + | ||||
| 34 | +def test_mediane_et_composition(res): | ||||
| 35 | + n = res["naifs"] | ||||
| 36 | + assert n["indice_mediane"].iloc[-1] == pytest.approx(128.63, abs=0.005) and n["indice_mediane"].max() == pytest.approx(133.68, abs=0.005) | ||||
| 37 | + assert n["indice_moy_geo"].iloc[-1] == pytest.approx(127.78, abs=0.005) | ||||
| 38 | + # décomposition exacte : ln(moyenne géométrique)_t − ln(…)_0 = composition_t + τ_t (les résidus MCO somment à zéro par trimestre) | ||||
| 39 | + lhs = np.log(n["moy_geo"].to_numpy() / n["moy_geo"].iloc[0]); rhs = n["composition_log"].to_numpy() + res["td"]["tau"] | ||||
| 40 | + assert np.allclose(lhs, rhs, atol=1e-9) | ||||
| 41 | + assert np.allclose(n["indice_moy_geo_corrigee"].to_numpy(), res["td"]["indice"], atol=1e-6) | ||||
| 42 | + assert res["corr_ecart_composition"] == pytest.approx(0.86, abs=0.01) | ||||
| 43 | + assert n["composition_log"].iloc[12] == pytest.approx(0.101, abs=0.001) and n["part_aylmer"].iloc[-1] == pytest.approx(0.364, abs=0.001) | ||||
| 44 | + p = res["precision"] | ||||
| 45 | + assert p["mediane"]["EAM_pct"] == pytest.approx(10.97, abs=0.01) and p["mediane"]["croissance_totale_pct"] == pytest.approx(28.63, abs=0.01) | ||||
| 46 | + assert p["hedonique"]["EAM_pct"] == pytest.approx(2.81, abs=0.01) and p["hedonique"]["croissance_totale_pct"] == pytest.approx(22.04, abs=0.01) | ||||
| 47 | + | ||||
| 48 | +def test_reventes_synthetiques(res): | ||||
| 49 | + p = res["paires"]; r = res["resume_paires"] | ||||
| 50 | + assert r["n_paires"] == 220 and r["n_flips"] == 47 and r["intervalle_median"] == 10.0 and r["intervalle_min"] == 3 and r["intervalle_max"] == 38 | ||||
| 51 | + assert (p["date_2"] <= c35.FIN_FENETRE).all() and (p["t_2"] > p["t_1"]).all() and r["meme_trimestre"] == 0 | ||||
| 52 | + assert (p["prix_2"] % 500 == 0).all() | ||||
| 53 | + assert r["part_moins_12"] == pytest.approx(0.559, abs=0.001) and r["sd_ln_ratio"] == pytest.approx(0.144, abs=0.001) | ||||
| 54 | + # reproductibilité (graine fixée) | ||||
| 55 | + p2 = c35.generer_reventes(res["ventes"]); assert len(p2) == 220 and np.allclose(p2["prix_2"], p["prix_2"]) | ||||
| 56 | + assert p[p["flip"]]["ln_ratio"].mean() == pytest.approx(0.0957, abs=0.0005) and p[~p["flip"]]["ln_ratio"].mean() == pytest.approx(0.0436, abs=0.0005) | ||||
| 57 | + | ||||
| 58 | +def test_bmn_identites(res): | ||||
| 59 | + b = res["bmn"] | ||||
| 60 | + D = b["D"]; assert D.shape == (220, 14) | ||||
| 61 | + # chaque ligne de la matrice complète (période 0 comprise) somme à zéro : ici, −1 à t1 et +1 à t2, période 0 omise | ||||
| 62 | + assert set(np.unique(D)) <= {-1.0, 0.0, 1.0} and np.all(np.abs(D).sum(1) <= 2) | ||||
| 63 | + assert np.allclose(b["beta"], b["beta_ferme"], atol=1e-10) | ||||
| 64 | + assert np.allclose(b["indice"], 100 * np.exp(np.concatenate([[0.0], b["beta"]]))) | ||||
| 65 | + assert b["indice"][-1] == pytest.approx(120.68, abs=0.005) and b["indice"][9] == pytest.approx(113.42, abs=0.005) | ||||
| 66 | + assert b["sigma"] == pytest.approx(0.1455, abs=0.0005) and b["se"][-1] == pytest.approx(0.0483, abs=0.0005) | ||||
| 67 | + assert res["precision"]["bmn"]["EAM_pct"] == pytest.approx(3.02, abs=0.01) and res["precision"]["bmn"]["largeur_ic_finale_pct"] == pytest.approx(20.83, abs=0.01) | ||||
| 68 | + | ||||
| 69 | +def test_case_shiller(res): | ||||
| 70 | + cs = res["cs"] | ||||
| 71 | + assert cs["indice"][-1] == pytest.approx(120.48, abs=0.005) and res["precision"]["cs"]["EAM_pct"] == pytest.approx(2.90, abs=0.01) | ||||
| 72 | + a = cs["coef_variance"]; assert a[0] == pytest.approx(0.0208, abs=0.0001) and a[1] == pytest.approx(-0.00023, abs=0.00001) | ||||
| 73 | + # sans les reventes rénovées, la pente redevient positive (structure 2σ² + δ²Δ de la loi de génération) | ||||
| 74 | + ao = res["sensibilite"]["filtre"]["sans les reventes rénovées (oracle)"]["cs_coef_variance"] | ||||
| 75 | + assert ao[0] == pytest.approx(0.0157, abs=0.0001) and ao[1] == pytest.approx(0.00053, abs=0.00001) | ||||
| 76 | + assert cs["variance_theorique"][0] == pytest.approx(2 * 0.085 ** 2) and cs["variance_theorique"][1] == pytest.approx(0.0012) | ||||
| 77 | + # poids = 1/sqrt(var) ; var minorée | ||||
| 78 | + assert np.allclose(cs["poids"], 1 / np.sqrt(np.maximum(a[0] + a[1] * cs["gap_trimestres"], 1e-8))) | ||||
| 79 | + # CS ≈ BMN quand les poids sont presque uniformes | ||||
| 80 | + assert np.max(np.abs(cs["indice"] - res["bmn"]["indice"])) < 0.5 | ||||
| 81 | + | ||||
| 82 | +def test_spar(res): | ||||
| 83 | + sp = res["spar"]; v = res["ventes"] | ||||
| 84 | + assert sp["indice_geo"][0] == 100 and sp["indice_arith"][0] == 100 | ||||
| 85 | + assert sp["indice_geo"][-1] == pytest.approx(115.06, abs=0.005) and sp["indice_arith"][-1] == pytest.approx(114.36, abs=0.005) | ||||
| 86 | + assert sp["ratio_median_global"] == pytest.approx(1.095, abs=0.001) and sp["sd_ln_ratio"] == pytest.approx(0.087, abs=0.001) | ||||
| 87 | + assert res["precision"]["spar"]["EAM_pct"] == pytest.approx(1.26, abs=0.01) | ||||
| 88 | + # identité arithmétique : ratio des sommes | ||||
| 89 | + t0 = v[v["trim"] == 0]; assert sp["ratio_arith"][0] == pytest.approx(t0["prix_vente"].sum() / t0["valeur_role_2025"].sum()) | ||||
| 90 | + | ||||
| 91 | +def test_ajustement_et_sensibilite(res): | ||||
| 92 | + a = res["ajustement"] | ||||
| 93 | + assert a["prix"] == 506_500 and a["trimestre_vente"] == "2025T2" and a["mois_ecoules"] == pytest.approx(15.2, abs=0.05) | ||||
| 94 | + assert a["hedonique"] == pytest.approx(44_760, abs=1) and a["bmn"] == pytest.approx(32_406, abs=1) and a["cs"] == pytest.approx(32_359, abs=1) | ||||
| 95 | + assert a["mediane"] == pytest.approx(44_009, abs=1) and a["spar"] == pytest.approx(26_575, abs=1) and a["tendance"] == pytest.approx(28_733, abs=1) | ||||
| 96 | + assert a["vrai"] == pytest.approx(28_558, abs=1) and a["chaine"] == pytest.approx(30_987, abs=1) | ||||
| 97 | + s = res["sensibilite"] | ||||
| 98 | + r = s["revisions"]["2025T2"]; assert r["bmn_v2025T2"] == pytest.approx(116.39, abs=0.005) and r["bmn_v2025T4"] == pytest.approx(114.69, abs=0.005) and r["bmn_v2026T3"] == pytest.approx(113.42, abs=0.005) | ||||
| 99 | + r4 = s["revisions"]["2024T4"]; assert r4["bmn_v2025T2"] == pytest.approx(114.45, abs=0.005) and r4["bmn_v2026T3"] == pytest.approx(109.99, abs=0.005) | ||||
| 100 | + f = s["filtre"] | ||||
| 101 | + assert f["toutes"]["n"] == 220 and f["intervalle ≥ 12 mois"]["n"] == 97 and f["intervalle ≥ 18 mois"]["n"] == 45 and f["sans les reventes rénovées (oracle)"]["n"] == 173 | ||||
| 102 | + assert f["toutes"]["bmn"]["croissance_totale_pct"] == pytest.approx(20.68, abs=0.01) and f["intervalle ≥ 12 mois"]["bmn"]["croissance_totale_pct"] == pytest.approx(17.98, abs=0.01) | ||||
| 103 | + assert f["sans les reventes rénovées (oracle)"]["bmn"]["croissance_totale_pct"] == pytest.approx(18.39, abs=0.01) and f["sans les reventes rénovées (oracle)"]["bmn"]["EAM_pct"] == pytest.approx(2.01, abs=0.01) | ||||
| 104 | + assert f["intervalle ≥ 12 mois"]["bmn"]["EAM_pct"] == pytest.approx(2.76, abs=0.01) and f["intervalle ≥ 18 mois"]["bmn"]["EAM_pct"] == pytest.approx(6.56, abs=0.01) | ||||
| 105 | + t = s["taille"]; assert t[0.5]["EAM_moyen_pct"] == pytest.approx(4.26, abs=0.01) and t[0.25]["EAM_moyen_pct"] == pytest.approx(6.46, abs=0.01) | ||||
| 106 | + assert t[0.5]["sd_indice_final"] == pytest.approx(4.77, abs=0.01) and t[0.25]["sd_indice_final"] == pytest.approx(8.96, abs=0.01) | ||||
| 107 | + assert s["fenetre"]["n"] == 295 and s["fenetre"]["ecart_max_pct"] == pytest.approx(0.37, abs=0.01) | ||||
| 108 | + | ||||
| 109 | +def test_solutions_exercices(res): | ||||
| 110 | + e = res["exercices"] | ||||
| 111 | + assert e["1"]["var_mediane_pct"] == pytest.approx(6.67, abs=0.01) and e["1"]["composition_pct"] == pytest.approx(3.79, abs=0.01) and e["1"]["variation_pure_pct"] == pytest.approx(2.77, abs=0.01) | ||||
| 112 | + assert np.allclose(e["2"]["indice"], [100, 103.15, 105.97, 110.74], atol=0.01) and e["2"]["variation_t3_t2_pct"] == pytest.approx(4.50, abs=0.01) | ||||
| 113 | + assert e["2"]["ic_t3"][0] == pytest.approx(106.27, abs=0.01) and e["2"]["ic_t3"][1] == pytest.approx(115.39, abs=0.01) | ||||
| 114 | + assert np.allclose(e["3"]["DtD"], [[3, -1], [-1, 2]]) and np.allclose(e["3"]["Dty"], [0.0288, 0.1726], atol=0.0001) | ||||
| 115 | + assert np.allclose(e["3"]["beta"], [0.0461, 0.1093], atol=0.0001) and np.allclose(e["3"]["indice"], [100, 104.71, 111.55], atol=0.01) | ||||
| 116 | + assert abs(e["3"]["residus"] @ np.array([[1, 0], [-1, 1], [0, 1], [1, 0]])).max() < 1e-12 # orthogonalité des résidus aux colonnes de D | ||||
| 117 | + assert np.allclose(e["4"]["poids_rel"], [1, 0.902, 0.807, 0.737], atol=0.001) and np.allclose(e["4"]["sd_pct"], [12.53, 13.89, 15.52, 17.00], atol=0.01) | ||||
| 118 | + assert e["5"]["ratio_arith"] == pytest.approx(1.0802, abs=0.0001) and e["5"]["ratio_geo"] == pytest.approx(1.0781, abs=0.0001) | ||||
| 119 | + assert e["5"]["spar_arith"] == pytest.approx(103.36, abs=0.01) and e["5"]["spar_geo"] == pytest.approx(103.16, abs=0.01) | ||||
| 120 | + assert e["6"]["ajustements"]["hedonique"] == pytest.approx(44_760, abs=1) and e["6"]["ajustements"]["bmn"] == pytest.approx(32_406, abs=1) | ||||
| 121 | + assert e["6"]["ajustements"]["mediane"] == pytest.approx(44_009, abs=1) and e["6"]["tendance"] == pytest.approx(28_774, abs=1) | ||||
| 122 | + | ||||
| 123 | +def test_bibliotheque_bmn_cas_simple(): | ||||
| 124 | + """Deux périodes, deux paires : l'indice BMN est la moyenne géométrique des ratios de prix (forme fermée).""" | ||||
| 125 | + r = h.ventes_repetees_bmn([100, 200], [110, 230], [0, 0], [1, 1], 2) | ||||
| 126 | + assert r["indice"][1] == pytest.approx(100 * math.sqrt(1.10 * 1.15), rel=1e-12) | ||||
| 127 | + idx = h.indice_dummies_temps([0.05, 0.10]); assert np.allclose(idx, [100, 100 * math.exp(0.05), 100 * math.exp(0.10)]) | ||||
modified
assets/figures/ch34/ch34-fig-calcul-tal.pdf
+0 −0
Binary file not shown.
deleted
manuscript/_wrap_ch24.tex
+0 −12
@@ -1,12 +0,0 @@ | |||||
| 1 | −\providecommand{\BUILDVARIANT}{uqo}\providecommand{\BUILDMEDIA}{numerique} | ||||
| 2 | −\documentclass[10pt,twoside,openright]{book} | ||||
| 3 | −\newif\ifLogoAutorise\LogoAutorisefalse\def\PALETTE{uqo} | ||||
| 4 | −\usepackage{traite-qc} | ||||
| 5 | −\input{../manuscript/frontmatter/metadata.tex} | ||||
| 6 | −\input{/Users/simon-pierreboucher/Desktop/UQO/Traite-Evaluation-QC/build/ch24/_labels.tex} | ||||
| 7 | −\begin{document} | ||||
| 8 | −\setcounter{chapter}{23} | ||||
| 9 | −\input{chapters/ch24.tex} | ||||
| 10 | −\appendix\chapter{Solutions du chapitre}\input{../solutions/ch24.tex} | ||||
| 11 | −\printbibliography | ||||
| 12 | −\end{document} | ||||
deleted
manuscript/_wrap_ch26.tex
+0 −12
@@ -1,12 +0,0 @@ | |||||
| 1 | −\providecommand{\BUILDVARIANT}{uqo}\providecommand{\BUILDMEDIA}{numerique} | ||||
| 2 | −\documentclass[10pt,twoside,openright]{book} | ||||
| 3 | −\newif\ifLogoAutorise\LogoAutorisefalse\def\PALETTE{uqo} | ||||
| 4 | −\usepackage{traite-qc} | ||||
| 5 | −\input{../manuscript/frontmatter/metadata.tex} | ||||
| 6 | −\input{/Users/simon-pierreboucher/Desktop/UQO/Traite-Evaluation-QC/build/ch26/_labels.tex} | ||||
| 7 | −\begin{document} | ||||
| 8 | −\setcounter{chapter}{25} | ||||
| 9 | −\input{chapters/ch26.tex} | ||||
| 10 | −\appendix\chapter{Solutions du chapitre}\input{../solutions/ch26.tex} | ||||
| 11 | −\printbibliography | ||||
| 12 | −\end{document} | ||||
modified
manuscript/chapters/ch14.tex
+3 −3
@@ -272,7 +272,7 @@ Centroïde de code postal, urbain & 150 & 177 & 368 & 1.33 & 76.1 & -0.0036 \\ | |||||
| 272 | Centroïde de code postal, périurbain & 1000 & 1199 & 2364 & 6.67 & 17.6 & -0.0003 \\ | 272 | Centroïde de code postal, périurbain & 1000 & 1199 & 2364 & 6.67 & 17.6 & -0.0003 \\ | ||
| 273 | \bottomrule | 273 | \bottomrule | ||
| 274 | \end{tabular} | 274 | \end{tabular} | ||
| 275 | −\tabsource{\synth{analysis/python/cases/ch14\_nettoyage.py (fonction \texttt{simulation\_geocodage}) ; coefficient de référence $-0{,}0036$ ; les $\sigma_g$ sont des hypothèses, non des mesures}} | 275 | +\tabsource{\synth{analysis/python/cases/ch14\_nettoyage.py (fonction \texttt{simulation\_geocodage}) ; Méd. = erreur médiane, P95 = 95\textsuperscript{e} centile, Rayon = part des ventes dont l'appartenance au rayon de 3 km change, Voisins = part des huit plus proches voisins conservés ; coefficient de référence $-0{,}0036$ ; les $\sigma_g$ sont des hypothèses, non des mesures}} | ||
| 276 | \end{table} | 276 | \end{table} | ||
| 277 | 277 | ||||
| 278 | \begin{figure}[htbp] | 278 | \begin{figure}[htbp] | ||
@@ -428,10 +428,10 @@ Les seuils des scores robustes et des résidus studentisés sont des décisions, | |||||
| 428 | \begin{table}[htbp] | 428 | \begin{table}[htbp] | ||
| 429 | \caption{Sensibilité de la chaîne de traitement aux seuils du score robuste et du résidu studentisé (données synthétiques)}\label{tab:14:sensibilite} | 429 | \caption{Sensibilité de la chaîne de traitement aux seuils du score robuste et du résidu studentisé (données synthétiques)}\label{tab:14:sensibilite} | ||
| 430 | \centering | 430 | \centering | ||
| 431 | −\small | 431 | +\let\small\footnotesize\setlength{\tabcolsep}{3pt} | ||
| 432 | \begin{tabular}{S[table-format=1.1]S[table-format=1.1]S[table-format=2.0]S[table-format=2.0]S[table-format=1.0]S[table-format=2.0]S[table-format=3.0]S[table-format=1.4]S[table-format=6.0]} | 432 | \begin{tabular}{S[table-format=1.1]S[table-format=1.1]S[table-format=2.0]S[table-format=2.0]S[table-format=1.0]S[table-format=2.0]S[table-format=3.0]S[table-format=1.4]S[table-format=6.0]} | ||
| 433 | \toprule | 433 | \toprule | ||
| 434 | −{Seuil $|z|$} & {Seuil $|t_i|$} & {Exclues S1} & {Exclues E1} & {Liées détectées / 6} & {Faux positifs} & {$n$ final} & {$\sigma$} & {Prédiction (\$)} \\ | 434 | +{Seuil $|z|$} & {Seuil $|t_i|$} & {Excl. S1} & {Excl. E1} & {Liées / 6} & {Faux pos.} & {$n$ final} & {$\sigma$} & {Préd. (\$)} \\ | ||
| 435 | \midrule | 435 | \midrule | ||
| 436 | 2.5 & 2.5 & 33 & 8 & 6 & 22 & 546 & 0.0783 & 633813 \\ | 436 | 2.5 & 2.5 & 33 & 8 & 6 & 22 & 546 & 0.0783 & 633813 \\ | ||
| 437 | 2.5 & 3.0 & 33 & 1 & 6 & 19 & 553 & 0.0816 & 633841 \\ | 437 | 2.5 & 3.0 & 33 & 1 & 6 & 19 & 553 & 0.0816 & 633841 \\ | ||
modified
manuscript/chapters/ch25.tex
+1 −1
@@ -211,7 +211,7 @@ L'ajustement de \emph{topographie} se raisonne de la même façon, par le coût | |||||
| 211 | 211 | ||||
| 212 | L'ajustement de \emph{zonage}, enfin, change la nature du bien plus qu'il ne le corrige : un terrain où trois logements sont permis ne se compare à un terrain unifamilial qu'après conversion en valeur par logement constructible, et un ajustement en pourcentage par logement supplémentaire, comme celui qu'estime l'exemple, n'est qu'une approximation valable pour de faibles différences de densité. Au-delà, on change d'unité et de comparables. | 212 | L'ajustement de \emph{zonage}, enfin, change la nature du bien plus qu'il ne le corrige : un terrain où trois logements sont permis ne se compare à un terrain unifamilial qu'après conversion en valeur par logement constructible, et un ajustement en pourcentage par logement supplémentaire, comme celui qu'estime l'exemple, n'est qu'une approximation valable pour de faibles différences de densité. Au-delà, on change d'unité et de comparables. | ||
| 213 | 213 | ||||
| 214 | −\begin{quebec}[Lotissement, parcs, zones inondables et zone agricole : ce qui borne la valeur d'un terrain] | 214 | +\begin{quebec}[{Lotissement, parcs, zones inondables et zone agricole : ce qui borne la valeur d'un terrain}] | ||
| 215 | Quatre régimes, détaillés au \cref{ch:08} et au \cref{ch:43}, bornent ce qu'un terrain permet et donc ce qu'il vaut. Le règlement de lotissement fixe la superficie et les dimensions minimales des lots par zone, selon qu'ils sont desservis ou non, et peut prohiber le lotissement dans les zones exposées aux inondations \parencite[art.~115 al.~2, par.~1°, 3° et 4°]{lau} ; le nombre de lots qu'un site peut produire en découle, et la méthode du lotissement en dépend. La municipalité peut exiger, comme condition du permis de lotissement ou de construction, une contribution pour fins de parcs sous forme de terrain, de servitude ou de somme, qui « ne doivent pas excéder 10 \% de la superficie et de la valeur, respectivement, du site » \parencite[art.~117.1, 117.2 et 117.4 al.~1]{lau} ; ces dispositions ont été modifiées en 2023 \parencite{loi2023c12}, et la Cour suprême a jugé en 2025 qu'une cession de terrains excédant ce que la municipalité pouvait exiger s'analyse comme une réserve ouvrant droit à une indemnité égale à la valeur marchande \parencite{laroda2025}. L'exemple de lotissement de la \cref{sec:25:lotissement} cède exactement 10 \% de la superficie du site. En matière d'inondations, le cadre en vigueur depuis le 1\ier{} mars 2026 classe l'exposition en quatre classes d'intensité et interdit toute nouvelle résidence dans le littoral, la rive et les classes très élevée, élevée et modérée, ne l'admettant sous conditions qu'en classe faible \parencite{zonesInond2026,inondcartes} ; un terrain vacant situé dans l'une des classes prohibées n'a plus de valeur résidentielle, et l'évaluateur vérifie la carte en vigueur pour chaque terrain riverain avant toute comparaison. Enfin, en zone agricole, nul ne peut utiliser un lot à une fin autre que l'agriculture, ni le lotir, sans l'autorisation de la Commission de protection du territoire agricole \parencite[art.~26, 28 et 29]{lptaa}, sous réserve des droits acquis des articles 101 à 105 ; la valeur d'un lot agricole dont l'usage résidentiel est espéré est une espérance pondérée par la probabilité d'autorisation, que le \cref{ch:08} a formalisée. Les ventes de terrains de Gatineau peuvent être croisées avec les couches de zonage et de zones inondables que la Ville diffuse en données ouvertes \parencite{gatzonage}. | 215 | Quatre régimes, détaillés au \cref{ch:08} et au \cref{ch:43}, bornent ce qu'un terrain permet et donc ce qu'il vaut. Le règlement de lotissement fixe la superficie et les dimensions minimales des lots par zone, selon qu'ils sont desservis ou non, et peut prohiber le lotissement dans les zones exposées aux inondations \parencite[art.~115 al.~2, par.~1°, 3° et 4°]{lau} ; le nombre de lots qu'un site peut produire en découle, et la méthode du lotissement en dépend. La municipalité peut exiger, comme condition du permis de lotissement ou de construction, une contribution pour fins de parcs sous forme de terrain, de servitude ou de somme, qui « ne doivent pas excéder 10 \% de la superficie et de la valeur, respectivement, du site » \parencite[art.~117.1, 117.2 et 117.4 al.~1]{lau} ; ces dispositions ont été modifiées en 2023 \parencite{loi2023c12}, et la Cour suprême a jugé en 2025 qu'une cession de terrains excédant ce que la municipalité pouvait exiger s'analyse comme une réserve ouvrant droit à une indemnité égale à la valeur marchande \parencite{laroda2025}. L'exemple de lotissement de la \cref{sec:25:lotissement} cède exactement 10 \% de la superficie du site. En matière d'inondations, le cadre en vigueur depuis le 1\ier{} mars 2026 classe l'exposition en quatre classes d'intensité et interdit toute nouvelle résidence dans le littoral, la rive et les classes très élevée, élevée et modérée, ne l'admettant sous conditions qu'en classe faible \parencite{zonesInond2026,inondcartes} ; un terrain vacant situé dans l'une des classes prohibées n'a plus de valeur résidentielle, et l'évaluateur vérifie la carte en vigueur pour chaque terrain riverain avant toute comparaison. Enfin, en zone agricole, nul ne peut utiliser un lot à une fin autre que l'agriculture, ni le lotir, sans l'autorisation de la Commission de protection du territoire agricole \parencite[art.~26, 28 et 29]{lptaa}, sous réserve des droits acquis des articles 101 à 105 ; la valeur d'un lot agricole dont l'usage résidentiel est espéré est une espérance pondérée par la probabilité d'autorisation, que le \cref{ch:08} a formalisée. Les ventes de terrains de Gatineau peuvent être croisées avec les couches de zonage et de zones inondables que la Ville diffuse en données ouvertes \parencite{gatzonage}. | ||
| 216 | \end{quebec} | 216 | \end{quebec} | ||
| 217 | 217 | ||||
modified
manuscript/chapters/ch27.tex
+1 −1
@@ -378,7 +378,7 @@ Pour le cas~3, avec $\gamma = \pct{4}$ et le taux global médian de \pct{4.415} | |||||
| 378 | \caption{Cas~3 : sensibilité du revenu brut effectif, du revenu net d'exploitation normalisé et de la valeur par capitalisation directe ($R = \pct{4.415}$) à la provision pour inoccupation et pertes $v$ ; dollars courants.} | 378 | \caption{Cas~3 : sensibilité du revenu brut effectif, du revenu net d'exploitation normalisé et de la valeur par capitalisation directe ($R = \pct{4.415}$) à la provision pour inoccupation et pertes $v$ ; dollars courants.} | ||
| 379 | \label{tab:27:sensibilite} | 379 | \label{tab:27:sensibilite} | ||
| 380 | \centering | 380 | \centering | ||
| 381 | −\begin{tabular}{S[table-format=1.1] S[table-format=5.2] S[table-format=6.2] S[table-format=5.2] S[table-format=7.0] S[table-format=+1.2]} | 381 | +\begin{tabular}{S[table-format=1.1] S[table-format=5.2] S[table-format=6.2] S[table-format=5.2] S[table-format=7.0] S[table-format=+1.2, retain-explicit-plus]} | ||
| 382 | \toprule | 382 | \toprule | ||
| 383 | {$v$ (\%)} & {Provision (\$)} & {RBE (\$)} & {$\NOI_1$ (\$)} & {Valeur (\$)} & {Écart (\%)} \\ | 383 | {$v$ (\%)} & {Provision (\$)} & {RBE (\$)} & {$\NOI_1$ (\$)} & {Valeur (\$)} & {Écart (\%)} \\ | ||
| 384 | \midrule | 384 | \midrule | ||
modified
manuscript/chapters/ch31.tex
+6 −6
@@ -138,7 +138,7 @@ Laquelle des deux contraintes lie dépend de la relation entre le taux de capita | |||||
| 138 | \begin{equation}\label{eq:31:rpv-max} | 138 | \begin{equation}\label{eq:31:rpv-max} | ||
| 139 | \frac{M_{\max}^{\DSCR}}{V_0} = \frac{\NOI_1/V_0}{\DSCR_{\min}\, f} = \frac{R}{\DSCR_{\min}\, f} , | 139 | \frac{M_{\max}^{\DSCR}}{V_0} = \frac{\NOI_1/V_0}{\DSCR_{\min}\, f} = \frac{R}{\DSCR_{\min}\, f} , | ||
| 140 | \end{equation} | 140 | \end{equation} | ||
| 141 | −où $R$ est le taux de capitalisation \emph{sur le prix payé}. La couverture lie dès que $R < \DSCR_{\min}\, f\, \LTV_{\max}$. Avec $\DSCR_{\min} = 1{,}20$, $\LTV_{\max} = \pct{75}$ et $f = \pct{5.079}$, le seuil est $R = \pct{4.571}$, exactement la formule de couverture du \cref{ch:29}. Tout immeuble multirésidentiel montréalais dont le taux de capitalisation est inférieur à ce seuil, c'est-à-dire la plupart en 2026, ne peut être financé à \pct{75} par un prêt conventionnel à quarante ans ; la section~\ref{sec:31:pret-max} chiffre la conséquence pour le cas 3. | 141 | +où $R$ est le taux de capitalisation \emph{sur le prix payé}. La couverture lie dès que $R$ est inférieur au produit $\DSCR_{\min} f \LTV_{\max}$. Avec un seuil de $1{,}20$, un ratio prêt-valeur maximal de \pct{75} et $f = \pct{5.079}$, ce produit vaut \pct{4.571}, exactement la formule de couverture du \cref{ch:29}. Tout immeuble multirésidentiel montréalais dont le taux de capitalisation est inférieur à ce seuil, c'est-à-dire la plupart en 2026, ne peut être financé à \pct{75} par un prêt conventionnel à quarante ans ; la section~\ref{sec:31:pret-max} chiffre la conséquence pour le cas 3. | ||
| 142 | 142 | ||||
| 143 | \begin{definition}{Ratio de couverture de la dette}{31:rcd} | 143 | \begin{definition}{Ratio de couverture de la dette}{31:rcd} | ||
| 144 | Le ratio de couverture de la dette est le rapport du revenu net d'exploitation prospectif de la première année au service de la dette annuel, intérêts et capital compris, du ou des prêts garantis par l'immeuble. Un ratio de $1{,}20$ signifie que le revenu net excède de \pct{20} le service de la dette, ou que le revenu net pourrait baisser de $1 - 1/1{,}20 = \pct{16.7}$ avant que l'immeuble cesse de payer sa dette. Le revenu net retenu est celui des conventions du \cref{ch:28}, réserve de remplacement comprise ; un prêteur qui calcule son ratio sur un revenu net \emph{avant} réserve obtient un ratio plus élevé, et l'évaluateur doit signaler la convention employée. | 144 | Le ratio de couverture de la dette est le rapport du revenu net d'exploitation prospectif de la première année au service de la dette annuel, intérêts et capital compris, du ou des prêts garantis par l'immeuble. Un ratio de $1{,}20$ signifie que le revenu net excède de \pct{20} le service de la dette, ou que le revenu net pourrait baisser de $1 - 1/1{,}20 = \pct{16.7}$ avant que l'immeuble cesse de payer sa dette. Le revenu net retenu est celui des conventions du \cref{ch:28}, réserve de remplacement comprise ; un prêteur qui calcule son ratio sur un revenu net \emph{avant} réserve obtient un ratio plus élevé, et l'évaluateur doit signaler la convention employée. | ||
@@ -202,13 +202,13 @@ Le \cref{tab:31:taux-bdc} rassemble les taux publics qui ancrent les calculs de | |||||
| 202 | \toprule | 202 | \toprule | ||
| 203 | Taux & {(\%)} & Date & Série ou source \\ | 203 | Taux & {(\%)} & Date & Série ou source \\ | ||
| 204 | \midrule | 204 | \midrule | ||
| 205 | −Taux cible du financement à un jour & 2.50 & 2026-10-28 & V39079 ; communiqué du 28 octobre 2026 \\ | 205 | +Taux cible du financement à un jour & 2.50 & 2026-10-28 & V39079 ; communiqué BdC \\ | ||
| 206 | Obligation de référence GdC 5 ans & 3.58 & 2026-10-29 & BD.CDN.5YR.DQ.YLD \\ | 206 | Obligation de référence GdC 5 ans & 3.58 & 2026-10-29 & BD.CDN.5YR.DQ.YLD \\ | ||
| 207 | Obligation de référence GdC 10 ans & 3.84 & 2026-10-29 & BD.CDN.10YR.DQ.YLD \\ | 207 | Obligation de référence GdC 10 ans & 3.84 & 2026-10-29 & BD.CDN.10YR.DQ.YLD \\ | ||
| 208 | Hypothèque conventionnelle 5 ans, taux affiché & 6.19 & 2026-10-28 & V80691335 (hebdomadaire) \\ | 208 | Hypothèque conventionnelle 5 ans, taux affiché & 6.19 & 2026-10-28 & V80691335 (hebdomadaire) \\ | ||
| 209 | Fonds avancés, assurés, fixe 5 ans et plus & 4.12 & 2026-08 & V122667780 (mensuel) \\ | 209 | Fonds avancés, assurés, fixe 5 ans et plus & 4.12 & 2026-08 & V122667780 (mensuel) \\ | ||
| 210 | Fonds avancés, non assurés, fixe 5 ans et plus & 4.58 & 2026-08 & V122667786 (mensuel) \\ | 210 | Fonds avancés, non assurés, fixe 5 ans et plus & 4.58 & 2026-08 & V122667786 (mensuel) \\ | ||
| 211 | −Taux admissible minimal sur un contrat à \pct{4.58} & 6.58 & 2026-01-29 & BSIF, $\max(i + 2\,\%,\ 5{,}25\,\%)$ \\ | 211 | +Taux admissible minimal, contrat à \pct{4.58} & 6.58 & 2026-01-29 & BSIF, $\max(i + 2\,\%,\ 5{,}25\,\%)$ \\ | ||
| 212 | \bottomrule | 212 | \bottomrule | ||
| 213 | \end{tabular} | 213 | \end{tabular} | ||
| 214 | \tabsource{\textcite{bdc20261028,bdcvalet,bdctauxhypothecaires2026,osfiMqr} ; fichiers \texttt{data/raw/bdc\_valet/} téléchargés le 2026-10-31. Les taux hypothécaires sont des taux nominaux annuels ; la Banque du Canada ne précise pas la convention de composition des taux des fonds avancés, que l'ouvrage traite comme semestrielle.} | 214 | \tabsource{\textcite{bdc20261028,bdcvalet,bdctauxhypothecaires2026,osfiMqr} ; fichiers \texttt{data/raw/bdc\_valet/} téléchargés le 2026-10-31. Les taux hypothécaires sont des taux nominaux annuels ; la Banque du Canada ne précise pas la convention de composition des taux des fonds avancés, que l'ouvrage traite comme semestrielle.} | ||
@@ -370,12 +370,12 @@ $+300$ points de base & 7.12 & 0.0747 & 110279 & 0.816 & 1003298 & 45.4 \\ | |||||
| 370 | Le \cref{tab:31:aph} applique au cas 3, sur la même valeur DCF et au même taux de \pct{4.12}, les conditions d'APH Select à 50, 70 et 100 points : ratio de couverture de $1{,}10$, ratio prêt-valeur maximal de \pct{85} et amortissement de 40, 45 ou 50 ans. La couverture lie encore : le service de la dette maximal passe de \dollars{74963} à $89\,956/1{,}10 = \dollars{81778}$, et le prêt à \dollars{1610138} sur 40 ans (\pct{72.9} de la valeur), \dollars{1682397} sur 45 ans (\pct{76.2}) et \dollars{1741328} sur 50 ans (\pct{78.8}). La mise de fonds tombe de \dollars{732606} à \dollars{467238} dans la formule la plus généreuse, soit une économie de \dollars{265000} de fonds propres ; en contrepartie, la prime d'assurance, de \pct{4.10} du prêt sur 40 ans (\pct{3.35} pour la tranche de ratio prêt-valeur jusqu'à \pct{75}, plus trois surprimes de \pct{0.25}), de \pct{5.35} sur 45 ans et de \pct{5.60} sur 50 ans, coûte de \dollars{66016} à \dollars{97514}, à quoi s'ajoutent les droits de demande et les engagements d'abordabilité ou de performance énergétique qui conditionnent les points. Si la prime est capitalisée au prêt, le service de la dette augmente d'autant et la couverture effective descend sous $1{,}10$. Le \cref{ch:47} reprend ce calcul sur la valeur finale réconciliée du dossier, ce qui en modifie les montants sans en changer la lecture : l'assurance déplace le financement du multirésidentiel vers des ratios qu'aucun prêteur conventionnel n'accepterait, à un coût explicite et sous des conditions que l'évaluateur ne doit pas prêter à l'acheteur typique. | 370 | Le \cref{tab:31:aph} applique au cas 3, sur la même valeur DCF et au même taux de \pct{4.12}, les conditions d'APH Select à 50, 70 et 100 points : ratio de couverture de $1{,}10$, ratio prêt-valeur maximal de \pct{85} et amortissement de 40, 45 ou 50 ans. La couverture lie encore : le service de la dette maximal passe de \dollars{74963} à $89\,956/1{,}10 = \dollars{81778}$, et le prêt à \dollars{1610138} sur 40 ans (\pct{72.9} de la valeur), \dollars{1682397} sur 45 ans (\pct{76.2}) et \dollars{1741328} sur 50 ans (\pct{78.8}). La mise de fonds tombe de \dollars{732606} à \dollars{467238} dans la formule la plus généreuse, soit une économie de \dollars{265000} de fonds propres ; en contrepartie, la prime d'assurance, de \pct{4.10} du prêt sur 40 ans (\pct{3.35} pour la tranche de ratio prêt-valeur jusqu'à \pct{75}, plus trois surprimes de \pct{0.25}), de \pct{5.35} sur 45 ans et de \pct{5.60} sur 50 ans, coûte de \dollars{66016} à \dollars{97514}, à quoi s'ajoutent les droits de demande et les engagements d'abordabilité ou de performance énergétique qui conditionnent les points. Si la prime est capitalisée au prêt, le service de la dette augmente d'autant et la couverture effective descend sous $1{,}10$. Le \cref{ch:47} reprend ce calcul sur la valeur finale réconciliée du dossier, ce qui en modifie les montants sans en changer la lecture : l'assurance déplace le financement du multirésidentiel vers des ratios qu'aucun prêteur conventionnel n'accepterait, à un coût explicite et sous des conditions que l'évaluateur ne doit pas prêter à l'acheteur typique. | ||
| 371 | 371 | ||||
| 372 | \begin{table}[htbp] | 372 | \begin{table}[htbp] | ||
| 373 | −\centering\small\setlength{\tabcolsep}{4pt} | 373 | +\centering\footnotesize\setlength{\tabcolsep}{3pt} | ||
| 374 | \caption{Variante APH Select pour le cas 3 sur la valeur DCF (\dollars{2208566}), taux \pct{4.12}, RCD minimal $1{,}10$, RPV maximal \pct{85} : prêt, ratio prêt-valeur, mise de fonds et prime d'assurance selon l'amortissement.} | 374 | \caption{Variante APH Select pour le cas 3 sur la valeur DCF (\dollars{2208566}), taux \pct{4.12}, RCD minimal $1{,}10$, RPV maximal \pct{85} : prêt, ratio prêt-valeur, mise de fonds et prime d'assurance selon l'amortissement.} | ||
| 375 | \label{tab:31:aph} | 375 | \label{tab:31:aph} | ||
| 376 | \begin{tabular}{@{}l S[table-format=7.0] S[table-format=2.1] S[table-format=5.0] S[table-format=6.0] S[table-format=1.2] S[table-format=5.0]@{}} | 376 | \begin{tabular}{@{}l S[table-format=7.0] S[table-format=2.1] S[table-format=5.0] S[table-format=6.0] S[table-format=1.2] S[table-format=5.0]@{}} | ||
| 377 | \toprule | 377 | \toprule | ||
| 378 | −Formule & {Prêt (\$)} & {RPV (\%)} & {Serv. dette (\$)} & {Mise de fonds (\$)} & {Prime (\%)} & {Prime (\$)} \\ | 378 | +Formule & {Prêt (\$)} & {RPV (\%)} & {Serv. dette (\$)} & {Mise (\$)} & {Prime (\%)} & {Prime (\$)} \\ | ||
| 379 | \midrule | 379 | \midrule | ||
| 380 | Conventionnel 40 ans (RPV 75 \%, RCD 1,20) & 1475959 & 66.8 & 74963 & 732606 & {—} & {—} \\ | 380 | Conventionnel 40 ans (RPV 75 \%, RCD 1,20) & 1475959 & 66.8 & 74963 & 732606 & {—} & {—} \\ | ||
| 381 | APH Select 50 points, 40 ans & 1610138 & 72.9 & 81778 & 598428 & 4.10 & 66016 \\ | 381 | APH Select 50 points, 40 ans & 1610138 & 72.9 & 81778 & 598428 & 4.10 & 66016 \\ | ||
@@ -404,7 +404,7 @@ Dans le cas 3, le solde à la fin du terme de cinq ans est de \dollars{1394739} | |||||
| 404 | \centering\footnotesize\setlength{\tabcolsep}{4pt} | 404 | \centering\footnotesize\setlength{\tabcolsep}{4pt} | ||
| 405 | \caption{Renouvellement exact du prêt du cas 3 à l'échéance du terme (solde \dollars{1394739}, amortissement résiduel 420 mois) selon le taux renouvelé, et comparaison avec l'approximation du \cref{ch:30} (taux majoré appliqué dès l'origine) ; achat à la valeur DCF, revenus projetés de base.} | 405 | \caption{Renouvellement exact du prêt du cas 3 à l'échéance du terme (solde \dollars{1394739}, amortissement résiduel 420 mois) selon le taux renouvelé, et comparaison avec l'approximation du \cref{ch:30} (taux majoré appliqué dès l'origine) ; achat à la valeur DCF, revenus projetés de base.} | ||
| 406 | \label{tab:31:renouvellement} | 406 | \label{tab:31:renouvellement} | ||
| 407 | −\begin{tabular}{@{}l S[table-format=1.2] S[table-format=1.2] S[table-format=1.2] S[table-format=1.2]@{}} | 407 | +\begin{tabular}{@{}l S[table-format=7.2] S[table-format=7.2] S[table-format=7.2] S[table-format=7.2]@{}} | ||
| 408 | \toprule | 408 | \toprule | ||
| 409 | & {Inchangé} & {$+100$ pb} & {$+200$ pb} & {$+300$ pb} \\ | 409 | & {Inchangé} & {$+100$ pb} & {$+200$ pb} & {$+300$ pb} \\ | ||
| 410 | \midrule | 410 | \midrule | ||
modified
manuscript/chapters/ch32.tex
+38 −37
@@ -107,15 +107,15 @@ Un point reste volontairement ouvert. Les prêteurs tiennent compte d'une partie | |||||
| 107 | \caption{Règles du financement résidentiel d'un plex de un à quatre logements retenues dans ce chapitre (état au 31 octobre 2026)}\label{tab:32:regles} | 107 | \caption{Règles du financement résidentiel d'un plex de un à quatre logements retenues dans ce chapitre (état au 31 octobre 2026)}\label{tab:32:regles} | ||
| 108 | \centering | 108 | \centering | ||
| 109 | \small | 109 | \small | ||
| 110 | −\begin{tabularx}{\textwidth}{lYl} | 110 | +\begin{tabularx}{\textwidth}{L{33mm}YL{40mm}} | ||
| 111 | \toprule | 111 | \toprule | ||
| 112 | Règle & Contenu & Source (date) \\ | 112 | Règle & Contenu & Source (date) \\ | ||
| 113 | \midrule | 113 | \midrule | ||
| 114 | −Plafond du prix assurable & \dollars{1500000} & Finances Canada, en vigueur le 2024-12-15 \parencite{fincan2024hypo} \\ | 114 | +Plafond du prix assurable & \dollars{1500000} & Finances Canada, en vigueur le 15 déc. 2024 \parencite{fincan2024hypo} \\ | ||
| 115 | Mise de fonds minimale (assuré) & 5~\% jusqu'à \dollars{500000} ; 10~\% de \dollars{500000} à \dollars{1500000} & idem \\ | 115 | Mise de fonds minimale (assuré) & 5~\% jusqu'à \dollars{500000} ; 10~\% de \dollars{500000} à \dollars{1500000} & idem \\ | ||
| 116 | Amortissement maximal (assuré) & 25 ans ; 30 ans pour les premiers acheteurs et les constructions neuves & idem \\ | 116 | Amortissement maximal (assuré) & 25 ans ; 30 ans pour les premiers acheteurs et les constructions neuves & idem \\ | ||
| 117 | −Taux admissible minimal (non assuré) & $\max(i + 2~\%,\ 5{,}25~\%)$, revu au moins une fois l'an & BSIF, page modifiée le 2026-01-29 \parencite{osfiMqr} \\ | 117 | +Taux admissible minimal (non assuré) & $\max(i + 2~\%,\ 5{,}25~\%)$, revu au moins une fois l'an & BSIF, page du 29 janv. 2026 \parencite{osfiMqr} \\ | ||
| 118 | −Limite prêt-revenu (non assuré) & limite de volume des prêts dépassant 4,5 fois le revenu, propre à chaque institution & BSIF, en vigueur depuis l'exercice 2025 \parencite{osfilti2025} \\ | 118 | +Limite prêt-revenu (non assuré) & limite de volume des prêts dépassant 4,5 fois le revenu, propre à chaque institution & BSIF, depuis l'exercice 2025 \parencite{osfilti2025} \\ | ||
| 119 | Évaluation de la garantie & réaliste, étayée, défendable ; évaluateur indépendant du crédit & BSIF, B-20, principe 4 \parencite{osfib20} \\ | 119 | Évaluation de la garantie & réaliste, étayée, défendable ; évaluateur indépendant du crédit & BSIF, B-20, principe 4 \parencite{osfib20} \\ | ||
| 120 | Composition des intérêts & semestrielle, non à l'avance & Loi sur l'intérêt, art.~6 \parencite{loiInteret} \\ | 120 | Composition des intérêts & semestrielle, non à l'avance & Loi sur l'intérêt, art.~6 \parencite{loiInteret} \\ | ||
| 121 | Taux des fonds avancés (août 2026) & assuré fixe $\geq$ 5 ans : \pct{4.12} ; non assuré : \pct{4.58} ; affiché 5 ans : \pct{6.19} & Banque du Canada \parencite{bdctauxhypothecaires2026} \\ | 121 | Taux des fonds avancés (août 2026) & assuré fixe $\geq$ 5 ans : \pct{4.12} ; non assuré : \pct{4.58} ; affiché 5 ans : \pct{6.19} & Banque du Canada \parencite{bdctauxhypothecaires2026} \\ | ||
@@ -247,7 +247,7 @@ Le \cref{tab:32:rne} reconstitue le revenu net du sujet avec les conventions de | |||||
| 247 | \caption{Cas~2 : du revenu brut potentiel au revenu net d'exploitation normalisé de la première année (dollars courants, exercice du 1\textsuperscript{er} septembre 2026 au 31 août 2027)}\label{tab:32:rne} | 247 | \caption{Cas~2 : du revenu brut potentiel au revenu net d'exploitation normalisé de la première année (dollars courants, exercice du 1\textsuperscript{er} septembre 2026 au 31 août 2027)}\label{tab:32:rne} | ||
| 248 | \centering | 248 | \centering | ||
| 249 | \small | 249 | \small | ||
| 250 | −\begin{tabular}{L{62mm} S[table-format=5.2] L{48mm}} | 250 | +\begin{tabular}{L{58mm} S[table-format=5.2] L{44mm}} | ||
| 251 | \toprule | 251 | \toprule | ||
| 252 | {Poste} & {Montant (\$)} & {Base} \\ | 252 | {Poste} & {Montant (\$)} & {Base} \\ | ||
| 253 | \midrule | 253 | \midrule | ||
@@ -288,7 +288,7 @@ supérieure de cinq pour cent à l'indication brute. Le même raisonnement appli | |||||
| 288 | 288 | ||||
| 289 | \subsection{La sélection des comparables triplex de Limoilou} | 289 | \subsection{La sélection des comparables triplex de Limoilou} | ||
| 290 | 290 | ||||
| 291 | −Parmi les 127 ventes, vingt-huit sont des triplex de Limoilou. La fonction \texttt{traite.comparables.distance\_attributs} les classe par ressemblance avec le sujet selon la distance | 291 | +Parmi les 127 ventes, vingt-huit sont des triplex de Limoilou. La fonction \texttt{distance\_attributs} du module \texttt{traite.comparables} les classe par ressemblance avec le sujet selon la distance | ||
| 292 | \begin{equation}\label{eq:32:distance} | 292 | \begin{equation}\label{eq:32:distance} | ||
| 293 | d_j = \sqrt{\sum_{k} \omega_k \left(\frac{x_{jk} - x_{sk}}{e_k}\right)^{2}}, | 293 | d_j = \sqrt{\sum_{k} \omega_k \left(\frac{x_{jk} - x_{sk}}{e_k}\right)^{2}}, | ||
| 294 | \end{equation} | 294 | \end{equation} | ||
@@ -297,7 +297,7 @@ avec six caractéristiques : la superficie habitable (échelle \msq{30}, poids 1 | |||||
| 297 | \begin{table}[htbp] | 297 | \begin{table}[htbp] | ||
| 298 | \caption{Le sujet et les cinq comparables triplex de Limoilou retenus par la distance d'attributs (données synthétiques)}\label{tab:32:comparables} | 298 | \caption{Le sujet et les cinq comparables triplex de Limoilou retenus par la distance d'attributs (données synthétiques)}\label{tab:32:comparables} | ||
| 299 | \centering | 299 | \centering | ||
| 300 | −\footnotesize\setlength{\tabcolsep}{3.5pt} | 300 | +\footnotesize\setlength{\tabcolsep}{2.4pt} | ||
| 301 | \begin{tabular}{lcccccc} | 301 | \begin{tabular}{lcccccc} | ||
| 302 | \toprule | 302 | \toprule | ||
| 303 | & Sujet & Q0187 & Q0222 & Q0243 & Q0207 & Q0235 \\ | 303 | & Sujet & Q0187 & Q0222 & Q0243 & Q0207 & Q0235 \\ | ||
@@ -308,8 +308,8 @@ Superficie habitable (m\textsuperscript{2}) & 262 & 243 & 286 & 247 & 269 & 275 | |||||
| 308 | Année de construction & 1948 & 1950 & 1934 & 1930 & 1957 & 1923 \\ | 308 | Année de construction & 1948 & 1950 & 1934 & 1930 & 1957 & 1923 \\ | ||
| 309 | État (1--5) & 3 & 3 & 4 & 3 & 2 & 1 \\ | 309 | État (1--5) & 3 & 3 & 4 & 3 & 2 & 1 \\ | ||
| 310 | Stationnement (cases) & 1 & 1 & 1 & 1 & 1 & 1 \\ | 310 | Stationnement (cases) & 1 & 1 & 1 & 1 & 1 & 1 \\ | ||
| 311 | −Loyer mensuel moyen, contrat (\$) & 1 162 & 1 053 & 1 092 & 1 286 & 1 146 & 1 214 \\ | 311 | +Loyer moyen, contrat (\$/mois) & 1 162 & 1 053 & 1 092 & 1 286 & 1 146 & 1 214 \\ | ||
| 312 | −Loyer mensuel moyen, marché estimé (\$) & 1 370 & 1 173 & 1 187 & 1 352 & 1 197 & 1 327 \\ | 312 | +Loyer moyen, marché estimé (\$/mois) & 1 370 & 1 173 & 1 187 & 1 352 & 1 197 & 1 327 \\ | ||
| 313 | Loyer relatif $\rho$ & 0,848 & 0,898 & 0,920 & 0,951 & 0,957 & 0,915 \\ | 313 | Loyer relatif $\rho$ & 0,848 & 0,898 & 0,920 & 0,951 & 0,957 & 0,915 \\ | ||
| 314 | Revenu brut potentiel (\$) & 41 832 & 37 925 & 39 322 & 46 306 & 41 263 & 43 705 \\ | 314 | Revenu brut potentiel (\$) & 41 832 & 37 925 & 39 322 & 46 306 & 41 263 & 43 705 \\ | ||
| 315 | Ratio de dépenses & 0,457 & 0,368 & 0,373 & 0,323 & 0,302 & 0,421 \\ | 315 | Ratio de dépenses & 0,457 & 0,368 & 0,373 & 0,323 & 0,302 & 0,421 \\ | ||
@@ -317,7 +317,7 @@ Distance d'attributs $d_j$ & --- & 2,13 & 2,51 & 2,87 & 3,09 & 3,15 \\ | |||||
| 317 | \midrule | 317 | \midrule | ||
| 318 | Prix de vente (\$) & --- & 787 000 & 918 000 & 1 023 000 & 910 000 & 922 000 \\ | 318 | Prix de vente (\$) & --- & 787 000 & 918 000 & 1 023 000 & 910 000 & 922 000 \\ | ||
| 319 | Prix par logement (\$) & --- & 262 333 & 306 000 & 341 000 & 303 333 & 307 333 \\ | 319 | Prix par logement (\$) & --- & 262 333 & 306 000 & 341 000 & 303 333 & 307 333 \\ | ||
| 320 | −Prix par m\textsuperscript{2} habitable (\$/m\textsuperscript{2}) & --- & 3 239 & 3 210 & 4 142 & 3 383 & 3 353 \\ | 320 | +Prix au m\textsuperscript{2} (\$/m\textsuperscript{2}) & --- & 3 239 & 3 210 & 4 142 & 3 383 & 3 353 \\ | ||
| 321 | Multiplicateur du revenu brut & --- & 20,75 & 23,35 & 22,09 & 22,05 & 21,10 \\ | 321 | Multiplicateur du revenu brut & --- & 20,75 & 23,35 & 22,09 & 22,05 & 21,10 \\ | ||
| 322 | Taux global extrait (\%) & --- & 2,97 & 2,62 & 2,99 & 3,09 & 2,68 \\ | 322 | Taux global extrait (\%) & --- & 2,97 & 2,62 & 2,99 & 3,09 & 2,68 \\ | ||
| 323 | \bottomrule | 323 | \bottomrule | ||
@@ -334,22 +334,21 @@ Le \cref{tab:32:indications} rassemble les indications. À partir des cinq compa | |||||
| 334 | \begin{table}[htbp] | 334 | \begin{table}[htbp] | ||
| 335 | \caption{Cas~2 : indications de valeur du triplex selon l'indicateur et l'échantillon, et pondération retenue}\label{tab:32:indications} | 335 | \caption{Cas~2 : indications de valeur du triplex selon l'indicateur et l'échantillon, et pondération retenue}\label{tab:32:indications} | ||
| 336 | \centering | 336 | \centering | ||
| 337 | −\small | 337 | +\footnotesize\setlength{\tabcolsep}{4pt} | ||
| 338 | −\begin{tabular}{l S[table-format=6.0] S[table-format=6.0] S[table-format=6.0] l} | 338 | +\begin{tabular}{L{40mm} S[table-format=6.0] S[table-format=6.0] S[table-format=6.0] L{30mm}} | ||
| 339 | \toprule | 339 | \toprule | ||
| 340 | −{Indicateur} & {127 ventes, brut (\$)} & {127 ventes, ajusté $\rho$ (\$)} & {5 comparables (\$)} & {Retenu pour la pondération} \\ | 340 | +{Indicateur} & {127 ventes, brut (\$)} & {127 ventes, ajusté (\$)} & {5 comparables (\$)} & {Retenu (poids)} \\ | ||
| 341 | \midrule | 341 | \midrule | ||
| 342 | −Prix par logement $\times$ 3 & 843000 & {900926\textsuperscript{a}} & 918000 & comparables, poids 0,40 \\ | 342 | +Prix par logement $\times$ 3 & 843000 & {900926\textsuperscript{a}} & 918000 & comparables (0,40) \\ | ||
| 343 | −Multiplicateur $\times$ RBP contractuel & 829110 & 888878 & 922396 & comparables, poids 0,35 \\ | 343 | +Multiplicateur $\times$ RBP contractuel & 829110 & 888878 & 922396 & comparables (0,35) \\ | ||
| 344 | −Capitalisation du $\NOI_1$ & 695078 & 729549 & 741884 & ajusté $\rho$, poids 0,25 \\ | 344 | +Capitalisation du $\NOI_1$ & 695078 & 729549 & 741884 & ajusté $\rho$ (0,25) \\ | ||
| 345 | −Prix au m\textsuperscript{2} $\times$ 262 m\textsuperscript{2} & 838400 & {---} & 878415 & contrôle, poids 0 \\ | 345 | +Prix au m\textsuperscript{2} $\times$ 262 m\textsuperscript{2} & 838400 & {---} & 878415 & contrôle (0) \\ | ||
| 346 | \midrule | 346 | \midrule | ||
| 347 | −\multicolumn{4}{l}{Indication pondérée $0{,}40 \times 918\,000 + 0{,}35 \times 922\,396 + 0{,}25 \times 729\,549$} & \dollars{872426} \\ | 347 | +\multicolumn{5}{l}{Indication pondérée : $0{,}40 \times 918\,000 + 0{,}35 \times 922\,396 + 0{,}25 \times 729\,549 = \dollars{872426}$, arrondie à \dollars{870000}} \\ | ||
| 348 | −\multicolumn{4}{l}{Arrondie au \dollars{5000} près} & \dollars{870000} \\ | 348 | +\multicolumn{5}{l}{Ratios implicites : taux global \pct{2.53} ; multiplicateur \num{20.86} ; \dollars{290809} par logement ; \parmsq{3330}} \\ | ||
| 349 | −\multicolumn{4}{l}{Taux global implicite ; multiplicateur implicite ; prix par logement ; prix au m\textsuperscript{2}} & \pct{2.53} ; \num{20.86} ; \dollars{290809} ; \parmsq{3330} \\ | ||||
| 350 | \bottomrule | 349 | \bottomrule | ||
| 351 | \end{tabular} | 350 | \end{tabular} | ||
| 352 | −\tabsource{\synth{\texttt{analysis/python/cases/ch32\_plex.py}, fonction \texttt{indications} ; \textsuperscript{a}~indexation à la date d'évaluation au rythme de \pct{7.29} par an sur l'ancienneté médiane de 11,3 mois, non un ajustement de loyer relatif ; graine 20261031}} | 351 | +\tabsource{\synth{\texttt{analysis/python/cases/ch32\_plex.py}, fonction \texttt{indications} ; colonne « ajusté » : taux et multiplicateur ajustés au loyer relatif du sujet par régression ; \textsuperscript{a}~indexation à la date d'évaluation au rythme de \pct{7.29} par an sur l'ancienneté médiane de 11,3 mois, non un ajustement de loyer relatif ; graine 20261031}} | ||
| 353 | \end{table} | 352 | \end{table} | ||
| 354 | 353 | ||||
| 355 | L'écart entre l'indication par capitalisation (\dollars{729549}) et celle par le prix par logement (\dollars{918000}) est de \pct{20.5}, et il faut l'expliquer avant de pondérer. La cause principale est la structure de dépenses du sujet. Le taux ajusté de \pct{3.02} a été extrait de ventes dont le ratio de dépenses médian est de \pct{35.7} ; appliqué au revenu net du sujet, dont le ratio est de \pct{45.7}, il « pénalise » le sujet pour ses coûts fixes élevés, sa gestion imputée et sa réserve, alors que les acheteurs du marché ne les comptent pas de cette façon. Si l'on recalcule le revenu net du sujet avec le ratio médian des ventes, soit \dollars{26091}, la capitalisation au même taux donne \dollars{863880}, à six pour cent des indications par comparaison : les deux tiers de l'écart viennent de là. Le reste tient au temps et au lieu : les comparables sont des triplex de Limoilou vendus au cours des neuf derniers mois, alors que le taux a été estimé sur quatre quartiers et vingt-quatre mois. L'indication par capitalisation n'est pas fausse ; elle dit ce que vaudrait le sujet pour un acheteur qui raisonnerait sur son revenu net normalisé au taux d'un marché d'occupants. C'est précisément parce que l'acheteur probable du sujet ne raisonne pas ainsi que son poids est limité à 25~\%. | 354 | L'écart entre l'indication par capitalisation (\dollars{729549}) et celle par le prix par logement (\dollars{918000}) est de \pct{20.5}, et il faut l'expliquer avant de pondérer. La cause principale est la structure de dépenses du sujet. Le taux ajusté de \pct{3.02} a été extrait de ventes dont le ratio de dépenses médian est de \pct{35.7} ; appliqué au revenu net du sujet, dont le ratio est de \pct{45.7}, il « pénalise » le sujet pour ses coûts fixes élevés, sa gestion imputée et sa réserve, alors que les acheteurs du marché ne les comptent pas de cette façon. Si l'on recalcule le revenu net du sujet avec le ratio médian des ventes, soit \dollars{26091}, la capitalisation au même taux donne \dollars{863880}, à six pour cent des indications par comparaison : les deux tiers de l'écart viennent de là. Le reste tient au temps et au lieu : les comparables sont des triplex de Limoilou vendus au cours des neuf derniers mois, alors que le taux a été estimé sur quatre quartiers et vingt-quatre mois. L'indication par capitalisation n'est pas fausse ; elle dit ce que vaudrait le sujet pour un acheteur qui raisonnerait sur son revenu net normalisé au taux d'un marché d'occupants. C'est précisément parce que l'acheteur probable du sujet ne raisonne pas ainsi que son poids est limité à 25~\%. | ||
@@ -372,14 +371,14 @@ Le \cref{tab:32:financement} décrit l'achat du triplex au prix arrondi de \doll | |||||
| 372 | \caption{Cas~2 : financement résidentiel assuré de l'acheteur-occupant au prix de \dollars{870000} et coût net d'occupation du logement du rez-de-chaussée (reprise à l'échéance du bail ; première année ; données synthétiques)}\label{tab:32:financement} | 371 | \caption{Cas~2 : financement résidentiel assuré de l'acheteur-occupant au prix de \dollars{870000} et coût net d'occupation du logement du rez-de-chaussée (reprise à l'échéance du bail ; première année ; données synthétiques)}\label{tab:32:financement} | ||
| 373 | \centering | 372 | \centering | ||
| 374 | \small | 373 | \small | ||
| 375 | −\begin{tabular}{L{78mm} S[table-format=6.2] L{40mm}} | 374 | +\begin{tabular}{L{70mm} S[table-format=6.2] L{34mm}} | ||
| 376 | \toprule | 375 | \toprule | ||
| 377 | {Élément} & {Montant (\$)} & {Base} \\ | 376 | {Élément} & {Montant (\$)} & {Base} \\ | ||
| 378 | \midrule | 377 | \midrule | ||
| 379 | Prix & 870000.00 & indication pondérée arrondie \\ | 378 | Prix & 870000.00 & indication pondérée arrondie \\ | ||
| 380 | Mise de fonds minimale assurée (\pct{7.1}) & 62000.00 & \eqref{eq:32:mise-de-fonds}, Finances Canada 2024 \\ | 379 | Mise de fonds minimale assurée (\pct{7.1}) & 62000.00 & \eqref{eq:32:mise-de-fonds}, Finances Canada 2024 \\ | ||
| 381 | Prêt (RPV \pct{92.9}, prime d'assurance exclue) & 808000.00 & \\ | 380 | Prêt (RPV \pct{92.9}, prime d'assurance exclue) & 808000.00 & \\ | ||
| 382 | −Versement mensuel à \pct{4.12}, 25 ans, composition semestrielle & 4302.97 & \eqref{eq:32:paiement} \\ | 381 | +Versement mensuel à \pct{4.12}, 25 ans, comp. semestrielle & 4302.97 & \eqref{eq:32:paiement} \\ | ||
| 383 | Service annuel de la dette ($\mathit{SD}$ ; constante \pct{6.39}) & 51635.62 & \\ | 382 | Service annuel de la dette ($\mathit{SD}$ ; constante \pct{6.39}) & 51635.62 & \\ | ||
| 384 | \quad\emph{dont intérêts de la première année} & {\emph{32 654,64}} & \\ | 383 | \quad\emph{dont intérêts de la première année} & {\emph{32 654,64}} & \\ | ||
| 385 | \quad\emph{dont capital remboursé la première année} & {\emph{18 980,98}} & \\ | 384 | \quad\emph{dont capital remboursé la première année} & {\emph{18 980,98}} & \\ | ||
@@ -387,7 +386,7 @@ Versement mensuel au taux admissible minimal (\pct{6.12}) & 5227.41 & test de r | |||||
| 387 | \midrule | 386 | \midrule | ||
| 388 | Dépenses d'exploitation supportées ($\mathit{DE}'$, hors gestion imputée) & 16920.00 & \cref{tab:32:rne} sans la gestion \\ | 387 | Dépenses d'exploitation supportées ($\mathit{DE}'$, hors gestion imputée) & 16920.00 & \cref{tab:32:rne} sans la gestion \\ | ||
| 389 | Coût d'opportunité de la mise de fonds (\pct{3.58}) & 2219.60 & obligation du GdC 5 ans, 2026-10-29 \\ | 388 | Coût d'opportunité de la mise de fonds (\pct{3.58}) & 2219.60 & obligation du GdC 5 ans, 2026-10-29 \\ | ||
| 390 | −Loyers des deux autres logements, nets de \pct{3} ($L_{-k}(1-v)$) & -28389.96 & $(1\,188 + 1\,251) \times 12 \times 0{,}97$ \\ | 389 | +Loyers des deux autres logements, nets de \pct{3} ($L_{-k}(1-v)$) & -28389.96 & $(1\,188 + 1\,251)\times 12 \times 0{,}97$ \\ | ||
| 391 | \textbf{Coût net d'occupation annuel} $C_{\text{occ}}$ & {\textbf{\num{42385.26}}} & \eqref{eq:32:cout-occupation} \\ | 390 | \textbf{Coût net d'occupation annuel} $C_{\text{occ}}$ & {\textbf{\num{42385.26}}} & \eqref{eq:32:cout-occupation} \\ | ||
| 392 | Coût net d'occupation mensuel & 3532.11 & \\ | 391 | Coût net d'occupation mensuel & 3532.11 & \\ | ||
| 393 | Capital remboursé, moyenne mensuelle des cinq premières années & -1719.02 & épargne, non un coût \\ | 392 | Capital remboursé, moyenne mensuelle des cinq premières années & -1719.02 & épargne, non un coût \\ | ||
@@ -407,11 +406,11 @@ Les indications de la \cref{sec:32:exemple} dépendent de quatre paramètres : l | |||||
| 407 | \begin{table}[htbp] | 406 | \begin{table}[htbp] | ||
| 408 | \caption{Cas~2 : sensibilité des indications de valeur au loyer relatif et au taux global, et du coût d'occupation au financement (données synthétiques)}\label{tab:32:sensibilite} | 407 | \caption{Cas~2 : sensibilité des indications de valeur au loyer relatif et au taux global, et du coût d'occupation au financement (données synthétiques)}\label{tab:32:sensibilite} | ||
| 409 | \centering | 408 | \centering | ||
| 410 | −\footnotesize\setlength{\tabcolsep}{4pt} | 409 | +\footnotesize\setlength{\tabcolsep}{3.5pt} | ||
| 411 | \begin{tabular}{l S[table-format=5.0] S[table-format=5.0] S[table-format=1.2] S[table-format=7.0] S[table-format=7.0] S[table-format=7.0]} | 410 | \begin{tabular}{l S[table-format=5.0] S[table-format=5.0] S[table-format=1.2] S[table-format=7.0] S[table-format=7.0] S[table-format=7.0]} | ||
| 412 | \toprule | 411 | \toprule | ||
| 413 | −\multicolumn{7}{l}{\emph{A. Niveau des loyers du sujet (toutes dépenses inchangées sauf la gestion imputée)}} \\ | 412 | +\multicolumn{7}{l}{\emph{A. Niveau des loyers du sujet (dépenses inchangées sauf la gestion imputée)}} \\ | ||
| 414 | −{$\rho$} & {RBP (\$)} & {$\NOI_1$ (\$)} & {Taux ajusté (\%)} & {Cap., taux ajusté (\$)} & {Cap., taux médian (\$)} & {MRB comp. $\times$ RBP (\$)} \\ | 413 | +{$\rho$} & {RBP (\$)} & {$\NOI_1$ (\$)} & {Taux aj. (\%)} & {Cap. aj. (\$)} & {Cap. méd. (\$)} & {MRB comp. (\$)} \\ | ||
| 415 | \midrule | 414 | \midrule | ||
| 416 | 0,85 (sujet) & 41932 & 22127 & 3.03 & 731244 & 698021 & 924605 \\ | 415 | 0,85 (sujet) & 41932 & 22127 & 3.03 & 731244 & 698021 & 924605 \\ | ||
| 417 | 0,90 & 44399 & 24424 & 3.17 & 771019 & 770478 & 978994 \\ | 416 | 0,90 & 44399 & 24424 & 3.17 & 771019 & 770478 & 978994 \\ | ||
@@ -419,25 +418,27 @@ Les indications de la \cref{sec:32:exemple} dépendent de quatre paramètres : l | |||||
| 419 | 1,00 (marché) & 49332 & 29018 & 3.45 & 840764 & 915393 & 1087771 \\ | 418 | 1,00 (marché) & 49332 & 29018 & 3.45 & 840764 & 915393 & 1087771 \\ | ||
| 420 | \midrule | 419 | \midrule | ||
| 421 | \multicolumn{7}{l}{\emph{B. Taux global appliqué au revenu net normalisé de \dollars{22034}}} \\ | 420 | \multicolumn{7}{l}{\emph{B. Taux global appliqué au revenu net normalisé de \dollars{22034}}} \\ | ||
| 422 | −\multicolumn{3}{l}{Taux (\%) : 2,50 \quad 2,75 \quad 3,00 \quad 3,25 \quad 3,50 \quad 3,75 \quad 4,00} & \multicolumn{4}{l}{Valeur (\$) : 881 358 \quad 801 235 \quad 734 465 \quad 677 968 \quad 629 542 \quad 587 572 \quad 550 849} \\ | 421 | +Taux (\%) & \multicolumn{1}{r}{2,50} & \multicolumn{1}{r}{2,75} & \multicolumn{1}{r}{3,00} & \multicolumn{1}{r}{3,25} & \multicolumn{1}{r}{3,50} & \multicolumn{1}{r}{3,75} \\ | ||
| 422 | +Valeur (\$) & \multicolumn{1}{r}{881 358} & \multicolumn{1}{r}{801 235} & \multicolumn{1}{r}{734 465} & \multicolumn{1}{r}{677 968} & \multicolumn{1}{r}{629 542} & \multicolumn{1}{r}{587 572} \\ | ||||
| 423 | \bottomrule | 423 | \bottomrule | ||
| 424 | \end{tabular} | 424 | \end{tabular} | ||
| 425 | 425 | ||||
| 426 | \medskip | 426 | \medskip | ||
| 427 | −\begin{tabular}{L{72mm} S[table-format=6.0] S[table-format=1.3] S[table-format=4.2] S[table-format=4.2] S[table-format=4.2]} | 427 | +\setlength{\tabcolsep}{3pt} | ||
| 428 | +\begin{tabular}{L{46mm} S[table-format=6.0] S[table-format=1.2] S[table-format=4.2] S[table-format=4.2] S[table-format=4.2]} | ||||
| 428 | \toprule | 429 | \toprule | ||
| 429 | \multicolumn{6}{l}{\emph{C. Financement de l'acheteur-occupant au prix de \dollars{870000} (reprise du rez-de-chaussée)}} \\ | 430 | \multicolumn{6}{l}{\emph{C. Financement de l'acheteur-occupant au prix de \dollars{870000} (reprise du rez-de-chaussée)}} \\ | ||
| 430 | −{Scénario} & {Mise de fonds (\$)} & {Taux} & {Versement (\$/mois)} & {Coût net (\$/mois)} & {Hors capital (\$/mois)} \\ | 431 | +{Scénario} & {Mise de fonds (\$)} & {Taux (\%)} & {Versement (\$/mois)} & {Coût net (\$/mois)} & {Hors capital (\$/mois)} \\ | ||
| 431 | \midrule | 432 | \midrule | ||
| 432 | −Assuré, mise de fonds minimale, 25 ans (référence) & 62000 & 0.0412 & 4302.97 & 3532.11 & 1813.08 \\ | 433 | +Assuré, mise minimale, 25 ans (référence) & 62000 & 4.12 & 4302.97 & 3532.11 & 1813.08 \\ | ||
| 433 | −Assuré, mise de fonds minimale, 30 ans (premier acheteur) & 62000 & 0.0412 & 3897.25 & 3126.39 & 1856.64 \\ | 434 | +Assuré, mise minimale, 30 ans (premier acheteur) & 62000 & 4.12 & 3897.25 & 3126.39 & 1856.64 \\ | ||
| 434 | −Assuré, mise de fonds de 10~\% & 87000 & 0.0412 & 4169.83 & 3473.55 & 1807.72 \\ | 435 | +Assuré, mise de fonds de 10~\% & 87000 & 4.12 & 4169.83 & 3473.55 & 1807.72 \\ | ||
| 435 | −Non assuré, mise de fonds de 20~\% & 174000 & 0.0458 & 3883.19 & 3446.46 & 2044.28 \\ | 436 | +Non assuré, mise de fonds de 20~\% & 174000 & 4.58 & 3883.19 & 3446.46 & 2044.28 \\ | ||
| 436 | −Assuré, mise de fonds minimale, taux $+100$~pb & 62000 & 0.0512 & 4754.72 & 3983.85 & 2458.56 \\ | 437 | +Assuré, mise minimale, taux $+100$~pb & 62000 & 5.12 & 4754.72 & 3983.85 & 2458.56 \\ | ||
| 437 | −Assuré, mise de fonds minimale, taux $+200$~pb & 62000 & 0.0612 & 5227.41 & 4456.55 & 3108.26 \\ | 438 | +Assuré, mise minimale, taux $+200$~pb & 62000 & 6.12 & 5227.41 & 4456.55 & 3108.26 \\ | ||
| 438 | \bottomrule | 439 | \bottomrule | ||
| 439 | \end{tabular} | 440 | \end{tabular} | ||
| 440 | −\tabsource{\synth{\texttt{analysis/python/cases/ch32\_plex.py}, fonction \texttt{sensibilite} ; panneau A : $\rho = 0{,}85$ arrondi, le sujet est à 0,848 ; panneau C : coût d'opportunité de la mise de fonds à \pct{3.58}, loyers des autres logements inchangés ; graine 20261031}} | 441 | +\tabsource{\synth{\texttt{analysis/python/cases/ch32\_plex.py}, fonction \texttt{sensibilite} ; panneau A : « Cap. aj. » = capitalisation au taux ajusté à $\rho$, « Cap. méd. » = capitalisation au taux médian des 127 ventes, « MRB comp. » = multiplicateur médian des cinq comparables $\times$ RBP ; $\rho = 0{,}85$ arrondi, le sujet est à 0,848 ; panneau C : coût d'opportunité de la mise de fonds à \pct{3.58}, loyers des autres logements inchangés ; graine 20261031}} | ||
| 441 | \end{table} | 442 | \end{table} | ||
| 442 | 443 | ||||
| 443 | \begin{figure}[htbp] | 444 | \begin{figure}[htbp] | ||
modified
manuscript/chapters/ch33.tex
+129 −0
@@ -330,3 +330,132 @@ Valeur au rôle (fin fiscale) & revenu au marché des loyers (art.~45.1 LFM) & c | |||||
| 330 | \end{table} | 330 | \end{table} | ||
| 331 | 331 | ||||
| 332 | Deux principes commandent ces pondérations. Le premier est la cohérence des conventions : un taux extrait de ventes dont le revenu net a été calculé après réserve ne s'applique qu'à un revenu net après réserve, et un prix par logement extrait d'immeubles chauffés par le propriétaire ne se compare qu'à des immeubles de même structure de dépenses ; la \cref{sec:29:coherence} l'a établi pour le revenu, l'\cref{eq:33:mrb-taux} le rappelle pour les unités. Le second est la correspondance entre la méthode et l'acheteur marginal : pour un immeuble de douze logements à Rosemont, l'acheteur est un investisseur privé qui raisonne en taux global et en prix par porte ; pour une tour de deux cents logements, c'est une institution qui raisonne en flux actualisés et en rendement interne ; pour un immeuble neuf, c'est un promoteur ou un prêteur qui compare le coût au revenu stabilisé. Pondérer, c'est choisir le raisonnement qui a réellement fixé le prix dans le marché du sujet. | 332 | Deux principes commandent ces pondérations. Le premier est la cohérence des conventions : un taux extrait de ventes dont le revenu net a été calculé après réserve ne s'applique qu'à un revenu net après réserve, et un prix par logement extrait d'immeubles chauffés par le propriétaire ne se compare qu'à des immeubles de même structure de dépenses ; la \cref{sec:29:coherence} l'a établi pour le revenu, l'\cref{eq:33:mrb-taux} le rappelle pour les unités. Le second est la correspondance entre la méthode et l'acheteur marginal : pour un immeuble de douze logements à Rosemont, l'acheteur est un investisseur privé qui raisonne en taux global et en prix par porte ; pour une tour de deux cents logements, c'est une institution qui raisonne en flux actualisés et en rendement interne ; pour un immeuble neuf, c'est un promoteur ou un prêteur qui compare le coût au revenu stabilisé. Pondérer, c'est choisir le raisonnement qui a réellement fixé le prix dans le marché du sujet. | ||
| 333 | + | ||||
| 334 | +\section{Exemple intégral : le cas 3 dans la fourchette du cas 4, et un trente-six logements à Gatineau}\label{sec:33:exemple} | ||||
| 335 | + | ||||
| 336 | +\begin{exemple}{Du douze logements montréalais au trente-six logements gatinois}{33:p45} | ||||
| 337 | +L'exemple se déroule en deux temps. Le premier replace l'immeuble de douze logements du cas~3, évalué au \cref{ch:47}, dans la fourchette interrégionale du portefeuille du cas~4 : taux pondérés et valeurs par logement de six régions métropolitaines. Le second évalue sommairement, par capitalisation directe, l'immeuble P45 de ce portefeuille, un immeuble de trente-six logements construit en 1954 à Gatineau, en état inférieur à la moyenne, dont le revenu net normalisé de 2026 est de \dollars{366800} ; plusieurs taux candidats sont appliqués pour isoler l'effet de la région, de la taille et de l'état. Tous les chiffres proviennent de \texttt{analysis/python/cases/ch33\_six\_logements.py}, qui appelle \texttt{traite.cas3}, \texttt{traite.cas4} et \texttt{traite.finance}. | ||||
| 338 | +\end{exemple} | ||||
| 339 | + | ||||
| 340 | +\subsection{La fourchette interrégionale du cas 4} | ||||
| 341 | + | ||||
| 342 | +Le \cref{tab:33:cas4-rmr} et la \cref{fig:33:rmr} résument le portefeuille synthétique du cas~4 par région : nombre d'immeubles et de logements, valeur et revenu net agrégés de 2026, taux pondéré (revenu net agrégé sur valeur agrégée), taux médian et étendue, ratio prêt-valeur, valeur et revenu net par logement, taille moyenne et loyer moyen. Les 48 immeubles totalisent 888 logements et \dollars{143363000} de valeur, soit \dollars{161445} par logement, pour un revenu net de \dollars{7447030} et un taux pondéré de \pct{5.19}. La hiérarchie régionale est nette et, par construction du jeu, cohérente avec les repères publics : Montréal se distingue par un taux pondéré de \pct{4.49} (médiane \pct{4.60}, étendue de \pct{4.00} à \pct{5.48}), dans la fourchette de \pct{4.25} à \pct{4.75} publiée par CBRE pour le troisième trimestre de 2026, et par la valeur par logement la plus élevée, \dollars{206237} ; Québec, Gatineau et Sherbrooke se situent entre \pct{5.44} et \pct{5.77}, conformément à la fourchette de \pct{5.00} à \pct{6.00} de la basse hauteur de classe~B de la ville de Québec \parencite{cbrecaprates2026q3} ; Trois-Rivières et le Saguenay, pour lesquels aucun taux n'est publié, portent des taux pondérés de \pct{6.29} et de \pct{6.39} posés par hypothèse. Les valeurs par logement suivent l'ordre inverse des taux, modulé par le niveau des loyers : Gatineau, dont le loyer moyen du portefeuille (\dollars{1412}) est le plus élevé des six régions, comme l'est le loyer moyen de deux chambres de la SCHL (\dollars{1460} en octobre 2025 \parencite{schlLocatif2025}), vaut \dollars{184173} par logement, nettement plus que Québec (\dollars{125455}), dont les immeubles du portefeuille sont plus grands, plus anciens et moins bien loués. | ||||
| 343 | + | ||||
| 344 | +\begin{table}[htbp]\centering | ||||
| 345 | +\caption{Cas 4 : sommaire du portefeuille par région métropolitaine (données synthétiques, valeurs 2026).}\label{tab:33:cas4-rmr} | ||||
| 346 | +\footnotesize\setlength{\tabcolsep}{3pt}\begin{tabular}{@{}l S[table-format=2.0] S[table-format=3.0] S[table-format=9.0] S[table-format=1.2] S[table-format=1.2] c S[table-format=2.1] S[table-format=6.0] S[table-format=5.0] S[table-format=2.1] S[table-format=4.0]@{}} | ||||
| 347 | +\toprule | ||||
| 348 | +RMR & {Imm.} & {Log.} & {Valeur (\$)} & {Taux pond. (\%)} & {Taux méd. (\%)} & Min–max (\%) & {RPV (\%)} & {Val./log. (\$)} & {RNE/log. (\$)} & {Log./imm.} & {Loyer (\$/mois)} \\ | ||||
| 349 | +\midrule | ||||
| 350 | +Montréal & 17 & 316 & 65171000 & 4.49 & 4.60 & 4,00–5,48 & 60.2 & 206237 & 9270 & 18.6 & 1323 \\ | ||||
| 351 | +Québec & 6 & 200 & 25091000 & 5.77 & 5.67 & 5,50–6,14 & 58.3 & 125455 & 7237 & 33.3 & 1153 \\ | ||||
| 352 | +Gatineau & 8 & 110 & 20259000 & 5.44 & 5.71 & 5,10–6,10 & 61.4 & 184173 & 10011 & 13.8 & 1412 \\ | ||||
| 353 | +Sherbrooke & 7 & 132 & 18132000 & 5.74 & 5.71 & 5,34–6,01 & 56.1 & 137364 & 7884 & 18.9 & 1060 \\ | ||||
| 354 | +Trois-Rivières & 6 & 98 & 11447000 & 6.29 & 6.30 & 6,05–7,00 & 61.8 & 116806 & 7345 & 16.3 & 1049 \\ | ||||
| 355 | +Saguenay & 4 & 32 & 3263000 & 6.39 & 6.46 & 5,66–7,17 & 67.2 & 101969 & 6520 & 8.0 & 935 \\ | ||||
| 356 | +\midrule | ||||
| 357 | +Portefeuille & 48 & 888 & 143363000 & 5.19 & {—} & {—} & 59.8 & 161445 & 8386 & 18.5 & {—} \\ | ||||
| 358 | +\bottomrule | ||||
| 359 | +\end{tabular} | ||||
| 360 | +\tabsource{\synth{\texttt{cas4\_portefeuille.csv} ; \texttt{traite/cas4.py}, fonction \texttt{sommaire} ; script \texttt{ch33\_six\_logements.py}. Taux pondéré = RNE agrégé / valeur agrégée ; RPV = dette / valeur.}} | ||||
| 361 | +\end{table} | ||||
| 362 | + | ||||
| 363 | +\begin{figure}[htbp]\centering | ||||
| 364 | +\includegraphics[width=\linewidth]{ch33/ch33-fig-rmr.pdf} | ||||
| 365 | +\caption{Cas 4 : valeur 2026 par logement (gauche ; barres = valeur agrégée sur logements de la région, points = immeubles, aire proportionnelle au nombre de logements) et taux global par région (droite ; médiane et étendue, taux pondéré, et médiane des quarante ventes du cas~3 en pointillé). Montréal cumule le taux le plus bas et la valeur par logement la plus élevée ; Gatineau se distingue des autres régions par ses loyers.} | ||||
| 366 | +\label{fig:33:rmr} | ||||
| 367 | +\figsource{\synth{script \texttt{analysis/python/figures/ch33\_figures.py}, graine 20261031.}} | ||||
| 368 | +\end{figure} | ||||
| 369 | + | ||||
| 370 | +Replacé dans cette fourchette, le douze logements du cas~3 est un immeuble montréalais typique du marché privé : son taux global implicite de \pct{4.37} à la valeur finale (médiane extraite \pct{4.415}) est inférieur au taux pondéré montréalais du cas~4 (\pct{4.49}) et à sa médiane (\pct{4.60}), ce qui s'explique par sa petite taille moins que par son potentiel de rattrapage, et sa valeur par logement (\dollars{171667}) est inférieure de \pct{17} à la moyenne montréalaise du portefeuille (\dollars{206237}), ce qui s'explique par ses loyers contractuels bas (\dollars{1150} par mois contre \dollars{1323} en moyenne dans les immeubles montréalais du cas~4) et par son état moyen. Les deux lectures sont cohérentes : à taux comparable, c'est le niveau du revenu qui fait la valeur par logement, conformément à l'\cref{eq:33:mrb}. Un évaluateur qui ne disposerait que de la valeur par logement du portefeuille pour juger le douze logements conclurait à tort qu'il est sous-évalué ; un évaluateur qui ne disposerait que du taux conclurait, à tort aussi, qu'il est cher. Les deux unités ensemble décrivent un immeuble mal loué dans un marché recherché. | ||||
| 371 | + | ||||
| 372 | +\subsection{L'immeuble P45 : trente-six logements à Gatineau} | ||||
| 373 | + | ||||
| 374 | +L'immeuble P45 du portefeuille est un bâtiment fictif de trente-six logements construit en 1954 dans la région de Gatineau, coté 2 sur 5 pour l'état, dont le loyer mensuel moyen est de \dollars{1532}, le revenu brut potentiel de \dollars{661635}, le ratio de dépenses de \pct{42.1} et le revenu net normalisé de 2026 de \dollars{366800}, soit \dollars{10189} par logement ; l'inoccupation de marché retenue dans le dossier est celle de la région (\pct{3.8}). Il est typique de la conciergerie d'après-guerre décrite à la \cref{sec:33:typologie} : taille moyenne, âge avancé, loyers relativement élevés pour la région parce que les logements sont grands, dépenses supérieures à celles d'un immeuble sans ascenseur. Il appartient à la zone de transition entre le marché privé et le marché institutionnel : trop gros pour la plupart des particuliers, trop petit pour les grands fonds, et situé dans une région pour laquelle aucun taux n'est publié. | ||||
| 375 | + | ||||
| 376 | +L'évaluation sommaire par capitalisation directe consiste à appliquer au revenu net normalisé un taux global justifié. Le \cref{tab:33:p45} présente huit taux candidats et les valeurs correspondantes, toutes obtenues par $V = \NOI / R$ avec $\NOI = \dollars{366800}$. Le premier est une erreur délibérée, pédagogique : appliquer la médiane des quarante ventes montréalaises du cas~3 (\pct{4.415}), c'est-à-dire le taux d'un autre marché, donnerait \dollars{8308041}, soit \dollars{230779} par logement, valeur supérieure de \pct{23.7} à celle que le marché régional justifie. Les trois suivants sont les taux de la région dans le portefeuille : le taux pondéré de Gatineau (\pct{5.436}, soit \dollars{6747739}), la médiane des huit immeubles gatinois (\pct{5.710}, soit \dollars{6423818}) et le taux prédit par la régression semi-logarithmique du portefeuille pour les caractéristiques exactes du sujet (\pct{5.461}, soit \dollars{6716534}). Les trois derniers isolent, à partir de la régression, l'effet d'une caractéristique à la fois : le même immeuble situé à Montréal aurait un taux de \pct{4.565} et une valeur de \dollars{8034343} ; le même immeuble réduit à douze logements, un taux de \pct{5.654} et une valeur par logement de \dollars{180219} au lieu de \dollars{186570} ; le même immeuble en état moyen, un taux de \pct{5.245} et une valeur de \dollars{6993820}. Le taux inscrit au dossier synthétique, \pct{5.10}, qui résulte de la loi de génération, donne \dollars{7192157}, cohérent avec la valeur enregistrée de \dollars{7186000}. | ||||
| 377 | + | ||||
| 378 | +\begin{table}[htbp]\centering | ||||
| 379 | +\caption{Immeuble P45 (36 logements, Gatineau, 1954, état 2 ; RNE normalisé \dollars{366800}) : taux candidats et indications par capitalisation directe (données synthétiques).}\label{tab:33:p45} | ||||
| 380 | +\small\begin{tabular}{@{}L{7.0cm}S[table-format=1.3]S[table-format=7.0]S[table-format=6.0]@{}} | ||||
| 381 | +\toprule | ||||
| 382 | +Taux candidat & {$R$ (\%)} & {$V = \NOI/R$ (\$)} & {\$ par logement} \\ | ||||
| 383 | +\midrule | ||||
| 384 | +Médiane des 40 ventes du cas 3 (Montréal, 6-30 log.) — \emph{autre marché} & 4.415 & 8308041 & 230779 \\ | ||||
| 385 | +Cas 4, Gatineau : taux pondéré (RNE / valeur, 8 immeubles) & 5.436 & 6747739 & 187437 \\ | ||||
| 386 | +Cas 4, Gatineau : taux médian (8 immeubles) & 5.710 & 6423818 & 178439 \\ | ||||
| 387 | +\textbf{Régression du cas 4, caractéristiques du sujet (retenu)} & \textbf{5.461} & \textbf{6716534} & \textbf{186570} \\ | ||||
| 388 | +\quad même immeuble situé à Montréal & 4.565 & 8034343 & 223176 \\ | ||||
| 389 | +\quad même immeuble réduit à 12 logements & 5.654 & 6487875 & 180219 \\ | ||||
| 390 | +\quad même immeuble en état moyen (3) & 5.245 & 6993820 & 194273 \\ | ||||
| 391 | +Taux inscrit au dossier synthétique (loi de génération) & 5.100 & 7192157 & 199782 \\ | ||||
| 392 | +\midrule | ||||
| 393 | +\multicolumn{4}{@{}l}{Repères : valeur enregistrée au dossier \dollars{7186000} (\dollars{199611} par logement, MRB 10,86) ; valeur par logement de la région \dollars{184173}} \\ | ||||
| 394 | +\bottomrule | ||||
| 395 | +\end{tabular} | ||||
| 396 | +\tabsource{\synth{\texttt{traite/cas4.py}, \texttt{traite/finance.py} (\texttt{capitalisation\_directe}) ; script \texttt{ch33\_six\_logements.py}, fonction \texttt{p45} ; régression décrite à l'\cref{eq:33:modele}.}} | ||||
| 397 | +\end{table} | ||||
| 398 | + | ||||
| 399 | +\subsection{Le modèle régional du taux} | ||||
| 400 | + | ||||
| 401 | +La régression qui fonde les quatre derniers taux est celle de la fonction \texttt{effets\_regionaux} de \texttt{traite.cas4}, reprise ici avec ses résidus pour corriger la prédiction. Elle explique le logarithme du taux global des 48 immeubles par l'état, le logarithme du nombre de logements rapporté à douze, deux indicatrices de risque, l'âge et cinq indicatrices régionales, Montréal servant de référence : | ||||
| 402 | +\begin{equation}\label{eq:33:modele} | ||||
| 403 | +\ln R_i = \beta_0 + \beta_e\,(e_i - 3) + \beta_n \ln\frac{n_i}{12} + \beta_z z_i + \beta_s s_i + \beta_a \frac{a_i - 50}{10} + \sum_{r \neq \text{Mtl}} \gamma_r\,\mathbb{1}[\text{RMR}_i = r] + \varepsilon_i, | ||||
| 404 | +\end{equation} | ||||
| 405 | +où $e_i$ est la cote d'état, $z_i$ et $s_i$ les indicatrices de zone inondable et de contamination du sol et $a_i$ l'âge. Avec 48 observations, le modèle atteint un $R^2$ de \num{0.883}. La constante correspond à un taux de \pct{4.60} pour un immeuble montréalais de douze logements, d'état moyen, de cinquante ans, sans risque particulier. Les coefficients s'interprètent en pourcentage du taux par la transformation | ||||
| 406 | +\begin{equation}\label{eq:33:effet-pct} | ||||
| 407 | +\text{effet}_k = e^{\hat\beta_k} - 1, | ||||
| 408 | +\end{equation} | ||||
| 409 | +que le \cref{ch:18} a justifiée : chaque point d'état abaisse le taux de \pct{3.96} de sa valeur, un doublement de la taille l'abaisse de \pct{2.16}, dix années d'âge l'élèvent de \pct{0.69}, la zone inondable de \pct{7.9} et la contamination de \pct{5.5} ; les effets régionaux, par rapport à Montréal, sont de +\pct{19.6} pour Gatineau (erreur-type HC1 du coefficient 0,024), +\pct{25.3} pour Sherbrooke, +\pct{26.8} pour Québec, +\pct{32.9} pour le Saguenay et +\pct{40.2} pour Trois-Rivières. La prédiction en niveau applique le facteur de Duan, moyenne des exponentielles des résidus, ici \num{1.0011} tant les résidus sont petits : | ||||
| 410 | +\begin{equation}\label{eq:33:prediction} | ||||
| 411 | +\hat R = \exp\!\big(\mathbf{x}\T\hat{\boldsymbol\beta}\big)\,\frac{1}{N}\sum_{i=1}^{N} e^{\hat\varepsilon_i}. | ||||
| 412 | +\end{equation} | ||||
| 413 | +Pour P45 (Gatineau, état 2, 36 logements, 72 ans), $\hat R = \pct{5.461}$. | ||||
| 414 | + | ||||
| 415 | +Parce que le modèle est multiplicatif, l'écart entre deux taux se décompose en facteurs. En partant d'un immeuble montréalais de douze logements qui aurait l'état et l'âge de P45 (taux prédit \pct{4.726}), le passage à trente-six logements abaisse le taux de \num{16.1}~points de base et le passage à Gatineau l'élève de \num{89.6}~points de base : | ||||
| 416 | +\begin{equation}\label{eq:33:decomposition} | ||||
| 417 | +\hat R_{\text{P45}} = \hat R_{\text{Mtl},12} \times \Big(\frac{36}{12}\Big)^{\hat\beta_n} \times e^{\hat\gamma_{\text{Gat}}} = \pct{4.726} \times \num{0.9659} \times \num{1.1962} = \pct{5.461}. | ||||
| 418 | +\end{equation} | ||||
| 419 | +L'effet de la région est près de six fois celui de la taille. C'est la conclusion que la \cref{fig:33:taux-taille} annonçait et que l'évaluateur appelé à travailler hors de Montréal et de Québec doit retenir : la prime de taille existe, elle vaut quelques points de base, mais c'est la prime régionale, qui n'est publiée nulle part, qu'il faut mesurer localement. Sur la valeur, la différence est considérable : entre le taux montréalais appliqué par erreur et le taux régional, l'écart est de \dollars{1591507}, soit \dollars{44209} par logement. | ||||
| 420 | + | ||||
| 421 | +Le choix du taux retenu suit le raisonnement du \cref{ch:29}. Le taux pondéré de la région (\pct{5.436}) et le taux de régression (\pct{5.461}) sont très proches ; la médiane régionale (\pct{5.710}) est plus élevée parce que les huit immeubles gatinois du portefeuille sont pour la plupart plus petits que P45 (\num{13.8} logements en moyenne) et que la médiane ne corrige pas la taille. Le taux de régression a l'avantage de tenir compte simultanément de l'état inférieur du sujet, de sa taille et de son âge ; il a l'inconvénient de reposer sur quarante-huit observations réparties dans six régions, dont huit seulement à Gatineau, et sur une forme fonctionnelle imposée. L'évaluateur le retient comme taux central, \pct{5.46}, arrondi, et encadre l'indication par les deux taux régionaux : la valeur sommaire de P45 est de l'ordre de \dollars{6700000}, entre \dollars{6420000} et \dollars{6750000}, soit \dollars{178000} à \dollars{187000} par logement, légèrement au-dessus de la moyenne régionale du portefeuille (\dollars{184173}) en raison des loyers élevés du sujet, et malgré son état. La valeur enregistrée au dossier synthétique (\dollars{7186000}) est supérieure de \pct{7} à cette indication ; l'écart tient au taux de \pct{5.10} que la loi de génération a attribué à cet immeuble, plus bas que ce que ses caractéristiques prédisent, et il illustre la dispersion résiduelle que toute extraction doit accepter. Il va de soi qu'une évaluation complète exigerait, au-delà de ce calcul sommaire, l'analyse des baux et des dépenses de P45, la vérification des trente-six loyers, l'inspection d'un immeuble de 1954 en état inférieur à la moyenne et, probablement, un flux actualisé intégrant les dépenses en capital que cet état laisse présager ; la \cref{sec:33:diligence} en a dressé la liste. | ||||
| 422 | + | ||||
| 423 | +Un mot sur le financement, qui ferme la boucle avec la \cref{sec:33:marche}. La dette inscrite au dossier de P45 est de \dollars{5416000} à \pct{5.17}, échéant en 2028, soit un ratio prêt-valeur de \pct{75.4} sur la valeur enregistrée et de \pct{80.6} sur l'indication par régression. Si l'on suppose un prêt assuré amorti sur quarante ans, le service annuel de la dette est de \dollars{318363} et le ratio de couverture de \num{1.15} : inférieur au seuil conventionnel de \num{1.20}, mais supérieur au minimum de \num{1.10} du programme APH~Select pour le locatif ordinaire \parencite{schlaphselect}. Un tel niveau d'endettement n'est accessible qu'à un emprunteur du marché institutionnel ou à un investisseur privé capable de monter un dossier d'assurance SCHL ; au renouvellement de 2028, une hausse du taux comprimerait la couverture sous \num{1.10}, et c'est ce risque de refinancement, plus que le risque d'exploitation, que le \cref{ch:48} analyse à l'échelle du portefeuille. | ||||
| 424 | + | ||||
| 425 | +\subsection{Sensibilité : taille, région, état et taux}\label{sec:33:sensibilite} | ||||
| 426 | + | ||||
| 427 | +La \cref{fig:33:p45} et le \cref{tab:33:sensibilite} prolongent l'exemple. La grille de la figure donne, pour un immeuble de trente-six logements de soixante-douze ans au revenu net de P45, le taux prédit et la valeur par logement pour chaque combinaison de région et d'état ; elle se lit comme une carte des primes. D'une colonne à l'autre, à état donné, la valeur par logement passe de \dollars{223176} à Montréal à \dollars{159220} à Trois-Rivières pour un immeuble d'état 2, soit un écart de \pct{40} ; d'une ligne à l'autre, à région donnée, elle passe de \dollars{179173} (état 1) à \dollars{210645} (état 5) à Gatineau, soit \pct{17.6}. La courbe de taille, à région et état donnés, est beaucoup plus plate : de six à soixante-douze logements, le taux prédit pour un immeuble gatinois d'état 2 passe de \pct{5.78} à \pct{5.34} et la valeur par logement, à revenu net par logement constant, de \dollars{176323} à \dollars{190693}, soit \pct{8} sur une multiplication de la taille par douze. Enfin, la sensibilité au taux lui-même est celle de toute capitalisation directe, $\dd V / V = -\dd R / R$ (\cref{sec:29:logique}) : une hausse de 25~points de base du taux retenu, de \pct{5.461} à \pct{5.711}, abaisse la valeur de \pct{4.38}, une baisse de 25~points de base l'élève de \pct{4.80}, et l'asymétrie provient de la convexité de $1/R$. À \pct{5.46}, un point de base vaut environ \dollars{1230} de valeur pour P45 ; à \pct{4.415}, pour le douze logements montréalais, un point de base vaut \dollars{4615} par million de valeur, contre \dollars{1831} par million à \pct{5.46} : l'incertitude sur le taux pèse d'autant plus lourd que le taux est bas, ce qui est la situation montréalaise. | ||||
| 428 | + | ||||
| 429 | +\begin{figure}[htbp]\centering | ||||
| 430 | +\includegraphics[width=\linewidth]{ch33/ch33-fig-p45-sensibilite.pdf} | ||||
| 431 | +\caption{Valeur par logement (k\$) et taux global prédits par la régression du cas~4 pour un immeuble de trente-six logements de soixante-douze ans au revenu net de P45, selon la région et l'état ; le cadre marque le sujet (Gatineau, état 2). Les colonnes (région) séparent davantage les valeurs que les lignes (état).} | ||||
| 432 | +\label{fig:33:p45} | ||||
| 433 | +\figsource{\synth{script \texttt{analysis/python/figures/ch33\_figures.py}, graine 20261031.}} | ||||
| 434 | +\end{figure} | ||||
| 435 | + | ||||
| 436 | +\begin{table}[htbp]\centering | ||||
| 437 | +\caption{Sensibilité de l'indication de P45 à la taille et au taux (données synthétiques ; RNE par logement constant pour la taille).}\label{tab:33:sensibilite} | ||||
| 438 | +\small\begin{tabular}{@{}L{5.2cm}S[table-format=1.3]S[table-format=7.0]S[table-format=6.0]S[table-format=-2.2]@{}} | ||||
| 439 | +\toprule | ||||
| 440 | +Variante & {$R$ (\%)} & {Valeur (\$)} & {\$ par logement} & {Écart (\%)} \\ | ||||
| 441 | +\midrule | ||||
| 442 | +\multicolumn{5}{@{}l}{\emph{Taille (Gatineau, état 2, 72 ans)}} \\ | ||||
| 443 | +6 logements & 5.778 & {—} & 176323 & -5.49 \\ | ||||
| 444 | +12 logements & 5.654 & {—} & 180219 & -3.40 \\ | ||||
| 445 | +24 logements & 5.531 & {—} & 184201 & -1.27 \\ | ||||
| 446 | +36 logements (sujet) & 5.461 & 6716534 & 186570 & 0.00 \\ | ||||
| 447 | +48 logements & 5.412 & {—} & 188270 & 0.91 \\ | ||||
| 448 | +72 logements & 5.343 & {—} & 190693 & 2.21 \\ | ||||
| 449 | +\midrule | ||||
| 450 | +\multicolumn{5}{@{}l}{\emph{Taux (36 logements)}} \\ | ||||
| 451 | +$R - 50$ pb & 4.961 & 7393447 & 205374 & 10.08 \\ | ||||
| 452 | +$R - 25$ pb & 5.211 & 7038753 & 195521 & 4.80 \\ | ||||
| 453 | +$R$ retenu & 5.461 & 6716534 & 186570 & 0.00 \\ | ||||
| 454 | +$R + 25$ pb & 5.711 & 6422524 & 178403 & -4.38 \\ | ||||
| 455 | +$R + 50$ pb & 5.961 & 6153175 & 170922 & -8.39 \\ | ||||
| 456 | +\bottomrule | ||||
| 457 | +\end{tabular} | ||||
| 458 | +\tabsource{\synth{script \texttt{ch33\_six\_logements.py}, fonction \texttt{sensibilite\_p45} ; écarts par rapport à l'indication retenue.}} | ||||
| 459 | +\end{table} | ||||
| 460 | + | ||||
| 461 | +Trois enseignements se dégagent pour la pratique. Premièrement, l'ordre des incertitudes : région, puis état, puis taille ; un évaluateur qui dispose de peu de ventes locales doit consacrer son effort à établir le niveau régional du taux, par extraction directe quand c'est possible, par comparaison raisonnée avec les régions couvertes par les publications sinon, et déclarer la source de ce niveau. Deuxièmement, la cohérence entre le revenu et le taux : la grille suppose un revenu net par logement constant d'une région à l'autre, ce qui n'est pas le cas dans le marché, où les loyers de Gatineau sont plus élevés que ceux de Québec ; la valeur par logement observée combine toujours un effet de revenu et un effet de taux, et c'est pourquoi la comparaison par logement entre régions est trompeuse sans contrôle des loyers. Troisièmement, la convexité : les intervalles de valeur ne sont pas symétriques autour de l'indication centrale et l'évaluateur qui rapporte une fourchette doit la calculer aux deux bornes du taux plutôt que d'appliquer un pourcentage uniforme. | ||||
added
references/lib-ch25.bib
+10 −0
@@ -0,0 +1,10 @@ | |||||
| 1 | +% Nouvelles références du chapitre 25 — Évaluation du terrain. | ||||
| 2 | +% Aucune nouvelle entrée vérifiée n'a été nécessaire : toutes les clés citées dans ch25.tex existent déjà dans references/library.bib | ||||
| 3 | +% (appraisal2026, appraisalCdn, achour1992, wyatt2022, oeaqNormes, cuspap2026, lfm, lau, lptaa, loi2023c12, laroda2025, jardinsverone2025, | ||||
| 4 | +% vqtaux2026, dqroles, mamhroles2026, reglpropmed, iaaoratio2013, zonesInond2026, inondcartes, gatzonage, davisHeathcote2007, | ||||
| 5 | +% knollSchularickSteger2017, albouyEhrlichShin2018, capozzaHelsley1989, capozzaHelsley1990, titman1985, quigg1993, cunningham2006, | ||||
| 6 | +% glaeserGyourko2005, rosenthalHelsley1994, munneke1996, munnekeWomack2020, dyeMcmillen2007, mcmillenOsullivan2013, clappSalavei2010, | ||||
| 7 | +% clappBardosWong2012, byrne1996, geltnerMillerClaytonEichholtz2014, halvorsenPalmquist1980, malpezziOzanneThibodeau1987, | ||||
| 8 | +% hardingRosenthalSirmans2007, ricardo1817, alonso1964, colwellCannadayWu1983, theriaultDesrosiers2011, kestensTheriaultDesrosiers2006). | ||||
| 9 | +% Les sources non vérifiées du chapitre sont consignées dans verification/chapters/ch25-claims.csv (statut non_verifie ou partiellement_verifie) | ||||
| 10 | +% et ne sont pas ajoutées ici, conformément à CONVENTIONS.md §9. | ||||
modified
tools/check_manuscript.py
+1 −1
@@ -29,7 +29,7 @@ for p, t in texts.items(): | |||||
| 29 | for key, row in figreg.items(): | 29 | for key, row in figreg.items(): | ||
| 30 | s = ROOT/row["script"] | 30 | s = ROOT/row["script"] | ||
| 31 | if row["script"] and not s.exists(): problems.append(f"figures.csv: script introuvable {row['script']} ({key})") | 31 | if row["script"] and not s.exists(): problems.append(f"figures.csv: script introuvable {row['script']} ({key})") | ||
| 32 | − if row.get("type_donnees") != "schema" and not (ROOT/"assets/figures"/key).exists(): problems.append(f"figures.csv: fichier inscrit mais absent {key}") | 32 | + if "schema" not in (row.get("type_donnees") or "").lower() and "tikz" not in key.lower() and not (ROOT/"assets/figures"/key).exists(): problems.append(f"figures.csv: fichier inscrit mais absent {key}") | ||
| 33 | # 3. compteurs | 33 | # 3. compteurs | ||
| 34 | n_fig = sum(len(incl.findall(t)) + t.count("\\begin{tikzpicture}") for t in texts.values()) | 34 | n_fig = sum(len(incl.findall(t)) + t.count("\\begin{tikzpicture}") for t in texts.values()) | ||
| 35 | n_tab = sum(t.count("\\begin{table}") + t.count("\\begin{longtable}") for t in texts.values()) | 35 | n_tab = sum(t.count("\\begin{table}") + t.count("\\begin{longtable}") for t in texts.values()) | ||
added
verification/chapters/ch25-claims.csv
+19 −0
@@ -0,0 +1,19 @@ | |||||
| 1 | +id,chapitre,affirmation,source_id,verification,date,statut,notes | ||||
| 2 | +CLM-25-001,25,"LFM art. 34 : unité d'évaluation = plus grand ensemble possible d'immeubles, même propriétaire, terrains contigus, même fin prédominante, cessibles globalement « compte tenu de l'utilisation la plus probable » (par. 4°)",SRC-B-001,notes-B.md (§9.1 et §ch. 25) ; LégisQuébec F-2.1 à jour au 2026-10-15,2026-10-31,verifie, | ||||
| 3 | +CLM-25-002,25,"LFM art. 46 al. 1 : valeur réelle établie selon l'utilisation la plus probable à la date de référence du rôle",SRC-B-001,notes-B.md,2026-10-31,verifie, | ||||
| 4 | +CLM-25-003,25,"LFM art. 244.36 : terrain vague desservi = desservi par aqueduc et égout, aucun bâtiment ou valeur du bâtiment « inférieure à 10 % de celle du terrain » ; art. 244.49 : taux pouvant atteindre le quadruple du taux de base",SRC-B-001,notes-B.md et normes-B.csv NRM-B-039 ; corroboré par le ratio exact 4,0 des taux 2026 de Québec,2026-10-31,verifie,"Texte de l'art. 244.49 non recopié mot à mot dans les notes (« jusqu'au quadruple ») — à relire avant publication" | ||||
| 5 | +CLM-25-004,25,"Ville de Québec 2026 (R.V.Q. 3492) : 2,9856 $/100 $ terrains vagues desservis vs 0,7464 $ (1 à 5 logements) = 4,0×",SRC-B-025,notes-B.md §9.9 ; library.bib vqtaux2026 ; calibration.json,2026-10-31,verifie, | ||||
| 6 | +CLM-25-005,25,"Données ouvertes du rôle (MAMH, CC BY 4.0) : champs RL0404A (valeur terrain) et RL0404B (valeur bâtiment) ; propriétaires caviardés",SRC-B-013,data/raw/SOURCES.md (répertoire des renseignements prescrits v2.5),2026-10-31,verifie, | ||||
| 7 | +CLM-25-006,25,"Jardins de Vérone (2025 QCCA 123 ; CSC 41748) : qualification d'un terrain en construction comme terrain vague desservi ; pourvoi en délibéré",SRC-B-072,notes-B.md §9.10 ; registre CSC consulté le 2026-10-31,2026-10-31,verifie,Décision CSC à surveiller | ||||
| 8 | +CLM-25-007,25,"F-2.1 r. 10 art. 8-10 : ventes de terrains vagues plafonnées dans l'échantillon de la proportion médiane",SRC-B-003,notes-B.md §ch. 25,2026-10-31,partiellement_verifie,Articles cités d'après les notes ; texte non relu dans ce lot | ||||
| 9 | +CLM-25-008,25,"IAAO Standard on Ratio Studies (2013) : COD admissible jusqu'à 25 pour les terrains vacants vs 5-15 unifamilial",SRC-C-024,notes-C.md (table 1-3),2026-10-31,verifie,"Incohérence interne du standard (§9.2.4 : 5-20) notée ; révision IAAO en cours" | ||||
| 10 | +CLM-25-009,25,"LAU art. 115 al. 2 par. 1°, 3°, 4° : superficie et dimensions minimales des lots, selon services, prohibition pour dangers d'inondation",SRC-B-038,notes-B.md §ch. 8 ; ch08.tex,2026-10-31,verifie, | ||||
| 11 | +CLM-25-010,25,"LAU art. 117.1, 117.2, 117.4 al. 1 : contribution pour fins de parcs (terrain, servitude ou somme) ≤ 10 % de la superficie et de la valeur du site ; modifiés par LQ 2023 c. 12",SRC-B-038;SRC-B-039,notes-B.md ; normes-B.csv NRM-B-068,2026-10-31,verifie,"Art. 117.6 (évaluation du site par évaluateur agréé) non lu — non affirmé dans le texte" | ||||
| 12 | +CLM-25-011,25,"Laroda 2025 CSC 44 : cession excédentaire pour fins de parcs = réserve de terrains, indemnité = valeur marchande",SRC-B-075,notes-B.md ; cause en bref CSC,2026-10-31,verifie, | ||||
| 13 | +CLM-25-012,25,"Zones inondables (cadre du 1er mars 2026, modifié le 29 juillet 2026) : quatre classes d'intensité ; nouvelle résidence interdite dans le littoral, la rive et les classes très élevée/élevée/modérée, permise sous conditions en classe faible",SRC-B-045;SRC-B-049;SRC-B-050,notes-B.md §43.2 ; ch08.tex encadré,2026-10-31,verifie,Règles détaillées par classe non extraites | ||||
| 14 | +CLM-25-013,25,"LPTAA art. 26, 28, 29 : utilisation non agricole, lotissement et aliénation avec lot contigu interdits sans autorisation CPTAQ ; droits acquis art. 101-105",SRC-B-040,notes-B.md §ch. 25 ; ch08.tex §8.x,2026-10-31,verifie, | ||||
| 15 | +CLM-25-014,25,"NPP OEAQ et CUSPAP 2026 : le rapport expose le raisonnement et motive le rejet des méthodes non retenues (aucune méthode d'évaluation du terrain prescrite)",SRC-C-001;SRC-C-018,notes-C.md §2 ; ch21.tex,2026-10-31,verifie,Formulation générale ; aucune disposition spécifique aux terrains citée | ||||
| 16 | +CLM-25-015,25,"Primauté de la comparaison directe pour les terrains ; six méthodes (comparaison, allocation, extraction, résiduelle, lotissement, capitalisation de la rente) ; règles de profondeur conventionnelles (4-3-2-1) présentées comme historiques",SRC-D-APPRAISAL,"appraisal2026 (16e éd.), achour1992 — ouvrages non consultés page à page",2026-10-31,partiellement_verifie,"Usage professionnel courant ; pas de numéro de page" | ||||
| 17 | +CLM-25-016,25,"Quigg (1993) : prime d'option (valeur d'attente) ≈ 6 % du prix des terrains",SRC-D-QUIGG,notes-D.md §ch. 25,2026-10-31,partiellement_verifie,Chiffre repris des notes D ; article non relu | ||||
| 18 | +CLM-25-017,25,"Dépréciation du logement entretenu de l'ordre de 0,5 à 1 %/an (Malpezzi–Ozanne–Thibodeau 1987 ; Harding–Rosenthal–Sirmans 2007)",SRC-D-MOT1987,notes-D.md §ch. 24,2026-10-31,partiellement_verifie,Ordre de grandeur ; voir ch. 24 | ||||
| 19 | +CLM-25-018,25,"Hypothèses pédagogiques du chapitre : prix de référence des terrains 225 000 $ (560 m², Hull, 2024-07) ; élasticités et décotes du jeu synthétique ; coût neuf 2 500 $/m² × 950 m² et dépréciation 52 % du 12 logements ; R_L = 3,75 % ; paramètres du lotissement ; façade du sujet 20 m ; C_N des comparables transposé (ε = 0,90 ; ±10 %/classe)",NON_VERIFIE,Déclarées comme hypothèses dans l'encadré synthetique et dans limites,2026-10-31,non_verifie,"Aucune source publique ; coût multilogement introuvable (notes-E) ; la grille de terrains de l'auteur n'est pas dans le dépôt" | ||||
added
verification/chapters/ch25-registry.csv
+2 −0
@@ -0,0 +1,2 @@ | |||||
| 1 | +id,type,titre,organisme,version_ou_date,url,date_consultation,statut,utilise_dans,notes | ||||
| 2 | +SRC-25-001,donnees_synthetiques,"ch25_terrains_ventes.csv — 200 ventes synthétiques de terrains vacants (Gatineau fictif)",Auteur (analysis/python/cases/ch25_terrain.py),"Généré le 2026-10-31, graine 20261031",data/synthetic/ch25_terrains_ventes.csv,2026-10-31,verifie,25,"Lois déclarées dans data/synthetic/README.md (section « Chapitre 25 ») ; prix de référence 225 000 $ = hypothèse pédagogique ; aucune vente réelle utilisée" | ||||
modified
verification/review_log.md
+1 −0
@@ -6,3 +6,4 @@ | |||||
| 6 | | 2026-10-31 | 1 | Cinq lots de sources vérifiés et fusionnés (registre, matrice des normes, bibliographie 422 clés, calibration 204 paramètres, données brutes 315 Mo) ; générateur synthétique recalibré | Claude + 5 agents | | 6 | | 2026-10-31 | 1 | Cinq lots de sources vérifiés et fusionnés (registre, matrice des normes, bibliographie 422 clés, calibration 204 paramètres, données brutes 315 Mo) ; générateur synthétique recalibré | Claude + 5 agents | | ||
| 7 | | 2026-10-31 | 3 | Prototype : ch. 16, 21, 29, 30, 47 rédigés et testés ; PDF pilote 338 p. ; modules cas1-4 | Claude + 4 agents | | 7 | | 2026-10-31 | 3 | Prototype : ch. 16, 21, 29, 30, 47 rédigés et testés ; PDF pilote 338 p. ; modules cas1-4 | Claude + 4 agents | | ||
| 8 | - 2026-10-31 (ch. 3) : SRC-E-019 « RMR Montréal 2025 : 21 138 mises en chantier » ne couvre que 9 mois (34-10-0143 : juillet–septembre 2025 absents) → ne pas citer comme total annuel ; V39079 Valet commence en 2009 (SOURCES.md dit 2000). | 8 | - 2026-10-31 (ch. 3) : SRC-E-019 « RMR Montréal 2025 : 21 138 mises en chantier » ne couvre que 9 mois (34-10-0143 : juillet–septembre 2025 absents) → ne pas citer comme total annuel ; V39079 Valet commence en 2009 (SOURCES.md dit 2000). | ||
| 9 | +- 2026-10-31 (ch. 15) : harmonisation à faire — ch. 4 « Sherbrooke 4,4 mois » vs 4,3 (ch. 3/15) ; rotation 15 % du cas 3 vs SCHL 8,5-9,4 % (déclaré). | ||||
| 9 | 10 | ||||