Calcoli scientifici con Julia/Simulatore pensionistico
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% |

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
Metodo FIRE
[modifica | modifica sorgente]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)