SPB Git

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>
Simon-Pierre Boucher committed (Oct 31, 2026) parent d16473f Browse files

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 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. 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 \begin{table}[tbp] 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} 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\small 265+\centering\footnotesize
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]@{}} 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 \toprule 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 \midrule 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 Maison individuelle & 66.1 & 71.9 & 86.3 & 100.0 & 107.3 & 116.5 & 1.620 \\ 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 \\ 272+Appartements, moins de 5 é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 \\ 273+Tour, 5 é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 \\ 274+Non résidentiel & 67.3 & 75.0 & 85.3 & 100.4 & 108.5 & 114.4 & 1.525 \\
275 \bottomrule 275 \bottomrule
276 \end{tabular} 276 \end{tabular}
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}.} 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 \end{exemple} 334 \end{exemple}
335 335
336 \begin{table}[tbp] 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 \centering\small 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 \toprule 340 \toprule
341 Bloc & {Postes} & {Montant (\$)} & {Part de $D+I$ (\%)} \\ 341 Bloc & {Postes} & {Montant (\$)} & {Part de $D+I$ (\%)} \\
342 \midrule 342 \midrule
@@ -348,9 +348,9 @@ Mécanique et électricité & 6 & 51105.45 & 14.1 \\
348 Aménagements extérieurs & 4 & 16607.70 & 4.6 \\ 348 Aménagements extérieurs & 4 & 16607.70 & 4.6 \\
349 \midrule 349 \midrule
350 Coûts directs $D$ & 33 & 298826.17 & 82.7 \\ 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 Sous-total $D + I$ & 38 & 361424.85 & 100.0 \\ 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 \midrule 354 \midrule
355 Coût neuf $C_N$ & & 397567.33 & \\ 355 Coût neuf $C_N$ & & 397567.33 & \\
356 \bottomrule 356 \bottomrule
@@ -367,10 +367,10 @@ Coût neuf $C_N$ & & 397567.33 & \\
367 367
368 \begin{table}[tbp] 368 \begin{table}[tbp]
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} 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 \begin{tabular}{@{}l S[table-format=4.0] S[table-format=3.1] S[table-format=4.0] S[table-format=3.1]@{}} 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 \toprule 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 \cmidrule(lr){2-3}\cmidrule(lr){4-5} 374 \cmidrule(lr){2-3}\cmidrule(lr){4-5}
375 Composante & {\$/m²} & {\$/pi²} & {\$/m²} & {\$/pi²} \\ 375 Composante & {\$/m²} & {\$/pi²} & {\$/m²} & {\$/pi²} \\
376 \midrule 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 \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.} 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 \label{tab:29:extraction} 67 \label{tab:29:extraction}
68 \centering 68 \centering
69−\begin{tabular}{l S[table-format=1.3] l} 69+\begin{tabular}{l S[table-format=-1.3] l}
70 \toprule 70 \toprule
71 {Statistique} & {Taux (\%)} & {Remarque} \\ 71 {Statistique} & {Taux (\%)} & {Remarque} \\
72 \midrule 72 \midrule
@@ -91,6 +91,7 @@ Régression : effet de la taille (par logement) & -0.023 & $R^2 = 0{,}16$ ; éca
91 \begin{figure}[htbp] 91 \begin{figure}[htbp]
92 \centering 92 \centering
93 \includegraphics[width=135mm]{ch29/ch29-fig-taux-extraits.pdf} 93 \includegraphics[width=135mm]{ch29/ch29-fig-taux-extraits.pdf}
94+\label{fig:29:taux-extraits}
94 \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 \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 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}} 96 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}}
96 \end{figure} 97 \end{figure}
@@ -108,6 +109,7 @@ où le centrage sur les attributs du sujet (état~3, douze logements) fait de la
108 \begin{figure}[htbp] 109 \begin{figure}[htbp]
109 \centering 110 \centering
110 \includegraphics[width=135mm]{ch29/ch29-fig-taux-etat-taille.pdf} 111 \includegraphics[width=135mm]{ch29/ch29-fig-taux-etat-taille.pdf}
112+\label{fig:29:taux-etat-taille}
111 \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.} 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 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}} 114 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}}
113 \end{figure} 115 \end{figure}
@@ -194,7 +196,7 @@ Le \cref{tab:29:construction} rassemble les quatre constructions appliquées au
194 \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).} 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 \label{tab:29:construction} 197 \label{tab:29:construction}
196 \centering 198 \centering
197−\small 199+\footnotesize\setlength{\tabcolsep}{4.5pt}
198 \begin{tabular}{l l S[table-format=1.3] S[table-format=7.0]} 200 \begin{tabular}{l l S[table-format=1.3] S[table-format=7.0]}
199 \toprule 201 \toprule
200 {Construction} & {Paramètres} & {$R$ (\%)} & {$V = \NOI_1/R$ (\$)} \\ 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 \begin{figure}[htbp] 220 \begin{figure}[htbp]
219 \centering 221 \centering
220 \includegraphics[width=135mm]{ch29/ch29-fig-bande-investissement.pdf} 222 \includegraphics[width=135mm]{ch29/ch29-fig-bande-investissement.pdf}
223+\label{fig:29:bande}
221 \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é.} 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 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, paramètres du cas~3, graine 20261031}} 225 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, paramètres du cas~3, graine 20261031}}
223 \end{figure} 226 \end{figure}
@@ -271,6 +274,7 @@ Un taux de capitalisation se décompose conceptuellement en un taux sans risque,
271 \begin{figure}[htbp] 274 \begin{figure}[htbp]
272 \centering 275 \centering
273 \includegraphics[width=135mm]{ch29/ch29-fig-taux-gdc.pdf} 276 \includegraphics[width=135mm]{ch29/ch29-fig-taux-gdc.pdf}
277+\label{fig:29:gdc}
274 \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.} 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 \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}).} 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 \end{figure} 280 \end{figure}
@@ -291,14 +295,13 @@ L'immeuble sujet est un bâtiment fictif de douze logements (quatre 3½, six 4½
291 \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).} 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 \label{tab:29:rne} 296 \label{tab:29:rne}
293 \centering 297 \centering
294−\small 298+\begin{tabular}{L{60mm} S[table-format=6.2] L{40mm}}
295−\begin{tabular}{l S[table-format=6.2] l}
296 \toprule 299 \toprule
297 {Poste} & {Montant (\$)} & {Base de normalisation} \\ 300 {Poste} & {Montant (\$)} & {Base de normalisation} \\
298 \midrule 301 \midrule
299 Revenu brut potentiel, loyers contractuels (RBP) & 165540.00 & douze baux en vigueur, $\times 12$ \\ 302 Revenu brut potentiel, loyers contractuels (RBP) & 165540.00 & douze baux en vigueur, $\times 12$ \\
300 \quad\emph{pour mémoire : RBP aux loyers de marché} & {\emph{186 036,00}} & loyers SCHL zone Rosemont, oct. 2025 \\ 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 Autres revenus (stationnement, buanderie) & 9360.00 & six places et services \\ 305 Autres revenus (stationnement, buanderie) & 9360.00 & six places et services \\
303 \textbf{Revenu brut effectif (RBE)} & \textbf{168443.94} & \\ 306 \textbf{Revenu brut effectif (RBE)} & \textbf{168443.94} & \\
304 \midrule 307 \midrule
@@ -333,7 +336,7 @@ Les quarante ventes de l'échantillon ont été analysées à la \cref{sec:29:ex
333 \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.} 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 \label{tab:29:proches} 337 \label{tab:29:proches}
335 \centering 338 \centering
336−\small 339+\footnotesize\setlength{\tabcolsep}{4pt}
337 \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]} 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 \toprule 341 \toprule
339 {Vente} & {Date} & {Quartier} & {Log.} & {Année} & {RNE (\$)} & {Prix (\$)} & {Taux (\%)} & {MRB} \\ 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 \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.} 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 \label{tab:29:sensibilite} 386 \label{tab:29:sensibilite}
384 \centering 387 \centering
388+\footnotesize\setlength{\tabcolsep}{4.5pt}
385 \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]} 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 \toprule 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 \midrule 392 \midrule
389 3.75 & 2278879 & 2398820 & 2518761 & +17.7 \\ 393 3.75 & 2278879 & 2398820 & 2518761 & +17.7 \\
390 4.00 & 2136449 & 2248894 & 2361339 & +10.4 \\ 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 \begin{figure}[htbp] 405 \begin{figure}[htbp]
402 \centering 406 \centering
403 \includegraphics[width=135mm]{ch29/ch29-fig-surface-v.pdf} 407 \includegraphics[width=135mm]{ch29/ch29-fig-surface-v.pdf}
408+\label{fig:29:surface}
404 \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.} 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 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}} 410 \figsource{\synth{script \texttt{analysis/python/figures/ch29\_figures.py}, graine 20261031}}
406 \end{figure} 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 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. 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 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 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} 86+\begin{align}\label{eq:30:loyers}
87−M_{i,t} = M_{i,1}(1+g_m)^{t-1}, \qquad 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} 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−\qquad RBP_t = 12 \sum_{i=1}^{n} L_{i,t}. 89+RBP_t &= 12 \sum_{i=1}^{n} L_{i,t}. &&
90−\end{equation} 90+\end{align}
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. 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 \begin{figure}[htbp] 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 \label{fig:30:loyers} 98 \label{fig:30:loyers}
99 \end{figure} 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 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. 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 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}). 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 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}). 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 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 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 \begin{equation}\label{eq:30:taux-mensuel} 208 \begin{equation}\label{eq:30:taux-mensuel}
209 i_m = \left(1 + \frac{i}{2}\right)^{1/6} - 1 = (1{,}0206)^{1/6} - 1 = \pct{0.34042}, 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 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. 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 \begin{table}[htbp] 278 \begin{table}[htbp]
279−\centering\footnotesize 279+\centering\footnotesize\setlength{\tabcolsep}{4pt}
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.} 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 \label{tab:30:projection} 281 \label{tab:30:projection}
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]@{}} 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 \toprule 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 \midrule 285 \midrule
286 1 & 2026 & 165540 & 186036 & 168444 & 70385 & 8103 & 89956 \\ 286 1 & 2026 & 165540 & 186036 & 168444 & 70385 & 8103 & 89956 \\
287 2 & 2027 & 177389 & 192547 & 180112 & 72497 & 8103 & 99512 \\ 287 2 & 2027 & 177389 & 192547 & 180112 & 72497 & 8103 & 99512 \\
@@ -369,12 +369,12 @@ Valeur par capitalisation directe (\pct{4.415}) & 2037503 & \\
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}$. 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 \begin{table}[htbp] 371 \begin{table}[htbp]
372−\centering\footnotesize 372+\centering\footnotesize\setlength{\tabcolsep}{4pt}
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}).} 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 \label{tab:30:levier} 374 \label{tab:30:levier}
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]@{}} 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 \toprule 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 \midrule 378 \midrule
379 0 & & & & & & -732606 \\ 379 0 & & & & & & -732606 \\
380 1 & 89956 & 89956 & 74963 & 14993 & 1.20 & 14993 \\ 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 \end{figure} 441 \end{figure}
442 442
443 \begin{table}[htbp] 443 \begin{table}[htbp]
444−\centering\footnotesize 444+\centering\footnotesize\setlength{\tabcolsep}{4pt}
445 \caption{Tornade du cas 3 : valeur aux bornes basse et haute de chaque intrant et amplitude (dollars), base \dollars{2208566}.} 445 \caption{Tornade du cas 3 : valeur aux bornes basse et haute de chaque intrant et amplitude (dollars), base \dollars{2208566}.}
446 \label{tab:30:tornade} 446 \label{tab:30:tornade}
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]@{}} 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 \toprule 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 \midrule 450 \midrule
451−Croissance des loyers de marché (2,5 / \pct{4.5}) & 2055176 & 2423411 & -153390 & 214845 & 368235 \\ 451+Croiss. 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 \\ 452+Croiss. 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 \\ 453+Indexation des baux (2,0 / \pct{4.0}) & 2118624 & 2326053 & -89942 & 117487 & 207429 \\
454−Taux d'actualisation $r$ ($-50$ / $+\qty{50}{\pb}$) & 2300356 & 2121138 & 91790 & -87428 & 179218 \\ 454+Taux $r$ ($\pm\qty{50}{\pb}$) & 2300356 & 2121138 & 91790 & -87428 & 179218 \\
455−Taux terminal $R_T$ ($-25$ / $+\qty{25}{\pb}$) & 2289943 & 2134939 & 81377 & -73626 & 155003 \\ 455+Taux terminal $R_T$ ($\pm\qty{25}{\pb}$) & 2289943 & 2134939 & 81377 & -73626 & 155003 \\
456 Rotation annuelle (5 / \pct{25}) & 2140916 & 2231655 & -67649 & 23089 & 90738 \\ 456 Rotation annuelle (5 / \pct{25}) & 2140916 & 2231655 & -67649 & 23089 & 90738 \\
457 CAPEX ($-25$ / $+\pct{25}$) & 2252978 & 2164154 & 44412 & -44412 & 88824 \\ 457 CAPEX ($-25$ / $+\pct{25}$) & 2252978 & 2164154 & 44412 & -44412 & 88824 \\
458 Inoccupation et pertes (2,9 / \pct{4.9}) & 2246652 & 2170480 & 38086 & -38086 & 76173 \\ 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 \begin{equation}\label{eq:47:rne} 301 \begin{equation}\label{eq:47:rne}
302 \NOI_1 = RBE - DE - RR = \dollars{168443.94} - \dollars{70385.19} - \dollars{8103.00} = \dollars{89955.75}, 302 \NOI_1 = RBE - DE - RR = \dollars{168443.94} - \dollars{70385.19} - \dollars{8103.00} = \dollars{89955.75},
303 \end{equation} 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 \end{solution} 48 \end{solution}
49 49
50 \begin{solution}{ex:30:7}{TRI des fonds propres, flux non conventionnels et MIRR} 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 (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. 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
Menu

Theme