114 lines
4.4 KiB
Python
114 lines
4.4 KiB
Python
|
|
"""
|
||
|
|
DragonBank - Simulateur d'Epargne
|
||
|
|
===================================
|
||
|
|
Classe de logique pure pour la simulation de croissance d'epargne.
|
||
|
|
|
||
|
|
Cette classe ne fait aucun acces a la base de donnees.
|
||
|
|
Elle contient uniquement les formules mathematiques de calcul
|
||
|
|
des interets composes avec versements mensuels reguliers.
|
||
|
|
|
||
|
|
Version : 3.0
|
||
|
|
"""
|
||
|
|
|
||
|
|
|
||
|
|
class Simulateur:
|
||
|
|
"""
|
||
|
|
Calcule la croissance d'un capital epargne par interets composes.
|
||
|
|
|
||
|
|
Formule appliquee pour chaque mois :
|
||
|
|
solde = solde * (1 + taux_mensuel) + versement_mensuel
|
||
|
|
|
||
|
|
Ou taux_mensuel = taux_annuel / 100 / 12.
|
||
|
|
|
||
|
|
Cette approche modelise les interets composes mensuels,
|
||
|
|
qui correspondent au fonctionnement reel du Livret A et
|
||
|
|
de l'assurance vie en fonds euros.
|
||
|
|
"""
|
||
|
|
|
||
|
|
def simuler(self, capital_initial, taux_annuel, duree_annees,
|
||
|
|
versement_mensuel=0.0):
|
||
|
|
"""
|
||
|
|
Simule la croissance d'un capital sur une duree donnee.
|
||
|
|
|
||
|
|
Calcule le capital annee par annee en appliquant les
|
||
|
|
interets composes chaque mois et en ajoutant les versements.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
capital_initial (float) : Montant de depart en euros.
|
||
|
|
taux_annuel (float) : Taux d'interet annuel en %.
|
||
|
|
duree_annees (int) : Duree de la simulation en annees.
|
||
|
|
versement_mensuel (float): Versement mensuel regulier (defaut: 0).
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
dict: Resultats complets de la simulation :
|
||
|
|
- capital_initial (float) : Mise de depart.
|
||
|
|
- taux_annuel (float) : Taux utilise.
|
||
|
|
- duree_annees (int) : Duree de la simulation.
|
||
|
|
- versement_mensuel (float) : Versement mensuel.
|
||
|
|
- capital_final (float) : Capital total a la fin.
|
||
|
|
- total_verse (float) : Somme totale versee (capital + versements).
|
||
|
|
- total_interets (float) : Interets generes.
|
||
|
|
- gain_pourcentage (float) : Gain en % par rapport au total verse.
|
||
|
|
- courbe (list[dict]) : Evolution annee par annee.
|
||
|
|
"""
|
||
|
|
taux_mensuel = taux_annuel / 100.0 / 12.0
|
||
|
|
solde_courant = float(capital_initial)
|
||
|
|
total_verse = float(capital_initial)
|
||
|
|
courbe = []
|
||
|
|
|
||
|
|
for annee in range(1, duree_annees + 1):
|
||
|
|
solde_courant, total_verse = self._calculer_annee(
|
||
|
|
solde_courant, total_verse, taux_mensuel, versement_mensuel
|
||
|
|
)
|
||
|
|
|
||
|
|
courbe.append({
|
||
|
|
'annee': annee,
|
||
|
|
'solde': round(solde_courant, 2),
|
||
|
|
'total_verse': round(total_verse, 2),
|
||
|
|
'interets': round(solde_courant - total_verse, 2)
|
||
|
|
})
|
||
|
|
|
||
|
|
capital_final = round(solde_courant, 2)
|
||
|
|
total_interets = round(solde_courant - total_verse, 2)
|
||
|
|
gain_pct = round((total_interets / max(total_verse, 1)) * 100, 2)
|
||
|
|
|
||
|
|
return {
|
||
|
|
'capital_initial': capital_initial,
|
||
|
|
'taux_annuel': taux_annuel,
|
||
|
|
'duree_annees': duree_annees,
|
||
|
|
'versement_mensuel': versement_mensuel,
|
||
|
|
'capital_final': capital_final,
|
||
|
|
'total_verse': round(total_verse, 2),
|
||
|
|
'total_interets': total_interets,
|
||
|
|
'gain_pourcentage': gain_pct,
|
||
|
|
'courbe': courbe
|
||
|
|
}
|
||
|
|
|
||
|
|
# =========================================================
|
||
|
|
# UTILITAIRE PRIVE
|
||
|
|
# =========================================================
|
||
|
|
|
||
|
|
def _calculer_annee(self, solde, total_verse, taux_mensuel, versement_mensuel):
|
||
|
|
"""
|
||
|
|
Calcule le solde et le total verse apres 12 mois.
|
||
|
|
|
||
|
|
Applique la formule des interets composes mois par mois,
|
||
|
|
puis ajoute le versement mensuel.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
solde (float) : Solde en debut d'annee.
|
||
|
|
total_verse (float) : Total deja verse en debut d'annee.
|
||
|
|
taux_mensuel (float) : Taux mensuel (taux_annuel / 12 / 100).
|
||
|
|
versement_mensuel (float): Versement ajoute chaque mois.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
tuple: (nouveau_solde, nouveau_total_verse) apres 12 mois.
|
||
|
|
"""
|
||
|
|
for mois in range(12):
|
||
|
|
if taux_mensuel > 0:
|
||
|
|
solde = solde * (1.0 + taux_mensuel)
|
||
|
|
solde = solde + versement_mensuel
|
||
|
|
total_verse = total_verse + versement_mensuel
|
||
|
|
|
||
|
|
return solde, total_verse
|