Vai al contenuto

Calcoli scientifici con Julia/Simulatore pensionistico

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Volendo calcolare il capitale futuro di una pensione integrativa nell'ipotesi di un tasso di rendimento fisso r si utilizza la formula classica della rendita composta :

dove

  • (P) = versamento periodico
  • (r) = rendimento medio
  • (n) = numero di periodi

In realtà secondo varie pubblicazioni scientifiche si assume che i tassi di rendimento r oscillino attorno a un valore medio.

Ad esempio:

| anno | rendimento |
| ----     | -----  |
| 1        | 7%     |
| 2        | -3%    |
| 3        | 11%    |
| 4        | 2%     |
Distribuzioni normali di media e deviazione standard o volatilità

Si ottiene una distribuzione approssimativamente a campana o normale e ciò è causato dal fatto che i rendimenti finanziari sono influenzati da molti fattori:

  • economia
  • politica
  • tassi di interesse
  • notizie
  • comportamento degli investitori

La combinazione di questi fattori porta spesso a una distribuzione simile alla normale, ma si tratta di una approssimazione, infatti molti analisti preferiscono approssimare i tassi con la distribuzione t di student.

La simulazione Monte Carlo può essere utilizzata per ottenere una distribuzione di capitali finali di pensione integrativa, facendo variare il tasso di rendimento annuale in modo casuale secondo una normale che ha a solo due parametri: media e deviazione standard o volatilità , e iterando il procedimento ad esempio 10.000 volte Ognuna delle 10.000 simulazioni produce un futuro diverso ed un patrimonio finale diverso.

Ottenuta tale distribuzione si calcolano i percentili che permettono di capire quanto patrimonio si potrebbe avere nei diversi scenari. Ad esempio supponiamo di fare 10.000 simulazioni Monte Carlo del patrimonio a 30 anni. Otteniamo 10.000 valori di patrimonio finale.

| Percentile | Patrimonio  |
| ---------- | ----------- |
| 10%        | 350.000 €   |
| 50%        | 700.000 €   |
| 90%        | 1.300.000 € |

Interpretazione:

  • 10% → scenario pessimistico (il 10% degli scenari ha un valore più basso di 350.000 €)
  • 50% → scenario tipico (la mediana - il 50% degli scenari ha un patrimonio inferiore o superiore a 700.000€ )
  • 90% → scenario molto favorevole (solo il 10% degli scenari ha valori più alti di 1.300.000 €)

Implementazione in Julia

[modifica | modifica sorgente]

Innanzitutto installo le librerie di Julia che mi servono:

using Pkg
Pkg.add("Distributions")
Pkg.add("Statistics")

Per calcolare il patrimonio ottenibile dopo 30 anni con un tasso di rendimento fisso del 5% si utilizza la formula della rendita composta in Julia, ottenendo 249.677€ :

function pac(payment, r, n)
    payment * ((1+r)^n - 1) / r
end

pac(300, 0.05/12, 12*30)
249677.59060843976

Volendo raggiungere un capitale pensionistico target di 500.000€ dopo 30 anni con un capitale iniziale di 20.000€ , un versamento annuale di 5.000€ e un tasso di rendimento r variabile approssimativamente secondo la normale con media 5% e deviazione standard o volatilità del 15% si implementano in Julia 10.000 simulazioni Monte Carlo e si calcolano i quantili del 10%, 50% e 90% e la probabilità di raggiungere il target:

using Distributions, Statistics

# parametri
capitale_iniziale = 20000
versamento = 5000
anni = 30
target = 500000

media = 0.05
volatilita = 0.15

simulazioni = 10000

# distribuzione rendimenti
dist = Normal(media, volatilita)

function simula()

    capitale = capitale_iniziale

    for i in 1:anni

        rendimento = rand(dist)

        capitale = capitale*(1 + rendimento) + versamento

    end

    return capitale

end

# esegue simulazioni
risultati = [simula() for i in 1:simulazioni]

# percentili patrimonio finale
p10 = quantile(risultati, 0.10)
p50 = quantile(risultati, 0.50)
p90 = quantile(risultati, 0.90)

# probabilità di raggiungere target
prob_target = mean(risultati .>= target)

println("Probabilità di raggiungere il target: ", prob_target)
println("10° percentile: ", p10)
println("Mediana: ", p50)
println("90° percentile: ", p90)
Probabilità di raggiungere il target: 0.2676
10° percentile: 176089.39588073976
Mediana: 352329.90761352365
90° percentile: 731757.8309400893

Quindi :

  • 26,76% di probabilità di raggiungere il target di 500k €
  • nello scenario pessimo si arriva a circa 176k €
  • nello scenario mediano a 352k.

Volendo realizzare un simulatore pensionistico completo con 40 di lavoro in cui si accumula un patrimonio con un tasso di rendimento r variabile approssimativamente secondo la normale con media 5% e deviazione standard o volatilità del 15% e poi 25 anni di pensione in cui il prelievo risulta uguale alla differenza tra la spesa e la pensione INPS a meno dell'inflazione del 2% si ottiene che la probabilità di non esaurire il capitale è del 78,29% e poi nello scenario mediano si può arrivare a 799K € :

using Distributions, Statistics

capitale_iniziale = 20000
contributo_annuo = 6000

anni_lavoro = 40
anni_pensione = 25

media_rendimento = 0.05
volatilita = 0.15
inflazione = 0.02

spesa_annua = 35000
pensione_inps = 20000

simulazioni = 10000

dist = Normal(media_rendimento, volatilita)

