Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Riccardo Cambini
Dipartimento di Economia e Management
Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: riccardo.cambini@unipi.it
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:
• Massimo [H1 , . . . , Hn ]: prezzo massimo raggiunto dal titolo nella giornata borsistica;
• Minimo [L1 , . . . , Ln ]: prezzo minimo raggiunto dal titolo nella giornata borsistica.
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;
V arAssk = (Qk Qk 1)
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.
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.
• 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
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.
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.
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.
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.
T R1 = (H1 L1 )
T Rk = M AX { Hk Lk , |Hk Ck 1| , |Ck 1 Lk | } per 2 k n
T Rk = M AX { Hk , Ck 1 } M IN { Lk , Ck 1 }
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);
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);
10
Appendice – Implementazioni in MATLAB
(Live Script realizzato con MATLAB versione 2020a)
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],:)
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
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.
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.
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
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
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.
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.
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;
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
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
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
SMA5=MediaSemplice(C,5);
WMA5=MediaPonder(C,5);
EMA5=MediaEspon(C,5);
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);
18
grid minor;
% 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
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.
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