Exemple de programme en Python : calcul d’un échéancier d’emprunt

Python est un langage de programmation moderne très utile pour traiter de la donnée et automatiser des calculs.

PYTHON Calcul emprunt output viewer

Automatiser le calcul de remboursement d’emprunt est un classique du genre. C’est précisément cette tâche que je vous propose d’aborder comme premier exemple de programme Python. Cet exemple ne présente pas de difficultés particulières et passe par les trois étapes suivantes :

  • Collecte des caractéristiques de l’emprunt (montant, durée, taux)
  • Calcul de la mensualité
  • Calcul de l’échéancier de remboursement d’emprunt.

La collecte des caractéristiques de l’emprunt passe par la fonction input. Ainsi la saisie du montant du capital (nombre décimal float) :

capital = float(input("Capital emprunté : "))

Le calcul de la mensualité :

mens = (capital * taux / 12) / (1 - (1 + taux / 12) ** -(duree * 12))

L’élévation à la puissance est réalisée à l’aide du double astérisque **.

Chaque échéance d’emprunt comprend le calcul des intérêts (capital restant dû x taux mensuel) et de l’amortissement du capital (mensualité – intérêts) :

  • Intérêts :
interet = capital_restant * taux / 12
  • Capital remboursé :
capital_remb = mens - interet

Une simple boucle compteur répète autant de fois que nécessaire le calcul des échéances :

for i in range(1, duree * 12 + 1):
    interet = capital_restant * taux / 12
    capital_remb = mens - interet

