19 ⭐ Compound interest calculator 💵

Obiettivi di apprendimento:

  • Calcoli di interesse composto
  • Formule finanziarie
  • Visualizzazione crescita nel tempo
  • Confronto scenari di investimento

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 dell'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}$$


🔍 Analisi dei Componenti

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

💡 Il Concetto Chiave: La Potenza di $n$

La vera essenza dell'interesse composto risiede nel ruolo della variabile $n$ (Frequenza di Capitalizzazione):

1. Il Tasso Periodico: $\frac{r}{n}$

L'interesse non viene calcolato una sola volta all'anno ($r$), ma viene suddiviso in periodi più brevi.

  • Esempio: Se il tasso annuale ($r$) è del $12\%$ ($0.12$) e la capitalizzazione è mensile ($n=12$):
    • Il tasso applicato ad ogni mese è $\frac{0.12}{12} = 0.01$ (cioè l'1% al mese).

2. Il Numero Totale di Periodi: $nt$

Questo termine rappresenta il numero totale di volte in cui l'interesse viene effettivamente calcolato e composto (aggiunto al capitale).

  • Esempio: Se investi per 5 anni ($t=5$) con capitalizzazione mensile ($n=12$):
    • Il numero totale di periodi di compounding è $12 \times 5 = 60$ volte.

3. La Crescita Esponenziale: $\left(1 + \frac{r}{n}\right)^{nt}$

L'espressione eleva il fattore di crescita periodico al numero totale di periodi.

  • Ad ogni periodo, il capitale viene moltiplicato per $\left(1 + \frac{r}{n}\right)$.
  • Poiché questo avviene $nt$ volte, la crescita non è lineare (come nell'interesse semplice) ma esponenziale. L'interesse guadagnato nel Periodo 1 genera a sua volta interesse nel Periodo 2, e così via, creando l'effetto a "palla di neve".

🔄 Calcolo dell'Interesse

Per trovare l'Interesse Netto Guadagnato ($I$), si usa la semplice sottrazione:

$$I = FV - P$$


Esempio Pratico

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$).

  1. Sostituzione: $$FV = 10000 \times \left(1 + \frac{0.06}{2}\right)^{(2 \times 3)}$$

  2. Calcolo del Tasso e dei Periodi: $$FV = 10000 \times (1 + 0.03)^6$$

  3. Calcolo Finale: $$FV = 10000 \times (1.03)^6$$ $$FV \approx 10000 \times 1.194052$$ $$FV \approx \text{€11.940,52}$$

  4. 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.