Sei sulla pagina 1di 34

Prerequisiti su

Titoli Azionari ed Analisi Tecnica


—————
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 27 Aprile 2020

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

1
1 Terminologia di Base
Una serie storica di n 2 quotazioni di un titolo di borsa viene in generale individuata
dai due vettori:
Q = [Q1 , . . . , Qn ] e T = [T1 , . . . , Tn ] ,
dove i valori positivi Q1 , . . . , Qn rappresentano rispettivamente le quotazioni del titolo
(ovvero il prezzo del titolo espresso in una determinata valuta) alle date T1 , . . . , Tn .
Le date T1 , . . . , Tn sono in ordine strettamente crescente, ovvero Tk 1 < Tk 8k =
2, . . . , n, inoltre sono periodiche, ovvero rappresentano le quotazioni del titolo giornaliere,
settimanali, mensili.

1.1 Quotazioni
Si ricordi che le quotazioni di un titolo fluttuano nell’arco della giornata borsistica (seduta
di contrattazioni), quindi occorre precisare a quale quotazione ci si riferisce nell’ambito
della serie storica:

• Apertura [O1 , . . . , On ]: prezzo del titolo alla apertura delle contrattazioni;

• Chiusura [C1 , . . . , Cn ]: prezzo del titolo alla chiusura delle contrattazioni;

• Chiusura Aggiustata [A1 , . . . , An ]: prezzo di chiusura aggiustato per dividendi e split;

• Massimo [H1 , . . . , Hn ]: prezzo massimo raggiunto dal titolo nella giornata borsistica;

• Minimo [L1 , . . . , Ln ]: prezzo minimo raggiunto dal titolo nella giornata borsistica.

Se non diversamente specificato, quando si parla genericamente della “quotazione” di


un titolo ci si riferisce al prezzo di chiusura.
Per 2  k  n, nel caso in cui sia Qk 1 < Qk si dice che il titolo ha avuto un rialzo, nel
caso invece in cui sia Qk 1 > Qk si dice che il titolo ha avuto un ribasso. Più in generale,
per 1  h < k  n, nel caso in cui sia Qh < Qk si dice che il titolo ha avuto un rialzo nel
periodo [h, k] (ovvero nell’intervallo di tempo [Th , Tk ]), nel caso invece in cui sia Qh > Qk
si dice che il titolo ha avuto un ribasso nel periodo [h, k].

1.2 Analisi Tecnica


L’Analisi Tecnica studia l’andamento dei prezzi dei titoli nel tempo sulla base delle serie
storiche delle quotazioni e per mezzo di metodi grafici. Viene complementata dalla cosid-
detta Analisi Fondamentale, che invece valuta il valore di una determinata società sulla
base del suo bilancio, della sua redditività, della sua solidità patrimoniale.
L’origine dell’Analisi Tecnica si può far risalire al 1884, quando Charles Henry Dow
(co-fondatore dell’indice Dow Jones) pubblicò sul Wall Street Journal degli articoli sull’e-
voluzione della Borsa.
L’analisi tecnica è stata inizialmente applicata soltanto al mercato azionario, il suo uso
si è poi di↵uso al mercato delle materie prime, a quello obbligazionario, a quello valutario
e agli altri mercati internazionali.
L’Analisi Tecnica si basa su tre principi (tutt’altro che indiscutibili):

2
• il prezzo attuale ingloba qualsiasi fattore : il grafico e l’andamento del prezzo del
titolo incorpora tutti i fattori di tipo fondamentale, politico, psicologico, monetario
ed economico, che ne hanno determinato l’andamento;

• la storia tende a ripetersi nel tempo : in presenza di situazioni simili, gli operatori
di mercato tendono ad assumere comportamenti analoghi;

• i prezzi seguono un trend : i prezzi non si muovono in maniera casuale ma hanno


un comportamento definito che resta in vigore fino a quando non si ha un segnale di
inversione.

2 Variazioni Assolute e Variazioni Relative


Per 2  k  n, i seguenti valori sono usualmente calcolati per valutare l’andamento del
titolo:
• Variazione Assoluta : la variazione assoluta a tempo k è data da:

V arAssk = (Qk Qk 1)

e rappresenta la variazione del prezzo del titolo nel periodo [k 1, k] espressa in


termini della valuta di riferimento; questa variazione risulta positiva in caso di rialzo,
negativa in caso di ribasso;

• Variazione Percentuale : la variazione percentuale (o variazione relativa) a tempo k


è data da:
Qk Qk 1
V arP erck =
Qk 1
e rappresenta la variazione del prezzo del titolo nel periodo [k 1, k] in proporzione
al suo prezzo iniziale; questa variazione è un numero puro, espresso di solito in
percentuale, e risulta positiva in caso di rialzo, negativa in caso di ribasso.
Le variazioni assolute e relative possono essere espresse anche in valore assoluto (ovvero
“senza segno”) evidenziando in tal caso esplicitamente la presenza di un rialzo o ribasso.
In altre parole possiamo definire i seguenti valori:
• Rialzo Assoluto e Rialzo Percentuale : se Qk 1 < Qk risulta:

RzAssk = V arAssk e RzP erck = V arP erck

• Ribasso Assoluto e Ribasso Percentuale : se Qk 1 > Qk risulta:

RbAssk = V arAssk e RbP erck = V arP erck

Si osservi che i rialzi assoluti/percentuali sono definiti solo nel caso in cui il titolo abbia
avuto un rialzo, mentre i ribassi assoluti/percentuali sono definiti solo nel caso in cui il
titolo abbia avuto un ribasso.
Nella pratica, quando si dice che “un titolo ha avuto un rialzo del 3%” vuol dire che
esso ha avuto una variazione percentuale del +3%, mentre se “un titolo ha avuto un ribasso

