Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
—————
Dati Numerici
Dati Non Numerici
Dati Strutturati
—————
Appunti per l’insegnamento di
Metodi Computazionali per la Finanza
Anno Accademico 2017/2018
Riccardo Cambini
Dipartimento di Economia e Management
Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: riccardo.cambini@unipi.it
1
Dati Numerici
(Live Script realizzato con MATLAB versione 2017b)
Valori Numerici
Per default MATLAB memorizza i valori numerici nel formato in virgola mobile a doppia precisione
(double-precision floating-point), ovvero numeri a 64bit di cui 52bit per la mantissa, 11bit per l'esponente
ed 1bit per il segno. Questo formato permette di memorizzare numeri aventi fino a 15 cifre. Anche i
numeri interi vengono memorizzati nel formato in virgola mobile, a meno che non vengano convertiti in
un formato dedicato ai numeri interi.
x=123*sqrt(7);
y=sqrt(15)*log(6);
z=exp(9)*log(2);
x,y,z
x = 325.4274
y = 6.9395
z = 5.6166e+03
Come si vede MATLAB non mostra tutte le cifre memorizzate, ma solamente 4 cifre decimali dopo la
virgola, eventualmente utilizzando la notazione esponenziale.
E' possibile modificare il formato con cui MATLAB visualizza i numeri tramite il comando "format".
format short % (default) notazione fissa con 4 cifre decimali dopo il punto
x,y,z
x = 325.4274
y = 6.9395
z = 5.6166e+03
x =
3.254274112609447e+02
y =
6.939454584729698
z =
5.616629778239486e+03
1
x =
3.2543e+02
y =
6.9395e+00
z =
5.6166e+03
x =
3.254274112609447e+02
y =
6.939454584729698e+00
z =
5.616629778239486e+03
format shortG % formato più compatto tra la notazione fissa e quella scientifica,
x,y,z % con un totale di 5 cifre
x =
325.43
y =
6.9395
z =
5616.6
format longG % formato più compatto tra la notazione fissa e quella scientifica,
x,y,z % con un totale di 15 cifre
x =
325.427411260945
y =
6.9394545847297
z =
5616.62977823949
format bank % formato più idoneo per le valute, con 2 cifre decimali dopo il punto
x,y,z
x =
325.43
y =
6.94
z =
5616.63
2
x =
40353/124
y =
3553/512
z =
44933/8
Per tornare alla notazione di default basta utilizzare da solo il comando "format"
x = 325.4274
y = 6.9395
z = 5.6166e+03
x=inf % infinito
x = Inf
x=-inf % -infinito
x = -Inf
x=inf-2^30
x = Inf
anche se in modo matematicamente "improprio" dividendo uno per zero si ottiene infinito
x=1/0
x = Inf
y = NaN
Di seguito vengono forniti alcuni esempi di calcoli che forniscono come risultato NaN (sostanzialmente
corrispondono alle forme di indeterminazione del calcolo dei limiti).
y=0/0
y = NaN
3
y=inf/inf
y = NaN
y=0*inf
y = NaN
y=inf-inf
y = NaN
Si osservi come il valore NaN si possa utilizzare nei calcoli senza ricevere errori MATLAB.
15+NaN
ans = NaN
25*NaN
ans = NaN
Vettori
v =
1 5 3 4 9
w =
4 3 6 7 8
z =
2
0
5
3
4
1
u =
2
5
6
7
n = 5
2:6 % numeri da 2 a 6
ans =
2 3 4 5 6
ans =
3 5 7 9 11 13
h =
3 4 5 6 7 8
Matrici
Per definire delle Matrici basta usare opportunamente "spazio", "," e ";". L'unica regola da seguire è tutte
le righe devono contenere lo stesso numero di valori numerici.
A =
1 2
3 4
B =
5 6
5
7 8
Q=[2 3 5 6;7 5 0 1]
Q =
2 3 5 6
7 5 0 1
S= [1 2 3
4 5 6
7 8 9]
S =
1 2 3
4 5 6
7 8 9
ans =
2 4
ans = 2
ans = 4
[rQ,cQ]=size(Q) % comando utile per memorizzare sia numero righe sia numero colonne
rQ = 2
cQ = 4
Concatenazione di matrici
Per mettere gli array/matrici uno sull'altro ed uno accanto all'altro basta usare "spazio", "," e ";"......
Per evitare errori occorre concatenare le matrici in modo tale da avere in ogni riga sempre lo stesso
numero di valori numerici.
W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8
6
Matrici e vettori possono essere oggetto dei classici calcoli matematici tipici dell'algebra lineare e
matriciale.
ans =
6 8
10 12
ans =
-4 -4
-4 -4
ans =
19 22
43 50
ans =
-3 -4
4 5
ans =
3.0000 -2.0000
2.0000 -1.0000
A' % trasposta di A
ans =
1 3
2 4
ans =
37 54
81 118
inv(A) % inversa di A
ans =
-2.0000 1.0000
1.5000 -0.5000
ans =
-2.0000 1.0000
1.5000 -0.5000
7
A^(-3) % potenza dell'inversa di A, in questo caso (inv(A))^3
ans =
-14.7500 6.7500
10.1250 -4.6250
Si possono effettuare anche operazioni elemento per elemento, che hanno numerose applicazioni nella
gestione massiva di dati in formato tabellare pur non essendo operazioni matematiche.
ans =
5 12
21 32
ans =
5.0000 3.0000
2.3333 2.0000
ans =
0.2000 0.3333
0.4286 0.5000
ans =
1 8
27 64
Spesso, scrivendo codice MATLAB, si ha la necessità di preallocare la memoria per velocizzare i cicli
iterativi, di inizializzare delle maschere logiche, di definire matrici identiche, etc etc.
A tal fine vediamo di seguito come definire con un unico comando alcune particolari matrici.
C =
0 0 0 0
0 0 0 0
C =
0 0
0 0
8
C =
1 1 1 1
1 1 1 1
C =
1 1
1 1
C =
Inf Inf Inf Inf
Inf Inf Inf Inf
C =
Inf Inf
Inf Inf
C =
1 0
0 1
C =
1 0 0 0
0 1 0 0
C =
C(:,:,1) =
1 1 1
1 1 1
C(:,:,2) =
1 1 1
1 1 1
C(:,:,3) =
1 1 1
1 1 1
C(:,:,4) =
1 1 1
9
1 1 1
Matrici pseudocasuali
R =
0.7746 0.3000 0.8133 0.9410
0.2506 0.6826 0.0275 0.9479
R =
-0.6305 0.8255 -0.1522 1.3356
-0.6414 -1.4769 1.4762 -0.9661
R =
3 -1 4 -1
-2 -5 -3 1
R =
R(:,:,1) =
R(:,:,2) =
R(:,:,3) =
Possiamo utilizzare il comando "histogram()" per verificare che il comando "rand()" genera numeri
pseudocasuali con distribuzione uniforme mentre il comando "randn()" genera numeri pseudocasuali
con distribuzione normale.
histogram(rand(1,1000000))
10
histogram(randn(1,1000000))
11
Riferimento agli elementi di un vettore - Selezione di una sottovettore - Permutazione delle
componenti
Fino ad ora abbiamo visto come creare un array o un vettore, vediamo adesso come riferirsi ai loro
elementi.
Per i vettori basta specificare la componente da visualizzare, se si specifica più di una componente si
ottiene un sottovettore, le componenti da specificare possono essere contigue oppure no, inoltre con la
stessa sintassi si possono permutare a piacimento le componenti del vettore.
v % questo è il vettore v
v =
1 5 3 4 9
ans = 5
ans =
5 4
ans =
4 5 9
ans =
1 5 3
ans =
5 3 4
ans =
5 3 4 9
ans =
1
5
3
4
9
12
Riferimento agli elementi di una matrice - Selezione di una sottomatrice - Permutazione di righe/
colonne
W % questa è la matrice W
W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8
ans = 5
ans =
1
8
ans =
6 5
ans =
7 8 8 7
3 1 4 3
5 6 6 5
ans =
7 4 5
1 6 2
ans =
3 7 0
5 1 5
7 3 7
ans =
2 3
4 5
6 2
13
8 4
Talvolta è utile invertire l'ordine delle colonne oppure delle righe; per far questo vi sono dei comandi
specifici.
W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8
ans =
7 8 3 4 7 8
5 6 1 2 5 6
3 4 7 5 0 1
1 2 2 3 5 6
ans =
6 5 3 2 2 1
1 0 5 7 4 3
6 5 2 1 6 5
8 7 4 3 8 7
Ciò può essere efficientemente eseguito indicando la lista delle colonne da prendere, oppure la
cosiddetta maschera delle colonne da prendere.
W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8
Supponiamo ad esempio di voler selezionare la seconda, quarta e quinta colonna di W tramite una lista.
b =
2 4 5
14
W(:,b) % tutte le righe, le colonne indicate nella lista b
ans =
2 3 5
4 5 0
6 2 5
8 4 7
Facciamo adesso la stessa selezione delle colonne tramite una maschera, ovvero un vettore le cui
componenti corrispondono alle colonne ed in cui il valore 1 indica che si deve prendere la colonna
mentre il valore 0 che non si deve prendere la colonna. Il comando "logical()" serve proprio a specificare
che si devono prendere le colonne corrispondenti agli 1.
ans =
2 3 5
4 5 0
6 2 5
8 4 7
Come approfondimento, si osservi che la maschera b si poteva definire anche con i valori true e false,
in particolare il valore true indica che si deve prendere la colonna mentre il valore false che non si deve
prendere la colonna.
I particolari valori "realmax" e "realmin" rappresentano, rispettivamente, il più grande numero macchina
positivo ed il più piccolo numero macchina positivo.
z = 1.7977e+308
15
% più piccolo numero positivo rappresentabile nel formato
w=realmin % in virgola mobile a doppia precisione
w = 2.2251e-308
Svolgere i calcoli con numeri approssimati comporta ulteriori errori numerici, dando origine al cosiddetto
fenomeno della propagazione degli errori. E' l'utente che deve imparare a gestire gli errori numerici,
onde evitare di ottenere risultati privi di senso. Di seguito sono forniti alcuni semplici esempi di errori
numerici.
x = 2.2204e-16
a=2^53;
y=(a+1)-a % dovrebbe essere uno ed invece...
y = 0
b=10^(-16);
z=sqrt(1+b)-1 % dovrebbe essere un numero positivo ed invece...
z = 0
Anche con le matrici bisogna prestare particolare attenzione agli errori numerici. Ad esempio
si consideri la matrice S che è una matrice singolare. Il comando "det()" di MATLAB calcola il
determinante tramite il metodo di Jordan ed operazioni riga elementari, il che per errori numerici di
arrotondamento può fornire risultati errati e restituire matrci inverse che in realtà non esistono.
S =
1 2 3
4 5 6
7 8 9
ans = -9.5162e-16
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
2.202823e-18.
ans =
1.0e+16 *
0.3153 -0.6305 0.3153
-0.6305 1.2610 -0.6305
0.3153 -0.6305 0.3153
MATLAB si accorge che ci potrebbero essere problemi numerici ed avverte con un warning.
Errori analoghi si hanno nel caso della risoluzione dei sistemi lineari Ax=b.
16
A=[3 0 3;5 6 0;2 1 2] % matrice dei coefficienti
A =
3 0 3
5 6 0
2 1 2
b =
1
3
2
x =
-1.0000
1.3333
1.3333
ans =
1.0e-15
0
-0.8882
-0.4441
x =
-1.0000
1.3333
1.3333
ans =
1.0e-15
0.6661
0
0
17
Dati Non Numerici
(Live Script realizzato con MATLAB versione 2017b)
Dati Logici
I valori logici sono quelli del tipo true e false (vero e falso) e sono molto usati nella verifica delle
condizioni logiche, nei salti condizionati, nelle maschere.
x = logical
1
y = logical
0
Come si vede, MATLAB traduce true con il valore 1 e false con il valore 0, pur ricordando che essi sono
valori del tipo "logical".
I principali operatori applicabili alle variabili logiche sono l'AND, l'OR ed il NOT.
x && y % x AND y, vero se entrambi sono veri, falso se almeno uno dei due è falso
ans = logical
0
x || y % x OR y, vero se almeno uno dei due è vero, falso se entrambi sono falsi
ans = logical
1
ans = logical
0
ans = logical
1
1
ans = logical
1
x = 2
ans = logical
1
ans = logical
0
ans = logical
0
ans = logical
1
ans = logical
1
Si possono definire anche vettori e matrici di valori logici, che in gergo vengono chiamate maschere. A
tal fine, si possono utilizzare i valori logici true e false oppure si possono utilizzare i valori 0 e 1 associati
al comando "logical()" che indica come l'1 debba essere interpretato come "vero" e lo 0 debba essere
interpretato come "falso".
mask1=[true,false,false,true,true,false]
mask2=logical([0,0,1,0,1,1])
2
In questo caso è possibile svolgere anche operazioni logiche elemento per elemento, basta scrivere i
simboli "&" e "|" una sola volta.
mask1 | mask2
not(mask1)
Ovviamente ci si può riferire ai singoli elementi di una maschera con la usuale notazione dei vettori.
mask1(2:5)
mask2([3,5,2])
x=[1,0,-1,3,-2,0,1,-3]
x =
1 0 -1 3 -2 0 1 -3
3
1 1 0 1 0 1 1 0
Se vogliamo infine maschere con soli valori "true" o "false", ad esempio in una fase di inizializzazione,
basta dare un unico comando.
true(1,6)
false(2,4)
char =
'M'
charVect =
'Monte dei Paschi'
4
Si osservi come in un array di caratteri in ogni riga ci debba essere lo stesso numero di caratteri, il che
comporta l'esigenza di usare degli spazi nel caso di parole di lunghezza diversa.
charVect(4:13)
ans =
'te dei Pas'
charArray([1,3],6:16)
Sempre utilizzando la notazione vettoriale è facile concatenare tra loro vettori di caratteri.
x='Metodi Computazionali'
x =
'Metodi Computazionali'
y='Finanza'
y =
'Finanza'
z =
'Metodi Computazionali per la Finanza'
str =
"Monte dei Paschi"
5
% questo è un vettore colonna di stringhe
strVect2=["Monte dei Paschi"; "Unicredit"; "Cassa di Risparmio"]
Si osservi come stavolta sia possibile mettere una sopra l'altra stringhe anche di lunghezza diversa (a
differenza di quel che accade per i vettori di caratteri).
strVect1(2)
ans =
"Unicredit"
strArray(2,2)
ans =
"Cassa di Risparmio"
Per concatenare tra loro delle stringhe si deve utilizzare l'operatore "+".
x="Metodi Computazionali"
x =
"Metodi Computazionali"
y="Finanza"
y =
"Finanza"
z =
"Metodi Computazionali per la Finanza"
Data ed Ora
6
Per assegnare una data ad una variabile occorre utilizzare il comando "datetime()".
t = datetime
27-Feb-2017
t = datetime
15-Oct-2013
t = datetime
15-Oct-2013
t = datetime
15-Oct-2013
t = datetime
27-Feb-2017 10:20:00
t = datetime
24-Oct-2014 12:45:07
Warning: Successfully read the date/time text using the format 'MM/dd/uuuu', but their format is
ambiguous and could also be 'dd/MM/uuuu'. Specify a format character vector to avoid ambiguity.
t = datetime
11-Oct-2013
% formato giorno/mese/anno,
t = datetime('10/11/2013','InputFormat','dd/MM/uuuu') % quindi 10 Novembre 2013
t = datetime
10-Nov-2013
7
% formato mese/giorno/anno,
t = datetime('10/11/2013','InputFormat','MM/dd/uuuu') % quindi 11 Ottobre 2013
t = datetime
11-Oct-2013
Vi sono anche delle date utili standard, ovvero adesso, oggi, domani ed ieri.
t = datetime
20-Mar-2018 21:44:47
t = datetime
20-Mar-2018
t = datetime
21-Mar-2018
t = datetime
19-Mar-2018
t=datetime('28-Jun-2017','Format','dd/MM/uuuu')
t = datetime
28/06/2017
t1 = datetime('28-Jun-2017');
t2 = datetime(t1,'Format','dd/MM/uuuu');
t1
t1 = datetime
28-Jun-2017
t2
t2 = datetime
28/06/2017
8
t = datetime
Wednesday, June 28, 2017
t = datetime(2017,6,28,'Format','uuuu-MM-dd')
t = datetime
2017-06-28
t = datetime(2017,6,28,'Format','dd.MM.uuuu')
t = datetime
28.06.2017
t = datetime
28 Jun 2017
t = datetime(2017,6,28,'Format','MMMM d, uuuu')
t = datetime
June 28, 2017
t = datetime
Wednesday, June 28, 2017 12:00 AM
t = datetime
June 28, 2017 00:00:00
eee : giorno della settimana indicato con nome abbreviato (es. Sat)
9
eeee : giorno della settimana indicato con nome completo (es. Saturday)
Si osservi come in versioni precedenti di MATLAB venisse utilizzata l'opzione "yyyy" per visualizzare
l'anno. Tale opzione crea problemi con gli anni non positivi ed è stata sostituita con "uuuu".
d=datetime(2018,05,30);
datetime(d,'Format','dd MMM uuuu')
ans = datetime
30 May 2018
ans = datetime
30 May 2018
d=datetime(0,05,30);
datetime(d,'Format','dd MMM uuuu')
ans = datetime
30 May 0000
ans = datetime
30 May 0001
d=datetime(-450,05,30);
datetime(d,'Format','dd MMM uuuu')
ans = datetime
30 May -0450
10
ans = datetime
30 May 0451
% matrice di date
dateArray=[datetime(2017,2,27), datetime('15-oct-2013')
datetime('yesterday'), datetime('tomorrow')]
Si osservi che vettori e matrici di date possono essere velocemente definiti anche utilizzando i cosiddetti
Cell Array (vedasi sezioni successive).
dateVect1(2)
ans = datetime
15-Oct-2013
dateArray(1,2)
ans = datetime
15-Oct-2013
Si osservi inoltre come sia possibile confrontare tra loro delle date ottenendo come risultati dei valori
logici.
d1 = datetime
15-Mar-2018
11
d2=datetime('25-january-2018') % definisce la data d2
d2 = datetime
25-Jan-2018
d3 = datetime
25-Jan-2018
ans = logical
0
ans = logical
1
ans = logical
0
ans = logical
1
Tramite operazioni numeriche si possono anche incrementare e decrementare le date. A tal fine è utile
utilizzare le funzioni "caldays()", "calweeks()", "calmonths()", "calyears()".
d2
d2 = datetime
25-Jan-2018
d2+caldays(20)
ans = datetime
14-Feb-2018
d2-calweeks(6)
ans = datetime
14-Dec-2017
12
Dati Strutturati
(Live Script realizzato con MATLAB versione 2017b)
Structures
Negli Array e Vettori di numeri, date, caratteri e stringhe, tutti i dati devono essere dello stesso tipo. Le
structures servono per poter assegnare ad una variabile un gruppo di dati di tipo diverso.
A tal fine basta dividere la variabile in diversi campi, utilizzando il simbolo "." seguito dal nome del
campo.
S.nome='Paolo Rossi';
S.nascita=datetime('24-Oct-1999');
S.iscritto=true;
S.matricola=712569;
S.matrice=[1 2;3 4];
S.sede="Pisa";
S
Per richiamare una delle parti della variabile basta specificarne il campo.
S.nome
ans =
'Paolo Rossi'
S.nascita
ans = datetime
24-Oct-1999
S.iscritto
ans = logical
1
S.matricola
1
ans = 712569
S.matrice
ans =
1 2
3 4
S.sede
ans =
"Pisa"
Come approfondimento è interessante osservare che anche i valori "datetime" si possano gestire come
structures.
d0=datetime('20-jul-2016')
d0 = datetime
20-Jul-2016
d0.Day
ans = 20
d0.Month
ans = 7
d0.Year
ans = 2016
Cell Arrays
I Cell Arrays rappresentano il grado massimo di libertà, sono in fatti array in cui in ogni singola cella si
può mettere un oggetto di tipo diverso.
Si definiscono utilizzando le parentesi graffe "{" e "}” invece delle parentesi quadre "[" e "]".
C={25,'Paolo',[1 2;3 4]
S,datetime(2017,2,27),{'Ugo','Gino';'Pippo','Pluto'}
[true,false,false,true],"Unicredit",zeros(2,3,5,8)}
2
Si osservi come le parentesi tonde "(" e ")" permettano di riferirsi ad una cella, mentre le parentesi graffe
"{" e "}" al contenuto della cella.
C(2,2)
C{2,2}
ans = datetime
27-Feb-2017
C(1,3)
C{1,3}
ans =
1 2
3 4
C(2,1)
C{2,1}
I Cell Array possono essere utili per definire vettori/matrici di vettori di caratteri, evitando il problema dei
vettori di caratteri di lunghezza diversa.
Srow={'Paolo','Simone','Giuseppe','Gianmarco','Riccardo','Gino'}
Scol={'Paolo';'Simone';'Giuseppe';'Gianmarco';'Riccardo';'Gino'}
3
{'Paolo' }
{'Simone' }
{'Giuseppe' }
{'Gianmarco'}
{'Riccardo' }
{'Gino' }
Sarray={'Paolo','Simone','Giuseppe';'Gianmarco','Riccardo','Gino'}
I Cell Array possono essere inoltre utili per definire velocemente vettori/matrici di date.
Drow={'12/25/2011','1/2/2012','1/23/2012','2/7/2012','2/15/2012','1/1/2013'};
t1=datetime(Drow)
Dcol={'12/25/2011';'1/2/2012';'1/23/2012';'2/7/2012';'2/15/2012';'1/1/2013'};
t2=datetime(Dcol)
Darray={'12/25/2011','1/2/2012','1/23/2012';'2/7/2012','2/15/2012','1/1/2013'};
t3=datetime(Darray)
Tables
Le Tables sono tabelle di dati in cui in ogni singola colonna i dati sono dello stesso tipo, ma colonne
diverse possono avere dati di tipo diverso.
Per vedere come si possono definire le Tables, creiamo preliminarmente dei vettori colonna di date,
nomi e numeri.
Date=datetime({'12/25/2011';'1/2/2012';'1/23/2012';'2/7/2012'});
Nomi={'A2A';'ENEL';'BMPS';'FCA'};
Quotazioni=[5.23;3.45;1.24;2.47];
4
Per definire la tabella basta utilizzare il comando "table()"
T1=table(Date,Nomi,Quotazioni)
T1 = 4×3 table
Date Nomi Quotazioni
NomiRighe={'Acquisto';'Vendita';'Put';'Call'};
T2=table(Date,Nomi,Quotazioni,'RowNames',NomiRighe)
T2 = 4×3 table
Date Nomi Quotazioni
Ci si può riferire alle singole colonne (solo alle colonne, non alle righe il cui nome è opzionale)
utilizzando la notazione delle Structures.
T2.Date
T2.Nomi
T2.Quotazioni
ans =
5.2300
5
3.4500
1.2400
2.4700
La notazione delle Structures può essere utilizzata anche per definire le Tables.
T3=table;
T3.Giorni=Date;
T3.Titoli=Nomi;
T3.Euro=Quotazioni;
T3
T3 = 4×3 table
Giorni Titoli Euro
Attenzione che per riferirsi ai singoli elementi di una Table occorre utilizzare le parentesi graffe "{” e "}",
se si utilizzano invece le parentesi tonde "(" e ")" si ottengono delle sottotabelle.
T3([1,3],[2,3])
1 'A2A' 5.2300
2 'BMPS' 1.2400
T3([1,3],2)
1 'A2A'
2 'BMPS'
T3{[1,3],2}
T3{[1,3],3}
ans =
6
5.2300
1.2400
Quando ci si riferisce agli elementi di una Table si deve far attenzione che siano tutti dello stesso tipo,
altrimenti si ottiene un errore.
T3{[1,3],[2,3]}
Cannot concatenate the table variables 'Euro' and 'Titoli', because their types are double and cell.
Anche per le Tables possono essere talvolta utili i comandi per invertire l'ordine delle righe e colonne,
ad esempio nel caso in cui le righe corrispondano a delle date e si vogliano mettere i dati della tabella in
ordine crescente o decrescente di data.
T3
T3 = 4×3 table
Giorni Titoli Euro