Sei sulla pagina 1di 35

Prerequisiti sulla

Analisi degli Investimenti


—————
Implementazioni in MATLAB
—————
Appunti per l’insegnamento di
Metodi Computazionali per la Finanza
Anno Accademico 2019/2020

Riccardo Cambini
Dipartimento di Economia e Management
Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: riccardo.cambini@unipi.it

Versione 11 Maggio 2020

Piattaforma E-learning : https://elearning.ec.unipi.it/course/view.php?id=1116

1
1 Definizioni iniziali
F1 F2 F3 F4 ……. Fn-2 Fn-1 Fn
Si definisce operazione finanziaria un qualsiasi accordo che origina una movimentazione
di somme di denaro in epoche diverse. Una operazione finanziaria può essere descritta da
un diagramma temporale (Figura 1) nel quale: …….
0 1 2 3 4 n-2 n-1 n
• F1 , . . . , Fn , con n 2, sono i flussi di cassa corrispondenti agli istanti di tempo
T1 , . . . , Tn , rispettivamente;

• si assume T1 0 e Tk 1  Tk 8k = 2, . . . , n (si osservi che è possibile avere T1 = 0


oppure Tk = Tk 1 per alcuni valori di k 2 {2, . . . , n}).

Per comodità i flussi di cassa ed i corrispondenti istanti di tempo possono essere espressi
con i vettori F = [F1 , . . . , Fn ] e T = [T1 , . . . , Tn ].

F1 F2 F3 F4 ……. Fn-2 Fn-1 Fn

…….
0 T1 T2 T3 T4 Tn-2 Tn-1 Tn

Figura 1: Diagramma temporale di una operazione finanziaria

Come di consueto, i flussi di cassa Fk positivi rappresentano le entrate, quelli negativi


le uscite. Si osservi inoltre che per far si che il primo flusso di cassa F1 avvenga a tempo
0 basta imporre T1 = 0.
Se n = 2 l’operazione finanziaria è detta semplice, se invece n > 2 è detta complessa.
Valori fondamentali
F F di uso Festremamente
F frequente ……. sono: F F F
1 2 3 4 n-2 n-1 n

• il fattore di attualizzazione ck , con k = 1, . . . , n, che permette di determinare il


ivalore
1 i2
al tempo i3 del flusso
zero i4 di cassa Fk , ovvero
…….Fk · ck in-1 in
0 T1 T2 T3 T4 Tn-2 Tn-1 Tn
• il saldo contabile Sk dei flussi di cassa non successivi al tempo Tk , con k = 1, . . . , n,
definito da: X
Sk = Fh
h:Th Tk

nel caso particolare in cui Tk 1 < Tk 8k = 2, . . . , n la formula del saldo contabile Sk


si semplifica nel modo seguente:
k
X
Sk = Fh
h=1

• il valore attuale Vk dei flussi di cassa non successivi al tempo Tk , con k = 1, . . . , n,


ovvero: X
Vk = Fh · c h
h:Th Tk

2
…….
0 1 2 3 4 n-2 n-1 n

nel caso particolare in cui Tk 1 < Tk 8k = 2, . . . , n la formula del valore attuale Vk


si semplifica nel modo seguente:

F1 F2 F3 F4 k
X ……. Fn-2 Fn-1 Fn
Vk = Fh · c h
h=1

…….
0• T1
il Risultato T2
Economico T3 Attualizzato,
T4 Tn-2
indicato per brevità Tn-1 (detto
con R.E.A. Tn
anche Valore Attuale Netto, V.A.N., in inglese Net Present Value, N.P.V.), che
indica il valore attuale di tutti i flussi di cassa dell’operazione finanziaria, ovvero:
n
X
REA = Vn = Fh · c h
h=1

• la scadenza media (calcolata come media ponderata) dei flussi di cassa negativi e
di quelli positivi, ovvero:
F1 F2 FP3 F4 …….
P Fn-2 Fn-1 Fn
F <0 Tk · Fk F >0 Tk · Fk
µu = Pk , µe = Pk
i1 i2 i3 i Fk <0 Fk
4 ……. Fk >0 Fk in-1 in
0 T1 T2 T3 T4 Tn-2 Tn-1 Tn
2 Calcolo dei fattori di attualizzazione
2.1 Tasso di interesse costante
In questo caso il tasso di interesse si considera costante ed uguale ad i 0 per tutto
il periodo di tempo [0, Tn ] (vedasi Figura 2). Pertanto, i coefficienti di attualizzazione
risultano, per k = 1, . . . , n:
ck = (1 + i) Tk

F1 F2 F3 F4 ……. Fn-2 Fn-1 Fn

i i i i ……. i i
0 T1 T2 T3 T4 Tn-2 Tn-1 Tn

Figura 2: Operazione finanziaria con tasso di interesse costante

In questo caso è utile esplicitare la dipendenza del valore attuale dei flussi di cassa dal
tasso di interesse i. In particolare, per k = 1, . . . , n verrà usata la seguente notazione:
X X
Th
Vk (i) = Fh · c h = Fh · (1 + i)
h:Th Tk h:Th Tk

ovvero, nel caso in cui sia Tk 1 < Tk 8k = 2, . . . , n:


k
X k
X
Th
Vk (i) = Fh · c h = Fh · (1 + i)
h=1 h=1

3
…….
0 1 2 3 4 n-2 n-1 n

inoltre, risulta:
n
X
Th
REA(i) = Vn (i) = Fh · (1 + i)
h=1
Si osservi infine
F che vale
F la seguente
F proprietà:
F ……. Fn-2 Fn-1 Fn
1 2 3 4
i=0 () Sk = Vk (i) 8i 2 {1, . . . , n}
…….
0 mostra Tcome
che 1 T2 contabili
i saldi T3 ed i valori
T4 attualizzati coincidano T Tn-1nel caso
solamente
n-2 Tnin
cui il tasso i sia nullo. In questo caso risulta REA(0) = Vn (0) = Sn .

2.2 Tasso di interesse variabile


In questo caso il tasso di interesse è variabile e si assume uguale ad i1 0 nell’intervallo di
tempo [0, T1 ], ed uguale ad ik 0 nell’intervallo di tempo [Tk 1 , Tk ] per ogni k 2 {2, . . . , n}.
L’operazione finanziaria è descritta dal diagramma temporale di Figura 3:

F1 F2 F3 F4 ……. Fn-2 Fn-1 Fn

i1 i2 i3 i4 ……. in-1 in
0 T1 T2 T3 T4 Tn-2 Tn-1 Tn

Figura 3: Operazione finanziaria con tasso di interesse variabile

In altri termini, per utilizzare una notazione classica della matematica finanziaria,
abbiamo che i1 = i (T0 , T1 ) e che ik = i (Tk 1 , Tk ) per ogni k 2 {2, . . . , n}.
I fattori di attualizzazione ck si calcolano come segue:
T1
c1 = (1 + i1 )
T1
c2 = (1 + i1 ) (1 + i2 )T1 T2
= c1 (1 + i2 )T1 T2

T1
c3 = (1 + i1 ) (1 + i2 )T1 T2
(1 + i3 )T2 T3
= c2 (1 + i3 )T2 T3

T1
c4 = (1 + i1 ) (1 + i2 )T1 T2
(1 + i3 )T2 T3
(1 + i4 )T3 T4
=
T3 T4
= c3 (1 + i4 )
...

Di conseguenza i fattori di attualizzazione si possono calcolare ricorsivamente come segue:


T1
c1 = (1 + i1 )
ck = ck 1 (1 + ik ) Tk 1 Tk
8k = 2, . . . , n