3
del 4%” vuol dire che esso ha avuto una variazione percentuale del 4%. In altre parole, le
variazioni assolute/percentuali sono numeri con un proprio segno che risulta essere positivo
in caso di rialzi e negativo in caso di ribassi, mentre i rialzi/ribassi assoluti/percentuali
sono sempre valori positivi (è come se il segno fosse stato “incorporato” nelle parole rialzo
e ribasso).
La Tabella 1 fornisce un esempio relativo al calcolo dei valori sopra descritti. In
particolare, sono state considerate le quotazioni di apertura del titolo BMPS (Banca Monte
dei Paschi di Siena) dal 9 maggio 2016 al 20 maggio 2016.

k Tk Qk VarAss VarPerc RzAss RzPerc RbAss RbPerc


1 Mon 09 May 2016 0,6530 - - - - - -
2 Tue 10 May 2016 0,6130 -0,0400 -6,13% - - 0,0400 6,13%
3 Wed 11 May 2016 0,5740 -0,0390 -6,36% - - 0,0390 6,36%
4 Thu 12 May 2016 0,5650 -0,0090 -1,57% - - 0,0090 1,57%
5 Fri 13 May 2016 0,5495 -0,0155 -2,74% - - 0,0155 2,74%
6 Mon 16 May 2016 0,5620 0,0125 2,27% 0,0125 2,27% - -
7 Tue 17 May 2016 0,5650 0,0030 0,53% 0,0030 0,53% - -
8 Wed 18 May 2016 0,5520 -0,0130 -2,30% - - 0,0130 2,30%
9 Thu 19 May 2016 0,5545 0,0025 0,45% 0,0025 0,45% - -
10 Fri 20 May 2016 0,5700 0,0155 2,80% 0,0155 2,80% - -

Tabella 1: Quotazioni BMPS 9-20 Maggio 2016

3 Analisi Grafica
Per avere una idea completa della variabilità giornaliera dei prezzi di un titolo occorre
integrare il suo prezzo di chiusura con le informazioni relative al suo prezzo di apertura ed
alla massima e minima quotazione da esso raggiunte durante la seduta di contrattazioni.

3.1 Grafici High-Low-Close


I grafici più semplici si limitano a rappresentare le informazioni relative al prezzo di chiu-
sura, al prezzo minimo ed al prezzo massimo. Si possono ottenere ad esempio nei due
modi seguenti:

• rappresentando nello stesso grafico l’andamento dei prezzi massimi, minimi e di


chiusura del titolo;

• rappresentando nel grafico l’andamento dei prezzi di chiusura del titolo e disegnando
in corrispondenza di ogni giornata un segmento verticale avente come estremi la
massima e la minima quotazione raggiunte durante tale giornata.

Si osservi che tali grafici non permettono purtroppo di evidenziare l’andamento rialzista
o ribassista del titolo.

4
3.2 Candele Giapponesi
Il grafico a “candele giapponesi” (candlestick) è una delle rappresentazioni più utilizzate
per l’analisi della variabilità giornaliera dei prezzi di un titolo. E’ stato inventato in
Giappone da Munehisa Homma ed utilizzato per la prima volta nel XVIII secolo per
prevedere l’andamento dei prezzi del riso; è stato poi introdotto in Europa intorno al 1989
grazie a Steve Nison che nel suo libro “Japanese Candlestick Charting Techniques” ne
spiegò le regole e l’utilizzo.
Per ogni giornata borsistica è possibile rappresentare una “candela” conoscendo i quat-
tro prezzi di apertura (Ok ), chiusura (Ck ), massimo (Hk ) e minimo (Lk ). Ogni Candela
ha le seguenti 3 caratteristiche (vedasi Figura 1):
• Real Body : è il corpo della candela vero e proprio, che rappresenta l’ampiezza tra il
prezzo di apertura (Ok , Open Price) e il prezzo di chiusura (Ck , Close Price);
• Shadows : le ombre della candela sono segmenti che rappresentano l’oscillazione del
prezzo tra il prezzo massimo (Hk , High Price) e il prezzo minimo (Lk , Low Price);
è possibile avere un segmento sopra il corpo della candela detto ombra superiore
(Upper Shadow ) ed uno invece al di sotto detto ombra inferiore (Lower Shadow );
• Colore : la candela può avere due colori per evidenziare un rialzo (Ok < Ck ) oppure
un ribasso (Ok > Ck ); in generale per i rialzi si utilizzano i colori bianco o verde,
per i ribassi si utilizzano i colori nero o rosso.
Questa tipologia di grafico è molto utilizzata perché evidenzia il comportamento al rialzo
o al ribasso del titolo.

Rialzo Ribasso
Hk Hk

Massimo – High Price Ombra Superiore Massimo – High Price


Upper Shadow
Ck Ok

Chiusura – Close Price


Apertura – Open Price
Corpo
Real Body
Ok Ck

Apertura – Open Price


Ombra Inferiore Chiusura – Close Price
Lower Shadow
Lk Lk

Minimo – Low Price Minimo – Low Price

Figura 1: Candele Giapponesi

5
4 Oscillatori
Vengono chiamati oscillatori quegli strumenti dell’analisi tecnica utilizzati per studiare
le oscillazioni del mercato finanziario in modo tale da complementare l’uso dell’analisi
grafica. Gli oscillatori più semplici sono il Momentum ed il ROC.

4.1 Momentum e Momentum Relativo


L’oscillatore momentum indica la forza del mercato misurando le continue variazioni di
prezzo su intervalli di tempo prefissati. Definito con p il parametro temporale considerato
(ad esempio p = 5, p = 10, p = 14) si ha che:

Mk = C k Ck p per (p + 1)  k  n

