Classeurs Excel (grille cas 1, DCF cas 3, amortissement) avec formules vivantes ; inventaire des scripts
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
18 changed files +634 −52
added
analysis/python/cases/make_spreadsheets.py
+170 −0
@@ -0,0 +1,170 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +"""Classeurs Excel du traité (openpyxl, formules vivantes) : spreadsheets/ | |
| 3 | +- cas1_grille_comparaison.xlsx : grille d'ajustements des 5 comparables (ch. 16-17) avec formules (prix ajusté, brut/net, pondération) | |
| 4 | +- cas3_dcf_12_logements.xlsx : état locatif, dépenses normalisées, RNE, capitalisation, DCF 10 ans, financement (ch. 28-31, 47) | |
| 5 | +- amortissement_hypothecaire.xlsx : calculateur d'hypothèque canadienne (composition semestrielle) avec tableau d'amortissement | |
| 6 | +Les valeurs sont celles des modules traite.cas1 / traite.cas3 ; les formules Excel reproduisent les identités du livre.""" | |
| 7 | +import sys, pathlib | |
| 8 | +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) | |
| 9 | +from openpyxl import Workbook | |
| 10 | +from openpyxl.styles import Font, PatternFill, Alignment | |
| 11 | +from openpyxl.utils import get_column_letter | |
| 12 | +from traite import cas1, cas3, finance as fin | |
| 13 | + | |
| 14 | +ROOT = pathlib.Path(__file__).resolve().parents[3]; OUT = ROOT / "spreadsheets"; OUT.mkdir(exist_ok=True) | |
| 15 | +H = Font(bold=True, color="FFFFFF"); HF = PatternFill("solid", fgColor="003E7E"); NOTE = Font(italic=True, color="606670") | |
| 16 | +MONEY = '#,##0 "$"'; PCT = "0.00%" | |
| 17 | + | |
| 18 | +def entete(ws, row, labels): | |
| 19 | + for j, l in enumerate(labels, 1): | |
| 20 | + c = ws.cell(row=row, column=j, value=l); c.font = H; c.fill = HF; c.alignment = Alignment(wrap_text=True, vertical="center") | |
| 21 | + | |
| 22 | +def avert(ws, row, txt="DONNÉES SYNTHÉTIQUES — aucun bien réel. Généré par analysis/python/cases/make_spreadsheets.py"): | |
| 23 | + ws.cell(row=row, column=1, value=txt).font = NOTE | |
| 24 | + | |
| 25 | +def grille_cas1(): | |
| 26 | + r = cas1.tout(); comps = r["selection"]["comparables"].reset_index(drop=True); adj = r["ajustements"]; s = r["sujet"] | |
| 27 | + wb = Workbook(); ws = wb.active; ws.title = "Grille" | |
| 28 | + avert(ws, 1); ws.cell(row=2, column=1, value="Grille d'ajustements — cas 1, maison de Gatineau (chapitres 16-17)").font = Font(bold=True, size=13) | |
| 29 | + cols = ["Élément", "Sujet"] + list(comps["id_vente"]) | |
| 30 | + entete(ws, 4, cols) | |
| 31 | + lignes = [("Date de vente", s["date_evaluation"], [str(d.date()) for d in comps["date_vente"]]), ("Superficie habitable (m²)", s["superficie_habitable_m2"], list(comps["superficie_habitable_m2"])), | |
| 32 | + ("Terrain (m²)", s["superficie_terrain_m2"], list(comps["superficie_terrain_m2"])), ("Année de construction", s["annee_construction"], list(comps["annee_construction"])), | |
| 33 | + ("Qualité (1-5)", s["qualite_1a5"], list(comps["qualite_1a5"])), ("Garage", s["garage_places"], list(comps["garage_places"])), ("Sous-sol fini", s["sous_sol_fini"], list(comps["sous_sol_fini"]))] | |
| 34 | + row = 5 | |
| 35 | + for lab, sv, vals in lignes: | |
| 36 | + ws.cell(row=row, column=1, value=lab); ws.cell(row=row, column=2, value=sv) | |
| 37 | + for j, v in enumerate(vals, 3): ws.cell(row=row, column=j, value=float(v) if isinstance(v, (int, float)) and not isinstance(v, bool) else v) | |
| 38 | + row += 1 | |
| 39 | + row += 1; ws.cell(row=row, column=1, value="Prix de vente").font = Font(bold=True); prix_row = row | |
| 40 | + for j, v in enumerate(comps["prix_vente"], 3): ws.cell(row=row, column=j, value=float(v)).number_format = MONEY | |
| 41 | + row += 1; ws.cell(row=row, column=1, value="Ajustements (du point de vue du sujet, $)").font = Font(italic=True) | |
| 42 | + groupes = ["conditions_marche", "localisation", "superficie", "terrain", "age", "qualite", "garage", "sous_sol", "piscine", "type"] | |
| 43 | + noms = ["Conditions du marché", "Localisation", "Superficie habitable", "Terrain", "Âge", "Qualité", "Garage", "Sous-sol", "Piscine", "Type"] | |
| 44 | + first_adj = row + 1 | |
| 45 | + for g, nm in zip(groupes, noms): | |
| 46 | + row += 1; ws.cell(row=row, column=1, value=nm) | |
| 47 | + for j in range(len(comps)): ws.cell(row=row, column=3 + j, value=round(float(adj.loc[j, g]), 2)).number_format = MONEY | |
| 48 | + last_adj = row | |
| 49 | + row += 1; ws.cell(row=row, column=1, value="Prix ajusté").font = Font(bold=True); paj_row = row | |
| 50 | + for j in range(len(comps)): | |
| 51 | + L = get_column_letter(3 + j); ws.cell(row=row, column=3 + j, value=f"={L}{prix_row}+SUM({L}{first_adj}:{L}{last_adj})").number_format = MONEY | |
| 52 | + row += 1; ws.cell(row=row, column=1, value="Ajustement brut (%)"); brut_row = row | |
| 53 | + for j in range(len(comps)): | |
| 54 | + L = get_column_letter(3 + j); ws.cell(row=row, column=3 + j, value=f"=SUMPRODUCT(ABS({L}{first_adj}:{L}{last_adj}))/{L}{prix_row}").number_format = PCT | |
| 55 | + row += 1; ws.cell(row=row, column=1, value="Ajustement net (%)") | |
| 56 | + for j in range(len(comps)): | |
| 57 | + L = get_column_letter(3 + j); ws.cell(row=row, column=3 + j, value=f"=({L}{paj_row}-{L}{prix_row})/{L}{prix_row}").number_format = PCT | |
| 58 | + row += 1; ws.cell(row=row, column=1, value="Poids ∝ 1/brut"); w_row = row | |
| 59 | + rng = f"{get_column_letter(3)}{brut_row}:{get_column_letter(2 + len(comps))}{brut_row}" | |
| 60 | + for j in range(len(comps)): | |
| 61 | + L = get_column_letter(3 + j); ws.cell(row=row, column=3 + j, value=f"=(1/MAX({L}{brut_row},0.01))/SUMPRODUCT(1/IF({rng}<0.01,0.01,{rng}))").number_format = "0.000" | |
| 62 | + row += 2; ws.cell(row=row, column=1, value="Valeur indiquée (pondérée)").font = Font(bold=True) | |
| 63 | + ws.cell(row=row, column=2, value=f"=SUMPRODUCT({get_column_letter(3)}{paj_row}:{get_column_letter(2+len(comps))}{paj_row},{get_column_letter(3)}{w_row}:{get_column_letter(2+len(comps))}{w_row})").number_format = MONEY | |
| 64 | + row += 1; ws.cell(row=row, column=1, value="Moyenne / médiane des prix ajustés"); ws.cell(row=row, column=2, value=f"=AVERAGE({get_column_letter(3)}{paj_row}:{get_column_letter(2+len(comps))}{paj_row})").number_format = MONEY | |
| 65 | + ws.cell(row=row, column=3, value=f"=MEDIAN({get_column_letter(3)}{paj_row}:{get_column_letter(2+len(comps))}{paj_row})").number_format = MONEY | |
| 66 | + for c in range(1, 8): ws.column_dimensions[get_column_letter(c)].width = 26 if c == 1 else 16 | |
| 67 | + wb.save(OUT / "cas1_grille_comparaison.xlsx") | |
| 68 | + | |
| 69 | +def dcf_cas3(): | |
| 70 | + r = cas3.tout(); e = r["etat"]; b = r["base"]; h = r["hyp"]; proj = r["projection"]; f = r["financement"] | |
| 71 | + wb = Workbook(); ws = wb.active; ws.title = "Hypothèses"; avert(ws, 1) | |
| 72 | + ws.cell(row=2, column=1, value="Cas 3 — 12 logements à Montréal : capitalisation, DCF et financement (chapitres 28-31, 47)").font = Font(bold=True, size=13) | |
| 73 | + hyp = [("Taux d'inoccupation et pertes", h["taux_inoccupation_pertes"], PCT), ("Croissance loyers contractuels (TAL)", h["croissance_loyers_contrat"], PCT), ("Croissance loyers de marché", h["croissance_loyers_marche"], PCT), | |
| 74 | + ("Rotation annuelle", h["rotation_annuelle"], PCT), ("Croissance des dépenses", h["croissance_depenses"], PCT), ("Taux d'actualisation", h["taux_actualisation"], PCT), ("Taux terminal", h["taux_terminal"], PCT), | |
| 75 | + ("Coûts de vente", h["couts_vente"], PCT), ("Taux de capitalisation retenu (médiane extraite)", r["taux"]["mediane"], PCT), ("RPV max", h["financement"]["rpv"], PCT), ("Taux hypothécaire (nominal, semestriel)", h["financement"]["taux"], PCT), | |
| 76 | + ("Amortissement (mois)", h["financement"]["amortissement_mois"], "0"), ("RCD minimal", h["financement"]["rcd_min"], "0.00")] | |
| 77 | + names = {} | |
| 78 | + for i, (lab, v, fmt) in enumerate(hyp, 4): | |
| 79 | + ws.cell(row=i, column=1, value=lab); c = ws.cell(row=i, column=2, value=float(v)); c.number_format = fmt; names[lab] = f"Hypothèses!$B${i}" | |
| 80 | + ws.column_dimensions["A"].width = 46; ws.column_dimensions["B"].width = 14 | |
| 81 | + # état locatif | |
| 82 | + w2 = wb.create_sheet("État locatif"); avert(w2, 1); entete(w2, 3, ["Logement", "Pièces", "Chambres", "Superficie (m²)", "Loyer contrat ($/mois)", "Loyer marché ($/mois)", "Écart ($/mois)", "Locataire depuis"]) | |
| 83 | + for i, row in e.iterrows(): | |
| 84 | + rr = 4 + i | |
| 85 | + for j, k in enumerate(["logement", "pieces", "chambres", "superficie_m2", "loyer_mensuel_contrat", "loyer_mensuel_marche"], 1): | |
| 86 | + v = row[k]; w2.cell(row=rr, column=j, value=float(v) if isinstance(v, (int, float)) and k not in ("logement",) else str(v)) | |
| 87 | + w2.cell(row=rr, column=7, value=f"=F{rr}-E{rr}"); w2.cell(row=rr, column=8, value=int(row["locataire_depuis"])) | |
| 88 | + last = 3 + len(e); w2.cell(row=last + 1, column=1, value="Total mensuel").font = Font(bold=True) | |
| 89 | + for col in "EFG": w2.cell(row=last + 1, column=ord(col) - 64, value=f"=SUM({col}4:{col}{last})").number_format = MONEY | |
| 90 | + w2.cell(row=last + 2, column=1, value="RBP annuel (contrat)").font = Font(bold=True); w2.cell(row=last + 2, column=5, value=f"=E{last+1}*12").number_format = MONEY | |
| 91 | + w2.cell(row=last + 2, column=6, value=f"=F{last+1}*12").number_format = MONEY | |
| 92 | + rbp_ref = f"'État locatif'!$E${last+2}" | |
| 93 | + # dépenses | |
| 94 | + w3 = wb.create_sheet("Dépenses et RNE"); avert(w3, 1); entete(w3, 3, ["Poste", "Historique 2025 ($)", "Normalisé ($)", "Type"]) | |
| 95 | + det = b["detail"] | |
| 96 | + for i, row in det.reset_index(drop=True).iterrows(): | |
| 97 | + rr = 4 + i; w3.cell(row=rr, column=1, value=row["poste"]); w3.cell(row=rr, column=2, value=None if row["historique_2025"] != row["historique_2025"] else float(row["historique_2025"])).number_format = MONEY | |
| 98 | + w3.cell(row=rr, column=3, value=round(float(row["normalise"]), 2)).number_format = MONEY; w3.cell(row=rr, column=4, value=row["type"]) | |
| 99 | + ld = 3 + len(det) | |
| 100 | + w3.cell(row=ld + 2, column=1, value="RBP (contrat)"); w3.cell(row=ld + 2, column=3, value=f"={rbp_ref}").number_format = MONEY | |
| 101 | + w3.cell(row=ld + 3, column=1, value="Autres revenus"); w3.cell(row=ld + 3, column=3, value=float(b["autres_revenus"])).number_format = MONEY | |
| 102 | + w3.cell(row=ld + 4, column=1, value="Inoccupation et pertes"); w3.cell(row=ld + 4, column=3, value=f"=-C{ld+2}*{names['Taux d\'inoccupation et pertes']}").number_format = MONEY | |
| 103 | + w3.cell(row=ld + 5, column=1, value="RBE").font = Font(bold=True); w3.cell(row=ld + 5, column=3, value=f"=C{ld+2}+C{ld+3}+C{ld+4}").number_format = MONEY | |
| 104 | + w3.cell(row=ld + 6, column=1, value="Dépenses totales (réserve incluse)"); w3.cell(row=ld + 6, column=3, value=f"=SUM(C4:C{ld})").number_format = MONEY | |
| 105 | + w3.cell(row=ld + 7, column=1, value="RNE").font = Font(bold=True); w3.cell(row=ld + 7, column=3, value=f"=C{ld+5}-C{ld+6}").number_format = MONEY | |
| 106 | + w3.cell(row=ld + 8, column=1, value="Ratio de dépenses"); w3.cell(row=ld + 8, column=3, value=f"=C{ld+6}/C{ld+5}").number_format = PCT | |
| 107 | + w3.cell(row=ld + 10, column=1, value="Valeur par capitalisation directe (RNE année 1 / R)").font = Font(bold=True) | |
| 108 | + w3.cell(row=ld + 10, column=3, value=f"='DCF'!C5/{names['Taux de capitalisation retenu (médiane extraite)']}").number_format = MONEY | |
| 109 | + w3.column_dimensions["A"].width = 44; w3.column_dimensions["B"].width = 18; w3.column_dimensions["C"].width = 18 | |
| 110 | + # DCF | |
| 111 | + w4 = wb.create_sheet("DCF"); avert(w4, 1); entete(w4, 3, ["Année", "RBP ($)", "RNE ($)", "CAPEX ($)", "Flux avant dette ($)", "Facteur d'actualisation", "VA ($)"]) | |
| 112 | + T = h["horizon_ans"] | |
| 113 | + for i, row in proj.iterrows(): | |
| 114 | + rr = 4 + i; w4.cell(row=rr, column=1, value=int(row["annee"])) | |
| 115 | + w4.cell(row=rr, column=2, value=round(float(row["rbp"]), 2)).number_format = MONEY; w4.cell(row=rr, column=3, value=round(float(row["rne"]), 2)).number_format = MONEY | |
| 116 | + w4.cell(row=rr, column=4, value=round(float(row["capex"]), 2)).number_format = MONEY; w4.cell(row=rr, column=5, value=f"=C{rr}-D{rr}").number_format = MONEY | |
| 117 | + if row["annee"] <= T: | |
| 118 | + w4.cell(row=rr, column=6, value=f"=1/(1+{names['Taux d\'actualisation']})^A{rr}").number_format = "0.0000"; w4.cell(row=rr, column=7, value=f"=E{rr}*F{rr}").number_format = MONEY | |
| 119 | + rT1 = 4 + T; rT = 3 + T | |
| 120 | + w4.cell(row=rT1 + 2, column=1, value="Valeur terminale brute = RNE(T+1)/R_T"); w4.cell(row=rT1 + 2, column=7, value=f"=C{rT1}/{names['Taux terminal']}").number_format = MONEY | |
| 121 | + w4.cell(row=rT1 + 3, column=1, value="Valeur terminale nette (après coûts de vente)"); w4.cell(row=rT1 + 3, column=7, value=f"=G{rT1+2}*(1-{names['Coûts de vente']})").number_format = MONEY | |
| 122 | + w4.cell(row=rT1 + 4, column=1, value="VA de la valeur terminale"); w4.cell(row=rT1 + 4, column=7, value=f"=G{rT1+3}*F{rT}").number_format = MONEY | |
| 123 | + w4.cell(row=rT1 + 5, column=1, value="VA des flux (années 1 à T)"); w4.cell(row=rT1 + 5, column=7, value=f"=SUM(G4:G{rT})").number_format = MONEY | |
| 124 | + w4.cell(row=rT1 + 6, column=1, value="VALEUR DCF").font = Font(bold=True); w4.cell(row=rT1 + 6, column=7, value=f"=G{rT1+4}+G{rT1+5}").number_format = MONEY | |
| 125 | + w4.cell(row=rT1 + 7, column=1, value="Part de la valeur terminale"); w4.cell(row=rT1 + 7, column=7, value=f"=G{rT1+4}/G{rT1+6}").number_format = PCT | |
| 126 | + w4.cell(row=rT1 + 8, column=1, value=f"Contrôle : valeur calculée par traite.cas3 = {round(r['dcf']['valeur'])} $").font = NOTE | |
| 127 | + w4.column_dimensions["A"].width = 44 | |
| 128 | + for c in "BCDEFG": w4.column_dimensions[c].width = 16 | |
| 129 | + # financement | |
| 130 | + w5 = wb.create_sheet("Financement"); avert(w5, 1) | |
| 131 | + w5.cell(row=3, column=1, value="Valeur retenue (DCF)"); w5.cell(row=3, column=2, value=f"='DCF'!G{rT1+6}").number_format = MONEY | |
| 132 | + w5.cell(row=4, column=1, value="RNE année 1"); w5.cell(row=4, column=2, value="='DCF'!C4").number_format = MONEY | |
| 133 | + w5.cell(row=5, column=1, value="Taux mensuel équivalent (composition semestrielle)"); w5.cell(row=5, column=2, value=f"=(1+{names['Taux hypothécaire (nominal, semestriel)']}/2)^(1/6)-1").number_format = "0.000000" | |
| 134 | + w5.cell(row=6, column=1, value="Constante hypothécaire annuelle f"); w5.cell(row=6, column=2, value=f"=12*B5/(1-(1+B5)^(-{names['Amortissement (mois)']}))").number_format = "0.000000" | |
| 135 | + w5.cell(row=7, column=1, value="Prêt max par RPV"); w5.cell(row=7, column=2, value=f"=B3*{names['RPV max']}").number_format = MONEY | |
| 136 | + w5.cell(row=8, column=1, value="Prêt max par RCD"); w5.cell(row=8, column=2, value=f"=B4/{names['RCD minimal']}/B6").number_format = MONEY | |
| 137 | + w5.cell(row=9, column=1, value="Prêt retenu (le plus faible)").font = Font(bold=True); w5.cell(row=9, column=2, value="=MIN(B7,B8)").number_format = MONEY | |
| 138 | + w5.cell(row=10, column=1, value="Service de la dette annuel"); w5.cell(row=10, column=2, value="=B9*B6").number_format = MONEY | |
| 139 | + w5.cell(row=11, column=1, value="RCD"); w5.cell(row=11, column=2, value="=B4/B10").number_format = "0.000" | |
| 140 | + w5.cell(row=12, column=1, value="RPV"); w5.cell(row=12, column=2, value="=B9/B3").number_format = PCT | |
| 141 | + w5.cell(row=13, column=1, value="Mise de fonds"); w5.cell(row=13, column=2, value="=B3-B9").number_format = MONEY | |
| 142 | + w5.cell(row=14, column=1, value=f"Contrôle : prêt calculé par traite.cas3 = {round(f['pret'])} $ ({f['contrainte']})").font = NOTE | |
| 143 | + w5.column_dimensions["A"].width = 50; w5.column_dimensions["B"].width = 18 | |
| 144 | + wb.save(OUT / "cas3_dcf_12_logements.xlsx") | |
| 145 | + | |
| 146 | +def amortissement(): | |
| 147 | + wb = Workbook(); ws = wb.active; ws.title = "Calculateur" | |
| 148 | + ws.cell(row=1, column=1, value="Calculateur d'hypothèque canadienne (composition semestrielle, Loi sur l'intérêt art. 6) — chapitre 31").font = Font(bold=True, size=12) | |
| 149 | + ws.cell(row=3, column=1, value="Capital emprunté ($)"); ws.cell(row=3, column=2, value=300000).number_format = MONEY | |
| 150 | + ws.cell(row=4, column=1, value="Taux nominal annuel"); ws.cell(row=4, column=2, value=0.05).number_format = PCT | |
| 151 | + ws.cell(row=5, column=1, value="Amortissement (mois)"); ws.cell(row=5, column=2, value=300) | |
| 152 | + ws.cell(row=6, column=1, value="Taux mensuel équivalent"); ws.cell(row=6, column=2, value="=(1+B4/2)^(1/6)-1").number_format = "0.0000000" | |
| 153 | + ws.cell(row=7, column=1, value="Paiement mensuel ($)").font = Font(bold=True); ws.cell(row=7, column=2, value="=B3*B6/(1-(1+B6)^(-B5))").number_format = '#,##0.00 "$"' | |
| 154 | + ws.cell(row=8, column=1, value="Contrôle (traite.finance) : 300 000 $ à 5 %% sur 25 ans = %.2f $" % fin.Hypotheque(300000, 0.05, 300).paiement).font = NOTE | |
| 155 | + entete(ws, 10, ["Mois", "Paiement", "Intérêt", "Capital", "Solde"]) | |
| 156 | + ws.cell(row=11, column=1, value=0); ws.cell(row=11, column=5, value="=B3").number_format = MONEY | |
| 157 | + for k in range(1, 361): | |
| 158 | + r = 11 + k | |
| 159 | + ws.cell(row=r, column=1, value=f'=IF(A{r-1}<$B$5,A{r-1}+1,"")') | |
| 160 | + ws.cell(row=r, column=2, value=f'=IF(A{r}="","",$B$7)').number_format = MONEY | |
| 161 | + ws.cell(row=r, column=3, value=f'=IF(A{r}="","",E{r-1}*$B$6)').number_format = MONEY | |
| 162 | + ws.cell(row=r, column=4, value=f'=IF(A{r}="","",B{r}-C{r})').number_format = MONEY | |
| 163 | + ws.cell(row=r, column=5, value=f'=IF(A{r}="","",MAX(E{r-1}-D{r},0))').number_format = MONEY | |
| 164 | + ws.column_dimensions["A"].width = 30 | |
| 165 | + for c in "BCDE": ws.column_dimensions[c].width = 16 | |
| 166 | + wb.save(OUT / "amortissement_hypothecaire.xlsx") | |
| 167 | + | |
| 168 | +if __name__ == "__main__": | |
| 169 | + grille_cas1(); dcf_cas3(); amortissement() | |
| 170 | + print("classeurs écrits dans spreadsheets/ :", sorted(p.name for p in OUT.glob("*.xlsx"))) | |
deleted
manuscript/_wrap_ch29.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/ch29/_labels.tex} | |
| 7 | −\begin{document} | |
| 8 | −\setcounter{chapter}{28} | |
| 9 | −\input{chapters/ch29.tex} | |
| 10 | −\appendix\chapter{Solutions du chapitre}\input{../solutions/ch29.tex} | |
| 11 | −\printbibliography | |
| 12 | −\end{document} | |
added
manuscript/appendices/_inventaire.tex
+85 −0
@@ -0,0 +1,85 @@ | ||
| 1 | +\begin{longtable}{lp{48mm}p{62mm}} | |
| 2 | +\caption{Scripts du dépôt (modules, calculs, figures, tests, outils)}\label{tab:app:scripts}\\ | |
| 3 | +\toprule Type & Fichier & Rôle \\ \midrule \endfirsthead | |
| 4 | +\toprule Type & Fichier & Rôle \\ \midrule \endhead | |
| 5 | +\bottomrule \endfoot | |
| 6 | +module & \texttt{analysis/python/traite/cas1.py} & Cas 1 — maison unifamiliale à Gatineau (données synthétiques) : calculs PARTAGÉS par les chapitres 9, 14, 16-2 \\ | |
| 7 | +module & \texttt{analysis/python/traite/cas2.py} & Cas 2 — triplex à Québec, Limoilou (données synthétiques) : calculs PARTAGÉS par les chapitres 26, 27, 32 et 4 \\ | |
| 8 | +module & \texttt{analysis/python/traite/cas3.py} & Cas 3 — immeuble de 12 logements à Montréal (données synthétiques) : calculs PARTAGÉS par les chapitres 26-31, \\ | |
| 9 | +module & \texttt{analysis/python/traite/cas4.py} & Cas 4 — portefeuille multirésidentiel interrégional (données synthétiques) : calculs PARTAGÉS par les chapitre \\ | |
| 10 | +module & \texttt{analysis/python/traite/comparables.py} & Méthode de comparaison : grille d'ajustements, ajustements séquentiels, ventes appariées, réconciliation. \\ | |
| 11 | +module & \texttt{analysis/python/traite/cout.py} & Méthode du coût : coût neuf, dépréciation (physique, fonctionnelle, externe), extraction de marché. \\ | |
| 12 | +module & \texttt{analysis/python/traite/finance.py} & Mathématiques financières de l'évaluation immobilière (conventions déclarées). \\ | |
| 13 | +module & \texttt{analysis/python/traite/hedonique.py} & Outils économétriques : hédonique semi-log, indices (dummies temporelles, ventes répétées BMN / Case–Shiller), \\ | |
| 14 | +module & \texttt{analysis/python/traite/style.py} & Style graphique du traité (Matplotlib). Palette validée : styles/palette.json. \\ | |
| 15 | +module & \texttt{analysis/python/traite/synth.py} & Génération des quatre dossiers de cas SYNTHÉTIQUES du traité. \\ | |
| 16 | +calcul & \texttt{analysis/python/cases/ch16\_selection.py} & Chapitre 16 — sélection des comparables pour le sujet du cas 1 (Gatineau, données synthétiques). \\ | |
| 17 | +calcul & \texttt{analysis/python/cases/ch21\_cout\_neuf.py} & Chapitre 21 — coût neuf (remplacement) du sujet du cas 1 (Gatineau, DONNÉES SYNTHÉTIQUES) et indexation IPCB ( \\ | |
| 18 | +calcul & \texttt{analysis/python/cases/ch29\_capitalisation.py} & Chapitre 29 — Capitalisation directe : calculs du cas 3 (12 logements, Rosemont ; DONNÉES SYNTHÉTIQUES). \\ | |
| 19 | +calcul & \texttt{analysis/python/cases/ch30\_dcf.py} & Chapitre 30 — Flux actualisés et valeur terminale : exemple intégral du cas 3 (12 logements, Montréal, \\ | |
| 20 | +calcul & \texttt{analysis/python/cases/ch47\_dossier.py} & Chapitre 47 — Cas 3 : immeuble de 12 logements à Montréal (DONNÉES SYNTHÉTIQUES, immeuble fictif). \\ | |
| 21 | +calcul & \texttt{analysis/python/cases/generate\_all.py} & Régénère tous les jeux synthétiques (graine fixée). Usage : python3 -m analysis.python.cases.generate\_all (de \\ | |
| 22 | +calcul & \texttt{analysis/python/cases/make\_spreadsheets.py} & Classeurs Excel du traité (openpyxl, formules vivantes) : spreadsheets/ \\ | |
| 23 | +figure & \texttt{analysis/python/figures/ch21\_decomposition.py} & Figure ch21 — décomposition du coût neuf du sujet du cas 1 par corps de métier (DONNÉES SYNTHÉTIQUES, graine 2 \\ | |
| 24 | +figure & \texttt{analysis/python/figures/ch21\_ipcb.py} & Figure ch21 — IPCB Montréal (Statistique Canada, tableau 18-10-0289-01, base 2023 = 100), données RÉELLES lues \\ | |
| 25 | +figure & \texttt{analysis/python/figures/ch21\_sensibilite.py} & Figure ch21 — sensibilité du coût neuf du sujet du cas 1 (DONNÉES SYNTHÉTIQUES) : (a) grille taux d'indirects \\ | |
| 26 | +figure & \texttt{analysis/python/figures/ch29\_figures.py} & Chapitre 29 — figures (5) : taux extraits (histogramme), taux vs état/taille (nuage), surface V(RNE, R) (carte \\ | |
| 27 | +figure & \texttt{analysis/python/figures/ch30\_flux.py} & Ch. 30, figure « flux » : RNE, CAPEX et flux net avant dette (barres) du cas 3 (DONNÉES SYNTHÉTIQUES), puis va \\ | |
| 28 | +figure & \texttt{analysis/python/figures/ch30\_gdc.py} & Ch. 30, figure « gdc » (DONNÉES RÉELLES, Banque du Canada, API Valet, téléchargées le 2026-10-31) : rendements \\ | |
| 29 | +figure & \texttt{analysis/python/figures/ch30\_loyers.py} & Ch. 30, figure « loyers » : trajectoire du revenu brut potentiel contractuel (indexé au taux TAL + relocation \\ | |
| 30 | +figure & \texttt{analysis/python/figures/ch30\_surface.py} & Ch. 30, figure « surface » : valeur DCF du cas 3 (DONNÉES SYNTHÉTIQUES) selon le taux d'actualisation r (ligne \\ | |
| 31 | +figure & \texttt{analysis/python/figures/ch30\_tornade.py} & Ch. 30, figure « tornade » : variation de la valeur DCF du cas 3 (DONNÉES SYNTHÉTIQUES) pour un choc bas/haut \\ | |
| 32 | +figure & \texttt{analysis/python/figures/ch47\_dossier\_figures.py} & Chapitre 47 — figures du dossier « 12 logements à Montréal » (DONNÉES SYNTHÉTIQUES, graine 20261031). \\ | |
| 33 | +figure & \texttt{analysis/python/figures/run\_all.py} & Exécute tous les scripts de figures (analysis/python/figures/chNN\_*.py) et les scripts R (analysis/r/chNN\_*. \\ | |
| 34 | +test & \texttt{analysis/python/tests/conftest.py} & \\ | |
| 35 | +test & \texttt{analysis/python/tests/test\_cas1.py} & \\ | |
| 36 | +test & \texttt{analysis/python/tests/test\_cas2\_cas4.py} & \\ | |
| 37 | +test & \texttt{analysis/python/tests/test\_cas3.py} & \\ | |
| 38 | +test & \texttt{analysis/python/tests/test\_ch16.py} & Chapitre 16 — vérification des chiffres cités dans le texte et les solutions. \\ | |
| 39 | +test & \texttt{analysis/python/tests/test\_ch21.py} & Tests du chapitre 21 — coût neuf du sujet du cas 1, IPCB Montréal, sensibilité et exercices. \\ | |
| 40 | +test & \texttt{analysis/python/tests/test\_ch29.py} & Tests du chapitre 29 — capitalisation directe (cas 3, données synthétiques). \\ | |
| 41 | +test & \texttt{analysis/python/tests/test\_ch30.py} & Tests du chapitre 30 — flux actualisés et valeur terminale (cas 3, données synthétiques). \\ | |
| 42 | +test & \texttt{analysis/python/tests/test\_ch47.py} & Tests du chapitre 47 (cas 3, 12 logements à Montréal — données synthétiques) : identités, valeurs citées dans \\ | |
| 43 | +test & \texttt{analysis/python/tests/test\_comparables.py} & \\ | |
| 44 | +test & \texttt{analysis/python/tests/test\_cout.py} & \\ | |
| 45 | +test & \texttt{analysis/python/tests/test\_finance.py} & \\ | |
| 46 | +test & \texttt{analysis/python/tests/test\_hedonique.py} & \\ | |
| 47 | +test & \texttt{analysis/python/tests/test\_synth.py} & \\ | |
| 48 | +outil & \texttt{tools/check\_manuscript.py} & Vérifications du manuscrit : stubs restants, figures manquantes, scripts des figures, \\ | |
| 49 | +outil & \texttt{tools/inventaire.py} & Inventaire des scripts, tests, données, figures et classeurs → manuscript/appendices/\_inventaire.tex (longtab \\ | |
| 50 | +outil & \texttt{tools/make\_labels.py} & Écrit un fichier d'étiquettes (newlabel) pour tous les chapitres et annexes, afin que cref{ch:NN} / cref{app:x \\ | |
| 51 | +outil & \texttt{tools/make\_release.py} & Assemble release/ : PDF, sources LaTeX, données, figures, scripts, classeurs, corrigés, rapport de validation. \\ | |
| 52 | +outil & \texttt{tools/merge\_sources.py} & Fusionne sources/registry-*.csv → sources/registry.csv, sources/normes-*.csv → sources/normes-matrice.csv, \\ | |
| 53 | +outil & \texttt{tools/compile\_chapter.sh} & !/usr/bin/env bash \\ | |
| 54 | +\end{longtable} | |
| 55 | + | |
| 56 | +\begin{longtable}{lr} | |
| 57 | +\caption{Jeux de données synthétiques}\label{tab:app:donnees}\\ | |
| 58 | +\toprule Fichier & Taille \\ \midrule \endfirsthead | |
| 59 | +\toprule Fichier & Taille \\ \midrule \endhead | |
| 60 | +\bottomrule \endfoot | |
| 61 | +\texttt{data/synthetic/README.md} & 15 ko \\ | |
| 62 | +\texttt{data/synthetic/calibration.json} & 93 ko \\ | |
| 63 | +\texttt{data/synthetic/calibration\_journal.csv} & 6 ko \\ | |
| 64 | +\texttt{data/synthetic/cas1\_gatineau\_couts.csv} & 2 ko \\ | |
| 65 | +\texttt{data/synthetic/cas1\_gatineau\_sujet.json} & 1 ko \\ | |
| 66 | +\texttt{data/synthetic/cas1\_gatineau\_ventes.csv} & 65 ko \\ | |
| 67 | +\texttt{data/synthetic/cas2\_quebec\_depenses.csv} & 0 ko \\ | |
| 68 | +\texttt{data/synthetic/cas2\_quebec\_loyers.csv} & 0 ko \\ | |
| 69 | +\texttt{data/synthetic/cas2\_quebec\_sujet.json} & 0 ko \\ | |
| 70 | +\texttt{data/synthetic/cas2\_quebec\_ventes\_plex.csv} & 28 ko \\ | |
| 71 | +\texttt{data/synthetic/cas3\_montreal\_comparables.csv} & 4 ko \\ | |
| 72 | +\texttt{data/synthetic/cas3\_montreal\_depenses.csv} & 1 ko \\ | |
| 73 | +\texttt{data/synthetic/cas3\_montreal\_etat\_locatif.csv} & 1 ko \\ | |
| 74 | +\texttt{data/synthetic/cas3\_montreal\_hypotheses\_dcf.json} & 1 ko \\ | |
| 75 | +\texttt{data/synthetic/cas3\_montreal\_sujet.json} & 0 ko \\ | |
| 76 | +\texttt{data/synthetic/cas4\_portefeuille.csv} & 6 ko \\ | |
| 77 | +\texttt{data/synthetic/cas4\_portefeuille\_series.csv} & 33 ko \\ | |
| 78 | +\end{longtable} | |
| 79 | + | |
| 80 | +\begin{itemize} | |
| 81 | +\item \texttt{spreadsheets/amortissement\_hypothecaire.xlsx} | |
| 82 | +\item \texttt{spreadsheets/cas1\_grille\_comparaison.xlsx} | |
| 83 | +\item \texttt{spreadsheets/cas3\_dcf\_12\_logements.xlsx} | |
| 84 | +\end{itemize} | |
| 85 | +\noindent Figures PDF générées : 24. | |
| \ No newline at end of file | ||
modified
manuscript/chapters/ch21.tex
+13 −13
@@ -261,17 +261,17 @@ La source publique de référence pour l'évolution des coûts est l'Indice des | ||
| 261 | 261 | La \cref{fig:21:ipcb} et le \cref{tab:21:ipcb} résument la trajectoire montréalaise. L'indice de la maison individuelle a progressé de 66,1 au premier trimestre de 2017 à 116,5 au troisième trimestre de 2026, soit un facteur de 1,76 ou une croissance composée de 6,15 \% par année ; la quasi-totalité de l'écart s'est creusée entre le début de 2020 et la fin de 2022, période pendant laquelle l'indice a gagné 36 \%, avec un pic de hausse trimestrielle de 4,75 \% au quatrième trimestre de 2021. Après une accalmie en 2023, la hausse a repris : 8,6 \% entre le troisième trimestre de 2025 et celui de 2026, tant pour la maison individuelle que pour l'ensemble résidentiel. Ces ordres de grandeur ont une conséquence directe pour l'évaluateur : un coût neuf établi il y a un an est déjà périmé de près de 9 \%, et un coût de 2019 doit être multiplié par 1,62 pour être exprimé en dollars de 2026. L'Indice des prix des logements neufs (IPLN, tableau 18-10-0205-01) est parfois confondu avec l'IPCB ; il mesure le prix de vente des maisons neuves, terrain compris, et non leur coût de construction, et il a progressé beaucoup moins vite à Montréal sur la même période, ce qui illustre la distinction entre prix et coût plutôt qu'il ne la contredit. |
| 262 | 262 | |
| 263 | 263 | \begin{table}[tbp] |
| 264 | −\caption{IPCB Montréal, valeurs choisies (indice, 2023 = 100) et ratios d'indexation vers le T3 2026.}\label{tab:21:ipcb} | |
| 265 | −\centering\small | |
| 264 | +\caption{IPCB Montréal, valeurs choisies (indice, 2023 = 100) et ratio d'indexation du T3 2019 vers le T3 2026.}\label{tab:21:ipcb} | |
| 265 | +\centering\footnotesize | |
| 266 | 266 | \begin{tabular}{@{}l S[table-format=3.1] S[table-format=3.1] S[table-format=3.1] S[table-format=3.1] S[table-format=3.1] S[table-format=3.1] S[table-format=1.3]@{}} |
| 267 | 267 | \toprule |
| 268 | −Type d'immeuble & {T1 2017} & {T3 2019} & {T3 2021} & {T3 2023} & {T3 2025} & {T3 2026} & {T3 2026 / T3 2019} \\ | |
| 268 | +Type d'immeuble & {T1 2017} & {T3 2019} & {T3 2021} & {T3 2023} & {T3 2025} & {T3 2026} & {Ratio} \\ | |
| 269 | 269 | \midrule |
| 270 | −Bâtiments résidentiels & 65.5 & 71.6 & 86.0 & 99.9 & 108.5 & 117.8 & 1.645 \\ | |
| 270 | +Résidentiel (ensemble) & 65.5 & 71.6 & 86.0 & 99.9 & 108.5 & 117.8 & 1.645 \\ | |
| 271 | 271 | Maison individuelle & 66.1 & 71.9 & 86.3 & 100.0 & 107.3 & 116.5 & 1.620 \\ |
| 272 | −Immeuble d'appartements, moins de cinq étages & 64.8 & 70.9 & 85.9 & 99.7 & 108.5 & 118.5 & 1.671 \\ | |
| 273 | −Tour d'habitation, cinq étages ou plus & 69.9 & 76.7 & 85.6 & 100.6 & 110.8 & 119.5 & 1.558 \\ | |
| 274 | −Bâtiments non résidentiels & 67.3 & 75.0 & 85.3 & 100.4 & 108.5 & 114.4 & 1.525 \\ | |
| 272 | +Appartements, moins de 5 étages & 64.8 & 70.9 & 85.9 & 99.7 & 108.5 & 118.5 & 1.671 \\ | |
| 273 | +Tour, 5 étages ou plus & 69.9 & 76.7 & 85.6 & 100.6 & 110.8 & 119.5 & 1.558 \\ | |
| 274 | +Non résidentiel & 67.3 & 75.0 & 85.3 & 100.4 & 108.5 & 114.4 & 1.525 \\ | |
| 275 | 275 | \bottomrule |
| 276 | 276 | \end{tabular} |
| 277 | 277 | \tabsource{Statistique Canada, tableau 18-10-0289-01, Montréal, agrégat des divisions, diffusé le 29 octobre 2026 (consulté le 31 octobre 2026) ; ratios calculés par \texttt{analysis/python/cases/ch21\_cout\_neuf.py}.} |
@@ -334,9 +334,9 @@ Le coût neuf de \dollars{397567} est le point de départ du \cref{ch:24}, qui e | ||
| 334 | 334 | \end{exemple} |
| 335 | 335 | |
| 336 | 336 | \begin{table}[tbp] |
| 337 | −\caption{Devis par composantes du sujet du cas 1 regroupé par corps de métier, et calcul du coût neuf (dollars du T3 2026).}\label{tab:21:devis} | |
| 337 | +\caption{Devis par composantes du sujet du cas 1 regroupé par corps de métier, et calcul du coût neuf (dollars du T3 2026). Les coûts indirects regroupent cinq postes : permis et études, supervision de chantier, assurances et cautionnement, plans et honoraires professionnels, financement intérimaire.}\label{tab:21:devis} | |
| 338 | 338 | \centering\small |
| 339 | −\begin{tabular}{@{}l S[table-format=2.0] S[table-format=6.2] S[table-format=2.1]@{}} | |
| 339 | +\begin{tabular}{@{}l S[table-format=2.0] S[table-format=6.2] S[table-format=3.1]@{}} | |
| 340 | 340 | \toprule |
| 341 | 341 | Bloc & {Postes} & {Montant (\$)} & {Part de $D+I$ (\%)} \\ |
| 342 | 342 | \midrule |
@@ -348,9 +348,9 @@ Mécanique et électricité & 6 & 51105.45 & 14.1 \\ | ||
| 348 | 348 | Aménagements extérieurs & 4 & 16607.70 & 4.6 \\ |
| 349 | 349 | \midrule |
| 350 | 350 | Coûts directs $D$ & 33 & 298826.17 & 82.7 \\ |
| 351 | −Coûts indirects $I$ (permis et études, supervision, assurances, plans et honoraires, financement intérimaire) & 5 & 62598.68 & 17.3 \\ | |
| 351 | +Coûts indirects $I$ (cinq postes) & 5 & 62598.68 & 17.3 \\ | |
| 352 | 352 | Sous-total $D + I$ & 38 & 361424.85 & 100.0 \\ |
| 353 | −Incitatif de l'entrepreneur, 10 \% de $(D+I)$ & & 36142.49 & \\ | |
| 353 | +Incitatif de l'entrepreneur, 10 \% de $D+I$ & & 36142.49 & \\ | |
| 354 | 354 | \midrule |
| 355 | 355 | Coût neuf $C_N$ & & 397567.33 & \\ |
| 356 | 356 | \bottomrule |
@@ -367,10 +367,10 @@ Coût neuf $C_N$ & & 397567.33 & \\ | ||
| 367 | 367 | |
| 368 | 368 | \begin{table}[tbp] |
| 369 | 369 | \caption{Coûts unitaires du sujet du cas 1 selon la convention de superficie et la composante retenue, et comparaison avec la fourchette Altus 2026 (Montréal, unifamiliale, hors terrain).}\label{tab:21:unitaires} |
| 370 | −\centering\small | |
| 370 | +\centering\footnotesize | |
| 371 | 371 | \begin{tabular}{@{}l S[table-format=4.0] S[table-format=3.1] S[table-format=4.0] S[table-format=3.1]@{}} |
| 372 | 372 | \toprule |
| 373 | − & \multicolumn{2}{c}{Sur superficie habitable (\msq{165})} & \multicolumn{2}{c}{Sur aire brute des étages (\msq{190})} \\ | |
| 373 | + & \multicolumn{2}{c}{Habitable (\msq{165})} & \multicolumn{2}{c}{Aire brute (\msq{190})} \\ | |
| 374 | 374 | \cmidrule(lr){2-3}\cmidrule(lr){4-5} |
| 375 | 375 | Composante & {\$/m²} & {\$/pi²} & {\$/m²} & {\$/pi²} \\ |
| 376 | 376 | \midrule |
modified
manuscript/chapters/ch29.tex
+12 −7
@@ -66,7 +66,7 @@ Une fois les taux $R_j$ calculés, trois résumés concurrents se présentent. L | ||
| 66 | 66 | \caption{Statistiques des taux globaux extraits de quarante ventes d'immeubles de 6 à 30 logements (cas~3, données synthétiques), revenu net après réserve de remplacement.} |
| 67 | 67 | \label{tab:29:extraction} |
| 68 | 68 | \centering |
| 69 | −\begin{tabular}{l S[table-format=1.3] l} | |
| 69 | +\begin{tabular}{l S[table-format=-1.3] l} | |
| 70 | 70 | \toprule |
| 71 | 71 | {Statistique} & {Taux (\%)} & {Remarque} \\ |
| 72 | 72 | \midrule |
@@ -91,6 +91,7 @@ Régression : effet de la taille (par logement) & -0.023 & $R^2 = 0{,}16$ ; éca | ||
| 91 | 91 | \begin{figure}[htbp] |
| 92 | 92 | \centering |
| 93 | 93 | \includegraphics[width=135mm]{ch29/ch29-fig-taux-extraits.pdf} |
| 94 | +\label{fig:29:taux-extraits} | |
| 94 | 95 | \caption{Distribution des quarante taux globaux extraits du cas~3. La médiane (\pct{4.415}) et les quartiles résument un échantillon dont l'étendue dépasse 170 points de base ; la prévision de la régression pour un immeuble de douze logements en état moyen (\pct{4.57}) se situe au-dessus de la médiane, parce que l'échantillon contient beaucoup de grands immeubles vendus à des taux plus bas.} |
| 95 | 96 | \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}} |
| 96 | 97 | \end{figure} |
@@ -108,6 +109,7 @@ où le centrage sur les attributs du sujet (état~3, douze logements) fait de la | ||
| 108 | 109 | \begin{figure}[htbp] |
| 109 | 110 | \centering |
| 110 | 111 | \includegraphics[width=135mm]{ch29/ch29-fig-taux-etat-taille.pdf} |
| 112 | +\label{fig:29:taux-etat-taille} | |
| 111 | 113 | \caption{Taux extraits selon le nombre de logements, par niveau d'état (trois séries), avec les droites de la régression~\eqref{eq:29:regression}. La pente négative sur la taille et le décalage vers le bas des immeubles en meilleur état sont visibles, mais la dispersion autour des droites (écart-type résiduel de 38 points de base) l'emporte sur les effets systématiques ; l'étoile marque la prévision pour le sujet.} |
| 112 | 114 | \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}} |
| 113 | 115 | \end{figure} |
@@ -194,7 +196,7 @@ Le \cref{tab:29:construction} rassemble les quatre constructions appliquées au | ||
| 194 | 196 | \caption{Quatre constructions du taux global appliquées au cas~3 et comparées à la médiane extraite (\pct{4.415}) ; paramètres du dossier synthétique (financement assuré à \pct{4.12} sur 40 ans, $M = 75~\%$, $\DSCR = 1{,}20$, $Y_E = r = \pct{7.25}$, horizon 10 ans).} |
| 195 | 197 | \label{tab:29:construction} |
| 196 | 198 | \centering |
| 197 | −\small | |
| 199 | +\footnotesize\setlength{\tabcolsep}{4.5pt} | |
| 198 | 200 | \begin{tabular}{l l S[table-format=1.3] S[table-format=7.0]} |
| 199 | 201 | \toprule |
| 200 | 202 | {Construction} & {Paramètres} & {$R$ (\%)} & {$V = \NOI_1/R$ (\$)} \\ |
@@ -218,6 +220,7 @@ Akerson, $\Delta$ implicite & $\Delta = 7{,}68~\%$ ramène $R$ au marché & 4.41 | ||
| 218 | 220 | \begin{figure}[htbp] |
| 219 | 221 | \centering |
| 220 | 222 | \includegraphics[width=135mm]{ch29/ch29-fig-bande-investissement.pdf} |
| 223 | +\label{fig:29:bande} | |
| 221 | 224 | \caption{Décomposition du taux global selon la construction. La part de la dette $M f$ (\pct{3.81}) est identique dans toutes les constructions ; ce sont la rémunération des fonds propres et les crédits pour remboursement du capital et pour appréciation (hachurés, soustraits) qui distinguent les méthodes. Avec l'appréciation du dossier (\pct{24.9} en dix ans), Ellwood tombe à \pct{3.18} ; seule une appréciation implicite de \pct{7.7} ramène le taux à la médiane de marché.} |
| 222 | 225 | \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, paramètres du cas~3, graine 20261031}} |
| 223 | 226 | \end{figure} |
@@ -271,6 +274,7 @@ Un taux de capitalisation se décompose conceptuellement en un taux sans risque, | ||
| 271 | 274 | \begin{figure}[htbp] |
| 272 | 275 | \centering |
| 273 | 276 | \includegraphics[width=135mm]{ch29/ch29-fig-taux-gdc.pdf} |
| 277 | +\label{fig:29:gdc} | |
| 274 | 278 | \caption{Rendements des obligations de référence du gouvernement du Canada à cinq et dix ans et taux hypothécaire conventionnel de cinq ans affiché par les banques à charte, moyennes mensuelles de janvier 2001 à octobre 2026. Après le creux de 2020, la remontée des taux sans risque a rétréci l'écart entre taux de capitalisation et rendement obligataire ; le taux affiché surestime le coût réel de la dette, que les taux des fonds avancés mesurent mieux.} |
| 275 | 279 | \figsource{Banque du Canada, API Valet, séries BD.CDN.5YR.DQ.YLD, BD.CDN.10YR.DQ.YLD et V80691335, extraites le 31 octobre 2026 \parencite{bdcvalet} ; moyennes mensuelles calculées par l'auteur (script \texttt{analysis/python/figures/ch29\_figures.py}).} |
| 276 | 280 | \end{figure} |
@@ -291,14 +295,13 @@ L'immeuble sujet est un bâtiment fictif de douze logements (quatre 3½, six 4½ | ||
| 291 | 295 | \caption{Cas~3 : 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).} |
| 292 | 296 | \label{tab:29:rne} |
| 293 | 297 | \centering |
| 294 | −\small | |
| 295 | −\begin{tabular}{l S[table-format=6.2] l} | |
| 298 | +\begin{tabular}{L{60mm} S[table-format=6.2] L{40mm}} | |
| 296 | 299 | \toprule |
| 297 | 300 | {Poste} & {Montant (\$)} & {Base de normalisation} \\ |
| 298 | 301 | \midrule |
| 299 | 302 | Revenu brut potentiel, loyers contractuels (RBP) & 165540.00 & douze baux en vigueur, $\times 12$ \\ |
| 300 | 303 | \quad\emph{pour mémoire : RBP aux loyers de marché} & {\emph{186 036,00}} & loyers SCHL zone Rosemont, oct. 2025 \\ |
| 301 | −Inoccupation et mauvaises créances (\pct{3.9} du RBP) & -6456.06 & hypothèse du dossier (RMR : \pct{2.9} en oct. 2025) \\ | |
| 304 | +Inoccupation et mauvaises créances (\pct{3.9} du RBP) & -6456.06 & hypothèse du dossier ; RMR : \pct{2.9} en oct. 2025 \\ | |
| 302 | 305 | Autres revenus (stationnement, buanderie) & 9360.00 & six places et services \\ |
| 303 | 306 | \textbf{Revenu brut effectif (RBE)} & \textbf{168443.94} & \\ |
| 304 | 307 | \midrule |
@@ -333,7 +336,7 @@ Les quarante ventes de l'échantillon ont été analysées à la \cref{sec:29:ex | ||
| 333 | 336 | \caption{Les dix ventes les plus proches du sujet (taille, état, âge, quartier, date), avec le revenu net reconstitué après réserve, le prix épuré et le taux global extrait.} |
| 334 | 337 | \label{tab:29:proches} |
| 335 | 338 | \centering |
| 336 | −\small | |
| 339 | +\footnotesize\setlength{\tabcolsep}{4pt} | |
| 337 | 340 | \begin{tabular}{l l l S[table-format=2.0] S[table-format=4.0] S[table-format=6.0] S[table-format=7.0] S[table-format=1.2] S[table-format=2.2]} |
| 338 | 341 | \toprule |
| 339 | 342 | {Vente} & {Date} & {Quartier} & {Log.} & {Année} & {RNE (\$)} & {Prix (\$)} & {Taux (\%)} & {MRB} \\ |
@@ -382,9 +385,10 @@ d'où les élasticités $\varepsilon_R = (\partial V/\partial R)(R/V) = -1$ et $ | ||
| 382 | 385 | \caption{Sensibilité de la valeur indiquée au taux global (par pas de 25 points de base) et au revenu net normalisé ($\pm\,5~\%$) ; cas~3, valeurs en dollars.} |
| 383 | 386 | \label{tab:29:sensibilite} |
| 384 | 387 | \centering |
| 388 | +\footnotesize\setlength{\tabcolsep}{4.5pt} | |
| 385 | 389 | \begin{tabular}{S[table-format=1.2] S[table-format=7.0] S[table-format=7.0] S[table-format=7.0] S[table-format=+2.1]} |
| 386 | 390 | \toprule |
| 387 | −{Taux $R$ (\%)} & {$\NOI_1 - 5~\%$ (\dollars{85458})} & {$\NOI_1$ (\dollars{89956})} & {$\NOI_1 + 5~\%$ (\dollars{94453})} & {Écart au cas de base (\%)} \\ | |
| 391 | +{$R$ (\%)} & {$\NOI_1 - 5~\%$ (\dollars{85458})} & {$\NOI_1$ (\dollars{89956})} & {$\NOI_1 + 5~\%$ (\dollars{94453})} & {Écart (\%)} \\ | |
| 388 | 392 | \midrule |
| 389 | 393 | 3.75 & 2278879 & 2398820 & 2518761 & +17.7 \\ |
| 390 | 394 | 4.00 & 2136449 & 2248894 & 2361339 & +10.4 \\ |
@@ -401,6 +405,7 @@ d'où les élasticités $\varepsilon_R = (\partial V/\partial R)(R/V) = -1$ et $ | ||
| 401 | 405 | \begin{figure}[htbp] |
| 402 | 406 | \centering |
| 403 | 407 | \includegraphics[width=135mm]{ch29/ch29-fig-surface-v.pdf} |
| 408 | +\label{fig:29:surface} | |
| 404 | 409 | \caption{Carte de la valeur indiquée $V = \NOI_1/R$ pour un revenu net variant de $-10$ à $+10~\%$ et un taux de \pct{3.75} à \pct{5.25}. Les iso-valeurs sont des hyperboles : la même valeur de \dollars{1799115} s'obtient avec le revenu de base à \pct{5.00}, avec un revenu réduit de cinq pour cent à \pct{4.75} ou avec un revenu accru de cinq pour cent à \pct{5.25}, ce qui illustre la compensation entre erreurs de revenu et erreurs de taux.} |
| 405 | 410 | \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}} |
| 406 | 411 | \end{figure} |
modified
manuscript/chapters/ch30.tex
+18 −18
@@ -83,11 +83,11 @@ Le revenu brut potentiel d'un immeuble locatif québécois se projette à partir | ||
| 83 | 83 | Le passage de la première trajectoire à la seconde se fait par la \motcle{rotation} des locataires. Lorsqu'un locataire quitte le logement, le locateur conclut un nouveau bail dont le loyer n'est pas soumis au pourcentage de fixation ; il doit toutefois déclarer au nouveau locataire le loyer le plus bas payé au cours des douze mois précédents (section G du bail, art.~1896 C.c.Q.), et celui-ci peut demander la fixation du loyer dans les dix jours (art.~1950 C.c.Q.) \parencite{ccq}. La relocation au loyer de marché n'est donc pas automatique en droit, mais elle est la pratique dominante, et c'est l'hypothèse de modélisation retenue, discutée dans l'encadré québécois ci-dessous. Le modèle du cas 3 suppose qu'une fraction $\rho = \pct{15}$ des logements se libère chaque année, que les logements les plus sous le marché se libèrent en premier et que chacun est reloué à son loyer de marché de l'année ; la SCHL mesurait un taux de rotation de \pct{9.4} dans la RMR de Montréal en 2025, contre \pct{11.1} en 2024 \parencite{schlLocatif2025}, et l'hypothèse de \pct{15} pour un immeuble de petits logements (quatre 3½, six 4½, deux 5½) est volontairement un peu plus élevée que la moyenne régionale ; la section~\ref{sec:30:sensibilite} mesure ce que vaut cette hypothèse. |
| 84 | 84 | |
| 85 | 85 | Formellement, si $L_{i,t}$ est le loyer mensuel contractuel du logement $i$ l'année $t$, $M_{i,t}$ son loyer de marché, $g_c$ le taux d'indexation des baux reconduits et $g_m$ la croissance des loyers de marché, la projection s'écrit |
| 86 | −\begin{equation}\label{eq:30:loyers} | |
| 87 | −M_{i,t} = M_{i,1}(1+g_m)^{t-1}, \qquad | |
| 88 | −L_{i,t} = \begin{cases} M_{i,t} & \text{si le logement } i \text{ est reloué l'année } t,\\ L_{i,t-1}(1+g_c) & \text{sinon,}\end{cases} | |
| 89 | −\qquad RBP_t = 12 \sum_{i=1}^{n} L_{i,t}. | |
| 90 | −\end{equation} | |
| 86 | +\begin{align}\label{eq:30:loyers} | |
| 87 | +M_{i,t} &= M_{i,1}(1+g_m)^{t-1}, & | |
| 88 | +L_{i,t} &= \begin{cases} M_{i,t} & \text{si le logement } i \text{ est reloué l'année } t,\\ L_{i,t-1}(1+g_c) & \text{sinon,}\end{cases} \notag\\ | |
| 89 | +RBP_t &= 12 \sum_{i=1}^{n} L_{i,t}. && | |
| 90 | +\end{align} | |
| 91 | 91 | Avec $g_c < g_m$, un logement qui n'est jamais reloué s'éloigne du marché ; la rotation est le seul mécanisme de rattrapage. La \cref{fig:30:loyers} montre le résultat pour le cas 3 : l'écart entre le revenu brut potentiel contractuel et le revenu au marché, de \dollars{20496} soit \pct{11.0} en 2026, se résorbe presque entièrement en dix ans ; sans relocation, l'indexation seule laisserait un écart croissant. |
| 92 | 92 | |
| 93 | 93 | \begin{figure}[htbp] |
@@ -98,7 +98,7 @@ Avec $g_c < g_m$, un logement qui n'est jamais reloué s'éloigne du marché ; l | ||
| 98 | 98 | \label{fig:30:loyers} |
| 99 | 99 | \end{figure} |
| 100 | 100 | |
| 101 | −\begin{quebec}[Fixation des loyers, rotation et trajectoire contractuelle] | |
| 101 | +\begin{quebec}[{{Fixation des loyers, rotation et trajectoire contractuelle}}] | |
| 102 | 102 | Le droit québécois encadre la trajectoire contractuelle des loyers plus étroitement que celui des autres provinces, et le modélisateur doit en tenir compte. Le bail de logement est reconduit de plein droit (art.~1941 C.c.Q.) ; le locateur qui veut modifier le loyer donne un avis de trois à six mois avant l'échéance (art.~1942) et, si le locataire refuse, c'est le Tribunal administratif du logement qui fixe le loyer selon les critères réglementaires (art.~1947 et 1953 C.c.Q. ; \parencite{ccq}). Depuis le 1\textsuperscript{er} janvier 2026, le Règlement sur les critères de fixation de loyer, modifié par le décret 1455-2025 \parencite{decret1455_2025,reglCriteresFixation}, calcule un pourcentage de base unique égal à la moyenne des trois dernières variations annuelles de l'IPC du Québec (art.~3.1), auquel s'ajoutent la part attribuable au logement des variations de taxes et d'assurances et un rendement de \pct{5} sur les dépenses d'immobilisation (art.~3). Le pourcentage de base publié par le TAL est de \pct{3.1} pour 2026 \parencite{talIndices2026} ; c'est la valeur de $g_c$ du cas 3, que l'on suppose constante faute de connaître les IPC futurs, alors qu'elle suivra en réalité l'inflation moyenne des trois années précédentes avec retard. |
| 103 | 103 | |
| 104 | 104 | Deux conséquences découlent pour la projection. Premièrement, la croissance des loyers contractuels est bornée par l'inflation passée, tandis que les dépenses suivent l'inflation courante : un immeuble sans rotation voit sa marge se comprimer dans les périodes de hausse des coûts. Deuxièmement, le rattrapage du marché dépend de la rotation, elle-même influencée par le droit : la cession de bail ne requiert plus le consentement du locateur pour un motif sérieux seulement, mais celui-ci peut désormais la refuser pour un autre motif, auquel cas le bail est résilié à la date prévue (art.~1978.1 à 1978.4 C.c.Q., introduits par la Loi~31 de 2024 ; \parencite{loi31_2024}), ce qui facilite la relocation au marché ; en revanche le nouveau locataire peut faire fixer le loyer s'il apprend que le loyer précédent était inférieur (art.~1896 et 1950). Les immeubles neufs échappent à la fixation pendant cinq ans à condition que le bail indique le loyer maximal (art.~1955, modifié en 2024). L'hypothèse « relocation au loyer de marché » est donc une approximation favorable au locateur ; un évaluateur prudent la tempère, par exemple en ne relouant qu'à une fraction du marché ou en retardant la rotation, et il en déclare l'effet (\cref{ch:34}). |
@@ -203,7 +203,7 @@ La fonction \texttt{traite.finance.rendement\_fonds\_propres\_levier} résout ce | ||
| 203 | 203 | |
| 204 | 204 | Le levier est dit \emph{positif} lorsque $y_E$ excède le rendement non endetté $r$, ce qui se produit lorsque le coût effectif de la dette est inférieur au rendement total de l'immeuble ; il est \emph{négatif} dans le cas contraire. Il faut distinguer ce levier sur le rendement \emph{total} du levier sur le rendement \emph{courant} : avec un taux de capitalisation de \pct{4.42} et une constante hypothécaire de \pct{5.08} (service de la dette annuel sur capital emprunté), chaque dollar emprunté coûte en service de la dette plus qu'il ne rapporte en revenu net la première année, et le rendement courant des fonds propres, dit \emph{cash-on-cash}, est faible ; c'est la croissance attendue du revenu et de la valeur qui rend le levier positif sur l'horizon. Cette situation, où $R < $ constante hypothécaire $<$ $r$, est celle du marché multirésidentiel montréalais de 2026 et elle explique pourquoi les prêteurs y contraignent les prêts par le ratio de couverture de la dette plutôt que par le ratio prêt-valeur (\cref{ch:31}). |
| 205 | 205 | |
| 206 | −\begin{quebec}[Taux hypothécaires canadiens : la composition semestrielle] | |
| 206 | +\begin{quebec}[{Taux hypothécaires canadiens : la composition semestrielle}] | |
| 207 | 207 | Au Canada, la Loi sur l'intérêt (L.R.C. 1985, c.~I-15, art.~6) exige que le taux d'un prêt hypothécaire à versements périodiques soit exprimé en taux annuel calculé semestriellement ou annuellement, non à l'avance. Un taux « de \pct{4.12} » affiché par un prêteur canadien est donc un taux nominal composé deux fois l'an, et le taux mensuel équivalent est |
| 208 | 208 | \begin{equation}\label{eq:30:taux-mensuel} |
| 209 | 209 | i_m = \left(1 + \frac{i}{2}\right)^{1/6} - 1 = (1{,}0206)^{1/6} - 1 = \pct{0.34042}, |
@@ -276,12 +276,12 @@ Le revenu brut potentiel contractuel des douze baux est de \dollars{165540} ; au | ||
| 276 | 276 | Le \cref{tab:30:projection} déroule la projection pendant onze ans, la onzième année ne servant qu'à la valeur terminale. Le revenu brut potentiel passe de \dollars{165540} à \dollars{259911}, soit \pct{4.6} par an, par l'effet conjugué de l'indexation à \pct{3.1} et de la relocation de deux logements par an environ ($0{,}15 \times 12 = 1{,}8$, arrondi à 2) au loyer de marché ; l'écart au marché se réduit de \pct{11.0} à \pct{1.0}. Les dépenses hors réserve croissent de \pct{3} par an ; la réserve est constante. Le revenu net passe de \dollars{89956} à \dollars{159658}, soit \pct{5.9} par an : la croissance du revenu net excède celle du revenu brut parce que les dépenses, qui en absorbent près de la moitié la première année, croissent moins vite que les loyers. Cet effet de levier opérationnel est la raison pour laquelle les immeubles à loyers déprimés présentent des taux de capitalisation courants bas et des croissances de revenu net élevées. |
| 277 | 277 | |
| 278 | 278 | \begin{table}[htbp] |
| 279 | −\centering\footnotesize | |
| 279 | +\centering\footnotesize\setlength{\tabcolsep}{4pt} | |
| 280 | 280 | \caption{Projection des revenus et des dépenses du cas 3, années 1 à 11 (dollars courants). L'année 11 ne sert qu'au calcul de la valeur terminale.} |
| 281 | 281 | \label{tab:30:projection} |
| 282 | 282 | \begin{tabular}{@{}cc S[table-format=6.0] S[table-format=6.0] S[table-format=6.0] S[table-format=5.0] S[table-format=4.0] S[table-format=6.0]@{}} |
| 283 | 283 | \toprule |
| 284 | −Année & Exercice & {RBP contractuel (\$)} & {RBP au marché (\$)} & {RBE (\$)} & {Dépenses hors réserve (\$)} & {Réserve (\$)} & {RNE (\$)} \\ | |
| 284 | +Année & Exercice & {\makecell{RBP\\contractuel (\$)}} & {\makecell{RBP au\\marché (\$)}} & {RBE (\$)} & {\makecell{Dépenses hors\\réserve (\$)}} & {Réserve (\$)} & {RNE (\$)} \\ | |
| 285 | 285 | \midrule |
| 286 | 286 | 1 & 2026 & 165540 & 186036 & 168444 & 70385 & 8103 & 89956 \\ |
| 287 | 287 | 2 & 2027 & 177389 & 192547 & 180112 & 72497 & 8103 & 99512 \\ |
@@ -369,12 +369,12 @@ Valeur par capitalisation directe (\pct{4.415}) & 2037503 & \\ | ||
| 369 | 369 | Le financement est celui que détermine \texttt{traite.cas3.financement} à partir de la valeur DCF et du revenu net de la première année : un prêt au plus égal à \pct{75} de la valeur, soit \dollars{1656424}, et au plus tel que le ratio de couverture de la dette atteigne $1{,}20$ sur le revenu net de la première année. Au taux nominal de \pct{4.12} composé semestriellement et sur un amortissement de 480 mois, la constante hypothécaire est de \pct{5.079} et le prêt maximal par le ratio de couverture est de \dollars{1475959} ; c'est cette seconde contrainte qui lie, et le prêt retenu représente \pct{66.83} de la valeur. Le paiement mensuel est de \dollars{6247}, le service de la dette annuel de \dollars{74963}, la mise de fonds de \dollars{732606}. Après 120 paiements, le solde du prêt est de \dollars{1295148} ; le produit net de revente qui revient aux fonds propres l'année 10 est donc $3\,113\,338 - 1\,295\,148 = \dollars{1818190}$. |
| 370 | 370 | |
| 371 | 371 | \begin{table}[htbp] |
| 372 | −\centering\footnotesize | |
| 372 | +\centering\footnotesize\setlength{\tabcolsep}{4pt} | |
| 373 | 373 | \caption{Flux après service de la dette et flux des fonds propres du cas 3 (prêt de \dollars{1475959} à \pct{4.12}, 480 mois ; mise de fonds \dollars{732606}).} |
| 374 | 374 | \label{tab:30:levier} |
| 375 | 375 | \begin{tabular}{@{}c S[table-format=6.0] S[table-format=6.0] S[table-format=5.0] S[table-format=-6.0] S[table-format=1.2] S[table-format=-7.0]@{}} |
| 376 | 376 | \toprule |
| 377 | −Année & {RNE (\$)} & {Flux avant dette (\$)} & {Service de la dette (\$)} & {Flux après dette (\$)} & {RCD} & {Flux des fonds propres (\$)} \\ | |
| 377 | +Année & {RNE (\$)} & {\makecell{Flux avant\\dette (\$)}} & {\makecell{Service de\\la dette (\$)}} & {\makecell{Flux après\\dette (\$)}} & {RCD} & {\makecell{Flux des fonds\\propres (\$)}} \\ | |
| 378 | 378 | \midrule |
| 379 | 379 | 0 & & & & & & -732606 \\ |
| 380 | 380 | 1 & 89956 & 89956 & 74963 & 14993 & 1.20 & 14993 \\ |
@@ -441,18 +441,18 @@ Le diagramme en tornade (\cref{fig:30:tornade} et \cref{tab:30:tornade}) fait va | ||
| 441 | 441 | \end{figure} |
| 442 | 442 | |
| 443 | 443 | \begin{table}[htbp] |
| 444 | −\centering\footnotesize | |
| 444 | +\centering\footnotesize\setlength{\tabcolsep}{4pt} | |
| 445 | 445 | \caption{Tornade du cas 3 : valeur aux bornes basse et haute de chaque intrant et amplitude (dollars), base \dollars{2208566}.} |
| 446 | 446 | \label{tab:30:tornade} |
| 447 | 447 | \begin{tabular}{@{}l S[table-format=7.0] S[table-format=7.0] S[table-format=-6.0] S[table-format=-6.0] S[table-format=6.0]@{}} |
| 448 | 448 | \toprule |
| 449 | −Intrant (borne basse / haute) & {$V$ basse (\$)} & {$V$ haute (\$)} & {$\Delta$ basse (\$)} & {$\Delta$ haute (\$)} & {Amplitude (\$)} \\ | |
| 449 | +Intrant (borne basse / haute) & {$V$ basse (\$)} & {$V$ haute (\$)} & {$\Delta$ basse (\$)} & {$\Delta$ haute (\$)} & {Ampl. (\$)} \\ | |
| 450 | 450 | \midrule |
| 451 | −Croissance des loyers de marché (2,5 / \pct{4.5}) & 2055176 & 2423411 & -153390 & 214845 & 368235 \\ | |
| 452 | −Croissance des dépenses (2,0 / \pct{4.0}) & 2310942 & 2096898 & 102376 & -111668 & 214045 \\ | |
| 453 | −Indexation des baux reconduits (2,0 / \pct{4.0}) & 2118624 & 2326053 & -89942 & 117487 & 207429 \\ | |
| 454 | −Taux d'actualisation $r$ ($-50$ / $+\qty{50}{\pb}$) & 2300356 & 2121138 & 91790 & -87428 & 179218 \\ | |
| 455 | −Taux terminal $R_T$ ($-25$ / $+\qty{25}{\pb}$) & 2289943 & 2134939 & 81377 & -73626 & 155003 \\ | |
| 451 | +Croiss. loyers de marché (2,5 / \pct{4.5}) & 2055176 & 2423411 & -153390 & 214845 & 368235 \\ | |
| 452 | +Croiss. des dépenses (2,0 / \pct{4.0}) & 2310942 & 2096898 & 102376 & -111668 & 214045 \\ | |
| 453 | +Indexation des baux (2,0 / \pct{4.0}) & 2118624 & 2326053 & -89942 & 117487 & 207429 \\ | |
| 454 | +Taux $r$ ($\pm\qty{50}{\pb}$) & 2300356 & 2121138 & 91790 & -87428 & 179218 \\ | |
| 455 | +Taux terminal $R_T$ ($\pm\qty{25}{\pb}$) & 2289943 & 2134939 & 81377 & -73626 & 155003 \\ | |
| 456 | 456 | Rotation annuelle (5 / \pct{25}) & 2140916 & 2231655 & -67649 & 23089 & 90738 \\ |
| 457 | 457 | CAPEX ($-25$ / $+\pct{25}$) & 2252978 & 2164154 & 44412 & -44412 & 88824 \\ |
| 458 | 458 | Inoccupation et pertes (2,9 / \pct{4.9}) & 2246652 & 2170480 & 38086 & -38086 & 76173 \\ |
modified
manuscript/chapters/ch47.tex
+203 −1
@@ -301,4 +301,206 @@ Le revenu net d'exploitation (RNE, \emph{net operating income}) de première ann | ||
| 301 | 301 | \begin{equation}\label{eq:47:rne} |
| 302 | 302 | \NOI_1 = RBE - DE - RR = \dollars{168443.94} - \dollars{70385.19} - \dollars{8103.00} = \dollars{89955.75}, |
| 303 | 303 | \end{equation} |
| 304 | −soit \dollars{7496.31} par logement et \pct{53.4} du revenu brut effectif. Ce chiffre est le pivot du dossier : il est capitalisé à la \cref{sec:47:capitalisation}, il constitue la première année de la projection de la \cref{sec:47:dcf}, il détermine le prêt maximal par la couverture de la dette à la \cref{sec:47:financement} et il sert de point de départ au test de résistance. Il est identique, au cent près, à celui que les chapitres de méthode ont obtenu sur les mêmes données, parce qu'il provient du même code ; c'est la garantie de cohérence que l'ouvrage s'est imposée. Trois précisions en encadrent l'usage. Le revenu net est \emph{prospectif} (douze mois suivant la date d'évaluation) et non historique : le revenu net comptable 2025, calculé avec les taxes de l'ancien rôle et sans gestion imputée, aurait été plus élevé d'environ \dollars{6300}, et un acheteur qui capitaliserait ce revenu historique surpaierait l'immeuble. Le revenu net est calculé \emph{après} réserve de remplacement, convention qui exige que le taux de capitalisation soit extrait de ventes dont le revenu net a été défini de la même manière. Enfin, le revenu net ne tient aucun compte du financement ni de l'impôt : il mesure la capacité de l'immeuble, non celle de son propriétaire. | |
| 304 | +soit \dollars{7496.31} par logement et \pct{53.4} du revenu brut effectif. Ce chiffre est le pivot du dossier : il est capitalisé à la \cref{sec:47:capitalisation}, il constitue la première année de la projection de la \cref{sec:47:dcf}, il détermine le prêt maximal par la couverture de la dette à la \cref{sec:47:financement} et il sert de point de départ au test de résistance. Il est identique, au cent près, à celui que les chapitres de méthode ont obtenu sur les mêmes données, parce qu'il provient du même code ; c'est la garantie de cohérence que l'ouvrage s'est imposée. Trois précisions en encadrent l'usage. Le revenu net est \emph{prospectif} (douze mois suivant la date d'évaluation) et non historique : les dépenses déclarées de 2025 (\dollars{70693}) sont inférieures de \dollars{7795} aux dépenses normalisées, parce qu'elles ne comportent ni gestion imputée ni indexation, et un acheteur qui capitaliserait le revenu net historique surpaierait l'immeuble d'environ \dollars{176000} au taux retenu. Le revenu net est calculé \emph{après} réserve de remplacement, convention qui exige que le taux de capitalisation soit extrait de ventes dont le revenu net a été défini de la même manière. Enfin, le revenu net ne tient aucun compte du financement ni de l'impôt : il mesure la capacité de l'immeuble, non celle de son propriétaire. | |
| 305 | + | |
| 306 | +\section{Méthode du revenu : capitalisation directe}\label{sec:47:capitalisation} | |
| 307 | + | |
| 308 | +\subsection{Extraction du taux global sur quarante ventes} | |
| 309 | + | |
| 310 | +La capitalisation directe convertit le revenu net de première année en valeur au moyen d'un taux global $R$ extrait de ventes comparables : | |
| 311 | +\begin{equation}\label{eq:47:extraction} | |
| 312 | +R_j = \frac{\NOI_{1,j}}{P_j}, \qquad j = 1, \dots, n, | |
| 313 | +\end{equation} | |
| 314 | +où $P_j$ est le prix de vente du comparable $j$ et $\NOI_{1,j}$ son revenu net de première année, normalisé par l'évaluateur selon les mêmes conventions que pour le sujet. Le fichier synthétique de comparables contient quarante ventes d'immeubles de 6 à 30 logements conclues entre septembre 2024 et août 2026 dans cinq quartiers de l'île (Rosemont, Villeray, Hochelaga, Plateau, Ahuntsic), avec pour chacune le revenu brut potentiel, le ratio de dépenses, le revenu net, le prix, le taux global, le prix par logement et le multiplicateur du revenu brut. La fenêtre de vingt-quatre mois et la tranche de 6 à 30 logements retenues par la fonction \texttt{taux\_extraits} conservent les quarante ventes. Le \cref{tab:47:comparables-taux} présente les dix ventes les plus proches du sujet, sélectionnées par la distance d'attributs du \chref{16} (nombre de logements, année de construction, ancienneté de la vente et état, avec un poids double pour la taille) ; le \cref{tab:47:stats-taux} donne les statistiques de l'ensemble et la \cref{fig:47:taux-extraits} la dispersion complète. | |
| 315 | + | |
| 316 | +\begin{table}[htbp]\centering | |
| 317 | +\caption{Les dix ventes comparables les plus proches du sujet (sur quarante), classées par distance d'attributs (données synthétiques).}\label{tab:47:comparables-taux} | |
| 318 | +\footnotesize\begin{tabular}{@{}l l l S[table-format=2.0] S[table-format=4.0] c S[table-format=6.0] S[table-format=7.0] S[table-format=1.2] S[table-format=6.0] S[table-format=2.2]@{}} | |
| 319 | +\toprule | |
| 320 | +Vente & Date & Quartier & {Log.} & {Constr.} & État & {RNE (\$)} & {Prix (\$)} & {Taux (\%)} & {Prix/log. (\$)} & {MRB} \\ | |
| 321 | +\midrule | |
| 322 | +M040 & 2026-08-09 & Villeray & 12 & 1954 & 3 & 111423 & 2518000 & 4.43 & 209833 & 11.87 \\ | |
| 323 | +M035 & 2026-04-30 & Plateau & 13 & 1947 & 3 & 98988 & 2354000 & 4.21 & 181077 & 13.43 \\ | |
| 324 | +M022 & 2025-08-22 & Rosemont & 11 & 1952 & 3 & 87455 & 1834000 & 4.77 & 166727 & 11.01 \\ | |
| 325 | +M019 & 2025-06-14 & Hochelaga & 14 & 1962 & 3 & 129519 & 2571000 & 5.04 & 183643 & 11.99 \\ | |
| 326 | +M024 & 2025-09-05 & Plateau & 8 & 1961 & 3 & 73999 & 1883000 & 3.93 & 235375 & 14.99 \\ | |
| 327 | +M027 & 2025-11-28 & Rosemont & 17 & 1960 & 3 & 157397 & 3426000 & 4.59 & 201529 & 11.89 \\ | |
| 328 | +M034 & 2026-04-12 & Rosemont & 14 & 1950 & 2 & 109849 & 2355000 & 4.66 & 168214 & 11.38 \\ | |
| 329 | +M023 & 2025-08-22 & Ahuntsic & 12 & 1965 & 4 & 134230 & 3511000 & 3.82 & 292583 & 16.05 \\ | |
| 330 | +M031 & 2026-01-08 & Hochelaga & 9 & 1972 & 4 & 68562 & 1254000 & 5.47 & 139333 & 9.68 \\ | |
| 331 | +M037 & 2026-07-28 & Hochelaga & 16 & 1942 & 3 & 157028 & 3923000 & 4.00 & 245188 & 15.67 \\ | |
| 332 | +\bottomrule | |
| 333 | +\end{tabular} | |
| 334 | +\tabsource{\synth{\texttt{cas3\_montreal\_comparables.csv} ; sélection par \texttt{traite.comparables.distance\_attributs} ; script \texttt{ch47\_dossier.py}.}} | |
| 335 | +\end{table} | |
| 336 | + | |
| 337 | +\begin{table}[htbp]\centering | |
| 338 | +\caption{Statistiques des taux globaux extraits des quarante ventes et indications de valeur correspondantes pour le sujet (données synthétiques).}\label{tab:47:stats-taux} | |
| 339 | +\small\begin{tabular}{@{}L{6.4cm}S[table-format=1.3]S[table-format=7.0]@{}} | |
| 340 | +\toprule | |
| 341 | +Statistique (n = 40) & {Taux (\%)} & {$\NOI_1 / R$ (\$)} \\ | |
| 342 | +\midrule | |
| 343 | +Minimum & 3.720 & 2418165 \\ | |
| 344 | +Premier quartile & 4.152 & 2166303 \\ | |
| 345 | +\textbf{Médiane (taux retenu)} & \textbf{4.415} & \textbf{2037503} \\ | |
| 346 | +Moyenne simple & 4.404 & 2042700 \\ | |
| 347 | +Moyenne pondérée par le RNE & 4.332 & 2076581 \\ | |
| 348 | +Troisième quartile & 4.638 & 1939747 \\ | |
| 349 | +Maximum & 5.470 & 1644530 \\ | |
| 350 | +Écart-type & 0.406 & {—} \\ | |
| 351 | +\midrule | |
| 352 | +Médiane, immeubles de 6 à 14 logements (n = 14) & 4.555 & 1974879 \\ | |
| 353 | +Médiane, ventes des 12 derniers mois (n = 17) & 4.430 & 2030604 \\ | |
| 354 | +Médiane, quartier Rosemont (n = 12) & 4.590 & 1959820 \\ | |
| 355 | +Régression : constante (état 3, 12 logements) & 4.567 & 1969694 \\ | |
| 356 | +\quad pente par point d'état (2 → 4) & -0.044 & {—} \\ | |
| 357 | +\quad pente par logement supplémentaire & -0.023 & {—} \\ | |
| 358 | +\bottomrule | |
| 359 | +\end{tabular} | |
| 360 | +\tabsource{\synth{\texttt{traite/cas3.py}, fonction \texttt{taux\_extraits} ; valeurs $= \dollars{89955.75} / R$.}} | |
| 361 | +\end{table} | |
| 362 | + | |
| 363 | +\begin{figure}[htbp]\centering | |
| 364 | +\includegraphics{ch47/ch47-fig-taux-extraits.pdf} | |
| 365 | +\caption{Taux globaux extraits des quarante ventes selon le nombre de logements et l'état ; la bande grise est l'intervalle interquartile, le trait pointillé la médiane retenue pour le sujet, repéré par le losange à douze logements. Les grands immeubles du Plateau et d'Ahuntsic tirent le bas de la distribution.} | |
| 366 | +\figsource{\synth{script \texttt{ch47\_dossier\_figures.py}, graine 20261031.}} | |
| 367 | +\end{figure} | |
| 368 | + | |
| 369 | +\subsection{Choix du taux et indication de valeur} | |
| 370 | + | |
| 371 | +La distribution des taux est resserrée : la moitié centrale des ventes se situe entre \pct{4.152} et \pct{4.638}, l'écart-type est de 41~points de base et la fourchette entière, de \pct{3.72} à \pct{5.47}, s'inscrit presque exactement dans l'intervalle publié par CBRE pour le multirésidentiel de faible hauteur à Montréal, \pct{4.25} à \pct{4.75} pour la catégorie B, les quelques ventes sous \pct{4} correspondant à de grands immeubles du Plateau qui relèvent plutôt de la catégorie A \parencite{cbrecaprates2026q3}. Trois sous-échantillons éclairent la position du sujet. Les immeubles de 6 à 14 logements se vendent à une médiane de \pct{4.555}, soit 14~points de base au-dessus de l'ensemble, ce que la pente de la régression confirme (environ 2~points de base de taux par logement supplémentaire) : les petits immeubles sont moins liquides et moins recherchés des investisseurs institutionnels. Les ventes des douze derniers mois donnent une médiane de \pct{4.43}, pratiquement égale à celle de l'ensemble : aucune dérive temporelle n'est perceptible, en accord avec la lecture « stable à légèrement en hausse » du marché. Le quartier Rosemont affiche une médiane de \pct{4.59}, mais sur douze ventes dont plusieurs grands immeubles anciens ; l'effet de quartier est confondu avec l'effet de taille et l'évaluateur ne lui accorde pas de poids distinct. Quant à l'état, la pente estimée est faible et de signe négatif (un meilleur état abaisse le taux), mais elle n'est pas statistiquement distinguable de zéro sur quarante observations. | |
| 372 | + | |
| 373 | +L'évaluateur retient la médiane de l'ensemble, \pct{4.415}, arrondie à \pct{4.42} dans la conclusion. Ce choix se justifie par la robustesse de la médiane aux valeurs extrêmes, par la cohérence avec la fourchette CBRE et avec la médiane des ventes récentes, et par la position du sujet : un immeuble de douze logements, d'état moyen, à Rosemont, dont les loyers sont sous le marché. Ce dernier trait mérite réflexion. Un acheteur qui anticipe un rattrapage des loyers accepte un taux de première année plus bas qu'il ne le ferait pour un immeuble déjà au marché, puisque la croissance attendue du revenu est plus forte ; la relation $R \approx r - g$ du modèle de \textcite{gordonShapiro1956}, dérivée au \chref{29}, l'exprime directement. Les comparables synthétiques ont été générés avec des loyers en place eux aussi décotés selon l'ancienneté, de sorte que leur taux global intègre déjà, en moyenne, une attente de rattrapage comparable ; appliquer la médiane au sujet revient à lui prêter un potentiel de croissance moyen, ce qui est prudent compte tenu de l'écart de \pct{11} au marché. L'évaluateur aurait pu, à l'inverse, retenir un taux légèrement supérieur pour la petite taille (vers \pct{4.55}) ; il s'en abstient parce que la méthode des flux actualisés, à la section suivante, rend explicite la trajectoire des loyers et offre un contrepoids à ce jugement. | |
| 374 | + | |
| 375 | +L'indication par capitalisation directe est | |
| 376 | +\begin{equation}\label{eq:47:vcap} | |
| 377 | +\hat V_{\text{cap}} = \frac{\NOI_1}{R} = \frac{\dollars{89955.75}}{\num{0.04415}} = \dollars{2037502.89}, | |
| 378 | +\end{equation} | |
| 379 | +soit \dollars{169792} par logement et un multiplicateur de \num{12.31} fois le revenu brut potentiel contractuel. La sensibilité au taux est immédiate : à \pct{4.165} l'indication passe à \dollars{2159802}, à \pct{4.665} à \dollars{1928312}, soit une variation d'environ \pct{5.7} pour 25~points de base ; les bornes interquartiles donnent \dollars{2166303} et \dollars{1939747}. Cette plage de plus ou moins \pct{6} autour de la médiane constitue l'incertitude propre à la méthode, indépendamment de celle du revenu net ; le \chref{20} a montré comment combiner les deux. | |
| 380 | + | |
| 381 | +\section{Méthode du revenu : flux actualisés sur dix ans}\label{sec:47:dcf} | |
| 382 | + | |
| 383 | +\subsection{Hypothèses de projection} | |
| 384 | + | |
| 385 | +La méthode des flux actualisés (DCF, \emph{discounted cash flow}) explicite ce que la capitalisation directe résume en un seul taux : la trajectoire des loyers contractuels et de marché, la rotation des locataires, la croissance des dépenses, les dépenses en capital et la revente. Le \cref{tab:47:hyp-dcf} déclare les hypothèses, toutes tirées du fichier \texttt{cas3\_montreal\_hypotheses\_dcf.json}, avec leur justification. L'horizon de dix ans correspond à la durée de détention typique d'un investisseur privé et à deux termes hypothécaires de cinq ans ; les flux sont réputés reçus en fin d'année, la première année courant du 1\textsuperscript{er} septembre 2026 au 31~août 2027. | |
| 386 | + | |
| 387 | +\begin{table}[htbp]\centering | |
| 388 | +\caption{Hypothèses de la projection de flux actualisés et leur justification.}\label{tab:47:hyp-dcf} | |
| 389 | +\footnotesize\begin{tabular}{@{}L{3.9cm}L{1.6cm}L{7.2cm}@{}} | |
| 390 | +\toprule | |
| 391 | +Hypothèse & Valeur & Justification et source \\ | |
| 392 | +\midrule | |
| 393 | +Horizon & 10 ans & Détention typique ; deux termes de 5 ans \\ | |
| 394 | +Croissance des loyers contractuels & \pct{3.1}/an & Pourcentage de base du TAL pour 2026, avis dès le 1\textsuperscript{er} janvier 2026 \parencite{talIndices2026} ; 2027 non publié \\ | |
| 395 | +Croissance des loyers de marché & \pct{3.5}/an & IPC du Québec \pct{3.1} \parencite{statcanipc} ; décélération attendue après +\pct{7.4} en 2025 \parencite{schlLocatif2025} ; inoccupation en hausse \parencite{schlpmh2026ete} \\ | |
| 396 | +Rotation annuelle & \pct{15} (≈ 2 log.) & Hypothèse ; SCHL RMR : \pct{9.4} en 2025 \parencite{schlrmltables2025} ; les logements les plus sous le marché se libèrent en premier \\ | |
| 397 | +Inoccupation et mauvaises créances & \pct{3.9} & \Cref{sec:47:etat-locatif} \\ | |
| 398 | +Croissance des dépenses & \pct{3.0}/an & IPC ; tarifs d'électricité +\pct{3.0} en 2026 ; réserve non indexée \\ | |
| 399 | +Dépenses en capital & 85~000~\$ (2027), 40~000~\$ (2029), 120~000~\$ (2032) & Inspection, \cref{tab:47:inspection} \\ | |
| 400 | +Taux d'actualisation $r$ & \pct{7.25} & Taux global \pct{4.42} + croissance attendue du RNE ≈ \pct{2.8} ; obligation 10 ans \pct{3.84} + prime ≈ 340~pb \parencite{bdcvalet} \\ | |
| 401 | +Taux terminal $R_T$ & \pct{5.00} & Taux retenu \pct{4.42} + 58~pb pour l'âge accru et l'incertitude à 10 ans \parencite{geltnerMillerClaytonEichholtz2014} \\ | |
| 402 | +Coûts de vente $c_v$ & \pct{2.5} & Courtage et frais juridiques usuels pour un immeuble de cette taille (hypothèse) \\ | |
| 403 | +\bottomrule | |
| 404 | +\end{tabular} | |
| 405 | +\tabsource{\synth{\texttt{cas3\_montreal\_hypotheses\_dcf.json} ; justifications de l'auteur.}} | |
| 406 | +\end{table} | |
| 407 | + | |
| 408 | +Le mécanisme central est celui du rattrapage par rotation. Chaque année $t \geq 2$, le loyer contractuel de chaque logement est indexé de $g_c = \pct{3.1}$ et le loyer de marché de $g_m = \pct{3.5}$ ; puis les $k = \lfloor 0{,}15 \times 12 \rceil = 2$ logements dont le rapport loyer contractuel sur loyer de marché est le plus faible sont reloués au marché : | |
| 409 | +\begin{equation}\label{eq:47:loyers} | |
| 410 | +L_{i,t} = \begin{cases} L^{m}_{i,t} = L^{m}_{i,t-1}(1+g_m) & \text{si } i \in \mathcal{K}_t \text{ (logement relocalisé)},\\ L_{i,t-1}(1+g_c) & \text{sinon,} \end{cases} | |
| 411 | +\qquad RBP_t = 12 \sum_i L_{i,t}. | |
| 412 | +\end{equation} | |
| 413 | +Le revenu brut effectif applique la provision $v$ au revenu brut potentiel et ajoute les autres revenus indexés de $g_d$ ; les dépenses hors réserve croissent de $g_d = \pct{3.0}$ et la réserve reste fixe ; le flux avant dette est le revenu net diminué des dépenses en capital de l'année. Le choix d'indexer les loyers contractuels au seul pourcentage de base du TAL est prudent : la nouvelle méthode ajoute la part attribuable des variations de taxes et d'assurances et un rendement de \pct{5} sur les immobilisations, de sorte que la toiture de 2027 et les cuisines de 2032 donneraient droit à des augmentations supplémentaires ; ne pas les compter revient à traiter ces travaux comme non récupérables, ce qui sous-estime légèrement le revenu et compense l'hypothèse favorable de rotation. | |
| 414 | + | |
| 415 | +\subsection{Projection et valeur} | |
| 416 | + | |
| 417 | +Le \cref{tab:47:projection} présente la projection complète et la \cref{fig:47:flux-dcf} la visualise. Le revenu brut potentiel passe de \dollars{165540} à \dollars{251101} en dix ans, et à l'année dix il atteint \pct{99.0} du revenu de marché de la même année : avec deux relocations par an, l'écart initial de \pct{11} est résorbé en cinq à six ans, après quoi la croissance du revenu rejoint celle du marché. Le revenu net croît de \dollars{89956} à \dollars{153581}, soit un taux annuel composé de \pct{6.12}, nettement supérieur à l'inflation, ce qui est la signature d'un immeuble dont les loyers rattrapent le marché ; la croissance ralentit à environ \pct{4} en fin de période. Les trois dépenses en capital, pour un total de \dollars{245000}, creusent le flux avant dette des années 2027, 2029 et 2032 ; l'année de la toiture, le flux tombe à \dollars{14512}, très inférieur au service de la dette que la \cref{sec:47:financement} calculera, ce qui signifie que l'acheteur devra financer ces travaux autrement que par l'exploitation courante. | |
| 418 | + | |
| 419 | +\begin{table}[htbp]\centering | |
| 420 | +\caption{Projection des flux sur dix ans et revenu de l'année 11 servant à la valeur terminale (données synthétiques, \$ courants).}\label{tab:47:projection} | |
| 421 | +\footnotesize\begin{tabular}{@{}c c S[table-format=6.0] S[table-format=6.0] S[table-format=6.0] S[table-format=5.0] S[table-format=4.0] S[table-format=6.0] S[table-format=6.0] S[table-format=6.0]@{}} | |
| 422 | +\toprule | |
| 423 | +$t$ & Exercice & {RBP} & {RBP marché} & {RBE} & {Dép. hors rés.} & {Réserve} & {RNE} & {CAPEX} & {Flux avant dette} \\ | |
| 424 | +\midrule | |
| 425 | +1 & 2026-27 & 165540 & 186036 & 168444 & 70385 & 8103 & 89956 & 0 & 89956 \\ | |
| 426 | +2 & 2027-28 & 177389 & 192547 & 180112 & 72497 & 8103 & 99512 & 85000 & 14512 \\ | |
| 427 | +3 & 2028-29 & 188095 & 199286 & 190689 & 74672 & 8103 & 107915 & 0 & 107915 \\ | |
| 428 | +4 & 2029-30 & 199953 & 206261 & 202383 & 76912 & 8103 & 117368 & 40000 & 77368 \\ | |
| 429 | +5 & 2030-31 & 209340 & 213481 & 211710 & 79219 & 8103 & 124388 & 0 & 124388 \\ | |
| 430 | +6 & 2031-32 & 218250 & 220952 & 220589 & 81596 & 8103 & 130890 & 0 & 130890 \\ | |
| 431 | +7 & 2032-33 & 226565 & 228686 & 228905 & 84044 & 8103 & 136759 & 120000 & 16759 \\ | |
| 432 | +8 & 2033-34 & 234307 & 236690 & 236681 & 86565 & 8103 & 142013 & 0 & 142013 \\ | |
| 433 | +9 & 2034-35 & 242513 & 244974 & 244912 & 89162 & 8103 & 147647 & 0 & 147647 \\ | |
| 434 | +10 & 2035-36 & 251101 & 253548 & 253521 & 91837 & 8103 & 153581 & 0 & 153581 \\ | |
| 435 | +\midrule | |
| 436 | +11 & 2036-37 & 259911 & 262422 & 262353 & 94592 & 8103 & 159658 & {—} & {(valeur terminale)} \\ | |
| 437 | +\bottomrule | |
| 438 | +\end{tabular} | |
| 439 | +\tabsource{\synth{\texttt{traite/cas3.py}, fonction \texttt{projection\_dcf} ; montants arrondis au dollar, calculs non arrondis.}} | |
| 440 | +\end{table} | |
| 441 | + | |
| 442 | +\begin{figure}[htbp]\centering | |
| 443 | +\includegraphics{ch47/ch47-fig-flux-dcf.pdf} | |
| 444 | +\caption{Revenu net, dépenses en capital et flux avant dette de la projection sur dix ans ; la ligne tiretée est le service annuel de la dette du prêt dimensionné au ratio de couverture de 1,20. Les années de travaux (toiture en 2027, balcons en 2029, cuisines en 2032) font passer le flux avant dette sous le service de la dette.} | |
| 445 | +\figsource{\synth{script \texttt{ch47\_dossier\_figures.py}, graine 20261031.}} | |
| 446 | +\end{figure} | |
| 447 | + | |
| 448 | +La valeur terminale capitalise le revenu net de l'année 11 au taux terminal, puis déduit les coûts de vente : | |
| 449 | +\begin{equation}\label{eq:47:vt} | |
| 450 | +V_T = \frac{\NOI_{11}}{R_T} = \frac{\dollars{159658.38}}{\num{0.05}} = \dollars{3193167.52}, \qquad V_T^{\text{net}} = V_T (1 - c_v) = \dollars{3113338.33}. | |
| 451 | +\end{equation} | |
| 452 | +La valeur présente est la somme des flux actualisés et de la valeur terminale nette actualisée : | |
| 453 | +\begin{equation}\label{eq:47:dcf} | |
| 454 | +\hat V_{\text{DCF}} = \sum_{t=1}^{10} \frac{CF_t}{(1+r)^t} + \frac{V_T^{\text{net}}}{(1+r)^{10}} = \dollars{662409.91} + \dollars{1546156.00} = \dollars{2208565.91}. | |
| 455 | +\end{equation} | |
| 456 | +La part de la valeur terminale dans la valeur présente est de \pct{70.0}, proportion élevée qui traduit la faiblesse des flux courants par rapport au potentiel de revenu, ainsi que le poids des dépenses en capital dans la première moitié de l'horizon ; \textcite{geltnerMillerClaytonEichholtz2014} rappellent que plus cette part est grande, plus la valeur dépend du couple $(R_T, r)$ et moins elle dépend de la projection détaillée, ce que la tornade de la \cref{sec:47:montecarlo} confirmera. Le taux global implicite de première année de l'indication DCF est $\NOI_1 / \hat V_{\text{DCF}} = \pct{4.07}$, soit 35~points de base sous la médiane extraite ; la différence mesure précisément la prime que le modèle de flux accorde au rattrapage des loyers par rapport au comparable moyen. Le taux de rendement interne (TRI) implicite d'un acheteur qui paierait \dollars{2208566} et recevrait les flux projetés puis la revente nette est, par construction, égal au taux d'actualisation de \pct{7.25} ; il devient une information lorsqu'on le calcule au prix réconcilié (\cref{sec:47:reconciliation}). | |
| 457 | + | |
| 458 | +L'indication DCF, \dollars{2208566}, excède l'indication par capitalisation de \dollars{171063}, soit \pct{8.4}. L'écart n'est pas une erreur : il révèle que la médiane des taux extraits valorise moins le potentiel de rattrapage du sujet que ne le fait la projection explicite avec deux relocations par an. La réconciliation devra trancher entre ces deux lectures, et le test de résistance dira dans quelle mesure l'écart dépend de l'hypothèse de rotation. | |
| 459 | + | |
| 460 | +\section{Méthode de comparaison par unité}\label{sec:47:comparaison} | |
| 461 | + | |
| 462 | +La méthode de comparaison appliquée à un immeuble de douze logements ne compare pas des prix totaux, trop dépendants de la taille, mais des prix par logement ou des multiplicateurs du revenu brut. Elle est ici une méthode d'appoint : elle vérifie que la valeur issue du revenu n'est pas déconnectée des prix réellement payés par logement dans le marché, et elle fournit un ordre de grandeur indépendant des hypothèses de revenu net. Les dix ventes du \cref{tab:47:comparables-taux} servent de comparables. | |
| 463 | + | |
| 464 | +\subsection{Extraction des ajustements} | |
| 465 | + | |
| 466 | +Faute de paires de ventes appariées, les ajustements sont extraits par une régression auxiliaire du logarithme du prix par logement sur l'état, la taille, le niveau de loyer, l'ancienneté de la vente et le quartier, estimée sur les quarante ventes ($R^2 = \num{0.635}$, écart-type résiduel \pct{10.9}). Trois coefficients sont exploitables : le niveau de loyer moyen, avec une élasticité de \num{1.17} (erreur-type \num{0.25}), ce qui signifie qu'un immeuble dont les loyers sont \pct{10} plus élevés se vend environ \pct{12} plus cher par logement ; la taille, avec un effet de \pct{0.79} par logement supplémentaire (erreur-type \pct{0.26}), qui traduit la prime des grands immeubles ; et le quartier, le Plateau (+\pct{17.5}) et Ahuntsic (+\pct{10.4}) se vendant plus cher que Rosemont, Hochelaga (+\pct{3.5}) et Villeray (+\pct{0.7}) étant statistiquement indiscernables de Rosemont. L'effet temporel estimé est négatif et non significatif ($-\pct{2.8}$ par an, erreur-type \pct{3.1}) : conformément à la lecture d'un marché stable (indice Teranet--Banque Nationale de Montréal à +\pct{1.4} sur un an en septembre 2026 \parencite{teranet202609}), aucun ajustement de conditions de marché n'est appliqué. L'effet de l'état n'est pas identifiable sur l'échantillon ; l'évaluateur retient un ajustement déclaré de \pct{3} du prix par point d'état, hypothèse pédagogique cohérente avec la loi de génération du jeu synthétique et avec les ordres de grandeur du \chref{17}. | |
| 467 | + | |
| 468 | +Les ajustements sont appliqués dans l'ordre conventionnel de l'ouvrage : d'abord les ajustements de transaction en pourcentage (ici nuls), puis les ajustements de propriété en dollars par logement, additifs, le signe étant celui du point de vue du sujet : | |
| 469 | +\begin{equation}\label{eq:47:ajuste} | |
| 470 | +P^{\text{aj}}_j = P_j\,(1 + a^{t}_j) + A_{j,\text{loc}} + A_{j,\text{taille}} + A_{j,\text{état}} + A_{j,\text{loyer}}, | |
| 471 | +\end{equation} | |
| 472 | +avec $A_{j,\text{loc}} = P_j\,[e^{-\hat\mu_{q(j)}} - 1]$ pour ramener le comparable au quartier Rosemont, $A_{j,\text{taille}} = P_j\,[e^{\hat\beta_n (12 - n_j)} - 1]$, $A_{j,\text{état}} = 0{,}03\,P_j\,(3 - e_j)$ et $A_{j,\text{loyer}} = P_j\,[(\bar L_s / \bar L_j)^{\hat\beta_L} - 1]$, où $\bar L_s = \dollars{1149.58}$ est le loyer contractuel moyen du sujet. L'ajustement de loyer est le plus important : il ramène le prix de comparables mieux loués au niveau de revenu effectivement acquis par l'acheteur du sujet, ce qui est la traduction, dans la méthode de comparaison, du droit du locateur évalué. | |
| 473 | + | |
| 474 | +\begin{table}[htbp]\centering | |
| 475 | +\caption{Grille d'ajustement des prix par logement (données synthétiques, \$ par logement).}\label{tab:47:grille} | |
| 476 | +\footnotesize\begin{tabular}{@{}l S[table-format=6.0] S[table-format=-5.0] S[table-format=-4.0] S[table-format=-4.0] S[table-format=-5.0] S[table-format=6.0] S[table-format=2.1] S[table-format=1.3]@{}} | |
| 477 | +\toprule | |
| 478 | +Vente & {Prix/log.} & {Localisation} & {Taille} & {État} & {Loyer} & {Prix ajusté} & {Ajust. brut (\%)} & {Poids} \\ | |
| 479 | +\midrule | |
| 480 | +M040 & 209833 & -1528 & 0 & 0 & -52858 & 155448 & 25.9 & 0.072 \\ | |
| 481 | +M035 & 181077 & -29127 & -1429 & 0 & 4834 & 155355 & 19.5 & 0.095 \\ | |
| 482 | +M022 & 166727 & 0 & 1327 & 0 & -17252 & 150802 & 11.1 & 0.167 \\ | |
| 483 | +M019 & 183643 & -6261 & -2888 & 0 & -21264 & 153230 & 16.6 & 0.112 \\ | |
| 484 | +M024 & 235375 & -37861 & 7581 & 0 & -33198 & 171897 & 33.4 & 0.056 \\ | |
| 485 | +M027 & 201529 & 0 & -7829 & 0 & -43244 & 150455 & 25.3 & 0.073 \\ | |
| 486 | +M034 & 168214 & 0 & -2645 & 5046 & -13097 & 157518 & 12.4 & 0.151 \\ | |
| 487 | +M023 & 292583 & -28833 & 0 & -8777 & -81442 & 173530 & 40.7 & 0.046 \\ | |
| 488 | +M031 & 139333 & -4751 & 3352 & -4180 & -6699 & 127056 & 13.6 & 0.137 \\ | |
| 489 | +M037 & 245188 & -8360 & -7650 & 0 & -33636 & 195542 & 20.3 & 0.092 \\ | |
| 490 | +\midrule | |
| 491 | +\multicolumn{6}{@{}l}{Prix ajusté pondéré (poids inversement proportionnels à l'ajustement brut)} & 155909 & & 1.000 \\ | |
| 492 | +\multicolumn{6}{@{}l}{Moyenne simple / médiane / minimum / maximum} & {159083 / 155401 / 127056 / 195542} & & \\ | |
| 493 | +\bottomrule | |
| 494 | +\end{tabular} | |
| 495 | +\tabsource{\synth{\texttt{traite.comparables} (\texttt{ComparableAjuste}, \texttt{poids\_inverse\_brut}, \texttt{reconciliation}) ; script \texttt{ch47\_dossier.py}.}} | |
| 496 | +\end{table} | |
| 497 | + | |
| 498 | +\subsection{Indication par le prix par logement et par le multiplicateur} | |
| 499 | + | |
| 500 | +Le \cref{tab:47:grille} montre que les prix ajustés se resserrent entre \dollars{150455} et \dollars{173530} pour huit des dix comparables, l'immeuble de neuf logements d'Hochelaga (M031) tirant vers le bas et le seize logements d'Hochelaga (M037) vers le haut. La pondération inversement proportionnelle à l'ajustement brut, règle usuelle du \chref{20}, donne un prix par logement de \dollars{155909}, l'écart-type pondéré étant de \dollars{17152} (\pct{11}). L'indication est | |
| 501 | +\begin{equation}\label{eq:47:vunite} | |
| 502 | +\hat V_{\text{unité}} = 12 \times \dollars{155909} = \dollars{1870903}. | |
| 503 | +\end{equation} | |
| 504 | +La méthode du multiplicateur du revenu brut (MRB), plus fruste, donne un repère complémentaire : les dix comparables se vendent à une médiane de \num{11.94} fois leur revenu brut potentiel (quartiles \num{11.50} et \num{14.60}), ce qui, appliqué au revenu contractuel du sujet, donne $\num{11.94} \times \dollars{165540} = \dollars{1976548}$. Le multiplicateur n'est pas ajusté pour les dépenses ni pour l'écart au marché des loyers, et sa dispersion interquartile de \pct{27} en fait un indicateur de vraisemblance plutôt qu'une méthode à part entière ; il n'est pas pondéré dans la réconciliation mais y est rapporté. | |
| 505 | + | |
| 506 | +L'indication par unité est inférieure de \pct{8.2} à la capitalisation directe et de \pct{15.3} aux flux actualisés. Cette hiérarchie est instructive : la comparaison par logement, ajustée sur le niveau de loyer en place, pénalise le sujet pour ses loyers bas sans lui créditer le rattrapage futur, alors que la capitalisation le crédite implicitement au niveau moyen du marché et que le DCF le crédite explicitement. Les trois indications décrivent donc un même immeuble sous trois degrés d'anticipation du rattrapage ; la réconciliation ne consiste pas à en faire la moyenne mécanique, mais à décider quel degré d'anticipation un acheteur typique paie réellement à la date d'évaluation. | |
added
references/lib-ch21.bib
+12 −0
@@ -0,0 +1,12 @@ | ||
| 1 | +% Nouvelles références du chapitre 21 — à fusionner dans library.bib par l'orchestrateur. | |
| 2 | +% Non citées dans ch21.tex (pour éviter une citation non définie avant fusion) ; l'encadré « Taxes de vente » mentionne le guide en toutes lettres. | |
| 3 | + | |
| 4 | +@manual{arcRC4028, | |
| 5 | + author = {{Agence du revenu du Canada}}, | |
| 6 | + title = {RC4028 --- Remboursement de la TPS/TVH pour habitations neuves}, | |
| 7 | + organization = {Agence du revenu du Canada}, | |
| 8 | + year = {2026}, | |
| 9 | + note = {Révision 10/2026 ; consulté le 31 octobre 2026 ; seuil de 450~000~\$ pour la maison construite par le propriétaire et remboursement pour les acheteurs d'une première habitation (travaux commencés à compter du 20 mars 2025 ; 1~M\$ / 1,5~M\$) lus sur la page ; autres paramètres (36~\%, 6~300~\$, 350~000~\$) non vérifiés mot à mot}, | |
| 10 | + url = {https://www.canada.ca/fr/agence-revenu/services/formulaires-publications/publications/rc4028/remboursement-tps-tvh-habitations-neuves.html}, | |
| 11 | + urldate = {2026-10-31} | |
| 12 | +} | |
modified
solutions/ch30.tex
+6 −1
@@ -48,7 +48,12 @@ La projection des revenus et des dépenses ne change pas (tableau~\ref{tab:30:pr | ||
| 48 | 48 | \end{solution} |
| 49 | 49 | |
| 50 | 50 | \begin{solution}{ex:30:7}{TRI des fonds propres, flux non conventionnels et MIRR} |
| 51 | −(a) La série $(-732\,606 ;\ 14\,993 ;\ -60\,451 ;\ 32\,951 ;\ 2\,405 ;\ 49\,425 ;\ 55\,927 ;\ -58\,205 ;\ 67\,050 ;\ 72\,684 ;\ 1\,896\,808)$ change cinq fois de signe. La règle des signes de Descartes autorise jusqu'à cinq racines réelles positives du polynôme de la VAN en $1/(1+y)$ ; l'unicité du TRI n'est donc pas garantie a priori et doit être vérifiée. | |
| 51 | +(a) La série des flux des fonds propres, | |
| 52 | +\begin{align*} | |
| 53 | +(&-732\,606 ;\ 14\,993 ;\ -60\,451 ;\ 32\,951 ;\ 2\,405 ;\ 49\,425 ;\\ | |
| 54 | +&\phantom{-}55\,927 ;\ -58\,205 ;\ 67\,050 ;\ 72\,684 ;\ 1\,896\,808), | |
| 55 | +\end{align*} | |
| 56 | +change cinq fois de signe. La règle des signes de Descartes autorise jusqu'à cinq racines réelles positives du polynôme de la VAN en $1/(1+y)$ ; l'unicité du TRI n'est donc pas garantie a priori et doit être vérifiée. | |
| 52 | 57 | |
| 53 | 58 | (b) $\VAN(\pct{8}) = +\dollars{243468}$ et $\VAN(\pct{12}) = -\dollars{48366}$ : la VAN change de signe une seule fois sur l'intervalle et décroît ; le TRI est compris entre \pct{8} et \pct{12}. La bissection donne $\TRI = \pct{11.22}$, pour lequel la VAN est nulle à moins d'un cent près. |
| 54 | 59 | |
added
spreadsheets/amortissement_hypothecaire.xlsx
+0 −0
Binary file not shown.
added
spreadsheets/cas1_grille_comparaison.xlsx
+0 −0
Binary file not shown.
added
spreadsheets/cas3_dcf_12_logements.xlsx
+0 −0
Binary file not shown.
added
tools/inventaire.py
+23 −0
@@ -0,0 +1,23 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +"""Inventaire des scripts, tests, données, figures et classeurs → manuscript/appendices/_inventaire.tex (longtable) et verification/inventaire.md.""" | |
| 3 | +import pathlib, re | |
| 4 | +ROOT = pathlib.Path(__file__).resolve().parents[1] | |
| 5 | +def esc(s): return s.replace("\\", "").replace("_", "\\_").replace("&", "\\&").replace("%", "\\%").replace("#", "\\#").replace("$", "\\$") | |
| 6 | +def doc(p): | |
| 7 | + t = p.read_text(encoding="utf-8", errors="ignore") | |
| 8 | + m = re.search(r'"""(.*?)"""', t, re.S) or re.search(r"^#\s*(.+)$", t, re.M) | |
| 9 | + return esc(m.group(1).strip().split("\n")[0]) if m else "" | |
| 10 | +rows = [] | |
| 11 | +for d, kind in [("analysis/python/traite", "module"), ("analysis/python/cases", "calcul"), ("analysis/python/figures", "figure"), ("analysis/python/tests", "test"), ("analysis/r", "R"), ("tools", "outil")]: | |
| 12 | + for p in sorted((ROOT / d).glob("*.py")) + sorted((ROOT / d).glob("*.R")) + sorted((ROOT / d).glob("*.sh")): | |
| 13 | + if p.name.startswith("__"): continue | |
| 14 | + rows.append((kind, esc(str(p.relative_to(ROOT))), doc(p)[:110])) | |
| 15 | +data = [(esc(str(p.relative_to(ROOT))), f"{p.stat().st_size/1024:.0f} ko") for p in sorted((ROOT / "data/synthetic").glob("*")) if p.is_file()] | |
| 16 | +xl = [esc(str(p.relative_to(ROOT))) for p in sorted((ROOT / "spreadsheets").glob("*.xlsx"))] | |
| 17 | +nfig = len(list((ROOT / "assets/figures").rglob("*.pdf"))) | |
| 18 | +tex = ["\\begin{longtable}{lp{48mm}p{62mm}}", "\\caption{Scripts du dépôt (modules, calculs, figures, tests, outils)}\\label{tab:app:scripts}\\\\", "\\toprule Type & Fichier & Rôle \\\\ \\midrule \\endfirsthead", "\\toprule Type & Fichier & Rôle \\\\ \\midrule \\endhead", "\\bottomrule \\endfoot"] | |
| 19 | +tex += [f"{k} & \\texttt{{{f}}} & {d} \\\\" for k, f, d in rows] + ["\\end{longtable}", "", "\\begin{longtable}{lr}", "\\caption{Jeux de données synthétiques}\\label{tab:app:donnees}\\\\", "\\toprule Fichier & Taille \\\\ \\midrule \\endfirsthead", "\\toprule Fichier & Taille \\\\ \\midrule \\endhead", "\\bottomrule \\endfoot"] | |
| 20 | +tex += [f"\\texttt{{{f}}} & {s} \\\\" for f, s in data] + ["\\end{longtable}", "", "\\begin{itemize}"] + [f"\\item \\texttt{{{x}}}" for x in xl] + ["\\end{itemize}", f"\\noindent Figures PDF générées : {nfig}."] | |
| 21 | +(ROOT / "manuscript/appendices/_inventaire.tex").write_text("\n".join(tex), encoding="utf-8") | |
| 22 | +(ROOT / "verification/inventaire.md").write_text(f"# Inventaire ({len(rows)} scripts, {len(data)} fichiers de données, {len(xl)} classeurs, {nfig} figures)\n\n" + "\n".join(f"- {k} `{f}` — {d}" for k, f, d in rows), encoding="utf-8") | |
| 23 | +print(f"{len(rows)} scripts, {len(data)} données, {len(xl)} classeurs, {nfig} figures") | |
added
verification/chapters/ch21-calculations.csv
+15 −0
@@ -0,0 +1,15 @@ | ||
| 1 | +id,chapitre,description,script,test,resultat_attendu,resultat_obtenu,statut,date | |
| 2 | +CALC-21-001,21,Coûts directs du devis cas 1 (33 postes),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_totaux_cites,298826.17,298826.17,verifie,2026-10-31 | |
| 3 | +CALC-21-002,21,Coûts indirects du devis cas 1 (5 postes) et taux I/D,analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_totaux_cites,62598.68 ; 20.95 %,62598.68 ; 20.95 %,verifie,2026-10-31 | |
| 4 | +CALC-21-003,21,Regroupement du devis en 7 blocs (somme = D+I),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_regroupement,361424.85,361424.85,verifie,2026-10-31 | |
| 5 | +CALC-21-004,21,Incitatif 10 % sur D+I et coût neuf C_N = D(1+τI)(1+τE),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_identite_multiplicative,36142.49 ; 397567.33,36142.49 ; 397567.33,verifie,2026-10-31 | |
| 6 | +CALC-21-005,21,Variante assiette directs seuls et écart D·τI·τE,analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_variante_assiette_direct,391307.47 ; 6259.87,391307.47 ; 6259.87,verifie,2026-10-31 | |
| 7 | +CALC-21-006,21,Coûts unitaires ($/m² et $/pi²) sur 165 m² habitables et 190 m² bruts,analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_unitaires,2409 / 223.8 ; 2092 / 194.4,2409 / 223.8 ; 2092 / 194.4,verifie,2026-10-31 | |
| 8 | +CALC-21-007,21,Fourchette Altus 155-215 $/pi² appliquée à 2045 pi² bruts et 1776 pi² habitables,analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestDevis::test_comparaison_altus,316997-439705 (milieu 378351) ; 275287-381849,idem,verifie,2026-10-31 | |
| 9 | +CALC-21-008,21,Lecture IPCB Montréal 18-10-0289-01 (valeurs du tableau 21.4),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestIPCB::test_valeurs_tableau,maison individuelle 66.1→116.5 ; résidentiel 65.5→117.8,idem,verifie,2026-10-31 | |
| 10 | +CALC-21-009,21,Variation annuelle IPCB T3 2025→T3 2026 et ratios d'indexation,analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestIPCB::test_ratios_et_variations,8.57 % ; 1.7625 ; 1.620 ; 6.15 %/an,idem,verifie,2026-10-31 | |
| 11 | +CALC-21-010,21,Exemples d'indexation (C_N en $ de 2021/2019 ; 290 000 $ de 2019 → 2026 ; erreur de série),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestIPCB::test_indexation_exemples,294507 ; 245366 ; 469889 ; −5.9 %,idem,verifie,2026-10-31 | |
| 12 | +CALC-21-011,21,Grille de sensibilité indirects × incitatif (min/max/étendue),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestSensibilite::test_grille,351420-436436 (24.2 %),idem,verifie,2026-10-31 | |
| 13 | +CALC-21-012,21,Tornade (indirects ±5 pts ; incitatif 5-15 % ; indice ±8.6 %),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestSensibilite::test_tornade,381132-414003 ; 379496-415639 ; 366171-431655,idem,verifie,2026-10-31 | |
| 14 | +CALC-21-013,21,Ajustement de taille (élasticités −0.05 à −0.20 ; 140 et 200 m² ; barème 2300 $/m²),analysis/python/cases/ch21_cout_neuf.py,analysis/python/tests/test_ch21.py::TestSensibilite::test_elasticite,477287/463711 ; 340112/348599 ; 386871 vs 379500,idem,verifie,2026-10-31 | |
| 15 | +CALC-21-014,21,Exercices 21.1 à 21.7 (solutions),analysis/python/tests/test_ch21.py,analysis/python/tests/test_ch21.py::TestExercices,voir solutions/ch21.tex,idem,verifie,2026-10-31 | |
added
verification/chapters/ch21-claims.csv
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +id,chapitre,affirmation,source_id,verification,date,statut,notes | |
| 2 | +CLM-21-001,21,"L'IPCB (18-10-0289-01, 2023=100) couvre 15 RMR dont Montréal ; séries résidentielles de Montréal depuis T1 2017, non résidentielles depuis 1981, tours depuis 1988 ; T3 2026 diffusé le 2026-10-29",SRC-E-017,Lecture du CSV brut et des métadonnées data/raw/statcan_18100289,2026-10-31,verifie, | |
| 3 | +CLM-21-002,21,"Maison individuelle Montréal : 66.1 (T1 2017) → 116.5 (T3 2026) ; +8.6 % sur un an ; +36 % entre T1 2020 et T4 2022 ; pic trimestriel +4.75 % au T4 2021",SRC-E-017,Calcul depuis le CSV brut (test_ch21.py),2026-10-31,verifie, | |
| 4 | +CLM-21-003,21,"Tableau 18-10-0276-01 archivé (dernière période T2 2024), remplacé par 18-10-0289-01",SRC-C-047,notes-E.md et library.bib (statcanipcb0276),2026-10-31,verifie, | |
| 5 | +CLM-21-004,21,"Altus Canadian Cost Guide 2026 publié le 2026-04-23 ; fourchette Montréal unifamiliale 155-215 $/pi² (sous-sol non fini, hors terrain)",SRC-E-041;SRC-E-043,Communiqué Altus vérifié ; fourchette relayée par NerdWallet (source secondaire),2026-10-31,partiellement_verifie,Tableaux Altus protégés non consultés ; fourchette 2025 (150-215) non vérifiée | |
| 6 | +CLM-21-005,21,"Règlement sur le rôle (F-2.1 r. 13) art. 1-2 : consignes du MEFQ obligatoires ; art. 8 : méthode(s) la/les plus pertinente(s) parmi 3C/3D/3E ; art. 9 : conciliation 3F",SRC-B-006,notes-B.md §9.7 (texte lu),2026-10-31,verifie, | |
| 7 | +CLM-21-006,21,"MEFQ édition 2026 applicable aux rôles entrant en vigueur le 1er janvier 2027 ; partie 3E = Coût ; barèmes protégés (droit d'auteur, pas de licence ouverte)",SRC-B-006;SRC-B-008,notes-B.md §9.7,2026-10-31,verifie,Contenu des barèmes 3E non dépouillé | |
| 8 | +CLM-21-007,21,"Normes de mesurage MEFQ : aire au sol, aire des étages, mesures brutes à la face externe des murs ; étage compté si plancher ≤ 0,4 m sous le niveau moyen du sol",SRC-B-009,notes-B.md §9.7 (p. 2C-53/54),2026-10-31,verifie,Pied de page « 2022 » dans le PDF 2026 | |
| 9 | +CLM-21-008,21,"LFM art. 42-43 (valeur réelle), art. 46 al. 1 (date de référence : 1er juillet du 2e exercice précédent) ; rôle 2027-2029 Gatineau → 2025-07-01",SRC-B-001,notes-B.md §9.2 et notes-E ch. 45,2026-10-31,verifie, | |
| 10 | +CLM-21-009,21,"Loi sur le bâtiment art. 46 (licence obligatoire) et art. 49 par. 2° (exemption autoconstruction unifamiliale sauf gaz/pétrole/électricité)",SRC-B-052,notes-B.md §44.1,2026-10-31,verifie, | |
| 11 | +CLM-21-010,21,"Règlement B-1.1 r. 8 : bâtiments visés (art. 2) ; couvertures 1 an malfaçons / 3 ans vices cachés / 5 ans vices de conception-sol (art. 10) ; plafond 300 000 $ par unifamiliale (art. 13)",SRC-B-057;SRC-B-058,notes-B.md §44.1,2026-10-31,verifie, | |
| 12 | +CLM-21-011,21,"Code de construction chap. I = CNB 2020 modifié Québec, en vigueur le 17 avril 2025, transition jusqu'au 17 octobre 2027",SRC-B-053,notes-B.md §44.1,2026-10-31,verifie, | |
| 13 | +CLM-21-012,21,"Convention collective construction 2025-2029 : hausses 8 %, 5 %, 5 %, 4 %",SRC-E-042,notes-E.md (relayé par Altus ; page CCQ non reconsultée),2026-10-31,partiellement_verifie, | |
| 14 | +CLM-21-013,21,"TPS/TVQ : habitation neuve taxable, revente usagée exonérée en règle générale",,Connaissance générale ; pages Revenu Québec inaccessibles (HTTP 403) le 2026-10-31,2026-10-31,non_verifie,Formulé prudemment dans l'encadré ; à vérifier sur IN-203 / RC4028 §généralités | |
| 15 | +CLM-21-014,21,"Remboursement fédéral TPS habitation neuve (maison construite par le propriétaire) nul à partir d'une JVM de 450 000 $",SRC-21-001,Guide ARC RC4028 Rév. 10/2026 lu le 2026-10-31 (seuil 450 000 $ verbatim ; 36 % / 6 300 $ / 350 000 $ non vérifiés mot à mot),2026-10-31,partiellement_verifie, | |
| 16 | +CLM-21-015,21,"Remboursement TPS premiers acheteurs : travaux commencés à compter du 20 mars 2025, 100 % de la TPS jusqu'à 1 M$, dégressif jusqu'à 1,5 M$",SRC-21-001,Guide ARC RC4028 Rév. 10/2026 (verbatim),2026-10-31,verifie, | |
| 17 | +CLM-21-016,21,"Paramètres du remboursement de la TVQ pour habitation neuve",,Pages Revenu Québec HTTP 403 le 2026-10-31,2026-10-31,non_verifie,Signalé dans limites ; non chiffré dans le texte | |
| 18 | +CLM-21-017,21,"IVS 103 sect. 70 = approche par le coût ; NPP OEAQ règle 2.3 élément 10 (rejet d'une méthode traditionnelle à expliquer) ; CUSPAP 2026 en vigueur le 1er avril 2026 ; NPP normes 13-14 (assurance)",SRC-C-001,notes-C.md §1.2, §2.1, §2.5, §3.2,2026-10-31,verifie, | |
| 19 | +CLM-21-018,21,"Taux d'incitatif de 10 % retenu pour le cas 1",,Hypothèse pédagogique (aucune extraction du marché de Gatineau),2026-10-31,non_verifie,Déclaré comme hypothèse dans le texte et les limites ; sensibilité 5-15 % | |
| 20 | +CLM-21-019,21,"Données Québec — rôles d'évaluation : licence CC-BY 4.0, interdiction de réidentification",SRC-B-012,notes-B.md §9.8,2026-10-31,verifie,id SRC à confirmer lors de la fusion (dqroles) | |
added
verification/chapters/ch21-figures.csv
+5 −0
@@ -0,0 +1,5 @@ | ||
| 1 | +fichier,chapitre,script,donnees,type_donnees,legende_courte,statut | |
| 2 | +ch21/ch21-fig-decomposition-corps.pdf,21,analysis/python/figures/ch21_decomposition.py,data/synthetic/cas1_gatineau_couts.csv,synthetique,"Décomposition du coût neuf du sujet du cas 1 par corps de métier, indirects et incitatif [données synthétiques]",verifie | |
| 3 | +ch21/ch21-fig-ipcb-montreal.pdf,21,analysis/python/figures/ch21_ipcb.py,data/raw/statcan_18100289/18100289.csv,reelle,"IPCB Montréal 2017T1-2026T3 (18-10-0289-01, 2023=100) : résidentiel, maison individuelle, appartements <5 étages, tours, non résidentiel",verifie | |
| 4 | +ch21/ch21-fig-sensibilite.pdf,21,analysis/python/figures/ch21_sensibilite.py,"data/synthetic/cas1_gatineau_couts.csv;data/raw/statcan_18100289/18100289.csv",synthetique,"Sensibilité du coût neuf : grille indirects × incitatif et tornade (indirects, incitatif, indice) [données synthétiques]",verifie | |
| 5 | +ch21/schema-methode-cout (TikZ),21,manuscript/chapters/ch21.tex,,schema,"Architecture de la méthode du coût : terrain + coût neuf (directs, indirects, incitatif) − dépréciations",verifie | |
added
verification/chapters/ch21-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-21-001,guide,"RC4028 — Remboursement de la TPS/TVH pour habitations neuves",Agence du revenu du Canada,Rév. 10/2026,https://www.canada.ca/fr/agence-revenu/services/formulaires-publications/publications/rc4028/remboursement-tps-tvh-habitations-neuves.html,2026-10-31,partiellement_verifie,21,"Lu par agent web-fetch le 2026-10-31 : seuil 450 000 $ (maison construite par le propriétaire) verbatim ; remboursement premiers acheteurs (travaux dès le 20 mars 2025, 1 M$ / 1,5 M$) verbatim ; 36 % / 6 300 $ / 350 000 $ non vérifiés mot à mot. Pages Revenu Québec (TVQ) HTTP 403." | |
added
verification/inventaire.md
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +# Inventaire (48 scripts, 17 fichiers de données, 3 classeurs, 24 figures) | |
| 2 | + | |
| 3 | +- module `analysis/python/traite/cas1.py` — Cas 1 — maison unifamiliale à Gatineau (données synthétiques) : calculs PARTAGÉS par les chapitres 9, 14, 16-2 | |
| 4 | +- module `analysis/python/traite/cas2.py` — Cas 2 — triplex à Québec, Limoilou (données synthétiques) : calculs PARTAGÉS par les chapitres 26, 27, 32 et 4 | |
| 5 | +- module `analysis/python/traite/cas3.py` — Cas 3 — immeuble de 12 logements à Montréal (données synthétiques) : calculs PARTAGÉS par les chapitres 26-31, | |
| 6 | +- module `analysis/python/traite/cas4.py` — Cas 4 — portefeuille multirésidentiel interrégional (données synthétiques) : calculs PARTAGÉS par les chapitre | |
| 7 | +- module `analysis/python/traite/comparables.py` — Méthode de comparaison : grille d'ajustements, ajustements séquentiels, ventes appariées, réconciliation. | |
| 8 | +- module `analysis/python/traite/cout.py` — Méthode du coût : coût neuf, dépréciation (physique, fonctionnelle, externe), extraction de marché. | |
| 9 | +- module `analysis/python/traite/finance.py` — Mathématiques financières de l'évaluation immobilière (conventions déclarées). | |
| 10 | +- module `analysis/python/traite/hedonique.py` — Outils économétriques : hédonique semi-log, indices (dummies temporelles, ventes répétées BMN / Case–Shiller), | |
| 11 | +- module `analysis/python/traite/style.py` — Style graphique du traité (Matplotlib). Palette validée : styles/palette.json. | |
| 12 | +- module `analysis/python/traite/synth.py` — Génération des quatre dossiers de cas SYNTHÉTIQUES du traité. | |
| 13 | +- calcul `analysis/python/cases/ch16\_selection.py` — Chapitre 16 — sélection des comparables pour le sujet du cas 1 (Gatineau, données synthétiques). | |
| 14 | +- calcul `analysis/python/cases/ch21\_cout\_neuf.py` — Chapitre 21 — coût neuf (remplacement) du sujet du cas 1 (Gatineau, DONNÉES SYNTHÉTIQUES) et indexation IPCB ( | |
| 15 | +- calcul `analysis/python/cases/ch29\_capitalisation.py` — Chapitre 29 — Capitalisation directe : calculs du cas 3 (12 logements, Rosemont ; DONNÉES SYNTHÉTIQUES). | |
| 16 | +- calcul `analysis/python/cases/ch30\_dcf.py` — Chapitre 30 — Flux actualisés et valeur terminale : exemple intégral du cas 3 (12 logements, Montréal, | |
| 17 | +- calcul `analysis/python/cases/ch47\_dossier.py` — Chapitre 47 — Cas 3 : immeuble de 12 logements à Montréal (DONNÉES SYNTHÉTIQUES, immeuble fictif). | |
| 18 | +- calcul `analysis/python/cases/generate\_all.py` — Régénère tous les jeux synthétiques (graine fixée). Usage : python3 -m analysis.python.cases.generate\_all (de | |
| 19 | +- calcul `analysis/python/cases/make\_spreadsheets.py` — Classeurs Excel du traité (openpyxl, formules vivantes) : spreadsheets/ | |
| 20 | +- figure `analysis/python/figures/ch21\_decomposition.py` — Figure ch21 — décomposition du coût neuf du sujet du cas 1 par corps de métier (DONNÉES SYNTHÉTIQUES, graine 2 | |
| 21 | +- figure `analysis/python/figures/ch21\_ipcb.py` — Figure ch21 — IPCB Montréal (Statistique Canada, tableau 18-10-0289-01, base 2023 = 100), données RÉELLES lues | |
| 22 | +- figure `analysis/python/figures/ch21\_sensibilite.py` — Figure ch21 — sensibilité du coût neuf du sujet du cas 1 (DONNÉES SYNTHÉTIQUES) : (a) grille taux d'indirects | |
| 23 | +- figure `analysis/python/figures/ch29\_figures.py` — Chapitre 29 — figures (5) : taux extraits (histogramme), taux vs état/taille (nuage), surface V(RNE, R) (carte | |
| 24 | +- figure `analysis/python/figures/ch30\_flux.py` — Ch. 30, figure « flux » : RNE, CAPEX et flux net avant dette (barres) du cas 3 (DONNÉES SYNTHÉTIQUES), puis va | |
| 25 | +- figure `analysis/python/figures/ch30\_gdc.py` — Ch. 30, figure « gdc » (DONNÉES RÉELLES, Banque du Canada, API Valet, téléchargées le 2026-10-31) : rendements | |
| 26 | +- figure `analysis/python/figures/ch30\_loyers.py` — Ch. 30, figure « loyers » : trajectoire du revenu brut potentiel contractuel (indexé au taux TAL + relocation | |
| 27 | +- figure `analysis/python/figures/ch30\_surface.py` — Ch. 30, figure « surface » : valeur DCF du cas 3 (DONNÉES SYNTHÉTIQUES) selon le taux d'actualisation r (ligne | |
| 28 | +- figure `analysis/python/figures/ch30\_tornade.py` — Ch. 30, figure « tornade » : variation de la valeur DCF du cas 3 (DONNÉES SYNTHÉTIQUES) pour un choc bas/haut | |
| 29 | +- figure `analysis/python/figures/ch47\_dossier\_figures.py` — Chapitre 47 — figures du dossier « 12 logements à Montréal » (DONNÉES SYNTHÉTIQUES, graine 20261031). | |
| 30 | +- figure `analysis/python/figures/run\_all.py` — Exécute tous les scripts de figures (analysis/python/figures/chNN\_*.py) et les scripts R (analysis/r/chNN\_*. | |
| 31 | +- test `analysis/python/tests/conftest.py` — | |
| 32 | +- test `analysis/python/tests/test\_cas1.py` — | |
| 33 | +- test `analysis/python/tests/test\_cas2\_cas4.py` — | |
| 34 | +- test `analysis/python/tests/test\_cas3.py` — | |
| 35 | +- test `analysis/python/tests/test\_ch16.py` — Chapitre 16 — vérification des chiffres cités dans le texte et les solutions. | |
| 36 | +- test `analysis/python/tests/test\_ch21.py` — Tests du chapitre 21 — coût neuf du sujet du cas 1, IPCB Montréal, sensibilité et exercices. | |
| 37 | +- test `analysis/python/tests/test\_ch29.py` — Tests du chapitre 29 — capitalisation directe (cas 3, données synthétiques). | |
| 38 | +- test `analysis/python/tests/test\_ch30.py` — Tests du chapitre 30 — flux actualisés et valeur terminale (cas 3, données synthétiques). | |
| 39 | +- test `analysis/python/tests/test\_ch47.py` — Tests du chapitre 47 (cas 3, 12 logements à Montréal — données synthétiques) : identités, valeurs citées dans | |
| 40 | +- test `analysis/python/tests/test\_comparables.py` — | |
| 41 | +- test `analysis/python/tests/test\_cout.py` — | |
| 42 | +- test `analysis/python/tests/test\_finance.py` — | |
| 43 | +- test `analysis/python/tests/test\_hedonique.py` — | |
| 44 | +- test `analysis/python/tests/test\_synth.py` — | |
| 45 | +- outil `tools/check\_manuscript.py` — Vérifications du manuscrit : stubs restants, figures manquantes, scripts des figures, | |
| 46 | +- outil `tools/inventaire.py` — Inventaire des scripts, tests, données, figures et classeurs → manuscript/appendices/\_inventaire.tex (longtab | |
| 47 | +- outil `tools/make\_labels.py` — Écrit un fichier d'étiquettes (newlabel) pour tous les chapitres et annexes, afin que cref{ch:NN} / cref{app:x | |
| 48 | +- outil `tools/make\_release.py` — Assemble release/ : PDF, sources LaTeX, données, figures, scripts, classeurs, corrigés, rapport de validation. | |
| 49 | +- outil `tools/merge\_sources.py` — Fusionne sources/registry-*.csv → sources/registry.csv, sources/normes-*.csv → sources/normes-matrice.csv, | |
| 50 | +- outil `tools/compile\_chapter.sh` — !/usr/bin/env bash | |
| \ No newline at end of file | ||
| 51 | ||