3 Tipologie di investimenti/finanziamenti
Nel caso di operazioni finanziarie semplici (n = 2) si definisce come investimento una
operazione in cui il flusso di cassa iniziale F1 è negativo ed il successivo F2 è positivo,
mentre si definisce come finanziamento una operazione in cui il flusso di cassa iniziale F1 è

4
positivo ed il successivo F2 è negativo. Nel caso di operazioni finanziarie complesse (n > 2)
le definizioni sono invece molteplici.

Classificazione degli investimenti/finanziamenti


Una operazione finanziaria avente almeno un flusso di cassa negativo ed almeno un flusso
di cassa positivo è detta:
• investimento [finanziamento] in senso stretto se i flussi di cassa negativi
[positivi] precedono temporalmente quelli positivi [negativi], ovvero se la scadenza
dell’ultima uscita [entrata] precede temporalmente la scadenza della prima entrata
[uscita].

• investimento [finanziamento] in senso lato se la scadenza media dei flussi di


cassa negativi [positivi] precede l’epoca del primo flusso di cassa positivo [negativo];

• investimento [finanziamento] puro se il primo flusso di cassa non nullo è ne-


gativo [positivo] e la sequenza dei saldi contabili S1 , . . . , Sn cambia segno una sola
volta, passando dal negativo al positivo [dal positivo al negativo];

• investimento [finanziamento] in senso generale se la scadenza media dei flussi


di cassa negativi [positivi] precede la scadenza media dei flussi di cassa positivi
[negativi]; è interessante osservare come questa definizione ammetta la possibilità di
avere un primo flusso di cassa non nullo di segno positivo.

4 T.I.R. - Tasso Interno di Rendimento


• Data una operazione finanziaria si dice Tasso Interno di Rendimento (T.I.R.)
dell’operazione stessa quel tasso di interesse costante i⇤ 0 che annulla il valore
attuale di tutti i suoi flussi di cassa.

In altre parole, ricordando che nel caso in cui il tasso sia costante risulta
n
X
Th
REA(i) = Vn (i) = Fh · (1 + i)
h=1

il T.I.R. dell’operazione finanziaria è quel tasso i⇤ 0 tale che REA(i⇤ ) = 0.


Il problema della determinazione del T.I.R. di una operazione finanziaria è quindi equi-
valente a quello della risoluzione della equazione nonlineare REA(i) = 0. Tale equazione
può però non avere soluzione, avere una unica soluzione, avere più soluzioni.

Esempio
Si considerino le quattro seguenti operazioni finanziarie:
A) T = [0, 1, 2] ed F = [ 100, 60, 30]

B) T = [0, 1, 2] ed F = [ 100, 60, 70]

C) T = [0, 1, 2] ed F = [ 50, 145, 100]

D) T = [0, 1, 2] ed F = [48, 140, 100]

5
Per calcolare i T.I.R. occorre, in tutti e quattro i casi, risolvere l’equazione nonlineare:
1 2
REA(i) = F1 + F2 (1 + i) + F3 (1 + i) =0

Per comodità si può e↵ettuare il cambio di variabile x = 1 + i e risolvere l’equazione di


secondo grado:
x2 F1 + xF2 + F3 = 0
Il discriminante risulta = F22 4F1 F3 da cui si ottiene:
p p
F2 ± F2 ±
x= e quindi i = 1
2F1 2F1
Eseguendo i calcoli si ottiene:

• operazione A) : = 15600, i1 = 132.45% e i2 = 7.55%; entrambi i tassi non


hanno senso finanziariamente e quindi A) non ammette alcun T.I.R.

• operazione B) : = 31600, i1 = 158.88% e i2 = 18.88%; il primo tasso non ha


senso finanziariamente e quindi B) ammette un unico T.I.R. i⇤ = 18.88%

• operazione C) : = 1025, i1 = 12.98% e i2 = 77.02%; entrambi i tassi sono


accettabili e quindi C) ammette due T.I.R. i⇤1 = 12.98% e i⇤2 = 77.02%

• operazione D) : = 400, i1 = 25.00% e i2 = 66.67%; entrambi i tassi sono accettabili


e quindi D) ammette due T.I.R. i⇤1 = 25.00% e i⇤2 = 66.67%

Per chiarire ulteriormente il problema della esistenza ed unicità del T.I.R., in Figura 4
sono rappresentati i grafici delle funzioni REA(i) per le quattro operazioni considerate.

Il seguente teorema fornisce delle condizioni sufficienti per l’esistenza di almeno un


T.I.R. i⇤ > 0.

Teorema [Esistenza del T.I.R.]


Si consideri una operazione finanziaria avente flussi di cassa F1 , . . . , Fn , con n 2, cor-
rispondenti agli istanti di tempo T1 , . . . , Tn , rispettivamente. Se è verificata almeno una
delle seguenti proprietà:
⇣⌘
i) 9î > 0 tale che REA(0) · REA î < 0;

ii) F1 · REA(0) < 0;

iii) F1 · Sn < 0;

iv) S1 · Sn < 0.

allora esiste un T.I.R. i⇤ > 0.


Dimostrazione. i) La tesi segue direttamente applicando il “Teorema degli zeri” alla fun-
zione continua REA(i) nell’intervallo chiuso e limitato [0, î].

6
O restart; O T1:=0;T2:=1;T3:=2;
O T1:=0;T2:=1;T3:=2; F1:=-100;F2:=60;F3:=70;
F1:=-100;F2:=60;F3:=30; V:=i->F1*(1+i)^(-T1)+F2*(1+i)^(-T2)+F3*(1+i)^(-T3);
V:=i->F1*(1+i)^(-T1)+F2*(1+i)^(-T2)+F3*(1+i)^(-T3); plot(V(i),i=0..1);
plot(V(i),i=0..0.5,view = [0 .. 0.5, -50 .. 0]); fsolve(V(i)=0,i=0..0.5);
Delta:=F2^2-4*F1*F3; Delta:=F2^2-4*F1*F3;
i1:=evalf(-1+((-F2-sqrt(Delta))/(2*F1))); i1:=evalf(-1+((-F2-sqrt(Delta))/(2*F1)));
i2:=evalf(-1+((-F2+sqrt(Delta))/(2*F1))); i2:=evalf(-1+((-F2+sqrt(Delta))/(2*F1)));
T1 := 0 T1 := 0
T2 := 1 T2 := 1
T3 := 2 T3 := 2
F1 := K100 F1 := K100
F2 := 60 F2 := 60
F3 := 30 F3 := 70
KT1 KT2 KT3
V := i/F1 1 C i KT1
C F2 1 C i KT2
C F3 1 C i KT3 V := i/F1 1 C i C F2 1 C i C F3 1 C i

0 30
0.1 0.2 0.3 0.4 0.5
i
20

K10
10

0
K20 0.2 0.4 0.6 0.8 1
i
K10
i2 := K1.588819442 (2) (3)
O T1:=0;T2:=1;T3:=2;
F1:=-50;F2:=145;F3:=-100;
K30
V:=i->F1*(1+i)^(-T1)+F2*(1+i)^(-T2)+F3*(1+i)^(-T3); K20
plot(V(i),i=0..1);
fsolve(V(i)=0,i=0..0.5);
fsolve(V(i)=0,i=0.5..1); K30
Delta:=F2^2-4*F1*F3;
i1:=evalf(-1+((-F2-sqrt(Delta))/(2*F1)));
K40
i2:=evalf(-1+((-F2+sqrt(Delta))/(2*F1)));
T1 := 0 K40
T2 := 1
T3 := 2
F1 := K50
K50
K50
F2 := 145 0.1888194417
D := 15600
(a)
F3 := K100
i1 := K0.0755002002
(b)
D := 31600
KT1 KT2 KT3
V := i/F1 1 C i i2 :=C F2 1 C i
K1.324499800 C F3 1 C i (1) i1 := 0.1888194417
8 (2)