Da un punto di vista matematico il momentum altro non è che la variazione assoluta del
prezzo di chiusura rispetto al corrispondente prezzo di p sedute precedenti. Il momentum
esprime velocità con cui i prezzi si muovono al rialzo o al ribasso, dando quindi importanti
segnali sulla opportunità di vendita o acquisto.
A partire dal momentum è possibile definire un altro oscillatore denominato Momen-
tum Relativo:
Ck Ck p
M Rk = per (p + 1)  k  n
Ck p
Il Momentum Relativo esprime il momentum in termini relativi e percentuali, in modo
quindi asettico rispetto al prezzo iniziale. Per questo motivo il Momentum Relativo riesce
meglio del momentum ad individuare i movimenti rialzisti o ribassisti dei titoli.

4.2 Rate of Change (ROC)


L’oscillatore ROC indica la forza del mercato misurando il tasso di variazione dei prezzi.
Definito con p il parametro temporale considerato (ad esempio p = 5, p = 10, p = 14) si
ha che:
Ck
ROCk = 100 per (p + 1)  k  n
Ck p
Il ROC esprime andamenti analoghi a quelli del momentum relativo (risulta infatti ROC =
100 ⇤ (1 + M R)), espressi però in valori che oscillano attorno al valore 100.

5 Analisi del Trend


Il modo più semplice per cercare di individuare l’andamento generale di un titolo di borsa
è quello di considerare la media, aritmetica o pesata, delle sue quotazioni. A tal fine
possiamo considerare un certo numero di quotazioni passate (tale numero viene detto look-
back e denotato con lb) e, in alcuni casi, anche un certo numero di quotazioni successive
(tale numero viene detto look-ahead e denotato con la). Si indica infine con p = lb + la + 1
il numero di quotazioni considerate nel calcolo della media. Per semplificare la trattazione
consideriamo di seguito casi in cui la = 0 e quindi in cui lb = p 1.

6
5.1 Media mobile semplice (Simple Moving Average, SMA)
Forse la più utilizzata, ma sicuramente la più semplice tra le medie mobili. E’ definita
come la media aritmetica delle ultime p quotazioni:
Pk Pp
j=k p+1 Qj h=1 Qk p+h
SM Ak = = per p  k  n
p p
Si osservi che in questo caso ad ogni quotazione viene data la stessa importanza.

5.2 Media mobile ponderata (Weighted Moving Average, WMA)


Questa media mobile intende dare maggior peso alle quotazioni recenti, ritenendole più
significative rispetto a quelle passate. In questo modo la media mobile risulta maggiormen-
te “reattiva” rispetto alle quotazioni recenti e tende a “dimenticarsi” delle quotazioni più
lontane. In questa media mobile alle p quotazioni Qk p+1 , Qk p+2 , . . . , Qk 1 , Qk , vengono
dati i pesi 1, 2, . . . , p 1, p:
Pk Pp
j=k p+1 (j k + p)Qj h=1 hQk p+h
W M Ak = Pp = Pp per p  k  n
h=1 h h=1 h
p
X p(p + 1)
Si ricordi al riguardo che risulta h= .
h=1
2

5.3 Media mobile esponenziale (Exponential Moving Average, EMA)


Anche questa media mobile ha la finalità di rendere le quotazioni passate meno “impor-
tanti” rispetto a quella più recente. Questa media mobile viene calcolata in modo ricorsivo
a partire dalla media mobile semplice:
Pp
j=1 Qj
EM Ap = SM Ap =
p
(p 1)EM Ak 1 + 2Qk
EM Ak = per (p + 1)  k  n
p+1

6 Analisi della Volatilità


La variabilità del prezzo/rendimento dei titoli e delle attività finanziarie è la principale
fonte di rischio per gli investitori che operano sui mercati finanziari. Con il termine
volatilità si intende una misura di tale variabilità dei prezzi/rendimenti e quindi del rischio
finanziario correlato.

6.1 True Range (TR)


Il True Range (TR) cerca di tener conto nella stima della volatilità non solo della massima
e minima quotazione, ma anche del prezzo di chiusura precedente. Esso è definito come il
più grande valore tra:
• di↵erenza tra massimo e minimo della giornata corrente;

7
• valore assoluto della di↵erenza tra il massimo della giornata corrente e la chiusura
della giornata precedente;

• valore assoluto della di↵erenza tra la chiusura della giornata precedente ed il minimo
della giornata corrente.

Per ogni istante temporale 2  k  n è quindi possibile calcolare i valori T Rk seguendo


la definizione suindicata. Convenzionalmente, per k = 1 il valore T R1 si calcola sem-
plicemente prendendo la di↵erenza tra la massima e la minima quotazione della prima
giornata (manca infatti la chiusura della giornata precedente). In altre parole, indicando
con Ck , Hk , Lk le quotazioni alla giornata k-esima , rispettivamente, di chiusura, massima,
e minima, risulta:

T R1 = (H1 L1 )
T Rk = M AX { Hk Lk , |Hk Ck 1| , |Ck 1 Lk | } per 2  k  n

Si osservi che la definizione precedente per 2  k  n può anche essere equivalentemente


scritta nel modo seguente:

T Rk = M AX { Hk , Ck 1 } M IN { Lk , Ck 1 }

6.2 Average True Range (ATR)


L’Average True Range (ATR) è un indicatore di misurazione della volatilità del mercato
proposto da J. Welles Wilder nel suo volume del 1978 “New Concepts inTechnical Trading
System”. Questo indicatore è molto utilizzato dagli analisti tecnici in concomitanza di
altri indicatori quali il Relative Strength Index (RSI), il Money Flow Index (MFI), il
Parabolic SAR (SAR significa “Stop and Reversal”), l’Average Directional Index (ADX).
Si ricorda che i vari indicatori se utilizzati singolarmente non sono in grado di generare
segnali affidabili; in altre parole occorre sempre analizzare le situazioni utilizzando tutti
gli indicatori a disposizione.
L’Average True Range a tempo k viene calcolato come la media aritmetica degli ultimi
p valori del T R (quindi con la = 0 e lb = p 1).
Wilder propose di utilizzare il valore p = 14 (motivandolo come la metà del ciclo lunare
di 28 giorni) ottenendo:

T R1 + T R2 + T R3 + . . . + T R12 + T R13 + T R14


AT R14 =
14
e, in generale, per 14  k  n:
T Rk 13 + T Rk 12 + T Rk 11 + . . . + T Rk 2 + T Rk 1 + T Rk
AT Rk =
14
Ovviamente è possibile anche utilizzare altri valori, come p = 5 (giornate di una
settimana borsistica) o p = 10 (giornate di due settimane borsistiche).
Si osservi infine come gli indicatori T R a AT R siano per definizione nonnegativi e
quindi evidenzino la instabilità del prezzo del titolo ma non forniscano alcuna informazione
sul fatto che esso abbia una tendenza al rialzo o al ribasso.

8
6.3 Weighted True Range (WTR) ed Exponential True Range (ETR)
In modo analogo alle medie mobili pesate ed esponenziali (WMA e EMA), per diminuire
il peso del True Range delle giornate passate è possibile definire gli indicatori WTR ed
ETR:
Pk Pp
j=k p+1 (j k+ p)T Rj h=1 hT Rk p+h
W T Rk = Pp = Pp per p  k  n
h=1 h h=1 h

Pp
j=1 T Rj
ET Rp = AT Rp =
p
(p 1)ET Rk 1 + 2T Rk
ET Rk = per (p + 1)  k  n
p+1

9
Appendice - Le principali borse mondiali
Di seguito viene fornita una brevissima descrizione delle 6 principali borse mondiali e dei
loro indici di borsa. Si ricorda che le serie storiche degli indici di questi mercati borsistici e
dei titoli che li compongono sono reperibili in modo gratuito (anche utilizzando il software
MATLAB) sul sito web Yahoo Finanza : http://it.finance.yahoo.com/

1) Borsa di New York (New York Stock Exchange, NYSE) : soprannominata “Big
Board”, è la più grande borsa valori del mondo per volume di scambi e la seconda
per numero di società quotate. Il Dow Jones (nome completo “Dow Jones Industrial
Average”) è il più noto indice azionario della borsa di New York (codice “ˆDJI” su
Yahoo Finanza);

2) NASDAQ (National Association of Securities Dealers Automated Quotation) : è


stato il primo mercato borsistico completamente elettronico, ovvero costituito solo
da una rete di computer; le principali aziende tecnologiche e innovative preferiscono
quotarsi sul NASDAQ piuttosto che sul NYSE. Il suo principale indice azionario è
il NASDAQ-100 (codice “ˆNDX” su Yahoo Finanza);

3) Borsa di Tokio (Tokyo Stock Exchange, TSE) : borsa molto antica (1878), su cui
adesso si opera solo in modo elettronico. Il suo principale indice azionario è il Nikkei
225 (codice “ˆN225” su Yahoo Finanza);

4) Borsa di Londra (London Stock Exchange, LSE) : di fatto è un gruppo che contiene
anche la Borsa di Milano ed è il principale mercato europeo. Il suo principale indice
azionario è il FTSE 100 (codice “ ˆ FTSE” su Yahoo Finanza), mentre il principale
indice della Borsa di Milano è il FTSE MIB (codice “FTSEMIB.MI” su Yahoo
Finanza);

5) Borsa di Hong Kong (Hong Kong Stock Exchange, HKSE) : punto di riferimento
per il mercato asiatico. Il suo principale indice azionario è l’HANG SENG INDEX
(codice “ˆHSI” su Yahoo Finanza);

6) Borsa di Shangai (Shanghai Stock Exchange, SSE) : piazza di riferimento per la


Cina, fondata solo nel 1990. Il suo principale indice azionario è l’SSE Composite
Index (codice “000001.SS” su Yahoo Finanza);

10
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

A1 - Caricamento Preliminare dei Dati


Supponiamo a titolo di esempio di avere un file "FCA.MI.csv" contenente i dati storici del titolo Fiat Chrysler
Automobiles N.V. (FCA.MI).

Per caricare i dati storici si utilizza il seguente comando.

FCA=readtable("FCA.MI.csv");

Warning: Column headers from the file were modified to make them valid MATLAB identifiers
before creating variable names for the table. The original column headers are saved in the
VariableDescriptions property.
Set 'PreserveVariableNames' to true to use the original column headers as table variable names.

Per verificare il caricamento dei dati visualizziamo le prime e le ultime righe della tabella.

FCA([1:4,end-3:end],:)

ans = 8×7 table


Date Open High Low Close AdjClose Volume

1 2000-01-03 8.3063 8.5029 8.0571 8.0571 4.9246 6726830


2 2000-01-04 8.3035 8.3866 8.1762 8.3201 5.0854 4925665
3 2000-01-05 8.1678 8.633 7.9906 8.6108 5.263 11267847
4 2000-01-06 8.777 8.8462 8.5693 8.6939 5.3138 4755192
5 2018-04-09 18.5 18.62 18.304 18.53 18.53 8569589
6 2018-04-10 18.7 18.796 18.59 18.78 18.78 8940937
7 2018-04-11 18.67 18.79 18.348 18.604 18.604 14689493
8 2018-04-12 18.63 18.988 18.57 18.97 18.97 9076866

Si osservi che le quotazioni sono in ordine crescente di data e quindi non occorre invertire le righe con il
comando "flipud()".

Inoltre, i dati numerici sono stati riconosciuti correttamente il che indica che nel file "FCA.MI.csv" non vi sono
valori "null" che devono ancora essere sostituiti con dei "NaN".

Per comodità, suddividiamo la tabella in vettori corrispondenti alle sue colonne e memorizziamo la lunghezza di
tali vettori.

D=FCA.Date;
O=FCA.Open;

