9. Il minimo indispensabile#
Questa pagina viene scritta in lingua italiana, per alcuni semplici motivi: l’Italia ha la popolazione con il minor tasso di alfabetizzazione finanziaria tra i paesi OCSE1, e il grado di alfabetizzazione finanziaria è legato al livello di istruzione (con correlazione positiva: in media, meno hai studiato, meno sai rispondere a domande su concetti base come inflazione, interesse composto, diversificazione del rischio, e più alta è la probabilità che tu faccia vaccate; meglio scrivere in italiano quindi se l’obiettivo è raggiungere l’italiano medio).
Prima di affrontare argomenti più complessi, è quindi meglio stabilire una linea di galleggiamento e fissare un minimo di decenza e igiene dal quale partire.
Necessità dell’investimento.
Si vive con il valore reale dei soldi, non con quello reale
Nel sistema attuale, gli obiettivi di inflazione sono attorno al \(2\%\)2 — misurata con un adeguato indice dei prezzi nell’area monetaria di riferimento
L’inflazione erode il valore reale dei soldi
Questo rende necessario cercare dei modi per difendere il valore del risparmio/patrimonio, attraverso investimento.
Come investire: i princìpi
rendimento, rischio, R/R: composizione rendimenti, ruolo dell’incertezza (e della volatilità), minimizzazione costi certi (a parità di altre condizioni)
diversificazione
Strumenti per investire
Come investire: costruzione di un portafogli, e gestione nel tempo. Una volta definiti gli obiettivi personali, compatibilmente con la propria tolleranza a rischi e volatilità:
Costruzione portafogli con strumenti finanziari, secondo i princìpi di investimento
Gestione su un orizzonte temporale medio-lungo (ribilanciamento,…)
9.1. Inflazione#
Breve nota sull’inflazione italiana negli ultimi anni. Se necessario, usate il traduttore automatico del browser.
9.2. Composizione dei rendimenti/dell’interesse#
9.2.1. Rendimenti costanti#
Composizione del rendimento: “se migliori l’\(1\%\) ogni giorno, alla fine dell’anno sei un supereroe”
Il rendimento (o l’interesse, con reinvestimento se necessario) di un investimento su più intervalli temporale si compone con il prodotto. Una piccola differenza di rendimento sul singolo intervallo può avere effetti enormi su orizzonti temporali sufficientemente lunghi.
Su orizzonti temporali lunghi, è misura minima di decenza e igiene usare la scala logaritmica nei grafici.
Show code cell source
%reset -f
import numpy as np
import matplotlib.pyplot as plt
yield_1 = .04
yield_2 = .08
ni_v = [ 30 ] # , 60 ]
for ni in ni_v:
iv = np.arange(ni+1)
w1 = (1 + yield_1)**iv
w2 = (1 + yield_2)**iv
fig, ax = plt.subplots(1,2, figsize=(8,4))
ax[0].plot(iv, w1, label=f"yield:{yield_1*100}%")
ax[0].plot(iv, w2, label=f"yield:{yield_2*100}%")
ax[1].semilogy(iv, w1, label=f"yield:{yield_1*100}%")
ax[1].semilogy(iv, w2, label=f"yield:{yield_2*100}%")
ax[0].grid(); ax[0].set_xlabel('t'); ax[0].legend()
ax[1].grid(); ax[1].set_xlabel('t'); ax[1].legend()
print(f"\nFinal value after {ni} periods:")
print(f"1-period yield: {yield_1:5.2f}; wealth: {w1[-1]:6.3f}")
print(f"1-period yield: {yield_2:5.2f}; wealth: {w2[-1]:6.3f}")
Final value after 30 periods:
1-period yield: 0.04; wealth: 3.243
1-period yield: 0.08; wealth: 10.063
9.2.2. Rendimenti non costanti - volatilità#
Concetti di base su composizione di rendimenti non costanti
Volatility drag: la volatilità riduce il rendimento composto atteso
Se perdi il \(33.33\%\), successivamente devi guadagnare il \(50\%\) per tornare in pari
Se perdi il \(33.33\%\), successivamente devi guadagnare il \(50\%\) per tornare in pari.
\[\begin{split}\begin{aligned} X_1 & = X_0 ( 1 - .\overline{3} ) = .\overline{6} \, X_0 \\ X_2 & = X_1 ( 1 + .5 ) = X_0 \end{aligned}\end{split}\]Se perdi il \(50\%\), successivamente devi guadagnare il \(100\%\)
\[\begin{split}\begin{aligned} X_1 & = X_0 ( 1 - .5 ) = .5 \, X_0 \\ X_2 & = X_1 ( 1 + 1. ) = X_0 \end{aligned}\end{split}\]Se perdi il \(\ell \%\) prima e guadagni il \(g \%\) poi o se guadagni il \(g \%\) prima e perdi il \(\ell \%\) poi, alla fine il risultato è lo stesso
\[\begin{split}\begin{aligned} X_2^a & = X_1^a \left( 1 + \frac{g}{100} \right) = X_0 \left( 1 - \frac{\ell}{100} \right) \left( 1 + \frac{g}{100} \right) \\ X_2^b & = X_1^b \left( 1 - \frac{\ell}{100} \right) = X_0 \left( 1 + \frac{g}{100} \right) \left( 1 - \frac{\ell}{100} \right) \ . \end{aligned}\end{split}\]…
Il rendimento composto produce un risultato asimmetrico
Anche un processo con rendimento di 1-periodo con probabilità simmetrica attorno a un valore medio, produce un rendimento algebrico medio con distribuzione di probabilità asimmetrica: in particolare si verifica la maggior parte degli eventi con risultati inferiori alla media, che risulta superiore alla mediana a causa di una minoranza di eventi estremamente positivi.
Show code cell source
%reset -f
import numpy as np
import matplotlib.pyplot as plt
from functools import partial
nt = 20
nreals = 2000
tv = np.arange(nt)
#> 1-period returns
# normal: loc=avg, scale: std.dev
# choice: a=[] (values), p=[] (probabilities)
# var(choice) = pi * ( vi - ev )**2
# = .5 * ( v1 - ev )**2 + .5 * ( v2 - ev )**2
# = Delta**2
# Delta = sqrt(var)
r_avg = .1
r_sdev = .2
rngs = [
partial(np.random.default_rng().normal, loc=r_avg, scale=r_sdev),
# partial(np.random.default_rng().choice, a=[r_avg-r_sdev, r_avg+r_sdev], p=[.5, .5]),
]
Show code cell source
#> Returns
rets = [
rng(size=(nt, nreals)) for rng in rngs
]
for ret in rets:
ret[ret < -.9999] = -.9999
#> Increment
delta_xs = [
1.+ret for ret in rets
]
#> Amount
xs = [
np.cumprod(delta_x, axis=0) for delta_x in delta_xs
]
Show code cell source
#> Statistics of realizations
n_times = 5
delta_time = int( np.floor(nt/n_times) )
times_v = delta_time * np.arange(n_times)
#> Plots
# 0. Algebraic return (density)
# 1. Algebraic return (cumulative)
# 2. Geometric return (density)
# 3. Geometric return (dcumulative)
n_plots = 4
fig, ax = plt.subplots(n_times, n_plots, figsize=(12,8))
d_bin = r_sdev / 4.
x_bins = np.linspace(-10, 10, 21) * d_bin + r_avg
for i_time, time in enumerate(times_v):
for i_ret, x in enumerate(xs):
#> Algebraic return
r_alg = ( x[time,:] - 1. ) / (time+1)
#> Geometric return
r_geo = x[time,:]**(1/(time+1)) - 1.
ax[i_time,0].hist(r_alg, bins=x_bins, color=plt.cm.tab10.colors[i_ret], alpha=.5, density=True)
ax[i_time,1].hist(r_alg, bins=x_bins, color=plt.cm.tab10.colors[i_ret], alpha=.5, density=True, cumulative=True)
ax[i_time,2].hist(r_geo, bins=x_bins, color=plt.cm.tab10.colors[i_ret], alpha=.5, density=True)
ax[i_time,3].hist(r_geo, bins=x_bins, color=plt.cm.tab10.colors[i_ret], alpha=.5, density=True, cumulative=True)
ax[i_time,0].set_xlim(x_bins[0], x_bins[-1])
ax[i_time,1].set_xlim(x_bins[0], x_bins[-1]); ax[i_time,1].set_ylim(.0, 1.)
ax[i_time,2].set_xlim(x_bins[0], x_bins[-1])
ax[i_time,3].set_xlim(x_bins[0], x_bins[-1]); ax[i_time,3].set_ylim(.0, 1.)
#> Lines of avgs
# r_alg_geo: Algebraic return corresponding to compounding of r_avg over many periods
# It's not sol useful, except for showing the power of compounding in producing
# returns over many periods, ( 1 + r )**n > 1 + n * r
# r_geo_alg: viceversa
r_alg_geo = ( ( 1. + r_avg )**(time+1) - 1. ) / (time+1)
r_geo_alg = ((time+1)*r_avg + 1 )**(1/(time+1)) - 1
print(r_alg_geo)
ax[i_time, 0].plot(2*[r_avg], [.0, 5.], ':', color='black')
ax[i_time, 2].plot(2*[r_avg], [.0, 3.*np.sqrt(time+1)], '--', color='black')
ax[i_time, 1].plot(2*[r_avg], [.0, 1.], ':', color='black')
ax[i_time, 3].plot(2*[r_avg], [.0, 1.], '--', color='black')
#> "mixed" returns
ax[i_time, 0].plot(2*[r_alg_geo], [.0, 5.], '--', color='black')
ax[i_time, 1].plot(2*[r_alg_geo], [.0, 1.], '--', color='black')
ax[i_time, 2].plot(2*[r_geo_alg], [.0, 3.*np.sqrt(time)], ':', color='black')
ax[i_time, 3].plot(2*[r_geo_alg], [.0, 1], ':', color='black')
#> Setting labels, titles, ticks
for i_plot in np.arange(n_plots):
ax[i_time, i_plot].grid()
if ( i_time < n_times - 1):
ax[i_time, i_plot].set_xticklabels([])
if ( i_time == 0 ):
ax[i_time, 0].set_title("Alg. avg. ${r}$ (pdf)")
ax[i_time, 1].set_title("Alg. avg. ${r}$ (pcf)")
ax[i_time, 2].set_title("Geo. avg. ${r}$ (pdf)")
ax[i_time, 3].set_title("Geo. avg. ${r}$ (pcf)")
ax[i_time,0].set_ylabel(f"Time: {time+1}")
0.10000000000000009
0.12210200000000011
0.15088307677777799
0.18863624726100797
0.23849825205840852
L’esempio considera un investimento con densità di probabilità di 1-periodo con distribuzione gaussiana con valore atteso \(\mu_1 = .1\) e deviazione standard \(\sigma_1 = .2\)
Le due righe mostrano i rendimenti algebrici (:) e geometrici (–) medi corrispondenti al rendimento atteso di un 1-periodo. La disuguaglianza \((1+r)^N > 1 + r N\) assicura l’effetto compounding, che la composizione di un rendimento \(r\) su \(N\) periodi produce un risultato migliore di rendimento algebrico \(r N\).
Così, un rendimento algebrico medio del \(10\%\) corrisponde a un rendimento composto medio decrescente nel tempo
Anni |
CAGR |
|---|---|
\(1\) |
\(10\%\) |
\(5\) |
\(8.4\%\) |
\(9\) |
\(7.4\%\) |
\(13\) |
\(6.6\%\) |
\(17\) |
\(6.0\%\) |
Viceversa un rendimento composto medio del \(10\%\) corrisponde a un rendimento algebrico medio crescente nel tempo (effetto compounding)
Anni |
Rendimento algebrico medio |
|---|---|
\(1\) |
\(10\%\) |
\(5\) |
\(12.2\%\) |
\(9\) |
\(15.1\%\) |
\(13\) |
\(18.9\%\) |
\(17\) |
\(23.8\%\) |
La prima colonna dei grafici mostra come la distribuzione di probabilità del rendimento algebrico medio diventa asimmetrica.
La terza colonna mostra la distribuzione del rendimento geometrico: sotto opportune ipotesi, il rendimento geometrico tende a una distribuzione gaussiana con valore atteso \(\mu - \frac{\sigma^2}{2}\) (minore del rendimento di 1-periodo) e varianza \(\sim \frac{\sigma}{T}\) (che quindi tende a diminuire con il tempo, come mostrato dalla distribuzione più compatta, con dispersione minore al crescere del tempo) come discusso con qualche dettaglio matematico nella sezione a proposito del rendimento composto.
La seconda e la quarta colonna mostrano la funzione di probabilità cumulativa del rendimento algebrico e geometrico, rispettivamente. Questi grafici mostrano come il rendimento mediano sia inferiore al rendimento atteso della distribuzione di 1-periodo: per \(T = 5\), circa il \(60\%\) delle realizzazioni ha rendimento negativo, per \(T = 17\), oltre il \(70\%\) delle realizzazioni ha un rendimento negativo.
#> Realizations
# fig, ax = plt.subplots(2,1, figsize=(5,4))
# for (i_ret, cum_ret) in enumerate(cum_rets):
# ax[0].plot(tv, cum_ret, color=plt.cm.tab10.colors[i_ret], lw=.2)
# ax[1].semilogy(tv, cum_ret, color=plt.cm.tab10.colors[i_ret], lw=.2)
# ax[0].grid()
# ax[1].grid()
Volatility-drag (I)
Una successione di eventi che comportano la perdita o il guadagno del \(30\%\), nel tempo portano il patrimonio atteso a zero. Se la possibile perdita è del \(50\%\), il patrimonio atteso tende a zero più velocemente.
Show code cell source
%reset -f
import numpy as np
import matplotlib.pyplot as plt
nt = 30
nreals = 1000
gain_1, loss_1 = .3 , -.3
gain_2 = .3; loss_2 = 1./(1.+gain_2) - 1.
p_win_1 = .5; p_loss_1 = 1. - p_win_1
p_win_2 = .5; p_loss_2 = 1. - p_win_2
#> Method 1. Succcessive independent Bernoulli = binomial distribution
from scipy.stats import binom
percs = np.array([.0, 1./30., .1, 1./3., .5, 2./3., .9, 1.-1./30., 1.])
n_percs = len(percs)
perc_pairs = [ [ i, n_percs-1-i ] for i in np.arange(int(np.floor((n_percs-1)/2))) ]
l1, b1 = binom.support(nt, p_win_1)
x = np.arange(l1,b1+1)
p = binom.cdf(x, nt, p_win_1)
y = ( 1. + gain_1 )**x * ( 1 + loss_1 )**(nt-x)
tv = np.arange(0,nt+1)
y_percs_m = []
for it in tv:
#> Support, domain, and cdf of the Bernoulli distribution
l1, u1 = binom.support(it, p_win_1) # lower, upper bound
x = np.arange(l1, u1+1) # domain
p = binom.cdf(x, it, p_win_1) # cumulative prob
y_1 = ( 1. + gain_1 )**x * ( 1 + loss_1 )**(u1-x) # outcomes
#>
idx = np.searchsorted(p, percs, side='left')
y_percs = y_1[idx]
y_percs_m += [ y_percs ]
y_percs_m = np.array(y_percs_m)
fig, ax = plt.subplots(1,1, figsize=(5,3))
# ax.step(tv, y_percs_m, where='post', color='black', lw=.5)
for perc_pair in perc_pairs:
ax.fill_between(tv, y_percs_m[:,perc_pair[0]], y_percs_m[:,perc_pair[1]], step='post', alpha=.2, color='orange')
ax.set_yscale('log')
ax.grid()
fig, ax = plt.subplots(1,1, figsize=(5,3))
# ax.step(tv, y_percs_m, where='post', color='black', lw=.5)
for perc_pair in perc_pairs:
ax.fill_between(tv, y_percs_m[:,perc_pair[0]], y_percs_m[:,perc_pair[1]], step='post', alpha=.2, color='orange')
ax.grid()
# #> Method 2. Realizations of the stochastic processes
# rng = np.random.default_rng().choice
# rng_params_1 = { 'a': [gain_1, loss_1], 'p': [p_win_1, p_loss_1], 'size': nt }
# rng_params_2 = { 'a': [gain_2, loss_2], 'p': [p_win_2, p_loss_2], 'size': nt }
# w1, w2 = [], []
# for ireal in np.arange(nreals):
# w1 += [ np.array([ 1. ] + list(np.cumprod(1+rng(**rng_params_1)))) ]
# w2 += [ np.array([ 1. ] + list(np.cumprod(1+rng(**rng_params_2)))) ]
# w1 = np.array(w1).T
# w2 = np.array(w2).T
Show code cell source
# fig, ax = plt.subplots(1,1, figsize=(5,5))
# plot_yscale = 'log'
#
# if plot_yscale == 'log':
# ax.semilogy(w1, lw=.5, color='blue' , alpha=.2)
# ax.semilogy(w2, lw=.5, color='orange', alpha=.2)
# ax.semilogy(np.mean(w1, axis=1), lw=2., color='blue')
# ax.semilogy(np.mean(w2, axis=1), lw=2., color='orange')
# else:
# ax.plot(w1, lw=.5, color='blue' , alpha=.1)
# ax.plot(w2, lw=.5, color='orange', alpha=.1)
# ax.plot(np.mean(w1, axis=1), lw=2., color='blue')
# ax.plot(np.mean(w2, axis=1), lw=2., color='orange')
#
# plt.show()
Volatility-drag (II)
A pari ritorno atteso di due investimenti, l’investimento con minore dispersione ha un rendimento composto maggiore.
Come discusso in dettaglio più avanti, il rendimento composto di un un’investimento con rendimento atteso \(\mu\) e deviazione standard dei rendimenti \(\sigma\) vale \(\mu - \frac{\sigma^2}{2}\).
La composizione di rendimenti simmetrici è asimmetrica
La composizione del rendimento di eventi simmetrici sul singolo intervallo temporale (es. probabilità uguale di guadagno o perdita di uno stessa quantità) porta a un rendimento asimmetrico, con skewness, di solito con valore mediano inferiore al valore medio: tipicamente, il valore medio risulta superiore al valore mediano a causa di eventi estremamente positivi ma estremamente rari.
9.3. Diversificazione#
“Non mettere tutte le tue uova nello stesso paniere”
Citazione?
9.3.1. Portafogli con 2 asset#
Dati due asset con rendimento atteso \(\boldsymbol\mu\), e covarianza \(\boldsymbol\sigma^2\),
un portafogli completamente investito, senza leva o short-selling, è identificato da i due pesi degli asset in protafogli
Il rendimento del portafogli è la variabile casuale
e quindi il rendidmento atteso è
e la varianza è
- 1
Paola Tamma, Why Europeans need to learn more about money, FT, e riferimenti contenuti; Mario Seminerio, tweet 2025.12.12; OECD 2022 survey.
- 2
Pagine di alcune banche centrali riguardo il valore obiettivo della politica monetaria e le motivazioni: Banca Centrale Europea, BCE o ECB; Federal Reserve, US Fed; Bank of England, BoE; Bank of Japan; Bloomberg, China may struggle to hit inflation target even after cutting it, 2025.03.05 riguardo l’adeguamento del target della Bank of China, dal \(3\%\) al \(2\%\). Sono numeri arbitrari? Entro una certa tolleranza probabilmente sì, anche se un numero o un intervallo va scelto, e la scelta è motivata nelle pagine delle Banche Centrali. Più importante del numero in sé, è la credibilità e la capacità delle BC di riuscire a ottenere un valore di inflazione vicino all’obiettivo, tramite la politica monetaria — anche se questa può avere dei limiti, soprattutto se non accompagnata da una politica fiscale coerente da parte dei governi: per chi fa scelte economiche risulta fondamentale che gli obiettivi di inflazione siano rispettati, e che gli attori preposti siano credibili. In un mondo normale, attese di inflazione e incertezza futura sugli obiettivi di inflazione vengono scontate dagli attori del sistema economico. Ad esempio, è lecito attendersi che un investitore che acquista un’obbligazione — statale di uno stato affidabile per escludere spread rispetto a ciò che può essere considerato “risk-free”; nella stessa valuta in cui vive per escludere rischio-cambio — a scadenza \(10\) anni richieda almeno un rendimento reale positivo su tale orizzonte temporale. In una situazione in cui l’investitore ha la certezza (beato lui che ha certezze) che il target di inflazione sia rispettato, può chiedere un interesse nominale netto del \(2.5\%\) se si accontenta di un rendimento reale dello \(0.5\%\) annuo. Lo stesso investitore chiederebbe lo stesso interesse se si attendesse un’inflazione superiore al target, o se non considerasse attendibile l’impegno della BC di rispettare il target, o se temesse qualche “fiammata inflazionistica”? Vedi rischio inflazione per obbligazioni.