2
7

1
6

0 5
0.2 0.4 0.6 0.8 1
i
4
K1

3
K2
2

K3
1

K4 0
0.2 0.4 0.6 0.8 1
i
K5 K1
0.1298437881 0.2500000000
(c) (d)
0.6666666667
D := 400
i1 := 0.2500000000
Figura 4: Valore attuale dei flussi di cassa al variare del tasso di interesse i2 := 0.6666666667 (4)
(3)

ii) Si consideri il caso REA(0) > 0 ed F1 < 0. Per definizione risulta:


2 3
X
T1
REA(i) = (1 + i) 4 F1 + Fh · (1 + i)T1 Th 5

h:Th >T1

Di conseguenza, essendo F1 < 0, esiste un tasso î > 0 sufficientemente grande tale che
P
F1 + h:Th >T1 Fh · (1 + î)T1 Th < 0 da cui si ha REA(î) < 0. La tesi segue quindi dalla
proprietà i) essendo REA(0) · REA(î) < 0. Il caso REA(0) < 0 ed F1 > 0 è analogo al
precedente.
iii) Segue direttamente dalla proprietà ii) essendo REA(0) = Sn .
iv) Segue direttamente dalla proprietà iii) essendo S1 = F1 .

7
Il seguente teorema fornisce alcune condizioni sufficienti per l’esistenza ed unicità del
T.I.R. nell’ambito delle operazioni finanziarie di investimento.

Teorema [Esistenza ed unicità del T.I.R.]


Si consideri una operazione finanziaria avente flussi di cassa F1 , . . . , Fn , con n 2, corri-
spondenti agli istanti di tempo T1 , . . . , Tn , rispettivamente.
P
Se F1 · Sn < 0 (Sn = nh=1 Fh ) e vale una delle seguenti condizioni:

i) l’operazione finanziaria è un investimento/finanziamento in senso lato

ii) l’operazione finanziaria è un investimento/finanziamento puro

iii) l’operazione finanziaria è un investimento/finanziamento in senso stretto

allora il T.I.R. esiste ed è unico.

Si osservi che il risultato espresso dalla condizione i) è noto come Teorema di Levi, il
risultato espresso dalla condizione ii) è noto come Teorema di Norstrom.

Esempio
Si considerino le due seguenti operazioni finanziarie:

A) T = [0, 1, 2, 3, 4] ed F = [ 2000, 2600, 1500, 3000, 600]

B) T = [0, 1, 2, 3, 4] ed F = [ 2000, 2600, 3000, 1500, 600]

Per entrambe le due operazioni finanziarie risulta S5 = 2700 > 0 ed F1 = 2000 < 0.
Nessuna delle due operazioni finanziarie è un investimento in senso stretto poiché vi sono
flussi di cassa negativi successivi all’entrata F2 .

Le scadenze medie aritmetiche dei flussi di cassa negativi risultano:


0·( 2000)+2·( 1500)
• operazione A) : µu = 2000 1500 = 30
35 <1
0·( 2000)+3·( 1500)
• operazione B) : µu = 2000 1500 = 45
35 >1

Poiché la prima entrata si ha a tempo T2 = 1, l’operazione A) è un investimento in senso


lato, ma non lo è l’operazione B).
Le sequenze dei saldi contabili risultano:

• operazione A) : [S1 , . . . , S5 ] = [ 2000, 600, 900, 2100, 2700]

• operazione B) : [S1 , . . . , S5 ] = [ 2000, 600, 3600, 2100, 2700]

L’operazione B) è quindi un investimento puro, ma non lo è l’operazione A).


Per il teorema precedente, entrambe le operazioni ammettono un unico T.I.R. che nello
specifico è, rispettivamente, i⇤A = 53, 26% e i⇤B = 92, 01%.

8
5 Analisi degli investimenti
5.1 Criterio del pay-back
Si supponga di dover analizzare una operazione finanziaria con F1 < 0, e quindi S1 < 0.

• Si definisce Periodo di Pay-Back (detto anche Periodo di Recupero, in inglese


Pay-Back Period), indicato per brevità con P.B.P., il periodo di tempo necessario
affinché il saldo contabile delle entrate arrivi a pareggiare il saldo contabile delle
uscite.

Nel caso in cui sia Sk < 0 per ogni k = 1, . . . , n allora si ha P BP = +1.


In caso contrario, essendo S1 < 0, deve esistere un indice k̄ 2 {1, . . . , n} tale che:

Sk < 0 8k < k̄ ed Sk̄ 0

Sia quindi k̄ il più piccolo indice per cui Sk̄ 0. Se risulta Sk̄ = 0 allora P BP = Tk̄ ; se
invece Sk̄ > 0 allora il periodo di Pay-Back è un valore compreso nell’intervallo [Tk̄ 1 , Tk̄ ].
In quest’ultimo caso, per poter dare una stima del periodo di Pay-Back possiamo interpo-
lare con un segmento i due punti (Tk̄ 1 , Sk̄ 1 ) e (Tk̄ , Sk̄ ) e prendere come P.B.P. il valore
per cui la retta interpolante si annulla, cosı̀ come descritto in Figura 5.

Sk

Tk-1

PBP Tk
Sk-1
Figura 5: Stima del periodo di Pay-Back

Essendo l’equazione della retta passante per i punti (Tk̄ 1 , Sk̄ 1 ) e (Tk̄ , Sk̄ ) data da:

Sk̄ Sk̄ 1
S = Sk̄ + m (T Tk̄ ) con m=
Tk̄ Tk̄ 1

risulta quindi analiticamente:


Sk̄ S Sk̄
P BP = Tk̄ con m = k̄ 1
m Tk̄ Tk̄ 1

Si osservi come la formula precedente consideri implicitamente anche il caso “P BP = Tk̄


se Sk̄ = 0”, permettendo quindi di riassumere il calcolo del PBP come segue:
8
>
< +1 se Sk < 0 per ogni k = 1, . . . , n
P BP =
>
: T Sk̄ Sk̄ Sk̄ 1
k̄ m con m = Tk̄ Tk̄ se Sk̄ 0 e Sk < 0 8k < k̄
1

9
In un confronto tra investimenti si andrà a scegliere quella con il PBP minore. Debo-
lezza di questo criterio è l’uso dei saldi contabili, finanziariamente poco utili, ed il fatto
che non necessariamente pareggiare il prima possibile le entrate/uscite può risultare con-
veniente. Altro grande difetto è che non si considera minimamente quel che accade dopo
il tempo Tk̄ .

5.2 Criterio del pay-back attualizzato


Si supponga di dover analizzare una operazione finanziaria con F1 < 0, e quindi V1 < 0.

• Si definisce Periodo di Pay-Back Attualizzato (detto anche Periodo di Recu-


pero Attualizzato, in inglese Discounted Pay-Back Period), indicato per brevità con
D.P.B.P., il periodo di tempo necessario affinché il valore attualizzato delle entrate
arrivi a pareggiare il valore attualizzato delle uscite.

Nel caso in cui sia Vk < 0 per ogni k = 1, . . . , n allora si ha DP BP = +1.


In caso contrario, essendo V1 < 0, deve esistere un indice k̄ 2 {1, . . . , n} tale che:
Vk < 0 8k < k̄ e Vk̄ 0
Sia quindi k̄ il più piccolo indice per cui Vk̄ 0. Se risulta Vk̄ = 0 allora DP BP = Tk̄ ; se
invece Vk̄ > 0 allora il periodo di Pay-Back attualizzato è un valore compreso nell’intervallo
[Tk̄ 1 , Tk̄ ]. In quest’ultimo caso, tale valore può essere stimato con la retta interpolante,
come avvenuto per il P.B.P., ottenendo il seguente valore:
Vk̄ V Vk̄
DP BP = Tk̄ con m = k̄ 1
m Tk̄ Tk̄ 1

