Python est un langage de programmation moderne très utile pour traiter de la donnée et automatiser des calculs.
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 :
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 :
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) :
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 :
Pour approfondir le sujet : se former à la programmation en langage Python pour automatiser ses tâches
Derniers articles parBenoît RIVIERE (voir tous)
- Projet IXP (v1.2beta) : quelques nouvelles de mon interpréteur d’expressions - dimanche 1 décembre 2024
- Nouveautés de l’interpréteur de formules de calcul (v1.1) - dimanche 3 novembre 2024
- Dématérialisation de la facturation : nouvelles mentions obligatoires - lundi 28 octobre 2024
- Interpréteur de formules de calcul en Python - dimanche 13 octobre 2024
- Les données de la facturation électronique - mercredi 9 octobre 2024
Pingback: Analyse de données & Python : créer un FEC augmenté - Audit & Systèmes d'Information