Obiettivi di apprendimento:
Contenuto teorico:
import math
def calcolatore_interesse_composto():
print("💰 CALCOLATORE INTERESSE COMPOSTO 💰")
def calcola_interesse_composto(principale, tasso, tempo, frequenza=1):
"""
Calcola interesse composto (Montante = P * (1 + r/n)^(nt))
principale: capitale iniziale
tasso: tasso di interesse annuale (decimale)
tempo: periodo in anni
frequenza: quante volte l'interesse viene composto per anno (n)
"""
# La formula dell'interesse composto: Montante = P * (1 + r/n)^(nt)
montante = principale * (1 + tasso/frequenza) ** (frequenza * tempo)
interesse = montante - principale
return montante, interesse
def calcola_valore_futuro_versamenti(versamento, tasso, tempo, frequenza=12):
"""
Calcola il valore futuro di versamenti regolari (rendita)
Formula: FV = PMT * [((1 + r/n)^(nt) - 1) / (r/n)]
"""
tasso_periodo = tasso / frequenza
num_periodi = frequenza * tempo
if tasso_periodo == 0:
# Caso limite: tasso zero (solo versamenti)
return versamento * num_periodi
valore_futuro = versamento * (((1 + tasso_periodo) ** num_periodi - 1) / tasso_periodo)
return valore_futuro
def mostra_tabella_crescita(principale, tasso, tempo, frequenza=1):
print(f"\n📊 CRESCITA NEL TEMPO (Frequenza: {frequenza}/anno):")
print(f"{'Anno':<6} {'Capitale':<12} {'Interesse':<12} {'Totale':<12}")
print("-" * 50)
# Uso del float per il capitale per tenere traccia con precisione
capitale_corrente = principale
for anno in range(1, min(tempo + 1, 21)): # Max 20 anni per tabella
# Calcola il montante alla fine dell'anno 'anno'
montante_anno = principale * (1 + tasso/frequenza) ** (frequenza * anno)
# Calcola l'interesse generato SOLO nell'ultimo anno
montante_anno_precedente = principale * (1 + tasso/frequenza) ** (frequenza * (anno - 1)) if anno > 1 else principale
interesse_anno = montante_anno - montante_anno_precedente
# Stampa la riga, mostrando l'interesse composto accumulato
print(f"{anno:<6} €{principale:<11,.2f} €{interesse_anno:<11,.2f} €{montante_anno:<11,.2f}")
capitale_corrente = montante_anno # Aggiorna il capitale corrente se fosse un calcolo step-by-step
def confronta_scenari():
print("\n🔍 CONFRONTO SCENARI DI INVESTIMENTO")
scenari = [
{"nome": "Conservativo", "tasso": 0.02, "descrizione": "Conto deposito (2%)"},
{"nome": "Moderato", "tasso": 0.05, "descrizione": "Obbligazioni miste (5%)"},
{"nome": "Aggressivo", "tasso": 0.08, "descrizione": "Azioni diversificate (8%)"},
{"nome": "Molto Aggressivo", "tasso": 0.12, "descrizione": "Investimenti ad alto rischio (12%)"}
]
try:
principale = float(input("Capitale iniziale (€): "))
tempo = int(input("Periodo (anni): "))
print(f"\n📈 CONFRONTO DOPO {tempo} ANNI:")
print(f"{'Scenario':<18} {'Tasso':<8} {'Montante':<12} {'Guadagno':<12}")
print("-" * 60)
for scenario in scenari:
montante, interesse = calcola_interesse_composto(principale, scenario["tasso"], tempo)
print(f"{scenario['nome']:<18} {scenario['tasso']:.1%} €{montante:<11,.2f} €{interesse:<11,.2f}")
print(f" {scenario['descrizione']}")
except ValueError:
print("❌ Valori non validi!")
def calcola_tempo_per_obiettivo():
print("\n🎯 TEMPO PER RAGGIUNGERE UN OBIETTIVO")
try:
principale = float(input("Capitale iniziale (€): "))
obiettivo = float(input("Obiettivo (€): "))
tasso = float(input("Tasso interesse annuale (%): ")) / 100
if obiettivo <= principale:
print("❌ L'obiettivo deve essere maggiore del capitale iniziale!")
return
if tasso <= 0:
print("❌ Il tasso deve essere positivo!")
return
# Formula (derivata da FV = PV * (1 + r)^t): t = ln(FV/PV) / ln(1 + r)
tempo = math.log(obiettivo / principale) / math.log(1 + tasso)
anni = int(tempo)
mesi = int((tempo - anni) * 12)
print(f"\n📅 RISULTATO:")
print(f"Per trasformare €{principale:,.2f} in €{obiettivo:,.2f}")
print(f"al tasso del {tasso:.1%} annuo servono:")
print(f"⏰ {anni} anni e {mesi} mesi ({tempo:.2f} anni)")
# Mostra crescita anno per anno
if tempo <= 20:
mostra_tabella_crescita(principale, tasso, math.ceil(tempo))
except ValueError:
print("❌ Valori non validi!")
except Exception as e:
print(f"❌ Errore nel calcolo: {e}")
def piano_pensionistico():
print("\n🏖️ SIMULATORE PIANO PENSIONISTICO")
try:
eta_attuale = int(input("Età attuale: "))
eta_pensione = int(input("Età pensione desiderata: "))
versamento_mensile = float(input("Versamento mensile (€): "))
tasso_annuo = float(input("Rendimento atteso annuale (%): ")) / 100
anni_investimento = eta_pensione - eta_attuale
if anni_investimento <= 0:
print("❌ L'età di pensione deve essere maggiore dell'età attuale!")
return
# Calcola il montante con versamenti mensili (frequenza=12)
capitale_accumulato = calcola_valore_futuro_versamenti(
versamento_mensile, tasso_annuo, anni_investimento, 12
)
versamenti_totali = versamento_mensile * 12 * anni_investimento
interessi_guadagnati = capitale_accumulato - versamenti_totali
print(f"\n💰 PIANO PENSIONISTICO - RISULTATI:")
print("="*50)
print(f"Periodo investimento: {anni_investimento} anni")
print(f"Versamento mensile: €{versamento_mensile:,.2f}")
print(f"Versamenti totali: €{versamenti_totali:,.2f}")
print(f"Interessi guadagnati: €{interessi_guadagnati:,.2f}")
print(f"CAPITALE A {eta_pensione} ANNI: €{capitale_accumulato:,.2f}")
# Calcola rendita mensile ipotetica
anni_pensione = 25 # Assumiamo 25 anni di pensione post-pensione
rendita_mensile_lorda = capitale_accumulato / (12 * anni_pensione)
print(f"\n🏖️ RENDITA PENSIONISTICA IPOTETICA:")
print(f"Rendita mensile (lorda) per {anni_pensione} anni: €{rendita_mensile_lorda:,.2f}")
print(f"Rendita annuale (lorda): €{rendita_mensile_lorda * 12:,.2f}")
# Confronto con inflazione (per dare un contesto del potere d'acquisto)
inflazione = 0.02 # 2% annuo ipotetico
# Calcolo del potere d'acquisto equivalente al versamento mensile odierno
# Formula: PV = FV / (1 + i)^t
potere_acquisto_futuro = versamento_mensile / ((1 + inflazione) ** anni_investimento)
print(f"\n⚠️ NOTA SUL POTERE D'ACQUISTO (Inflazione 2%):")
print(f"Il tuo versamento mensile odierno di €{versamento_mensile:,.2f} avrà")
print(f"un potere d'acquisto equivalente a circa €{potere_acquisto_futuro:,.2f}")
print(f"tra {anni_investimento} anni a causa dell'inflazione.")
except ValueError:
print("❌ Valori non validi!")
except Exception as e:
print(f"❌ Errore nel calcolo: {e}")
# --- Menu Principale del Calcolatore ---
while True:
print("\n=== SELEZIONA OPZIONE ===")
print("1. Calcola Montante e Interesse Composto (Capitale Unico)")
print("2. Confronta Scenari di Investimento")
print("3. Calcola Tempo per Raggiungere un Obiettivo")
print("4. Simula Piano Pensionistico (Versamenti Regolari)")
print("0. Esci")
scelta = input("Scelta: ")
if scelta == '1':
try:
p = float(input("Capitale iniziale (€): "))
r = float(input("Tasso interesse annuale (%): ")) / 100
t = int(input("Periodo (anni): "))
n = int(input("Frequenza (es. 12 per mensile, 1 per annuale): "))
montante, interesse = calcola_interesse_composto(p, r, t, n)
print(f"\nRisultato:")
print(f"Montante (Valore Futuro): €{montante:,.2f}")
print(f"Interesse Guadagnato: €{interesse:,.2f}")
mostra_tabella_crescita(p, r, t, n)
except ValueError:
print("❌ Inserimento non valido. Assicurati che tutti i valori siano numeri.")
elif scelta == '2':
confronta_scenari()
elif scelta == '3':
calcola_tempo_per_obiettivo()
elif scelta == '4':
piano_pensionistico()
elif scelta == '0':
print("Arrivederci!")
break
else:
print("Scelta non valida. Riprova.")
# Esecuzione del calcolatore
calcolatore_interesse_composto()
La formula fondamentale utilizzata per calcolare il Montante Finale ($FV$) di un capitale soggetto a interesse composto è la seguente:
$$\text{FV} = P \left(1 + \frac{r}{n}\right)^{nt}$$
Ecco una scomposizione dettagliata di ogni variabile nella formula:
| Simbolo | Nome in Italiano | Significato | Unità di Misura Tipica |
|---|---|---|---|
| $FV$ | Future Value (Montante Finale) | Il valore totale dell'investimento dopo il periodo di tempo specificato. È la somma del capitale iniziale più tutti gli interessi maturati. | Valuta (€, $) |
| $P$ | Principal (Capitale Iniziale) | La somma di denaro iniziale che viene investita o presa in prestito. | Valuta (€, $) |
| $r$ | Rate (Tasso di Interesse) | Il tasso di interesse annuale espresso in formato decimale (es. $5\%$ si scrive come $0.05$). | Percentuale |
| $t$ | Time (Tempo) | Il periodo di tempo totale dell'investimento o del prestito, espresso in anni. | Anni |
| $n$ | Frequenza di Capitalizzazione | Il numero di volte in cui l'interesse viene calcolato e aggiunto al capitale all'interno di un anno. | Numero di periodi/anno |
La vera essenza dell'interesse composto risiede nel ruolo della variabile $n$ (Frequenza di Capitalizzazione):
L'interesse non viene calcolato una sola volta all'anno ($r$), ma viene suddiviso in periodi più brevi.
Questo termine rappresenta il numero totale di volte in cui l'interesse viene effettivamente calcolato e composto (aggiunto al capitale).
L'espressione eleva il fattore di crescita periodico al numero totale di periodi.
Per trovare l'Interesse Netto Guadagnato ($I$), si usa la semplice sottrazione:
$$I = FV - P$$
Si vuole investire €10.000 ($P$) per 3 anni ($t$) con un tasso di interesse annuale del $6\%$ ($r=0.06$), composto semestralmente ($n=2$).
Sostituzione: $$FV = 10000 \times \left(1 + \frac{0.06}{2}\right)^{(2 \times 3)}$$
Calcolo del Tasso e dei Periodi: $$FV = 10000 \times (1 + 0.03)^6$$
Calcolo Finale: $$FV = 10000 \times (1.03)^6$$ $$FV \approx 10000 \times 1.194052$$ $$FV \approx \text{€11.940,52}$$
Interesse Guadagnato: $$I = \text{€11.940,52} - \text{€10.000} = \text{€1.940,52}$$
In questo esempio, il capitale è cresciuto esponenzialmente grazie al fatto che l'interesse del primo semestre è stato aggiunto al capitale per calcolare l'interesse del secondo semestre, e così via per sei periodi totali.