Si osservi come la formula precedente consideri implicitamente anche il caso “DP BP = Tk̄
se Vk̄ = 0”, permettendo quindi di riassumere il calcolo del PBP come segue:
8
>
< +1 se Vk < 0 per ogni k = 1, . . . , n
DP BP =
>
: T Vk̄ Vk̄ Vk̄ 1
k̄ m con m = Tk̄ Tk̄ se Vk̄ 0 e Vk < 0 8k < k̄
1

In un confronto tra investimenti si andrà a scegliere quella con il DPBP minore. De-
bolezza di questo criterio è che non necessariamente pareggiare il prima possibile il valore
attuale delle entrate/uscite risulta conveniente. Altro grande difetto è che non si considera
minimamente quel che accade dopo il tempo Tk̄ .

5.3 Criterio del R.E.A.


Si ricordi che nel caso in cui il tasso di interesse sia costante nel periodo [0, Tn ] allora:
n
X
Th
REA(i) = Fh · (1 + i)
h=1

se invece il tasso di interesse varia nel tempo, allora:


n
X
REA = Fh · c h
h=1

10
dove:
T1
c1 = (1 + i1 )
ch = ch 1 (1 + ih ) Th 1 Th
8h = 2, . . . , n

Nel caso di confronto tra operazioni finanziarie, si andrà a scegliere quella con il REA
maggiore. Rispetto ai criteri del P.B.P. e D.P.B.P. il criterio del R.E.A. considera l’ope-
razione finanziaria nella sua interezza. Debolezza di questo criterio è la necessità di dover
utilizzare una stima dei tassi di interesse futuri (operazione di per sé ai limiti della magia e
della veggenza); inoltre tale stima dei tassi di interesse risulta essere estremamente delica-
ta poiché a seconda del tasso di interesse scelto può risultare conveniente una operazione
finanziaria invece che un’altra, o viceversa.

5.4 Criterio del T.I.R.


Il tasso Interno di Rendimento (in inglese Internal Rate of Return, I.R.R.), è già stato
studiato dal punto di vista teorico nella Sezione 4.
In un confronto tra investimenti si andrà a scegliere quello con il TIR maggiore, in un
confronto tra finanziamenti si andrà a scegliere quello con il TIR minore. Questo criterio
risolve i problemi dei criteri del P.B.P., D.P.B.P. e R.E.A. ma non è esente da difetti:
in particolare si ricordi che il T.I.R. può non essere unico, nel qual caso si hanno grossi
problemi poiché non si sa quale T.I.R. utilizzare, inoltre il T.I.R. necessita di tecniche
numeriche di calcolo computazionale per essere determinato.
Come è noto, il T.I.R. di una operazione finanziaria è quel tasso i⇤ 0 tale che

REA(i ) = 0. Poiché siamo interessati ad analizzare operazioni di investimento, possiamo
supporre nel resto di questa sottosezione che sia REA(0) = Sn > 0 ed S1 < 0 (ovvero
F1 < 0), da cui segue REA(î) < 0 per un tasso î sufficientemente grande. Il problema
è calcolare numericamente il/un tasso i⇤ 2 [0, î] tale che REA(i⇤ ) = 0. Più in generale,
dati due tassi ia ed ib tali che 0  ia < ib , REA(ia ) > 0 e REA(ib ) < 0, si deve calcolare
numericamente il/un tasso i⇤ 2 [ia , ib ] tale che REA(i⇤ ) = 0.

Metodo Montecarlo
Si suddivide l’intervallo [ia , ib ] in m sottointervalli i0 , i1 , i2 , . . . , im , con i0 = ia , im = ib ,
ij 1 < ij 8j = 1, . . . , m. Si cerca quindi il valore j̄ tale che:

REA(ij ) > 0 8j < j̄ ed REA(ij̄ )  0

Se REA(ij̄ ) = 0 allora T IR = ij̄ , altrimenti il T.I.R. è un valore appartenente all’intervallo


[ij̄ 1 , ij̄ ] che possiamo stimare in due modi:

• semplicemente con il valore medio dell’intervallo, ovvero T IR = 21 (ij̄ 1 + ij̄ );

• in modo analogo alla approssimazione usata per il PBP e DPBP, ovvero:

REA(ij̄ ) REA(ij̄ ) REA(ij̄ 1)


T IR = ij̄ con m = .
m ij̄ ij̄ 1

11
L’errore di approssimazione commesso prendendo il punto medio è:
1 1 ib ia
✏ < (ij̄ ij̄ 1) =
2 2 m
Se vogliamo calcolare il T.I.R. con circa p cifre decimali di precisione dobbiamo avere
✏ ⇡ 10 p da cui si ha 10 p ⇡ 12 ib mia e quindi:

1
m ⇡ (ib ia )10p
2
In altre parole, il metodo Montecarlo è molto semplice ma necessita di un numero enorme
di tassi da valutare.

Metodo di Bisezione
Si parte dall’intervallo [ia , ib ] e si scelgono i tassi ip , in 2 {ia , ib } in modo tale che sia
REA(ip ) > 0 e REA(in ) < 0. Sia ic il punto medio tra ip ed in , ovvero ic = 12 (ip + in );
se REA(ic ) > 0 si prende ic come nuovo tasso ip , se invece REA(ic ) < 0 si prende ic
come nuovo tasso in . L’intervallo è stato cosı̀ dimezzato e si ricomincia il procedimento
dall’inizio. Se troviamo che REA(ic ) = 0 allora possiamo prendere T IR = ic e concludere
il processo algoritmico; altrimenti, per non continuare all’infinito, ad un certo punto bi-
sogna interrompere la procedura iterativa e prendere come T.I.R. una delle due seguenti
approssimazioni:

• semplicemente il valore medio dell’intervallo, ovvero T IR = 21 (ip + in );

• l’approssimazione analoga a quella usata per il PBP e DPBP, ovvero:

REA(ip ) REA(ip ) REA(in )


T IR = ip con m = .
m ip in

Ogni volta che si calcola un nuovo tasso ic e lo si valuta, l’intervallo precedente viene
dimezzato. Di conseguenza, dopo m valutazioni l’intervallo iniziale di lunghezza ib ia è
stato ridotto ad un intervallo di lunghezza ib2mia . L’errore di approssimazione commesso
prendendo il punto medio risulta quindi:
1 ib ia
✏<
2 2m
Se vogliamo calcolare il T.I.R. con circa p cifre decimali di precisione dobbiamo avere
✏ ⇡ 10 p da cui si ha 10 p ⇡ i2bm+1
ia
e quindi:

m ⇡ p log2 (10) + log2 (ib ia ) 1

Il numero di tassi da valutare è notevolmente inferiore a quello del metodo Montecarlo.


Essendo inoltre log2 (10) ⇡ 3.32 si evince che per avere 3 cifre decimali aggiuntive di preci-
sione occorre e↵ettuare 10 valutazioni aggiuntive, ovvero svolgere 10 iterazioni aggiuntive
del processo algoritmico.

12
Appendice – Implementazioni in MATLAB
(Live Script realizzato con MATLAB versione 2020a)

clear; % conviene sempre iniziare un LiveScript con il comando "clear"


% in modo da poter utilizzare efficacemente il comando "Run all sections"
format shortG; % comando utile per visualizzare al meglio i dati in modo compatto

Si supponga di avere a disposizione un file denominato "OpFin.mat" contenente i seguenti dati:

