SPB Git
2.7 KB · 42 lines python
1#!/usr/bin/env python32"""Ch. 31, figure « solde » (DONNÉES SYNTHÉTIQUES, cas 3) : trajectoire du solde du prêt de 1 475 959 $ à 4,12 % (composition3semestrielle) amorti sur 480 mois, avec les soldes au terme (60 mois) et à la revente (120 mois), et décomposition annuelle du4service de la dette en intérêts et capital. Sortie : ch31-fig-solde.pdf."""5from __future__ import annotations6import sys, pathlib7sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1]))8import numpy as np, matplotlib.pyplot as plt9from matplotlib.ticker import FuncFormatter10from traite.style import setup, palette, savefig, LARGEUR, fmt_milliers11from cases import ch31_financement as c1213def main():14    setup()15    r = c.base(); h = r["financement"]["hypotheque"]16    dec = c.decomposition_annuelle(h)17    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(LARGEUR, 3.0), gridspec_kw={"width_ratios": [1.1, 1]})18    k = np.arange(0, h.amortissement_mois + 1)19    solde = np.array([h.solde(int(x)) for x in k]) / 100020    ax1.plot(k / 12, solde, color=palette.cat[0], lw=1.8)21    # convention américaine pour comparaison22    import traite.finance as fin23    hus = fin.Hypotheque(h.capital, h.taux_nominal, h.amortissement_mois, composition=12)24    ax1.plot(k / 12, np.array([hus.solde(int(x)) for x in k]) / 1000, color=palette.cat[2], lw=1.0, ls="--")25    for m, lab, dx, dy in ((60, "fin du terme (60 mois)", 4.0, -330), (120, "revente (120 mois)", 6.0, -620)):26        s = h.solde(m) / 100027        ax1.plot([m / 12], [s], "o", color=palette.cat[1], ms=4)28        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,29                     arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6))30    ax1.text(1.0, 180, "trait plein : semestriel (Canada)\npointillé : mensuel (É.-U.)", fontsize=7.2, color=palette.ink)31    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)32    ax1.set_title("Trajectoire du solde", loc="left")33    ax2.bar(dec["annee"], dec["interet"] / 1000, color=palette.cat[1], width=0.8, label="Intérêts")34    ax2.bar(dec["annee"], dec["capital"] / 1000, bottom=dec["interet"] / 1000, color=palette.cat[0], width=0.8, label="Capital remboursé")35    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)36    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)37    ax2.legend(loc="upper right", fontsize=7.5, ncol=2); ax2.set_title("Intérêts et capital par année", loc="left")38    savefig(fig, "ch31/ch31-fig-solde.pdf")3940if __name__ == "__main__":41    main()42
Files · 0b0a78499997700c9aa16d44b91243a1ef46c0bb
Menu

Theme