maj
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user