• : matrice in cui le singole colonne indicano ciascuna i flussi di cassa di un investimento;


• : vettore dei tempi corrispondente ai flussi di cassa delle colonne della matrice ;
• : vettore dei tassi di interesse corrispondente ai flussi di cassa delle colonne della matrice
(regime di capitalizzazione composta con convenzione esponenziale).

Per caricare tali dati basta eseguire il seguente comando:

load("OpFin.mat"); % carica tutti i dati contenuti nel file "OpFin.mat"

Per comodità ridenominiamo "Flussi", "Tempi" e "Tassi" in "MF", "T" ed "I":

MF=Flussi;
T=Tempi;
I=Tassi;

Di seguito indicheremo con "F" dei vettori di flussi di cassa, ovvero singole colonne di "MF".

Per essere coerenti questi dati devono verificare le seguenti proprietà:

• le colonne di MF ed i vettori T ed I devono avere tutti la medesima lunghezza;


• il vettore T deve avere componenti strettamente crescenti con T(1) ≥ 0;
• il vettore I deve avere componenti nonnegative.

Queste proprietà possono essere verificate in MATLAB con il seguente codice.

[numf,numinv]=size(MF); % dimensione di MF (num. flussi e num. investimenti)


if not(length(T)==numf) % controllo lunghezza T e colonne di F
error('colonne di F e T non hanno la stessa lunghezza');
end
if not(length(I)==numf) % controllo lunghezza I e colonne di F
error('colonne di F e I non hanno la stessa lunghezza');
end
if not(T(1)>=0) % controllo T(1)>=0
error('Prima componente di T negativa : %g',T(1)');
end
for i=2:numf
if not(T(i)>T(i-1)) % controllo stretta crescenza di T
error('Vettore T non strettamente crescente');
end
end

1
for i=1:numf % controllo non negatività di I
if not(I(i)>=0)
error('Componente %g di I negativa : %g',i,I(i));
end
end

A1. Saldi contabili e scadenze medie


Per calcolare questi valori servono solamente una colonna di MF ed il vettore T.

% colonna di MF, prendiamo ad esempio la seconda


F=MF(:,2);

% presenza di almeno un flusso positivo ed un flusso negativo


primopos=NaN;
primoneg=NaN;
for i=1:numf
if F(i)>0
primopos=i;
break;
end
end
for i=1:numf
if F(i)<0
primoneg=i;
break;
end
end
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end

% calcolo dei saldi contabili


S=zeros(numf,1);
S(1)=F(1);
for i=2:numf
S(i)=S(i-1)+F(i);
end
S'

ans = 1×26
-2000 -3000 -3200 -3300 -3100 -2800

% scadenza media dei flussi di cassa negativi


numer=0;
denom=0;
for i=1:numf
if F(i)<0
numer=numer+T(i)*F(i);
denom=denom+F(i);
end
end
scadmedianeg=numer/denom

2
scadmedianeg =
6.0667

% scadenza media dei flussi di cassa positivi


numer=0;
denom=0;
for i=1:numf
if F(i)>0
numer=numer+T(i)*F(i);
denom=denom+F(i);
end
end
scadmediapos=numer/denom

scadmediapos =
12.376

Gli stessi valori possono essere calcolati tramite delle function:


function primopos=PrimoPos(v)
primopos=NaN;
for h=1:length(v)
if v(h)>0
primopos=h;
break;
end
end
end

function primoneg=PrimoNeg(v)
primoneg=NaN;
for h=1:length(v)
if v(h)<0
primoneg=h;
break;
end
end
end

function S=SaldiCont(F)
n=length(F);
S=zeros(n,1);
S(1)=F(1);
for h=2:n
S(h)=S(h-1)+F(h);
end
end

function scadmediapos=ScadMediaPos(F,T)
numer=0;
denom=0;
for h=1:length(F)
if F(h)>0
numer=numer+T(h)*F(h);
denom=denom+F(h);
end
end

3
scadmediapos=numer/denom;
end

function scadmedianeg=ScadMediaNeg(F,T)
numer=0;
denom=0;
for h=1:length(F)
if F(h)<0
numer=numer+T(h)*F(h);
denom=denom+F(h);
end
end
scadmedianeg=numer/denom;
end

Queste function possono essere utilizzate nel seguente modo:

primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
S=SaldiCont(F);
S'

ans = 1×26
-2000 -3000 -3200 -3300 -3100 -2800

scadmedianeg=ScadMediaNeg(F,T)

scadmedianeg =
6.0667

scadmediapos=ScadMediaPos(F,T)

scadmediapos =
12.376

A2. Coefficienti di attualizzazione e saldi attualizzati - caso operazioni a


tasso fisso i0
Nel caso in cui l’operazione finanziaria si svolga con un tasso i0 costante per tutto il periodo [0,Tn] i coefficienti
di attualizzazione ed il vettore dei saldi attualizzati si possono calcolare facilmente. A tal fine occorrono il tasso
fisso i0, una colonna di F ed il vettore T.

% colonna di MF, prendiamo ad esempio la seconda


F=MF(:,2);

% tasso i0, prendiamo ad esempio il 2.5%


i0=0.025;

% calcolo coefficienti di attualizzazione nel caso di un tasso fisso i0


c=zeros(numf,1);
for i=1:numf
c(i)=(1+i0)^(-T(i));
end

4
c'

ans = 1×26
1 0.97561 0.95181 0.9286 0.90595 0.88385

% calcolo dei saldi attualizzati nel caso di un tasso fisso i0


V=zeros(numf,1);
V(1)=F(1)*(1+i0)^(-T(1));
for i=2:numf
V(i)=V(i-1)+F(i)*(1+i0)^(-T(i));
end
V'

ans = 1×26
-2000 -2975.6 -3166 -3258.8 -3077.6 -2812.5

A3. Coefficienti di attualizzazione e saldi attualizzati – caso operazioni a


tasso variabile
Nel caso in cui l’operazione finanziaria si svolga con un tasso variabile espresso dal vettore I allora i coefficienti
di attualizzazione si possono calcolare con i seguenti comandi (che necessitano solamente dei vettori T ed I).

c=zeros(numf,1);
c(1)=(1+I(1))^(-T(1));
for i=2:numf
c(i)=c(i-1)*(1+I(i))^(T(i-1)-T(i));
end
c'

ans = 1×26
1 0.98039 0.95882 0.93089 0.89509 0.86274

Se i coefficienti di attualizzazione sono noti, allora il vettore dei saldi attualizzati si può determinare come di
seguito (occorrono i vettori F e c).

V=zeros(numf,1);
V(1)=F(1)*c(1);
for i=2:numf
V(i)=V(i-1)+F(i)*c(i);
end
V'

ans = 1×26
-2000 -2980.4 -3172.2 -3265.2 -3086.2 -2827.4

Se invece i coefficienti di attualizzazione non sono noti e non serve memorizzarli, allora il vettore dei saldi
attualizzati si può calcolare con il seguente codice (occorrono i vettori F, T ed I).

V=zeros(numf,1);
coeff=(1+I(1))^(-T(1));
V(1)=F(1)*coeff;
for i=2:numf
coeff=coeff*(1+I(i))^(T(i-1)-T(i));

5
V(i)=V(i-1)+F(i)*coeff;
end
V'

ans = 1×26
-2000 -2980.4 -3172.2 -3265.2 -3086.2 -2827.4

Anche in questo caso, è utile definire delle function per il calcolo dei coefficienti di attualizzazione e dei saldi
attualizzati.
function c=CoeffAtt(T,I)
n=length(T);
c=zeros(n,1);
c(1)=(1+I(1))^(-T(1));
for h=2:n
c(h)=c(h-1)*(1+I(h))^(T(h-1)-T(h));
end
end

function V=SaldiAtt(F,c)
n=length(F);
V=zeros(n,1);
V(1)=F(1)*c(1);
for h=2:n
V(h)=V(h-1)+F(h)*c(h);
end
end

Con queste function il calcolo di tali valori è diretto.

c=CoeffAtt(T,I);
c'

ans = 1×26
1 0.98039 0.95882 0.93089 0.89509 0.86274

V=SaldiAtt(F,c);
V'

ans = 1×26
-2000 -2980.4 -3172.2 -3265.2 -3086.2 -2827.4

A4. Risultato Economico Attualizzato


Il REA come è noto è il valore attuale di tutti i flussi di cassa, pertanto coincide con l’ultima componente del
vettore dei saldi attualizzati, ovvero REA=V(n). Nel caso in cui il vettore dei saldi attualizzati non sia invece
noto, il REA si può determinare utilizzando dei semplici accumulatori.

Vediamo come primo esempio il REA al tasso fisso i0:

% colonna di MF, prendiamo ad esempio la seconda


F=MF(:,2);

% tasso i0, prendiamo ad esempio il 2.5%


i0=0.025;

6
% calcolo REA al tasso fisso i0
rea=F(1)*(1+i0)^(-T(1));
for i=2:numf
rea=rea+F(i)*(1+i0)^(-T(i));
end

Di seguito invece abbiamo il calcolo del REA al tasso variabile, così come descritto dal vettore I:

coeff=(1+I(1))^(-T(1));
reaVAR=F(1)*coeff;
for i=2:numf
coeff=coeff*(1+I(i))^(T(i-1)-T(i));
reaVAR=reaVAR+F(i)*coeff;
end

Sarà talvolta utile avere delle function che calcolano direttamente il REA al tasso fisso i0 ed il REA al tasso
variabile.
function rea=ReaFisso(F,T,i0)
rea=F(1)*(1+i0)^(-T(1));
for h=2:length(F)
rea=rea+F(h)*(1+i0)^(-T(h));
end
end

function reavar=ReaVar(F,c)
reavar=F(1)*c(1);
for h=2:length(F)
reavar=reavar+F(h)*c(h);
end
end

Utilizzando queste function possiamo ad esempio calcolare i REA per tutte le operazioni finanziarie della
matrice MF.

% come tasso i0 prendiamo ad esempio il 2.5%


i0=0.025;
c=CoeffAtt(T,I);
REAfisso=zeros(1,numinv);
REAvar=zeros(1,numinv);
for j=1:numinv
F=MF(:,j);
REAfisso(j)=ReaFisso(F,T,i0);
REAvar(j)=ReaVar(F,c);
end
REAfisso

REAfisso = 1×12
1888.7 1399.8 2454 1258.9 1404.4 1080.4

REAvar

REAvar = 1×12
2685.1 1751.3 3327.5 517.42 2055.2 1471

7
A5. Classificazione degli investimenti
Le seguenti function MATLAB forniscono un risultato del tipo vero/falso indicando se l’operazione finanziaria "F"
fornita come vettore in input è o meno un investimento in senso stretto, puro, in senso lato, in senso generale.

Queste function possono essere utilizzate anche per caratterizzare un finanziamento: è infatti sufficiente
passare alla function il vettore "–F" invece che "F" tenuto conto che "F" è un finanziamento se e solo se "–F" è
un investimento.

Le due seguenti function necessitano come input del solo vettore "F". Si ricordi che è richiesto avere almeno un
flusso di cassa positivo ed almeno un flusso di cassa negativo, inoltre il primo flusso di cassa non nullo deve
necessariamente essere negativo.
function puro=InvPuro(F)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if primopos<primoneg
puro=false;
return;
end
S=SaldiCont(F);
primosaldopos=PrimoPos(S);
if isnan(primosaldopos)
puro=false;
return;
end
puro=true;
for h=(primosaldopos+1):length(F)
if S(h)<0
puro=false;
break;
end
end
end

function stretto=InvStretto(F)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if primopos<primoneg
stretto=false;
return;
end
stretto=true;
for h=(primopos+1):length(F)
if F(h)<0
stretto=false;
break;
end
end
end

8
Si osservi come le precedenti function possano essere implementate anche utilizzando la subfunction
"PrimoNeg":
function puro=InvPuro(F)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if primopos<primoneg
puro=false;
return;
end
S=SaldiCont(F);
primosaldopos=PrimoPos(S);
if isnan(primosaldopos)
puro=false;
return;
end
S2=S(primosaldopos+1:end);
primonegS2=PrimoNeg(S2);
puro=isnan(primonegS2);
end

function stretto=InvStretto(F)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if primopos<primoneg
stretto=false;
return;
end
F2=F(primopos+1:end);
primonegF2=PrimoNeg(F2);
stretto=isnan(primonegF2);
end

Le seguenti function necessitano come input dei vettori "F" e "T".


function generale=InvGenerale(F,T)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if ScadMediaNeg(F,T)<ScadMediaPos(F,T)
generale=true;
else
generale=false;
end
end

function lato=InvLato(F,T)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)

