#!/usr/bin/env python3 """Ch. 31, figure « solde » (DONNÉES SYNTHÉTIQUES, cas 3) : trajectoire du solde du prêt de 1 475 959 $ à 4,12 % (composition semestrielle) amorti sur 480 mois, avec les soldes au terme (60 mois) et à la revente (120 mois), et décomposition annuelle du service de la dette en intérêts et capital. Sortie : ch31-fig-solde.pdf.""" from __future__ import annotations import sys, pathlib sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) import numpy as np, matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter from traite.style import setup, palette, savefig, LARGEUR, fmt_milliers from cases import ch31_financement as c def main(): setup() r = c.base(); h = r["financement"]["hypotheque"] dec = c.decomposition_annuelle(h) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(LARGEUR, 3.0), gridspec_kw={"width_ratios": [1.1, 1]}) k = np.arange(0, h.amortissement_mois + 1) solde = np.array([h.solde(int(x)) for x in k]) / 1000 ax1.plot(k / 12, solde, color=palette.cat[0], lw=1.8) # convention américaine pour comparaison import traite.finance as fin hus = fin.Hypotheque(h.capital, h.taux_nominal, h.amortissement_mois, composition=12) ax1.plot(k / 12, np.array([hus.solde(int(x)) for x in k]) / 1000, color=palette.cat[2], lw=1.0, ls="--") for m, lab, dx, dy in ((60, "fin du terme (60 mois)", 4.0, -330), (120, "revente (120 mois)", 6.0, -620)): s = h.solde(m) / 1000 ax1.plot([m / 12], [s], "o", color=palette.cat[1], ms=4) ax1.annotate(f"{lab}\n{fmt_milliers(s*1000)} $", xy=(m / 12, s), xytext=(m / 12 + dx, s + dy), fontsize=7.5, color=palette.ink, arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6)) ax1.text(1.0, 180, "trait plein : semestriel (Canada)\npointillé : mensuel (É.-U.)", fontsize=7.2, color=palette.ink) ax1.set_xlabel("Années écoulées"); ax1.set_ylabel("Solde du prêt (milliers de $)"); ax1.set_xlim(0, 40); ax1.set_ylim(0, 1600) ax1.set_title("Trajectoire du solde", loc="left") ax2.bar(dec["annee"], dec["interet"] / 1000, color=palette.cat[1], width=0.8, label="Intérêts") ax2.bar(dec["annee"], dec["capital"] / 1000, bottom=dec["interet"] / 1000, color=palette.cat[0], width=0.8, label="Capital remboursé") ax2.axvline(5.5, color=palette.ink2, lw=0.7, ls=":"); ax2.text(6.0, 77.5, "fin du terme", fontsize=7, color=palette.ink2) ax2.set_xlabel("Année du prêt"); ax2.set_ylabel("Service de la dette (milliers de $)"); ax2.set_xlim(0.3, 40.7); ax2.set_ylim(0, 100) ax2.legend(loc="upper right", fontsize=7.5, ncol=2); ax2.set_title("Intérêts et capital par année", loc="left") savefig(fig, "ch31/ch31-fig-solde.pdf") if __name__ == "__main__": main()