La boucle initiée par for i in range( fait prendre à la variable i tour à tour les valeurs 1, 2, 3… jusqu’à la dernière échéance 121 (sur la base de 10 ans x 12 mois + 1) afin de réaliser le calcul des échéances 120 fois (dans le cas présent). A noter : dans ce calcul, la dernière échéance est la 121 (10 * 12 + 1), or sur un emprunt de 10 ans, il n’y en a que 120. En fait, en Python, la fonction range(début, fin) génère une séquence de nombres de début inclus à fin exclu. Ainsi, range(1, duree * 12 + 1) génère les nombres de 1 à duree * 12 (ou 120) inclus.

Toutes les douze mensualités (if i % 12 == 0:), le programme affiche la synthèse des intérêts et du capital remboursés de la période. Le signe % sert en Python à calculer le reste d’une division (modulo).

Les données calculées sont stockées dans une liste, équivalent de la variable tableau en VBA, nommée ici table_emprunt :

table_emprunt = []

[...]

# Boucle de calcul de l'échéancier
for i in range(1, duree * 12 + 1):
    [...]

    # Constitution de l'échéance en cours (i)
    ligne_echeance = [i, locale._format('%.2f', capital_restant),
           locale._format('%.2f', interet),
           locale._format('%.2f', capital_remb),
           locale._format('%.2f', capital_restant - capital_remb)]

    # Ajout de la ligne dans le tableau
    table_emprunt.append(ligne_echeance)

    [...]

    # Dernière échéance de l'année (divisible par 12)
    if i % 12 == 0:
        # Affichage des échéances de l'année (sous forme d'un tableau)
        print(tabulate(table_emprunt, headers=headers, tablefmt="fancy_grid"))

Un simple print(tabulate()) permet d’afficher les données à l’écran.

Le script Python du programme fournit ci-après comprend des commentaires explicatifs.

Exemple d’exécution du programme :

Saisie des paramètres de calcul : montant emprunt = 100 000 € sur 10 ans (120 mensualités) à 3,60 % l’an.

L’interpréteur Python affiche instantanément le montant de la mensualité (993,55 €) suivi de l’échéancier de remboursement.

Chaque année est séparée par une synthèse des intérêts et du capital remboursés sur la période :

PYTHON Calcul emprunt Squeezed.PNG

Pour visionner les échéances de remboursements (affichées pour le moment sous forme de captions Squeezed text), deux alternatives :

  • Le clic droit ouvre un menu contextuel qui propose de visionner (View) l’échéancier dans une fenêtre (Squeezed Output Viewer) ou de le copier dans le presse-papier (Copy) pour l’utiliser dans une autre application.
  • Le clic gauche ouvre le tableau :

PYTHON Calcul emprunt année 1

Ce script Python est adapté du programme écrit en FreeBasic et largement commenté dans cette série d’articles : https://www.auditsi.eu/?p=1797.

A titre de comparaison, voici le même échéancier calculé avec la calculatrice en ligne programmée en PHP (cf calcul d’échéanciers d’emprunt en ligne) :

Echéancier emprunt

Code source complet du programme de calcul d’échéancier d’emprunt en Python :

# ------------------------------------------------------------------------------------
# Calcul d'un échéancier d'emprunt
# 12/2023 (Python)
# Infos : https://www.auditsi.eu/?p=12153
# ------------------------------------------------------------------------------------
# Ecrit initialement en basic (2012) sous FreeBASIC (cf https://www.auditsi.eu/?cat=1207)

# Bibliothèques externes
import locale #définit la configuration régionale d'un programme (nombres décimaux par exemple)
from tabulate import tabulate # nécessite une installation : pip install tabulate

# Configure Python pour utiliser les paramètres régionaux (séparateur décimal, séparateur de milliers...) par défaut du système d'exploitation
locale.setlocale(locale.LC_ALL, '')

# Variables emprunt année
interet_periode = 0
capital_periode = 0

# Saisie des paramètres de l'emprunt
print("Calcul d'un échéancier d'emprunt")
print()

capital = float(input("Capital emprunté : "))
duree = int(input("Durée de l'emprunt en années : "))
taux = float(input("Taux annuel : "))

# Calcul et affichage de la mensualité
taux /= 100
mens = (capital * taux / 12) / (1 - (1 + taux / 12) ** -(duree * 12))
print(f"Mensualité : {locale._format('%.2f', mens)}")

# Calcul, affichage et enregistrement de l'échéancier
capital_restant = capital

# Définition de la table de données emprunt
table_emprunt = []

# En-tête du tableau d'emprunt
headers = ["Mois", "Capital restant", "Intérêts", "Capital remboursé", "Capital restant"]

# Boucle de calcul de l'échéancier
for i in range(1, duree * 12 + 1):
    interet = capital_restant * taux / 12
    capital_remb = mens - interet

    # Constitution de l'échéance en cours (i)
    ligne_echeance = [i, locale._format('%.2f', capital_restant),
           locale._format('%.2f', interet),
           locale._format('%.2f', capital_remb),
           locale._format('%.2f', capital_restant - capital_remb)]

    # Ajout de la ligne dans le tableau
    table_emprunt.append(ligne_echeance)

    # MAJ du capital restant à rembourser en fin de période
    capital_restant -= capital_remb

    # MAJ des totalisations annuelles
    interet_periode += interet
    capital_periode += capital_remb

    # Dernière échéance de l'année (divisible par 12)
    if i % 12 == 0:
        # Affichage des échéances de l'année (sous forme d'un tableau)
        print(tabulate(table_emprunt, headers=headers, tablefmt="fancy_grid"))

        # Affichage des totaux de l'année
        print(f"Total année {i // 12} {'-'*60}")
        print(f"Intérêts de la période : {locale._format('%.2f', interet_periode)}")
        print(f"Capital de la période : {locale._format('%.2f', capital_periode)}")
        print('-' * 75)

        # RAZ des totalisations de l'année
        interet_periode=0
        capital_periode=0

        # RAZ du tableau pour traitement de l'année suivante
        table_emprunt = []

Autre projet : exécution de requêtes SQL sur l’ensemble des comptabilités d’un groupe et restitution sur Excel :

PROJET REQUETE PY PADOCC

Pour approfondir le sujet : se former à la programmation en langage Python pour automatiser ses tâches

Share Button
Calcul Emprunt
Calcul Emprunt
Calcul-emprunt.txt
3 KiB
185 téléchargements
Détails...
The following two tabs change content below.
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.