9
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if ScadMediaNeg(F,T)<T(primopos)
lato=true;
else
lato=false;
end
end

Si osservi come queste function si possano implementare alternativamente utilizzando il calcolo booleano:
function generale=InvGenerale(F,T)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
generale = ( ScadMediaNeg(F,T)<ScadMediaPos(F,T) );
end

function lato=InvLato(F,T)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
lato = ( ScadMediaNeg(F,T)<T(primopos) );
end

Utilizzando queste function possiamo in modo estremamente semplice vedere che tipo di investimenti sono
raccolti nel file "OpFin.mat". Iniziamo con delle maschere:

% determiniamo le maschere corrispondenti al tipo di investimenti


maskSTRETTO=false(1,numinv);
maskPURO=false(1,numinv);
maskLATO=false(1,numinv);
maskGENERALE=false(1,numinv);
for j=1:numinv
F=MF(:,j);
maskSTRETTO(j)=InvStretto(F);
maskPURO(j)=InvPuro(F);
maskLATO(j)=InvLato(F,T);
maskGENERALE(j)=InvGenerale(F,T);
end
maskSTRETTO

maskSTRETTO = 1×12 logical array


0 0 1 0 0 0 1 0 0 0 1 0

maskPURO

maskPURO = 1×12 logical array


1 0 1 0 1 0 1 0 0 0 1 1

maskLATO

maskLATO = 1×12 logical array

10
1 0 1 0 1 0 1 0 0 1 1 0

maskGENERALE

maskGENERALE = 1×12 logical array


1 1 1 0 1 1 1 0 1 1 1 1

Vediamo ora il caso delle liste:

listaSTRETTO=zeros(1,numinv);
numSTRETTO=0;
listaPURO=zeros(1,numinv);
numPURO=0;
listaLATO=zeros(1,numinv);
numLATO=0;
listaGENERALE=zeros(1,numinv);
numGENERALE=0;
for j=1:numinv
F=MF(:,j);
if InvStretto(F)
numSTRETTO=numSTRETTO+1;
listaSTRETTO(numSTRETTO)=j;
end
if InvPuro(F)
numPURO=numPURO+1;
listaPURO(numPURO)=j;
end
if InvLato(F,T)
numLATO=numLATO+1;
listaLATO(numLATO)=j;
end
if InvGenerale(F,T)
numGENERALE=numGENERALE+1;
listaGENERALE(numGENERALE)=j;
end
end
listaSTRETTO=listaSTRETTO(1:numSTRETTO)

listaSTRETTO = 1×3
3 7 11

listaPURO=listaPURO(1:numPURO)

