• Non ci sono risultati.

Simulazione Matlab del Libor Market Model.

Nel caso in cui il contratto di opzione dia la facoltà di acquistare il sottostante ad una data futura e ad un prezzo stabilito, si tratterà di un’opzione call Al

CAPITOLO 3: Analisi modelli di pricing delle swaption.

3.6 Simulazione Matlab del Libor Market Model.

Una volta introdotti brevemente gli elementi cardine del Libor Market Model possiamo adesso implementare tale modello in Matlab per il calcolo del valore di una swaption.

Sia per il modello di Hull-White a un fattore che per il Libor Market Model è necessario in via preliminare calibrare gli strumenti prima di implementare il modello.

Nel dettaglio bisognerà:

• costruire la “Zero Curve”, ovvero la curva che esprime la relazione tra i tassi spot e le varie scadenze.

• Definire i parametri della swaption, quindi in questo caso data di esercizio, data di maturità e strike dello strumento.

• Calcolare il modello di Black e costruire la matrice della volatilità della swaption.

• Calibrare gli strumenti, ovvero tutte le swaptions che hanno una scadenza che matura prima della data di maturazione della swaption presa in esame verranno utilizzate per calibrare il modello.

• Prezzare le swaption con il metodo di Black. • Definire i parametri della simulazione.

Al fine di consentire un confronto più agevole tra i due modelli, per individuare quello che meglio si adatta alla determinazione del prezzo di una swaption, utilizzeremo gli stessi valori (scadenze, strike, ecc.) utilizzati in precedenza, quando abbiamo calcolato il valore della swaption con il modello Hull-White a un fattore.

Il primo passaggio da compiere per calcolare il valore di una swaption con il LMM sarà la calibrazione del modello, per far ciò dovremo definire i parametri a,b,c e il , inoltre utilizzeremo la formula di Rebonato di cui abbiamo parlato in precedenza per la stabilizzazione dei risultati previsti e quelli osservati.

Possiamo tradurre tali esigenze nei seguenti codici Matlab:

CorrFunc = @(i,j,Beta) exp(-Beta*abs(i-j));