1
H=FCA.High;
L=FCA.Low;
C=FCA.Close;
V=FCA.Volume;
nday=length(D);

Nello svolgimento degli esercizi successivi ci riferiremo ai dati relativi al periodo temporale che va dal 1 marzo
2017 al 30 aprile 2017.

d1=datetime("1-mar-2017");
d2=datetime("30-apr-2017");

Si osservi infine che di seguito per preallocare la memoria di un array verrà utilizzato il comando "NaN(m,n)".
Può infatti accadere che alcune componenti di un array non possano essere calcolate, in tal caso a tali
componenti è opportuno assegnare il valore NaN che ben evidenzia come esse non siano calcolabili. Si osservi
al riguardo come non sia invece possibile assegnare alle componenti non calcolabili il valore zero (e quindi
utilizzare nella preallocazione dell'array il comando "zeros(m,n)") in quanto in Analisi Tecnica il valore zero ha
un significato contestuale ben preciso.

NaN(2,4)

ans = 2×4
NaN NaN NaN NaN
NaN NaN NaN NaN

A2 - Individuazione righe corrispondenti al periodo considerato


Per individuare le righe della tabella corrispondenti al periodo temporale [d1,d2] si può utilizzare la seguente
function "FindRows()" che riceve come inputs un vettore di date "days" e due date "d1" e "d2" e fornisce come
output i due indici di riga "r1" ed "r2" corrispondenti al periodo [d1,d2].
function [r1,r2]=FindRows(days,d1,d2)
n=length(days);
if days(n)<d1 || days(1)>d2
error('Periodo [d1,d2] incompatibile con il vettore di date fornito');
end
for h=1:n
if days(h)>=d1
r1=h;
break; % attenzione: non dimenticarsi il break
end
end
if days(n)<=d2 % attenzione: questo controllo è necessario se si vuol
r2=n; % visitare il vettore da r1 ad end
else
for h=r1:n
if days(h)>d2
r2=h-1;
break; % attenzione: non dimenticarsi il break
end
end
end
end

2
Il valore della variabile "r2" può essere determinato anche con un ciclo for che scorre le componenti del vettore
"days" in senso contrario, come descritto nella seguente function.
function [r1,r2]=FindRows(days,d1,d2)
n=length(days);
if days(n)<d1 || days(1)>d2
error('Periodo [d1,d2] incompatibile con il vettore di date fornito');
end
for h=1:n
if days(h)>=d1
r1=h;
break; % attenzione: non dimenticarsi il break
end
end
for h=n:-1:r1
if days(h)<=d2
r2=h;
break; % attenzione: non dimenticarsi il break
end
end
end

La function "FindRows()" permette di individuare le righe corrispondenti al periodo [d1,d2] in modo molto
semplice.

[row1,row2]=FindRows(D,d1,d2);
period=row1:row2;

Il grafico dei prezzi di chiusura del titolo FCA per il periodo [d1,d2] si può quindi tracciare con i seguenti
comandi.

figure("Name","Grafico Prezzi di Chiusura");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(C(period));
ymax=max(C(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),C(period),'b-*');
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Prezzi di Chiusura di FCA");
legend("FCA Prezzi di Chiusura","Location","best");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;

3
E' talvolta utile mettere in evidenza il massimo ed il minimo prezzo di chiusura raggiunto dal titolo nel periodo
considerato. A tal fine è possibile utilizzare, ad esempio, la seguente function che riceve in input le ascisse X e
le ordinate Y dei dati plottati, ne determina massimi/minimi valori e la loro posizione, e li evidenzia con il simbolo
indicato in opt:
function PlotMaxMin(X,Y,opt)
n=length(Y);
valmin=+inf;
valmax=-inf;
for h=1:n
if Y(h)>valmax
valmax=Y(h);
posmax=h;
end
end
for h=1:n
if Y(h)<valmin
valmin=Y(h);
posmin=h;
end
end
plot(X(posmin),valmin,opt);
plot(X(posmax),valmax,opt);
end

Si osservi come convenga inizializzare i valori di "valmin" e "valmax" a +inf e -inf per evitare problemi con
possibili NaN all'inizio del vettore Y.

4
La stessa funzione può essere implementata in modo molto più conciso utilizzando i comandi predefiniti "max()"
e "min" di MATLAB:
function PlotMaxMin(X,Y,opt)
[valmin,posmin]=min(Y);
[valmax,posmax]=max(Y);
plot(X(posmin),valmin,opt);
plot(X(posmax),valmax,opt);
end

Il grafico dei prezzi di chiusura del titolo FCA per il periodo [d1,d2] con in evidenza i massimi ed i minimi valori
raggiunti nel periodo si può quindi tracciare con i seguenti comandi.

figure("Name","Grafico Prezzi di Chiusura");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(C(period));
ymax=max(C(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),C(period),'b-');
hold on;
PlotMaxMin(D(period),C(period),'rd');
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Prezzi di Chiusura di FCA");
legend("FCA Prezzi di Chiusura","Location","best");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;

5
Il diagramma a barre dei volumi di scambio del titolo FCA per il periodo [d1,d2] si può invece ottenere
utilizzando il comando "bar()". Si osservi come nel caso di diagrammi a barre sia necessario nel comando
"ylim()" utilizzare lo zero come valore minimo.

figure("Name","Volumi di Scambio");
xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=0;
ymax=max(V(period));
dy=(ymax-ymin)*0.02;
%
bar(D(period),V(period),'b');
%
xlim([xmin-dx,xmax+dx]);
ylim([0,ymax+dy]); % attenzione: si deve partire da "0" e non da "ymin-dy"
title("Volumi di Scambio di FCA");
legend("FCA Volumi di Scambio","Location","best");
xlabel("Giornate");
ylabel("Volumi");
grid on;
grid minor;

6
A3 - Variazioni Relative ed Assolute
Le variazioni relative ed assolute si calcolano facilmente con dei cicli iterativi. Consideriamo per default il prezzo
di chiusura.

Varass=NaN(nday,1);
Varper=NaN(nday,1);
for i=2:nday
Varass(i)=C(i)-C(i-1);
Varper(i)=(C(i)-C(i-1))/C(i-1);
end

Lo stesso risultato si può ottenere anche con delle function:


function VA=VarAss(v)
n=length(v);
VA=NaN(n,1);
for h=2:n
VA(h)=v(h)-v(h-1);
end
end

function VR=VarRel(v)
n=length(v);
VR=NaN(n,1);
for h=2:n
VR(h)=(v(h)-v(h-1))/v(h-1); % attenzione: ricordarsi le parentesi
end

7
end

In questo caso basta dare i seguenti comandi:

Varass=VarAss(C);
Varper=VarRel(C);

Visualizziamo adesso una figura con l'andamento del prezzo di chiusura e le corrispondenti variazioni assolute/
percentuali. Si osservi l'uso del comando "xlim()" che definisce gli estremi sinistro e destro dell'asse delle
ascisse, in modo tale che i tre grafici che compongono la figura siano confrontabili l'un l'altro.

figure("Name","Variazioni Assolute e Relative");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
%
subplot(3,1,1);
ymin=min(C(period));
ymax=max(C(period));
dy=(ymax-ymin)*0.02;
plot(D(period),C(period),'b-');
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Prezzi di Chiusura del titolo FCA");
legend("FCA Prezzo di Chiusura","Location","best");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;
%
subplot(3,1,2);
ymin=min(Varass(period));
ymax=max(Varass(period));
dy=(ymax-ymin)*0.02;
plot(D(period),Varass(period),'r-');
hold on;
plot([xmin,xmax],[0,0],'k-');
hold off;
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Variazioni Assolute del titolo FCA");
legend("Variazioni Assolute","Location","best");
xlabel("Giornate");
ylabel("Variazioni Assolute");
grid on;
grid minor;
%
subplot(3,1,3);
ymin=min(Varper(period));
ymax=max(Varper(period));
dy=(ymax-ymin)*0.02;
plot(D(period),Varper(period),'g-');
hold on;
plot([xmin,xmax],[0,0],'k-');

8
hold off;
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Variazioni Percentuali del titolo FCA");
legend("Variazioni Percentuali","Location","best");
xlabel("Giornate");
ylabel("Variazioni Percentuali");
grid on;
grid minor;

A4 - Analisi Grafica
Vediamo innanzi tutto come realizzare i grafici High-Low-Close del titolo FCA.

Di seguito vengono rappresentati nello stesso grafico i prezzi massimo, minimo e di chiusura del titolo.

figure("Name","Quotazioni Massime, Minime e di Chiusura");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(L(period));
ymax=max(H(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),C(period),'b-');
hold on;
plot(D(period),H(period),'r-');
plot(D(period),L(period),'g-');

9
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Confronto Quotazioni Massime, Minime e di Chiusura di FCA");
legend("Chiusura","Massimo","Minimo","Location","best");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;

I comandi successivi invece forniscono l'andamento dei prezzi di chiusura e disegnano per ogni giornata un
segmento corrispondente alla oscillazione minimo-massimo subita dal prezzo del titolo.

figure("Name","Grafico High-Low-Close");
xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(L(period));
ymax=max(H(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),C(period),'b-');
hold on;
for i=row1:row2
plot([D(i),D(i)],[L(i),H(i)],'r-');
end
hold off;

10
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("High-Low-Close di FCA");
legend("Prezzo di Chiusura di FCA","Location","best");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;

Vediamo adesso come rappresentare le Candele Giapponesi.

figure("Name","Candele Giapponesi");
xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(L(period));
ymax=max(H(period));
dy=(ymax-ymin)*0.02;
%
hold on;
for i=row1:row2
plot([D(i),D(i)],[L(i),H(i)],'b-');
if C(i)<O(i)
plot([D(i),D(i)],[C(i),O(i)],'r-','LineWidth',3);
else
plot([D(i),D(i)],[C(i),O(i)],'g-','LineWidth',3);
end

11
end
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Candlestick di FCA");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;

A5 - Oscillatori
Vediamo adesso come è facilmente possibile calcolare Momentum, Momentum Relativi e ROC (consideriamo a
titolo di esempio p=5).

p=5;
M5=NaN(nday,1);
MR5=NaN(nday,1);
ROC5=NaN(nday,1);
for k=(p+1):nday
M5(k)=C(k)-C(k-p);
MR5(k)=(C(k)-C(k-p))/C(k-p);
ROC5(k)=100*(C(k)/C(k-p));
end

Lo stesso risultato si può ottenere anche con delle function:

12
function M=Momentum(v,p)
n=length(v);
M=NaN(n,1);
for h=(p+1):n
M(h)=v(h)-v(h-p);
end
end

function MR=MomRel(v,p)
n=length(v);
MR=NaN(n,1);
for h=(p+1):n
MR(h)=(v(h)-v(h-p))/v(h-p); % attenzione: ricordarsi le parentesi
end
end

function R=Roc(v,p)
n=length(v);
R=NaN(n,1);
for h=(p+1):n
R(h)=100*(v(h)/v(h-p));
end
end

In questo caso basta dare i seguenti comandi:

M5=Momentum(C,p);
MR5=MomRel(C,p);
ROC5=Roc(C,p);

Visualizziamo adesso un grafico con l'andamento del prezzo di chiusura ed i corrispondenti momenti, momenti
relativi e ROC per un periodo p=5.

figure("Name","Momentum e ROC");
xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
%
subplot(4,1,1);
ymin=min(C(period));
ymax=max(C(period));
dy=(ymax-ymin)*0.02;
plot(D(period),C(period),'b-');
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Prezzi di Chiusura del titolo FCA");
legend("FCA Prezzo di Chiusura","Location","best");
xlabel("Giornate");
ylabel("Quotazioni");
grid on;
grid minor;
%
subplot(4,1,2);
ymin=min(M5(period));
ymax=max(M5(period));

13
dy=(ymax-ymin)*0.02;
plot(D(period),M5(period),'r-');
hold on;
plot([xmin,xmax],[0,0],'k-');
hold off;
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Momenti del titolo FCA");
legend("FCA Momenti","Location","best");
xlabel("Giornate");
ylabel("Momenti");
grid on;
grid minor;
%
subplot(4,1,3);
ymin=min(MR5(period));
ymax=max(MR5(period));
dy=(ymax-ymin)*0.02;
plot(D(period),MR5(period),'g-');
hold on;
plot([xmin,xmax],[0,0],'k-');
hold off;
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Momenti Relativi del titolo FCA");
legend("FCA Momenti Relativi","Location","best");
xlabel("Giornate");
ylabel("Momenti Relativi");
grid on;
grid minor;
%
subplot(4,1,4);
ymin=min(ROC5(period));
ymax=max(ROC5(period));
dy=(ymax-ymin)*0.02;
plot(D(period),ROC5(period),'m-');
hold on;
plot([xmin,xmax],[100,100],'k-');
hold off;
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("ROC del titolo FCA");
legend("FCA ROC","Location","best");
xlabel("Giornate");
ylabel("ROC");
grid on;
grid minor;

14
A6 - Analisi del Trend
Le medie mobili possono essere calcolate con i comandi seguenti (caso p=5 e prezzi di chiusura).

p=5;
% media mobile semplice
SMA5=NaN(nday,1);
for k=p:nday
somma=0;
used=0;
for h=1:p
if not(isnan(C(k-p+h)))
somma=somma+C(k-p+h);
used=used+1;
end
end
SMA5(k)=somma/used;
end
% media mobile ponderata
WMA5=NaN(nday,1);
for k=p:nday
somma=0;
den=0;
for h=1:p
if not(isnan(C(k-p+h)))
somma=somma+h*C(k-p+h);
den=den+h;

15
end
end
WMA5(k)=somma/den;
end
% media mobile esponenziale
EMA5=NaN(nday,1);
for k=p:nday
if isnan(EMA5(k-1))
EMA5(k)=SMA5(k);
elseif isnan(C(k))
EMA5(k)=EMA5(k-1);
else
EMA5(k)=((p-1)*EMA5(k-1)+2*C(k))/(p+1);
end
end

Si osservi come nel calcolo delle medie mobili sia necessario tener conto che alcune quotazioni possano avere
il valore "NaN".

In alternativa, può essere utile definire delle function che calcolano le medie semplici, ponderate ed
esponenziali:
function M=MediaSemplice(v,p)
n=length(v);
M=NaN(n,1);
for k=p:n
num=0;
den=0;
for h=1:p
val=v(k-p+h);
if not(isnan(val))
num=num+val;
den=den+1;
end
end
M(k)=num/den;
end
end

function M=MediaPonder(v,p)
n=length(v);
M=NaN(n,1);
for k=p:n
num=0;
den=0;
for h=1:p
val=v(k-p+h);
if not(isnan(val))
num=num+h*val;
den=den+h;
end
end
M(k)=num/den;
end
end

function M=MediaEspon(v,p)

16
n=length(v);
M=NaN(n,1);
S=MediaSemplice(v,p);
for k=p:n
if isnan(M(k-1))
M(k)=S(k);
elseif isnan(v(k))
M(k)=M(k-1);
else
M(k)=((p-1)*M(k-1)+2*v(k))/(p+1); % attenzione: ricordarsi le parentesi
end
end
end

Con queste function è possibile calcolare facilmente le medie mobili:

SMA5=MediaSemplice(C,5);
WMA5=MediaPonder(C,5);
EMA5=MediaEspon(C,5);

Confrontiamo adesso in un grafico le medie mobili semplici, ponderate ed esponenziali:

figure("Name","Grafico Medie Mobili");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(C(period));
ymax=max(C(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),C(period),'b-');
hold on;
plot(D(period),SMA5(period),'r-');
plot(D(period),WMA5(period),'g-');
plot(D(period),EMA5(period),'c-');
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Confronto Prezzi di Chiusura, SMA5, WMA5 e EMA5 di FCA");
legend("Chiusura","SMA5","WMA5","EMA5","Location","best");
xlabel("Giornate");
ylabel("Prezzi");
grid on;
grid minor;

17
E' interessante osservare anche il comportamento delle medie mobili al variare del parametro p.

SMA5=MediaSemplice(C,5);
SMA10=MediaSemplice(C,10);
SMA14=MediaSemplice(C,14);

figure("Name","Grafico Medie Mobili Semplici");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(C(period));
ymax=max(C(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),C(period),'b-');
hold on;
plot(D(period),SMA5(period),'r-');
plot(D(period),SMA10(period),'g-');
plot(D(period),SMA14(period),'c-');
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("Confronto Prezzi di Chiusura, SMA5, SMA10 e SMA14 di FCA");
legend("Chiusura","SMA5","SMA10","SMA14","Location","best");
xlabel("Giornate");
ylabel("Prezzi");
grid on;

18
grid minor;

A7 - Analisi della Volatilità


In ultimo, vediamo come rappresentare graficamente l'andamento del TR, ATR, WTR, ETR (caso p=5).

% Calcolo del TR
TR=NaN(nday,1);
TR(1)=H(1)-L(1);
for k=2:nday
if isnan(C(k))
TR(k)=NaN;
elseif isnan(C(k-1))
TR(k)=H(k)-L(k);
else
if C(k-1)>H(k)
TrueMax=C(k-1);
else
TrueMax=H(k);
end
if C(k-1)<L(k)
TrueMin=C(k-1);
else
TrueMin=L(k);
end
TR(k)=TrueMax-TrueMin;
end
end

19
Anche in questo caso è utile definire una function per il calcolo del TR:
function TR=TrueRange(C,H,L)
n=length(C);
TR=NaN(n,1);
TR(1)=H(1)-L(1);
for h=2:n
if isnan(L(h))
TR(h)=NaN;
elseif isnan(C(h-1))
TR(h)=H(h)-L(h);
else
if C(h-1)>H(h)
TrueMax=C(h-1);
else
TrueMax=H(h);
end
if C(h-1)<L(h)
TrueMin=C(h-1);
else
TrueMin=L(h);
end
TR(h)=TrueMax-TrueMin;
end
end
end

Una implementazione alternativa della function "TrueRange()" si basa sull'uso dei comandi "max()" e "min()" di
MATLAB:
function TR=TrueRange(C,H,L)
n=length(C);
TR=NaN(n,1);
TR(1)=H(1)-L(1);
for h=2:n
if isnan(C(h))
TR(h)=NaN;
elseif isnan(C(h-1))
TR(h)=H(h)-L(h);
else
TrueMax=max(C(h-1),H(h));
TrueMin=min(C(h-1),L(h));
TR(h)=TrueMax-TrueMin;
end
end
end

Utilizzando queste function abbiamo semplicemente:

TR=TrueRange(C,H,L);

Si osservi come sia possibile calcolare ATR, WTR e ETR con le function definite per le medie mobili.

ATR5=MediaSemplice(TR,5);
WTR5=MediaPonder(TR,5);
ETR5=MediaEspon(TR,5);

20
Vediamo di seguito il grafico del TR, ATR, WTR, ETR.

figure("Name","Grafico TR, ATR, WTR, ETR");


xmin=D(row1);
xmax=D(row2);
dx=(xmax-xmin)*0.02;
ymin=min(TR(period));
ymax=max(TR(period));
dy=(ymax-ymin)*0.02;
%
plot(D(period),TR(period),'b-');
hold on;
plot(D(period),ATR5(period),'g-');
plot(D(period),WTR5(period),'r-');
plot(D(period),ETR5(period),'c-');
hold off;
%
xlim([xmin-dx,xmax+dx]);
ylim([ymin-dy,ymax+dy]);
title("TR, ATR5, WTR5 ed ETR5 di FCA");
legend("TR","ATR5","WTR5","ETR5","Location","best");
xlabel("Giornate");
ylabel("TR");
grid on;
grid minor;

21
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 [r1,r2]=FindRows(days,d1,d2)
n=length(days);
if days(n)<d1 || days(1)>d2
error('Periodo [d1,d2] incompatibile con il vettore di date fornito');
end
for h=1:n
if days(h)>=d1
r1=h;
break; % attenzione: non dimenticarsi il break
end
end
if days(n)<=d2 % attenzione: questo controllo è necessario se si vuol
r2=n; % visitare il vettore da r1 ad end
else
for h=r1:n
if days(h)>d2
r2=h-1;
break; % attenzione: non dimenticarsi il break
end
end
end
end

function PlotMaxMin(X,Y,opt)
[valmin,posmin]=min(Y);
[valmax,posmax]=max(Y);
plot(X(posmin),valmin,opt);
plot(X(posmax),valmax,opt);
end

function VA=VarAss(v)
n=length(v);
VA=NaN(n,1);
for h=2:n
VA(h)=v(h)-v(h-1);
end
end

function VR=VarRel(v)
n=length(v);
VR=NaN(n,1);
for h=2:n
VR(h)=(v(h)-v(h-1))/v(h-1); % attenzione: ricordarsi le parentesi
end
end

function M=Momentum(v,p)
n=length(v);

22
M=NaN(n,1);
for h=(p+1):n
M(h)=v(h)-v(h-p);
end
end

function MR=MomRel(v,p)
n=length(v);
MR=NaN(n,1);
for h=(p+1):n
MR(h)=(v(h)-v(h-p))/v(h-p); % attenzione: ricordarsi le parentesi
end
end

function R=Roc(v,p)
n=length(v);
R=NaN(n,1);
for h=(p+1):n
R(h)=100*(v(h)/v(h-p));
end
end

function M=MediaSemplice(v,p)
n=length(v);
M=NaN(n,1);
for k=p:n
num=0;
den=0;
for h=1:p
val=v(k-p+h);
if not(isnan(val))
num=num+val;
den=den+1;
end
end
M(k)=num/den;
end
end

function M=MediaPonder(v,p)
n=length(v);
M=NaN(n,1);
for k=p:n
num=0;
den=0;
for h=1:p
val=v(k-p+h);
if not(isnan(val))
num=num+h*val;
den=den+h;
end
end
M(k)=num/den;
end

23
end

function M=MediaEspon(v,p)
n=length(v);
M=NaN(n,1);
S=MediaSemplice(v,p);
for k=p:n
if isnan(M(k-1))
M(k)=S(k);
elseif isnan(v(k))
M(k)=M(k-1);
else
M(k)=((p-1)*M(k-1)+2*v(k))/(p+1); % attenzione: ricordarsi le parentesi
end
end
end

function TR=TrueRange(C,H,L)
n=length(C);
TR=NaN(n,1);
TR(1)=H(1)-L(1);
for h=2:n
if isnan(L(h))
TR(h)=NaN;
elseif isnan(C(h-1))
TR(h)=H(h)-L(h);
else
if C(h-1)>H(h)
TrueMax=C(h-1);
else
TrueMax=H(h);
end
if C(h-1)<L(h)
TrueMin=C(h-1);
else
TrueMin=L(h);
end
TR(h)=TrueMax-TrueMin;
end
end
end

24

Potrebbero piacerti anche