listaPURO = 1×6
1 3 5 7 11 12

listaLATO=listaLATO(1:numLATO)

listaLATO = 1×6
1 3 5 7 10 11

listaGENERALE=listaGENERALE(1:numGENERALE)

listaGENERALE = 1×10
1 2 3 5 6 7 9 10 11 12

11
A6. Calcolo del PBP e del DPBP
Le seguenti function MATLAB calcolano il “Pay-Back Period” ed il “Discounted Pay-Back Period”
dell’operazione finanziaria fornita come input (vettori F, T e c).

Si ricordi che nel caso del PBP e del DPBP il primo flusso di cassa deve essere negativo (condizione non
particolarmente vincolante dal momento che questi valori sono rilevanti soltanto nel caso degli investimenti).
function primononneg=PrimoNonneg(v)
primononneg=NaN;
for h=1:length(v)
if v(h)>=0
primononneg=h;
break;
end
end
end

function pbp=PBP(F,T)
if not(F(1)<0)
error('Il vettore F non ha il primo flusso di cassa negativo');
end
S=SaldiCont(F);
k=PrimoNonneg(S);
if isnan(k)
pbp=+inf;
else
m=(S(k)-S(k-1))/(T(k)-T(k-1));
pbp=T(k)-(S(k)/m);
end
end

function dpbp=DPBP(F,T,c)
if not(F(1)<0)
error('Il vettore F non ha il primo flusso di cassa negativo');
end
V=SaldiAtt(F,c);
k=PrimoNonneg(V);
if isnan(k)
dpbp=+inf;
else
m=(V(k)-V(k-1))/(T(k)-T(k-1));
dpbp=T(k)-(V(k)/m);
end
end

Tramite queste function possiamo calcolare per le operazioni finanziarie in MF i valori dei PBP e DPBP:

c=CoeffAtt(T,I);
Pbp=zeros(1,numinv);
Dpbp=zeros(1,numinv);
for j=1:numinv
F=MF(:,j);
Pbp(j)=PBP(F,T);
Dpbp(j)=DPBP(F,T,c);
end
Pbp

12
Pbp = 1×12
13.75 7.2 13.636 4.3077 14.333 6.9444

Dpbp

Dpbp = 1×12
15.62 11.694 14.772 4.4536 15.862 17.776

Un modo immediato per verificare la correttezza dei valori calcolati per il PBP ed il DPBP è quello di
rappresentare graficamente i saldi contabili, i saldi di cassa attualizzati, il PBP ed il DPBP. In particolare,
PBP e DPBP altro non sono che il primo istante di tempo in cui i saldi contabili ed i saldi di cassa attualizzati,
rispettivamente, intersecano l'asse delle ascisse per la prima volta.

Siamo a questo punto in grado di rappresentare il grafico dei saldi di cassa e dei PBP e DPBP.

% colonna di MF, prendiamo ad esempio la seconda


F=MF(:,2);

% si calcolano preliminarmente i coefficienti di attualizzazione


c=CoeffAtt(T,I);

% si calcolano i saldi contabili ed i saldi di cassa attualizzati


S=SaldiCont(F);
V=SaldiAtt(F,c);

% si calcolano PBP e DPBP


Pbp=PBP(F,T);
Dpbp=DPBP(F,T,c);

% grafico
figure("Name","PBP e DPBP");
xmin=0;
xmax=T(end);
dx=(xmax-xmin)*0.05;
yall=[0;S;V];
ymin=min(yall);
ymax=max(yall);
dy=(ymax-ymin)*0.05;
%
plot(T,S,'r-');
hold on;
plot(T,V,'g-');
plot(Pbp,0,'ks');
plot(Dpbp,0,'ks');
plot([xmin,xmax],[0,0],'b');
plot([0,0],[ymin,ymax],'b');
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Saldi di cassa, PBP e DPBP");
legend("Saldi Contabili","Saldi Cassa Attualizzati","Location","best");
xlabel("Tempi");
ylabel("Saldi");

13
grid on;
grid minor;

A7. Calcolo del TIR


Per i calcolo del Tasso Interno di Rendimento verranno presi in considerazione il metodo di bisezione ed il
metodo Monte-Carlo. Le function proposte permettono di determinare il TIR sia nel caso degli investimenti sia
nel caso di finanziamenti. Si osservi che si richiede che sia verificata la condizione REA(i1)* REA(i2)<=0, che
garantisce l’esistenza del TIR.

E’ opportuno osservare l’uso della function per il calcolo del REA a tasso fisso (precedentemente descritta) che
permette di semplificare notevolmente il codice.