objfun = @(x) SwaptionBlackVol(relidx) - blackvolbyrebonato(RateSpec,... repmat({@(t) ones(size(t)).*(x(1)*t + x(2)).*exp(-x(3)*t) + x(4)},nRates-1,1),... CorrFunc(meshgrid(1:nRates-1)',meshgrid(1:nRates-1),x(5)),...

EurExDatesFull(relidx),EurMatFull(relidx),'Period',1);

options = optimset('disp','iter','MaxFunEvals',1000,'TolFun',1e-5); x0 = [.2 .05 1 .05 .2];

lb = [0 0 .5 0 .01]; ub = [1 1 2 .3 1];

LMMparams = lsqnonlin(objfun,x0,lb,ub,options)

Con il comando nRates andremo a indicare il numero di tassi spot che prenderemo in esame per il nostro calcolo.

Elemento cardine del LMM è il coefficiente di correlazione tra i tassi storici e i tassi attuali di mercato. Il comando CorrFunc non è altro che la traduzione in codici Matlab della formula indicata nel paragrafo precedente, i,j = 𝑒−𝑖−𝑗.

Calcoleremo dunque (con il comando objfun) la differenza tra i valori della volatilità della swaption calcolati in via preliminare tramite la formula di Black e la volatilità dello stesso strumento con la formula di Rebonato, la cui formula è stata esposta nel paragrafo precedente.

Esiste in matlab la funzione preimpostata per il calcolo di quest’ultimo valore, tale funzione fa capo al comando blackvolbyrebonato, per settare tale comando dovremo inserire i dati della “Zero curve” che nel nostro caso faranno capo alla matrice RateSpec. Dovremo indicare inoltre la volatilità della funzione tramite la costruzione manuale di una serie di matrici (tramite la funzione repmat) di cui dovremo indicare le dimensioni e gli elementi che la compongono. La matrice di correlazione sarà settata richiamando i valori della funzione creata in precedenza CorrFunc di cui ne andremo a impostare le dimensioni. Gli ultimi due valori,

EurExDatesFull(relidx) e EurMatFull(relidx) indicheranno rispettivamente la data di esercizio e la maturità dello strumento.

Successivamente la struttura dell’opzione verrà modificata, in particolare verranno settati i valori massimi della funzione e la tolleranza.

Dopo aver impostato i valori delle matrici x0, upperbond (ub) e lowerbond(lb) avremo come output i parametri del LMM.

Sulla base dei nostri dati l’output sarà il seguente:

Iteration Func-count f(x) step optimality 0 6 0.156251 0.483 1 12 0.00870177 0.188164 0.0339 2 18 0.00463441 0.165527 0.00095 3 24 0.00331055 0.351017 0.0154 4 30 0.00294775 0.0892617 7.47e-05 5 36 0.00281565 0.385779 0.00917 6 42 0.00278988 0.0145632 4.15e-05 7 48 0.00278522 0.115042 0.00116 Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the selected value of the function tolerance. LMMparams =

0.0781 0.1656 0.5121 0.0617 0.0100

Dopo aver estrapolato i parametri del LMM potremo per semplicità associarli a delle lettere per calcolare successivamente la funzione di volatilità, la cui risultate sarà la funzione VolFunc.

a = LMMparams(1); b = LMMparams(2); c = LMMparams(3);

d = LMMparams(4); Beta = LMMparams(5);

VolFunc = repmat({@(t) ones(size(t)).*(a*t + b).*exp(-c*t) + d},nRates-1,1); Come vediamo il Beta sarà rappresentato dal quinto parametro.

Tale funzione della volatilità potremo inoltre rappresentarla graficamente. Basterà inserire in Matlab i seguenti comandi:

figure

fplot(VolFunc{1},[0 20]) title('Volatility Function')

CorrelationMatrix = CorrFunc(meshgrid(1:nRates-1)',meshgrid(1:nRates-1),Beta); L’output del comando sarà il seguente:

Possiamo inoltre evidenziare la matrice di correlazione tramite il comando

disp('Correlation Matrix')

il cui output sarà dunque rappresentato dalla matrice di correlazione i cui valori sono stati calcolati in precedenza. Nel dettaglio:

Correlation Matrix 1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.932 0.923 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.932 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.942 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.932 0.942 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.923 0.932 0.942 0.951 0.961 0.970 0.980 0.990 1.000

Dopo aver determinato tutti i valori che ci serviranno per il calcolo del valore della swaption con il LMM possiamo rappresentare in grafico tridimensionale l’evoluzione della Zero curve con il LMM.

Per far questo, poiché sappiamo che potranno essere infiniti scenari, faremo uso della simulazione Montecarlo, che mi permette di creare una serie infinita di scenari e il grafico sarà la rappresentazione quindi dell’evoluzione della curva zero in uno di questi scenari, nel nostro caso prenderemmo in considerazione il primo scenario.

LMM = LiborMarketModel(irdc,VolFunc,CorrelationMatrix,'Period',1);

[LMMZeroRates, ForwardRates] = LMM.simTermStructs(nPeriods,'nTrials',nTrials); trialIdx = 1;

figure

tmpPlotData = LMMZeroRates(:,:,trialIdx); tmpPlotData(tmpPlotData == 0) = NaN; surf(Tenor,SimDates,tmpPlotData)

title(['Evolution of the Zero Curve for Trial:' num2str(trialIdx) ' of LIBOR Market Model']) xlabel('Tenor (Years)')

Da cui il grafico:

Attraverso il comandoLMM.simTermStructs simulerò l’andamento della struttura dei tassi a termine impostandone i settaggi come il numero di periodi che prenderemo in considerazione (nperiods), il numero di prove ovvero il numero di traiettorie da simulare (ntrials), il Deltatime ovvero la lunghezza di ciascun periodo di simulazione misurata in anni, e le scadenze in anni (Tenor).

Una volta creato lo scenario di riferimento con l’evoluzione dei tassi d’interesse potremo infine determinare il valore della swaption con il Libor Market Model.

DF = exp(bsxfun(@times,-LMMZeroRates,repmat(Tenor',[nPeriods+1 1]))); SwapRate = (1 - DF(exRow,endCol,:))./sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); PayoffValue = 100*max(SwapRate- InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); RealizedDF = prod(exp(bsxfun(@times,- LMMZeroRates(2:exRow+1,1,:),SimTimes(1:exRow))),1);

LMM_SwaptionPrice = mean(RealizedDF.*PayoffValue)

Una volta trovate le matrici 1x100x1000 “Payoffvalue” e “RealizedDF” sarà possibile calcolare il valore della swaption che sarà dato dal valore medio del prodotto elemento per elemento delle matrici.

LMM_SwaptionPrice =1.8809.

3.7 Comparazione dei swaption price calcolati con metodo Hull White a

Documenti correlati