Matlab Volatility

  • Due nuove obbligazioni Societe Generale, in Euro e in Dollaro USA

    Societe Generale porta sul segmento Bond-X (EuroTLX) di Borsa Italiana due obbligazioni, una in EUR e una in USD, a tasso fisso decrescente con durata massima di 15 anni e possibilità di rimborso anticipato annuale a discrezione dell’Emittente.

    Per continuare a leggere visita questo LINK
  • SONDAGGIO: Potrebbe interessarti una sezione "Trading Sportivo"?

    Ciao, ci piacerebbe sapere se potrebbe interessarti l'apetura di una nuova sezione dedicata unicamente al trading sportivo o betting exchange. Il tuo voto è importante perchè ci consente di capire se vale la pena pianificarla o no. Per favore esprimi il tuo voto, o No, nel seguente sondaggio: LINK.
    Puoi chiudere questo avviso premendo la X in alto a destra.

    Staff | FinanzaOnline

Sig. Ernesto

Utente Registrato
Registrato
14/8/01
Messaggi
21.247
Punti reazioni
807
function vol = EstimateVol(O,H,L,C,n)
% Estimate Volatility using different methods
% EstimateVol(O,H,L,C)gives an estimate of volatility based on Open, High,
% Low, Close prices.
% INPUTS:
% O--Open Price
% H--High Price
% L--Low Price
% C--Close Price
% n--Number of historical days used in the volatility estimate
% OUTPUT:
% Vol is a structure with volatilities using different methods.
% hccv -- Historical Close-to-Close volatility
% hhlv -- Historical High Low Parkinson Volatility
% hgkv -- Historical Garman Klass Volatility
% hgkvM -- Historical Garman Klass Volatility modified by Yang and Zhang
% hrsv -- Historical Roger and Satchell Volatility
% hyzv -- Historical Yang and Zhang Volatility
% AVGV -- Average of all the historical volatilities calculated above
% web: SITMO - Financial Engineering
try
OHLC = [O H L C];
catch %#ok
error('O H L C must be of the same size');
rethrow(lasterror);
end
if(n<=length(O))
fh = @(x) x(length(x)-n+1:end);
else
error('n should be less than or equal to the length of the prices')
end
open = fh(O); %O(length(O)-n+1:end);
high = fh(H); %H(length(H)-n+1:end);
low = fh(L); %L(length(L)-n+1:end);
close = fh(C); %C(length(C)-n+1:end);
Z = 252; %Number of trading Days in a year

vol.hccv = hccv();
vol.hhlv = hhlv();
vol.hgkv = hgkv();
vol.hgkvm = hgkvM();
vol.hrsv = hrsv();
vol.hyzv = hyzv();
vol.AVGV = mean(cell2mat(struct2cell(vol)));

function vol1 = hccv()
% historical close to close volatility
%Historical volatility calculation using close-to-close prices.

r = log(close(2:end)./close(1:end-1));
rbar = mean(r);
vol1 = sqrt((Z/(n-2)) * sum((r - rbar).^2));
end

function vol2 = hhlv()
%The Parkinson formula for estimating the historical volatility of an
%underlying based on high and low prices.

vol2 = sqrt((Z/(4*n*log(2))) * sum((log(high./low)).^2));
end

function vol3 = hgkv()
% The Garman and Klass estimator for estimating historical volatility
% assumes Brownian motion with zero drift and no opening jumps
%(i.e. the opening = close of the previous period). This estimator is
% 7.4 times more efficient than the close-to-close estimator.

vol3 = sqrt((Z/n)* sum((0.5*(log(high./low)).^2) - (2*log(2) - 1).*(log(close./open)).^2));

end

function vol4 = hgkvM()
%Yang and Zhang derived an extension to the Garman Glass historical
%volatility estimator that allows for opening jumps. It assumes
%Brownian motion with zero drift. This is currently the preferred
%version of open-high-low-close volatility estimator for zero drift
%and has an efficiency of 8 times the classic close-to-close estimator.
%Note that when the drift is nonzero, but instead relative large to the
%volatility, this estimator will tend to overestimate the volatility.