Vediamo innanzi tutto una procedura per il calcolo del TIR tramite il "Metodo di Bisezione" (che si basa
sull'utilizzo di un ciclo iterativo "while").
function tir=TIR(F,T,i1,i2,precis)
R1=ReaFisso(F,T,i1);
R2=ReaFisso(F,T,i2);
if R1*R2>0
error('Esistenza del TIR non garantita')
elseif R1==0
tir=i1;
return
elseif R2==0
tir=i2;
return
end
if R1>0

14
ipos=i1;
reapos=R1;
ineg=i2;
reaneg=R2;
else
ipos=i2;
reapos=R2;
ineg=i1;
reaneg=R1;
end
while abs(ipos-ineg)>precis
itemp=(ipos+ineg)/2;
reatemp=ReaFisso(F,T,itemp);
if reatemp>0
ipos=itemp;
reapos=reatemp;
elseif reatemp<0
ineg=itemp;
reaneg=reatemp;
else
tir=itemp;
return;
end
end
m=(reapos-reaneg)/(ipos-ineg);
tir=ipos-(reapos/m);
end

Tramite questa function possiamo calcolare i TIR (i1=0%, i2=35%, precis=10^(-11)) delle operazioni finanziarie
descritte dalla matrice MF:

% fissiamo l'intervallo di ricerca del TIR


i1=0;
i2=0.35;
precis=10^(-11);

% calcoliamo i TIR
tir=zeros(1,numinv);
for j=1:numinv
F=MF(:,j);
tir(j)=TIR(F,T,i1,i2,precis);
end
tir

tir = 1×12
0.059164 0.063262 0.068078 0.29047 0.052469 0.052998

Un metodo immediato per verificare la correttezza del calcolo del TIR è quello di rappresentare graficamente
il REA al tasso fisso calcolato per i tassi nell'intervallo [0,0.35]. In questo caso, il TIR deve essere il punto di
intersezione del grafico del REA con l'asse delle ascisse.

% colonna di MF, prendiamo ad esempio la seconda


F=MF(:,2);

% fissiamo l'intervallo di ricerca del TIR


i1=0;

15
i2=0.35;
precis=10^(-11);
step=0.01;

% calcoliamo i REA al tasso fisso da visualizzare


tassi=i1:step:i2;
numtassi=length(tassi);
Rea=zeros(numtassi,1);
for i=1:numtassi
Rea(i)=ReaFisso(F,T,tassi(i));
end

% calcoliamo il TIR
Tir=TIR(F,T,i1,i2,precis);

% grafico
figure("Name","TIR");
xmin=0;
xmax=i2;
dx=(xmax-xmin)*0.05;
yall=[0;Rea];
ymin=min(yall);
ymax=max(yall);
dy=(ymax-ymin)*0.05;
%
plot(tassi,Rea,'r-');
hold on;
plot(Tir,0,'ks');
plot([xmin,xmax],[0,0],'b');
plot([0,0],[ymin,ymax],'b');
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Rea al variare del tasso fisso e TIR");
legend("REA al variare del tasso fisso","Location","best");
xlabel("Tassi");
ylabel("REA");
grid on;
grid minor;

16
Vediamo adesso una procedura per il calcolo del TIR basata sul cosiddetto "Metodo Monte Carlo".
function tir=TIRmc(F,T,i1,i2,precis)
R1=ReaFisso(F,T,i1);
R2=ReaFisso(F,T,i2);
if R1*R2>0
error('Esistenza del TIR non garantita')
elseif R1==0
tir=i1;
return
elseif R2==0
tir=i2;
return
end
tassi=i1:precis:i2;
numtassi=length(tassi);
Rea=NaN(numtassi,1);
Rea(1)=R1;
for h=2:numtassi
Rea(h)=ReaFisso(F,T,tassi(h));
if Rea(h)==0
tir=tassi(h);
return;
elseif Rea(h-1)*Rea(h)<0
m=(Rea(h)-Rea(h-1))/(tassi(h)-tassi(h-1));
tir=tassi(h)-(Rea(h)/m);
return;
end
end

17
end

E’ utile ribadire con un test computazionale quanto il metodo di bisezione sia più veloce del metodo Monte-
Carlo.

Utilizzando i comandi “tic” e “toc” per la determinazione del tempo di esecuzione e richiedendo una precisione
di 10^(-8), per la determinazione del TIR il Metodo Monte Carlo necessita di circa 10 secondi di elaborazione
su un computer con processore i7 con 6-core a 2.6GHz, mentre il metodo di bisezione impiega sullo stesso
computer circa 2 millesimi di secondo.

% colonna di MF, prendiamo ad esempio la seconda


F=MF(:,2);

% fissiamo l'intervallo di ricerca del TIR


i1=0;
i2=0.35;
precis=10^(-8);

% vediamo i tempi di esecuzione


tic,TIR(F,T,i1,i2,precis),toc

ans =
0.063262
Elapsed time is 0.002135 seconds.

tic,TIRmc(F,T,i1,i2,precis),toc

ans =
0.063262
Elapsed time is 10.083986 seconds.

A8 - Definizione delle Function


Le function utilizzate nel live script (i Live Script sono stati introdotti in MATLAB 9.0, ovvero nella versione
2016a) devono essere scritte alla fine del file. Di seguito sono quindi definite le function utilizzate nelle sezioni
precedenti.

function primopos=PrimoPos(v)
primopos=NaN;
for h=1:length(v)
if v(h)>0
primopos=h;
break;
end
end
end

function primoneg=PrimoNeg(v)
primoneg=NaN;
for h=1:length(v)
if v(h)<0
primoneg=h;
break;

18
end
end
end

function c=CoeffAtt(T,I)
n=length(T);
c=zeros(n,1);
c(1)=(1+I(1))^(-T(1));
for h=2:n
c(h)=c(h-1)*(1+I(h))^(T(h-1)-T(h));
end
end

function S=SaldiCont(F)
n=length(F);
S=zeros(n,1);
S(1)=F(1);
for h=2:n
S(h)=S(h-1)+F(h);
end
end

function V=SaldiAtt(F,c)
n=length(F);
V=zeros(n,1);
V(1)=F(1)*c(1);
for h=2:n
V(h)=V(h-1)+F(h)*c(h);
end
end

function rea=ReaFisso(F,T,i0)
rea=F(1)*(1+i0)^(-T(1));
for h=2:length(F)
rea=rea+F(h)*(1+i0)^(-T(h));
end
end

function reavar=ReaVar(F,c)
reavar=F(1)*c(1);
for h=2:length(F)
reavar=reavar+F(h)*c(h);
end
end

% function classificazione investimenti

function scadmediapos=ScadMediaPos(F,T)
numer=0;
denom=0;
for h=1:length(F)
if F(h)>0
numer=numer+T(h)*F(h);
denom=denom+F(h);

19
end
end
scadmediapos=numer/denom;
end

function scadmedianeg=ScadMediaNeg(F,T)
numer=0;
denom=0;
for h=1:length(F)
if F(h)<0
numer=numer+T(h)*F(h);
denom=denom+F(h);
end
end
scadmedianeg=numer/denom;
end

function generale=InvGenerale(F,T)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
generale = ( ScadMediaNeg(F,T)<ScadMediaPos(F,T) );
end

function lato=InvLato(F,T)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
lato = ( ScadMediaNeg(F,T)<T(primopos) );
end

function puro=InvPuro(F)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if primopos<primoneg
puro=false;
return;
end
S=SaldiCont(F);
primosaldopos=PrimoPos(S);
if isnan(primosaldopos)
puro=false;
return;
end
S2=S(primosaldopos+1:end);
primonegS2=PrimoNeg(S2);
puro=isnan(primonegS2);

20
end

function stretto=InvStretto(F)
primopos=PrimoPos(F);
primoneg=PrimoNeg(F);
if isnan(primopos) || isnan(primoneg)
error('Nel vettore F i flussi sono tutti dello stesso segno');
end
if primopos<primoneg
stretto=false;
return;
end
F2=F(primopos+1:end);
primonegF2=PrimoNeg(F2);
stretto=isnan(primonegF2);
end

% function pay-back period

function primononneg=PrimoNonneg(v)
primononneg=NaN;
for h=1:length(v)
if v(h)>=0
primononneg=h;
break;
end
end
end

function pbp=PBP(F,T)
if not(F(1)<0)
error('Il vettore F non ha il primo flusso di cassa negativo');
end
S=SaldiCont(F);
k=PrimoNonneg(S);
if isnan(k)
pbp=+inf;
else
m=(S(k)-S(k-1))/(T(k)-T(k-1));
pbp=T(k)-(S(k)/m);
end
end

function dpbp=DPBP(F,T,c)
if not(F(1)<0)
error('Il vettore F non ha il primo flusso di cassa negativo');
end
V=SaldiAtt(F,c);
k=PrimoNonneg(V);
if isnan(k)
dpbp=+inf;
else
m=(V(k)-V(k-1))/(T(k)-T(k-1));
dpbp=T(k)-(V(k)/m);

21
end
end

% function tir

function tir=TIR(F,T,i1,i2,precis)
R1=ReaFisso(F,T,i1);
R2=ReaFisso(F,T,i2);
if R1*R2>0
error('Esistenza del TIR non garantita')
elseif R1==0
tir=i1;
return
elseif R2==0
tir=i2;
return
end
if R1>0
ipos=i1;
reapos=R1;
ineg=i2;
reaneg=R2;
else
ipos=i2;
reapos=R2;
ineg=i1;
reaneg=R1;
end
while abs(ipos-ineg)>precis
itemp=(ipos+ineg)/2;
reatemp=ReaFisso(F,T,itemp);
if reatemp>0
ipos=itemp;
reapos=reatemp;
elseif reatemp<0
ineg=itemp;
reaneg=reatemp;
else
tir=itemp;
return;
end
end
m=(reapos-reaneg)/(ipos-ineg);
tir=ipos-(reapos/m);
end

function tir=TIRmc(F,T,i1,i2,precis)
R1=ReaFisso(F,T,i1);
R2=ReaFisso(F,T,i2);
if R1*R2>0
error('Esistenza del TIR non garantita')
elseif R1==0
tir=i1;
return

22
elseif R2==0
tir=i2;
return
end
tassi=i1:precis:i2;
numtassi=length(tassi);
Rea=NaN(numtassi,1);
Rea(1)=R1;
for h=2:numtassi
Rea(h)=ReaFisso(F,T,tassi(h));
if Rea(h)==0
tir=tassi(h);
return;
elseif Rea(h-1)*Rea(h)<0
m=(Rea(h)-Rea(h-1))/(tassi(h)-tassi(h-1));
tir=tassi(h)-(Rea(h)/m);
return;
end
end
end

23

Potrebbero piacerti anche