function simula_vita()

    capitale = capitale_iniziale

    # fase di accumulo
    for i in 1:anni_lavoro

        r = rand(dist)
        capitale = capitale*(1+r) + contributo_annuo

    end

    # fase pensione
    spesa = spesa_annua

    for i in 1:anni_pensione

        r = rand(dist)

        # reddito pensionistico INPS
        prelievo = max(spesa - pensione_inps, 0)

        capitale = capitale*(1+r) - prelievo

        # inflazione della spesa
        spesa *= (1 + inflazione)

        if capitale <= 0
            return 0
        end

    end

    return capitale

end

risultati = [simula_vita() for i in 1:simulazioni]
# percentili patrimonio finale
p10 = quantile(risultati, 0.10)
p50 = quantile(risultati, 0.50)
p90 = quantile(risultati, 0.90)
prob_successo = mean(risultati .> 0)

println("10° percentile: ", p10)
println("Mediana: ", p50)
println("90° percentile: ", p90)
println("Probabilità di non esaurire il capitale: ", prob_successo)
10° percentile: 0.0
Mediana: 799229.9586610713
90° percentile: 4.859875070862252e6
Probabilità di non esaurire il capitale: 0.7829

Il metodo FIRE (Financial Independence, Retire Early) si basa su un principio semplice: accumulare un patrimonio sufficiente a generare rendite passive che coprano le spese di vita, rendendo il lavoro opzionale. I pilastri fondamentali sono la regola del 4% (puoi prelevare il 4% del patrimonio ogni anno senza esaurirlo) e il suo inverso (1/0.04 = 25), la regola del 25x (ti servono 25 volte le tue spese annue).

Implementazione in Julia

[modifica | modifica sorgente]

Si considerano 30.000 euro di spese annue, per cui applicando la regola del 25x , l'obiettivo fire diventa 30.000 x 25 = 750.000 euro che dovranno essere raggiunti per coprire le spese di vita, rendendo il lavoro opzionale. Si calcola in quanti anni si raggiunge l'obiettivo fire e lo storico del patrimonio accumulato :

# Obiettivo FIRE con regola del 25x
spese_annue = 30000.0
obiettivo_fire = spese_annue * 25  # €750,000

# Tasso di risparmio (leva principale)
entrate_nette = 4000.0  # mensili
spese_mensili = 2500.0
risparmio_mensile = entrate_nette - spese_mensili
tasso_risparmio = risparmio_mensile / entrate_nette  # 37.5%

# Simulazione anno per anno
function simulazione_fire(
    patrimonio_iniziale::Float64,
    risparmio_annuo::Float64,
    rendimento::Float64,
    obiettivo::Float64
)
    patrimonio = patrimonio_iniziale
    storico = [patrimonio]
    anno = 0
    while patrimonio < obiettivo && anno < 60
        patrimonio = patrimonio * (1 + rendimento) + risparmio_annuo
        push!(storico, patrimonio)
        anno += 1
    end
    return anno, storico
end

anni, storico = simulazione_fire(50000.0, risparmio_mensile * 12, 0.07, obiettivo_fire)
println("Anni al FIRE: $anni")
Anni al FIRE: 18
for a in 1:anni
        println("Anno $a: €$(round(storico[a], digits=2))")
end
Anno 1: €50000.0
Anno 2: €71500.0
Anno 3: €94505.0
Anno 4: €119120.35
Anno 5: €145458.77
Anno 6: €173640.89
Anno 7: €203795.75
Anno 8: €236061.45
Anno 9: €270585.76
Anno 10: €307526.76
Anno 11: €347053.63
Anno 12: €389347.39
Anno 13: €434601.7
Anno 14: €483023.82
Anno 15: €534835.49
Anno 16: €590273.97
Anno 17: €649593.15
Anno 18: €713064.67

Con la regola del 4% si può prelevare il 4% del patrimonio ogni anno senza esaurirlo:

# Fase di decumulo:
function decumulo(patrimonio, spese_annue, rendimento, anni)
    p = patrimonio
    for a in 1:anni
        p = p * (1 + rendimento) - spese_annue
        println("Anno $a: €$(round(p, digits=0))")
        p < 0 && (println("Patrimonio esaurito!"); break)
    end
end
decumulo(obiettivo_fire, spese_annue, 0.04, 40)
Anno 1: €750000.0
Anno 2: €750000.0
Anno 3: €750000.0
Anno 4: €750000.0
Anno 5: €750000.0
Anno 6: €750000.0
Anno 7: €750000.0
Anno 8: €750000.0
Anno 9: €750000.0
Anno 10: €750000.0
Anno 11: €750000.0
Anno 12: €750000.0
Anno 13: €750000.0
Anno 14: €750000.0
Anno 15: €750000.0
Anno 16: €750000.0
Anno 17: €750000.0
Anno 18: €750000.0
Anno 19: €750000.0
Anno 20: €750000.0
Anno 21: €750000.0
Anno 22: €750000.0
Anno 23: €750000.0
Anno 24: €750000.0
Anno 25: €750000.0
Anno 26: €750000.0
Anno 27: €750000.0
Anno 28: €750000.0
Anno 29: €750000.0
Anno 30: €750000.0
Anno 31: €750000.0
Anno 32: €750000.0
Anno 33: €750000.0
Anno 34: €750000.0
Anno 35: €750000.0
Anno 36: €750000.0
Anno 37: €750000.0
Anno 38: €750000.0
Anno 39: €750000.0
Anno 40: €750000.0

Prelevando il 3% ogni anno il patrimonio decresce , col 5% annuo il patrimonio cresce oltre l'obiettivo_fire:

 decumulo(obiettivo_fire, spese_annue, 0.03, 40)
 decumulo(obiettivo_fire, spese_annue, 0.05, 40)