vol4 = sqrt((Z/n)* sum((log(open(2:end)./close(1:end-1))).^2 + (0.5*(log(high(2:end)./low(2:end))).^2) - (2*log(2) - 1)*(log(close(2:end)./open(2:end))).^2));
end

function vol5 = hrsv()
%The Roger and Satchell historical volatility estimator allows for
%non-zero drift, but assumed no opening jump.

vol5 = sqrt((Z/n)*sum((log(high./close).*log(high./open)) + (log(low./close).*log(low./open))));
end

function vol6 = hyzv()
%Yang and Zhang were the first to derive an historical volatility
%estimator that has a minimum estimation error, is independent of
%the drift, and independent of opening gaps. This estimator is
%maximally 14 times more efficient than the close-to-close estimator.
%It can be interpreted as a weighted average of the Rogers and Satchell
%estimator, the close-open volatility and the open-close volatility.
%The performance degrades to the classic close-to-close estimator when
%the price process is heavily dominated by opening jumps.
muO = (1/n)*sum(log(open(2:end)./close(1:end-1)));
sigmaO = (Z/(n-1)) * sum((log(open(2:end)./close(1:end-1)) - muO).^2);
muC = (1/n)*sum(log(close./open));
sigmaC = (Z/(n-1)) * sum((log(close./open) - muC).^2);
sigmaRS = hrsv();
sigmaRS = sigmaRS^2;
k = 0.34/(1+((n+1)/(n-1)));

vol6 = sqrt(sigmaO^2+(k*sigmaC^2)+((1-k)*(sigmaRS)));

end
end
 
Eccoci lì, ci siamo. L'avevo trascurato perchè qui in ufficio non ho Matlab. Però ho scaricato abusivamente Scilab :D Mi sembra che, in funzione dei requisiti e delle ipotesi alla base di ciascun modello, inevitabilmente finiamo per orientarci al VI modello. Concordi?
 
Ultima modifica:
Già, poi con calma vi faccio avere le solite Excel versioni.

Avevo cominciato, poi mi è passato...:)
 
Già, poi con calma vi faccio avere le solite Excel versioni.

Avevo cominciato, poi mi è passato...:)
Paolo, credo sia sufficiente l'ultima :) Ma la vuoi fare in VBA?

...a me resta un solo atavico e profondo dubbio: n = ? E qui vi lancio la porcata: il GARCH(1,1) lo facciamo lo stesso, dalla stima dei parametri ricaviamo proprio il periodo n da usare con la classica formuletta ;)
 
Ultima modifica:
Paolo, credo sia sufficiente l'ultima :) Ma la vuoi fare in VBA?

...a me resta un solo atavico e profondo dubbio: n = ? E qui vi lancio la porcata: il GARCH(1,1) lo facciamo lo stesso, dalla stima dei parametri ricaviamo proprio il periodo n da usare con la classica formuletta ;)

Guarda che sono semplicissime.

I problemi del VBA sono altri......
 
