Simulazione di numeri casuali - elearning.unimib.it
Transcript of Simulazione di numeri casuali - elearning.unimib.it
Simulazione di numeri casuali
Il metodo Montecarlo si basa sulla simulazione di numeri casuali, cioe direalizzazioni di variabili casuali con una distribuzione fissata.Il primo problema e simulare numeri casuali che abbiano una distribuzioneuniforme U(0, 1); non entriamo nel dettaglio dei metodi con cui si ottienequesto risultato; l’idea generale e utilizzare sequenze deterministiche cheabbiano delle proprieta statistiche non distinguibili da una successione divariabili casuali uniformi e identicamente distribuite.In Matlab uno dei modi di generare variabili casuali uniformi e attraverso ilcomando unifrnd.
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 1 / 25
Il comando unifrnd
>> help unifrnd
unifrnd Random arrays from continuous uniform distribution.
R = unifrnd(A,B) returns an array of random numbers chosen
from the continuous uniform distribution on the
interval from A to B. The size of R is the common size
of A and B if both are arrays. If either parameter is
a scalar, the size of R is the size of the other parameter.
R = unifrnd(A,B,M,N,...) or R = unifrnd(A,B,[M,N,...])
returns an M-by-N-by-... array.
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 2 / 25
Esempio
>> X=unifrnd(0,1,10000,1);
figure
subplot(1,2,1)
plot(X)
subplot(1,2,2)
histogram(X,50)
>>
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 3 / 25
Esempio
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 4 / 25
Simulazione di numeri casuali
Consideriamo ora una generica variabile casuale X con funzione didistribuzione
FX (t) = P(X ≤ t).
Se definiamo la inversa generalizzata di F come
F−1X (α) = inf{t ∈ R | F (t) ≥ α}, con α ∈ (0, 1),
e possibile dimostrare che se U ha una distribuzione uniforme, allora
F−1(U)d= X .
Per simulare qualsiasi variabile casuale di cui sia nota F−1 e quindisufficiente simulare una variabile casuale uniforme.
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 5 / 25
Simulazione di numeri casuali
Non avremo bisogno di applicare questo risultato in quanto nella toolbox“Statistics and Machine Learning” di Matlab troviamo gia implementatenumerose funzioni per la simulazione di numeri casuali, ad esempio
Random Number Generators.
....
normrnd - Normal (Gaussian) random numbers.
lognrnd - Lognormal random numbers.
....
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 6 / 25
Esempio
>> X=normrnd(0,1,10000,1);
figure
subplot(1,2,1)
plot(X)
subplot(1,2,2)
histfit(X,50)
>>
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 7 / 25
Esempio
0 5000 10000
-4
-3
-2
-1
0
1
2
3
4
-4 -2 0 2
0
100
200
300
400
500
600
700
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 8 / 25
Simulazione di processi stocastici
Creiamo una funzione simbm che simuli e disegni N traiettorie di un motobrowniano, ciascuna di lunghezza n, relative a un time-step ∆t.
function [X] = simbm(N,n,delta_t)
% ciascuna traiettoria sara una riga della matrice X
X0=zeros(N,1);
% tutte le traiettorie partono da 0
Y=normrnd(0,delta_t^0.5,N,n);
% simuliamo gli incrementi
X=[X0, cumsum(Y,2)];
% calcoliamo la traiettoria
t=0:delta_t:n*delta_t;
% calcoliamo il vettore dei tempi
plot(t,X)
grid on
end
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 9 / 25
Esempio
>> X = simbm(100,1000,0.1);
0 10 20 30 40 50 60 70 80 90 100
-30
-20
-10
0
10
20
30
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 10 / 25
Processo mean reverting
Vogliamo ora simulare un processo mean reverting come quello dello shortrate nel modello di Vasicek
dXt = k[θ − Xt ] dt + σdBt , X0 = x0
che discretizzando possiamo scrivere come
Xt+∆t = Xt + k[θ − Xt ] ∆t + σYt , X0 = x0,
con Yt variabili casuali i.i.d. di media nulla e varianza pari a ∆t.
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 11 / 25
Processo mean reverting
function [X] = simmr(N,n,delta_t,kappa,theta,sigma,x0)
Y=normrnd(0,delta_t^0.5,N,n);
i=1;
X(:,1)=x0*ones(N,1);
while i<=n
X(:,i+1)=X(:,i)+kappa*(theta-X(:,i))*delta_t+sigma*Y(:,i);
i=i+1;
end
t=0:delta_t:n*delta_t;
plot(t,X)
grid on
end
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 12 / 25
Esempio
>> figure
subplot(2,2,1)
X=simmr(10,1000,0.1,0.5,0.03,0.01,0.06);
subplot(2,2,2)
X=simmr(10,1000,0.1,0.5,0.03,0.001,0.06);
subplot(2,2,3)
X=simmr(10,1000,0.1,0.5,0.03,0.01,0.00);
subplot(2,2,4)
X=simmr(10,1000,0.1,0.5,0.03,0.001,0.00);
>>
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 13 / 25
Esempio
0 50 100
-0.02
0
0.02
0.04
0.06
0.08
0 50 100
0.02
0.03
0.04
0.05
0.06
0 50 100
0
0.02
0.04
0.06
0 50 100
0
0.01
0.02
0.03
0.04
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 14 / 25
Moto browniano geometrico
Simuliamo adesso un moto browniano geometrico
dSt = µStdt + σStdBt .
Anche in questo caso, scriviamo
St+∆t = St + µStdt + σStdBt
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 15 / 25
Moto browniano geometrico
function [X] = simgbm(N,n,delta_t,mu,sigma,S0)
Y=normrnd(0,delta_t^0.5,N,n);
i=1;
X(:,1)=S0*ones(N,1);
while i<=n
X(:,i+1)=X(:,i)+mu*X(:,i)*delta_t+sigma*X(:,i).*Y(:,i);
i=i+1;
end
t=0:delta_t:n*delta_t;
plot(t,X)
grid on
end
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 16 / 25
Esempio
>> X = simgbm(50,100,0.1,0.01,0.05,100);
0 1 2 3 4 5 6 7 8 9 10
70
80
90
100
110
120
130
140
150
160
170
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 17 / 25
Il metodo Montecarlo
Sia X una variabile casuale con funzione di densita f e sia g : R → R unafunzione. Come noto,
E [g(X )] =
∫ +∞
−∞g(x)f (x) dx .
L’idea del metodo Montecarlo e approssimare numericamente questointegrale, simulando un certo numero di realizzazioni della variabile X , ecalcolando poi la media aritmetica della funzione f :
E [g(X )] ≈ 1
N
N∑i=1
g(xi ),
dove le xi sono appunto simulazioni indipendenti della variabile casuale X .
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 18 / 25
Prezzo di uno strumento derivato
Possiamo utilizzare il metodo Montecarlo per calcolare il prezzo di ungenerico strumento derivato di stile europeo, che come noto e dato dalvalore attuale del valore atteso neutrale al rischio del payoff:
P0 = exp(−rT )E [g(ST )].
Consideriamo il caso di una opzione call nel modello di Black-Scholes, percui g(x) = (x − K )+ e
ST = S0 exp
((r − σ2
2
)T + σBT
),
con BT ∼ N(0,T ).
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 19 / 25
Prezzo di una call
A titolo di esempio, sia S0 = 100, K = 100, r = 0.01, σ = 0.1, T = 0.25anni. Iniziamo a simulare i valori del sottostante a scadenza:
>> Y=normrnd(0,0.25^0.5,10000,1);
ST=100*exp((0.01-0.1^2/2)*0.25+0.1*Y);
e ne controlliamo la distribuzione
>> histogram(ST,50)
Possiamo anche verificare che la media
>> mean(ST)=100.2769
sia non lontana dal prezzo forward F = 100 ∗ exp(0.01× 0.25) ' 100.25.
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 20 / 25
La distribuzione di ST
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 21 / 25
Prezzo di una call
Determiniamo la distribuzione del payoff della call
>> Z=max(ST-100,0);
>> hist(Z,50)
Contiamo in quanti casi la call finisce in the money
>> length(nonzeros(Z)) = 5138
da cui possiamo dedurre che la probabilita di esercizio e circa
5138
10000= 51, 38%
e infine calcoliamo il prezzo Montecarlo
>> exp(-0.01*0.25)*mean(Z) = 2.1072
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 22 / 25
La distribuzione del payoff della call
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 23 / 25
Confronto con il valore esatto
Nella Financial Toolbox e gia implementata la formula di Black-Scholes
help blsprice
blsprice Black-Scholes put and call option pricing.
Compute European put and call option prices using
a Black-Scholes model.
[Call,Put] = blsprice(Price, Strike, Rate, Time, Volatility)
[Call,Put] = blsprice(Price, Strike, Rate, Time, Volatility,
Yield)
...
>> blsprice(100, 100, 0.01, 0.25, 0.1) = 2.1193
Il valore ottenuto dal metodo Montecarlo e ragionevolmente vicino alvalore esatto; la precisione cresce aumentando il numero delle simulazioni.
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 24 / 25
Calcolo del Delta
Calcoliamo il prezzo per S = 100 e S = 100.1 e il Delta come il rapportotra la variazione del prezzo della call e la variazione del sottostante:
>> Y=normrnd(0,0.25^0.5,10000,1);
ST1=100*exp((0.01-0.1^2/2)*0.25+0.1*Y);
ST2=100.1*exp((0.01-0.1^2/2)*0.25+0.1*Y);
Z1=max(ST1-100,0);
Z2=max(ST2-100,0);
P1=exp(-0.01*0.25)*mean(Z1);
P2=exp(-0.01*0.25)*mean(Z2);
Delta=(P2-P1)/0.1
Otteniamo
>> Delta = 0.5340
Confrontiamo con il valore esatto
>> blsdelta(100, 100, 0.01,0.25, 0.1) = 0.5299
Fabio Bellini (DISMEQ) Il metodo Montecarlo 6 aprile 2020 25 / 25