Pubblico la versione in Visual Basic dello stimatore di Yang e Zhang (l'ultimo elencato al primo messaggio) adeguatamente, cortesemente e sapientemente corretta da Paolo, che colgo l'occasione per ringraziare pubblicamente per l'aiuto. Rispetto alla costruzione del modello in forma esplicita (un vero divoratore di colonne), si ottengono valori leggerissimamente difformi alla sesta cifra decimale.
Codice:
Public Function YangZhang(O As Range, H As Range, L As Range, C As Range) As Double
 Dim nRows As Integer
 Dim i As Integer
 Dim o_t() As Double
 Dim u_t() As Double
 Dim d_t() As Double
 Dim c_t() As Double
 
 Dim sigma2_o As Double
 Dim sigma2_c As Double
 Dim sigma2_rs As Double
 Dim sigma2_yz As Double
 
 Dim k As Double
 
 nRows = O.Rows.Count
 ReDim o_t(nRows - 2)
 ReDim u_t(nRows - 2)
 ReDim d_t(nRows - 2)
 ReDim c_t(nRows - 2)
 
 k = 0.34 / (1.34 + (nRows + 1) / (nRows - 1))
 
 For i = 0 To nRows - 2
    o_t(i) = Log(O(i + 2)) - Log(C(i + 1))
    u_t(i) = Log(H(i + 2)) - Log(O(i + 2))
    d_t(i) = Log(L(i + 2)) - Log(O(i + 2))
    c_t(i) = Log(C(i + 2)) - Log(O(i + 2))
    Next
     
 sigma2_o = Application.Var(o_t)
 sigma2_c = Application.Var(c_t)
 sigma2_rs = 0
 
 For i = 0 To nRows - 2
    sigma2_rs = sigma2_rs + u_t(i) * (u_t(i) - c_t(i)) + d_t(i) * (d_t(i) - c_t(i))
    Next
    
 sigma2_rs = sigma2_rs / (nRows - 1)
 YangZhang = sigma2_o + k * sigma2_c + (1 - k) * sigma2_rs
 
 
 
End Function
Aggiungo: è incredibile che questa bellissima rassegna di stimatori, inclusi il numero di Parkinson e il Garman-Klass con relative varianti, sia stata visitata meno di 400 volte. Tutta la volatilità è qua.
 
Ultima modifica:
Pubblico la versione in Visual Basic dello stimatore di Yang e Zhang (l'ultimo elencato al primo messaggio) adeguatamente, cortesemente e sapientemente corretta da Paolo, che colgo l'occasione per ringraziare pubblicamente per l'aiuto. Rispetto alla costruzione del modello in forma esplicita (un vero divoratore di colonne), si ottengono valori leggerissimamente difformi alla sesta cifra decimale.
Codice:
Public Function YangZhang(O As Range, H As Range, L As Range, C As Range) As Double
 Dim nRows As Integer
 Dim i As Integer
 Dim o_t() As Double
 Dim u_t() As Double
 Dim d_t() As Double
 Dim c_t() As Double
 
 Dim sigma2_o As Double
 Dim sigma2_c As Double
 Dim sigma2_rs As Double
 Dim sigma2_yz As Double
 
 Dim k As Double
 
 nRows = O.Rows.Count
 ReDim o_t(nRows - 2)
 ReDim u_t(nRows - 2)
 ReDim d_t(nRows - 2)
 ReDim c_t(nRows - 2)
 
 k = 0.34 / (1.34 + (nRows + 1) / (nRows - 1))
 
 For i = 0 To nRows - 2
    o_t(i) = Log(O(i + 2)) - Log(C(i + 1))
    u_t(i) = Log(H(i + 2)) - Log(O(i + 2))
    d_t(i) = Log(L(i + 2)) - Log(O(i + 2))
    c_t(i) = Log(C(i + 2)) - Log(O(i + 2))
    Next
     
 sigma2_o = Application.Var(o_t)
 sigma2_c = Application.Var(c_t)
 sigma2_rs = 0
 
 For i = 0 To nRows - 2
    sigma2_rs = sigma2_rs + u_t(i) * (u_t(i) - c_t(i)) + d_t(i) * (d_t(i) - c_t(i))
    Next
    
 sigma2_rs = sigma2_rs / (nRows - 1)
 YangZhang = sigma2_o + k * sigma2_c + (1 - k) * sigma2_rs
 
 
 
End Function
Aggiungo: è incredibile che questa bellissima rassegna di stimatori, inclusi il numero di Parkinson e il Garman-Klass con relative varianti, sia stata visitata meno di 400 volte. Tutta la volatilità è qua.

Bocciamo il cinese in matematica.
 
Propongo qui la versione per Scilab :

Codice:
function y = yangzhang(Open,High,Low,Close)
    l = length(Open);
    k = 0.34/(1.34+(l+1)/(l-1));
    u_t = log(High./Open);
    d_t = log(Low./Open);
    c_t = log(Close./Open);
    o_t = log(Open(2:$)./Close(1:$-1));
    sigma2_o = variance(o_t);
    sigma2_c = variance(c_t);
    temp = u_t.*(u_t-c_t)+d_t.*(d_t-c_t);
    sigma2_rs = mean(temp);
    y = sigma2_o + k*sigma2_c + (1-k)*sigma2_rs
endfunction

non perché siano necessari mezzi avanzati di calcolo, ma perché è una sintassi molto stringata e intuitiva. Sempre SE&O..
 
Pubblico la versione in Visual Basic dello stimatore di Yang e Zhang (l'ultimo elencato al primo messaggio) adeguatamente, cortesemente e sapientemente corretta da Paolo, che colgo l'occasione per ringraziare pubblicamente per l'aiuto. Rispetto alla costruzione del modello in forma esplicita (un vero divoratore di colonne), si ottengono valori leggerissimamente difformi alla sesta cifra decimale.

Un grazie a Paolo e Cren per l'ottimo lavoro... :clap::clap::clap:
 
Ha trovato l'errore?
Provi con Bulgari la settimana dell'opa.
Devi partire dal presupposto che non tutti hanno a disposizione uno storico di volatilità implicita ATM e/o una serie di prezzi di opzioni da bisezionare in senso newtoniano :D Almeno provala rispetto alla volatilità implicita, poi mi dici le tue impressioni.
 
Devi partire dal presupposto che non tutti hanno a disposizione uno storico di volatilità implicita ATM e/o una serie di prezzi di opzioni da bisezionare in senso newtoniano :D Almeno provala rispetto alla volatilità implicita, poi mi dici le tue impressioni.

La formula vorrebbe stimare la varianza con OHLC.
Ci posso passare di tutto, dai pomodori ai prezzi del sottostante a quello delle opzioni.

ma piu' la passata è di suo volatile è piu' la stima è inattendibile, con quell'errore marchiano. Per questo avevo suggerito Bulgari.

Vabbè, non importa.
Cambio forum: www.LaCucinaSemplice.it
 
La formula vorrebbe stimare la varianza con OHLC.
Ci posso passare di tutto, dai pomodori ai prezzi del sottostante a quello delle opzioni.

ma piu' la passata è di suo volatile è piu' la stima è inattendibile, con quell'errore marchiano. Per questo avevo suggerito Bulgari.

Vabbè, non importa.
Cambio forum: www.LaCucinaSemplice.it
Scusami, ma quando usi un modello della famiglia GARCH o una EWMA che cosa gli passi al modello? Addirittura gli dai solo i prezzi di chiusura (o di apertura, o quello che vuoi misurare... Ma sempre e comunque una sola tipologia di prezzo). Nella famosissima EWMA(0.94) si decide addirittura che c.ca 32 giorni è la finestra temporale giusta per potersi poi "dimenticare" gradualmente del passato. Insomma: da profano a me non sembra così male. Magari domani proverò su Bulgari e vedrò cosa produce.
 
Scusami, ma quando usi un modello della famiglia GARCH o una EWMA che cosa gli passi al modello? Addirittura gli dai solo i prezzi di chiusura (o di apertura, o quello che vuoi misurare... Ma sempre e comunque una sola tipologia di prezzo). Nella famosissima EWMA(0.94) si decide addirittura che c.ca 32 giorni è la finestra temporale giusta per potersi poi "dimenticare" gradualmente del passato. Insomma: da profano a me non sembra così male. Magari domani proverò su Bulgari e vedrò cosa produce.

La formula va bene per serie storiche a bassa varianza e quasi prive di fuori scala
(spike, outlier) , cioè non serve quasi mai.
maggio/2010, 15 - 18/marzo 2011 la formula sottostima la varianza del 30% e per le opzioni del 50 - 60%. Se per voi va bene fate pure.
Ma in parallelo usate una banale media aritmetica e fatemi sapere.
Una serie piccola piccola di un mese, maggio 2010, marzo 2011 di un indice, opa bulgari

mail
Salviati@cucinafacile.it
 
Bulgari. Adesso non puoi dirmi che si comporta così male. L'ho usato su campione mobile a 30, 60 e 90 giorni (dal blu scuro all'azzurro) e ho annualizzato. Guarda cosa fa al salto da 7.59 a 12.24: se do in pasto una serie come quella alla massima verosimiglianza che genere di parametri mi dà di fronte a delle escursioni di tale violenza? Tutto il peso all'ultimo logrendimento quadrato? A quel punto ti scordi il profilo più dolce del periodo dal 2003 al 2007, però. Magari dopo guardiamo l'implicita ATM Put e Call.
 

Allegati

  • Immagine.GIF
    Immagine.GIF
    26,5 KB · Visite: 389
Ultima modifica:
Indietro