Académique Documents
Professionnel Documents
Culture Documents
20 juin 2005
Question 1 : Simulations de mouvements browniens
1. Méthode des incréments
La méthode des incréments consiste à prendre :
√
T
B0 = 0, Bti+1 = Bti + √ Yi
L
avec ti = iT /L, pour i varie de 1 à L et (Yi ) est une suite de v.a. indépendantes
de loi gaussienne centrée réduite.
0.5 0
0 −0.5
−0.5 −1
−1 −1.5
0 0.5 1 0 0.5 1
1
0.5
0
0
−1
−2 −0.5
0 0.5 1 0 0.5 1
1
2. Méthode de Karhunen-Loève
Dans la méthode de Karhunen-Loève, on pose :
√
2 2T (2n + 1)πt
φn (t) = sin( )
(2n + 1)π 2T
Soit (Zn ) une suite de v.a. indépendantes de loi gaussienne centrée réduite.
Alors, on a dans L2 (Ω × [0, T ]) :
∞
X
Bt = Zn φn (t)
n=0
Il existe une sous-suite de la suite des sommes partielles qui convergent p.s.
vers B. On approxime par troncature de la série.
Dans notre simulation, nous avons, après plusieurs essais, choisi de tronquer la
série à 5000 termes.
2 0.5
1.5 0
1 −0.5
0.5 −1
0 −1.5
0 0.5 1 0 0.5 1
1.5
0
1
−0.5
0.5
−1
0
−1.5 −0.5
0 0.5 1 0 0.5 1
2
3. Méthode de Cholesky
Pour simuler un vecteur gaussien de vecteur moyen m et de matrice de cova-
riance Γ, on peut utiliser la méthode de Cholevsky.
Comme la matrice Γ est symétrique positive, il existe une matrice carrée A
telle que
AAt = Γ
Soit Y = AG + m, avec G un vecteur de v.a. indépendantes gaussiennes
centrées réduites. On remarque que Y est un vecteur gaussien (par combinaison
linéaire de v.a. gaussiennes indépendantes et de constantes). Y est donc caractéridé
par le vecteur de ses moyennes et sa matrice de covariance.
Par linéarité, E(Y ) = m + AE(G) = m.
De plus, par un simple calcul on trouve : Cov(Yi , Yj ) = Γij .
Pour simuler un vecteur gaussien m, Γ, il suffit donc de :
– Calculer une racine carrée A de γ.
– Tirer G un vecteur de v.a. indépendantes gaussiennes centrées. réduites
– Retourner le vecteur Y = AG + m
Cela conduit à la méthode de simulation du mouvement brownien, en posant
Γij = min(ti , tj ).
1.5
0
1
0.5
−0.5
0
−0.5 −1
0 0.5 1 0 0.5 1
1
0.5
0.5
0
0
−0.5
−0.5
−1 −1
0 0.5 1 0 0.5 1
3
4. Méthode du point médian
On part de B0 = 0 et BT = Z0 où Z0 est une v.a. gaussienne centrée de
variance T . On procède ensuite récursivement :
BT /2 = (B0 + BT + Z1 )/2
avec Zi,k est de variance T 2−(i−1) indépendantes des Zj,l pour j < i.
2
0.5
1.5
0
1
−0.5
0.5
0 −1
0 0.5 1 0 0.5 1
2 0.5
1 0
0 −0.5
−1 −1
0 0.5 1 0 0.5 1
4
Sommes calculées avec les différentes simulations
√
On conjecture que Σ|∆Bi | se comporte comme O( n) et tend vers ∞, que
Σ|∆Bi |2 converge vers 1 et que Σ|∆Bi |3 converge vers 0.
5
temps d’exécution (en secondes)
On constate que les méthodes du point médian et des incréments sont les plus
rapides. On les privilégiera donc dans les simulations suivantes. En effet, la mé-
thode de Cholesky est très lente, en raison notamment de la nécessité de calculer
la racine carrée de la matrice auto-adjointe. En ce qui concerne la méthode de
Karhunen-Loève, on constate qu’avec 5000 termes, la méthode reste approxima-
tive et lente. On n’utilisera donc pas ces deux dernières méthodes de simulation
dans la suite.
Remarque : il faut noter que ces résultats sont intrinsèquement liés à notre pro-
grammation des algorithmes. Ils ont été obtenus avec Matlab qui reste un langage
interprété et qui nécessite une programmation vectorielle pour arriver à de bons ré-
sultats. Ainsi dans d’autres langages, les vitesses d’exécutions seraient sans doute
bien différentes.
6
Question 2
On utilise la méthode des incréments en modifiant l’intervalle de calcul. Cela
vient de la propriété d’accroissements indépendants des mouvements browniens.
0.8
0.6
0.4
0.2
−0.2
0.5 0.55 0.6 0.65 0.7 0.75
Question 3
Grâce à l’indépendance des accroissements, on peut recoller 2 trajectoires si-
mulées sur 2 intervalles distincts pour obtenir une simulation sur l’union de ces 2
intervalles.
Question 4
|B1 | est une variable aléatoire à valeurs sur [0; ∞] donc la densité est :
r
2 − x2
p(x) = e 2
π
7
Ainsi les équations à résoudre pour trouver les (ai ), i ∈ {0...19} sont :
Z ai
i
p(x)dx = , ∀ai
0 20
Ces équations sont résolues numériquement à partir des tables de la fonction
erreur intégrées aux logiciels de calcul classiques.
Ainsi sous matlab on vérifie :
>> 2*(stderf(0.062706777)-stderf(0))
ans =
0.0500
8
Question 6 : Mouvement brownien fractionnaire
Grâce à la méthode de Cholesky, il est aisé de simuler un processus gaussien en
connaissant sa covariance. Simulons un mouvement brownien fractionnaire dont la
covariance est donnée par :
Z min(t,s)
E[BtH BsH ] = (t − s)H−1/2 (s − r)H−1/2 dr
0
−1
−2
−3
−4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
9
Brownien Fractionnaire sur [0;1] avec L=500 et H=0.8
0.15
0.1
0.05
−0.05
−0.1
−0.15
−0.2
−0.25
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0.2
0.1
−0.1
−0.2
−0.3
−0.4
−0.5
−0.6
−0.7
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
10
Question 7 : Représentation intégrale
Ce processus est représenté sous forme intégrale par :
Z t
BtH = (t − s)H−1/2 dBs
0
On approche le processus par la formule (qui semble être une généralisation de
la formule de Riemann) :
Z ti+1
H
X 1
Bt ≃ (t − s)H−1/2 dr∆Bi
ti+1 − ti ti
ti ≤t
−1
−2
−3
−4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
11
Brownien Fractionnaire (qu7) sur [0;1] avec L=500 et H=0.8
0.3
0.2
0.1
−0.1
−0.2
−0.3
−0.4
−0.5
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
−0.5
−1
−1.5
−2
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
12
Annexe - TP1 MMFI
Simulation de processus gaussiens
10 juin 2005
Table des matières
1 Sortie du programme Matlab global (script demo tp1.m) 2
1
1 Sortie du programme Matlab global (script demo tp1.m)
>> demo_tp1
Question 1
Increments
Increments s1=8.5892 :: s2=0.84431 :: s3=0.10536
Increments s1=18.462 :: s2=1.0896 :: s3=0.080473
Increments s1=24.8224 :: s2=0.9477 :: s3=0.045802
Increments s1=51.1561 :: s2=0.99723 :: s3=0.024762
Temps passe dans le calcul par methode des increments =0.98204s
Karhunen
Karhunen s1=8.2934 :: s2=0.80899 :: s3=0.095819
Karhunen s1=18.1448 :: s2=1.0011 :: s3=0.070298
Karhunen s1=24.0608 :: s2=0.903 :: s3=0.043905
Karhunen s1=47.3052 :: s2=0.86103 :: s3=0.019826
Temps passe dans le calcul par methode de Karhunen-Loeve =7.0681s
Cholesky
Cholesky s1=9.6211 :: s2=1.1966 :: s3=0.1889
Cholesky s1=18.7098 :: s2=1.0359 :: s3=0.071294
Cholesky s1=25.3598 :: s2=0.97857 :: s3=0.048152
Cholesky s1=50.8614 :: s2=0.992 :: s3=0.02485
Temps passe dans le calcul par methode de Cholesky =45.4508s
Methode point Median
Median s1=8.2978 :: s2=0.809 :: s3=0.097018
Median s1=19.4587 :: s2=1.1444 :: s3=0.083952
Median s1=25.9814 :: s2=1.0541 :: s3=0.055702
Median s1=50.5697 :: s2=0.98086 :: s3=0.024451
Temps passe dans le calcul par methode du point median =3.3902s
Question 2
Question 5
T_khi2 =
26.8000
Test_accepte =
Question 6
Temps passe dans le calcul des browniens fractionnaires par Cholesky=3790.5939s
Question 7
Temps passe dans le calcul des browniens fractionnaires par integrale stochastique =79.2083s
2
randn(’state’,0) ;
CALCULE S = 1 ;
FIGURE = 1 ;
disp ’Question 1’
tic
disp ’Increments’
figure,
subplot(2,2,1), B = increments(128,0,1); set(gca,’FontSize’,13) ;
title(’Increments avec nb = 128’) ; set(gca,’FontSize’,13) ;
subplot(2,2,2), B = increments(512,0,1); set(gca,’FontSize’,13) ;
title(’Increments avec nb = 512’) ; set(gca,’FontSize’,13) ;
subplot(2,2,3), B = increments(1024,0,1); set(gca,’FontSize’,13) ;
title(’Increments avec nb = 1024’) ; set(gca,’FontSize’,13) ;
subplot(2,2,4), B = increments(4096,0,1); set(gca,’FontSize’,13) ;
title(’Increments avec nb = 4096’) ; set(gca,’FontSize’,13) ;
saveas(gcf, ’res increments.eps’, ’psc2’) ;
t=toc ;
disp([’Temps passe dans le calcul par methode des increments =’ num2str(t) ’s’]) ;
tic
disp ’Karhunen’
figure,
subplot(2,2,1), B = karhunen(128,0,1) ; set(gca,’FontSize’,13) ;
title(’Karhunen avec nb = 128’) ; set(gca,’FontSize’,13) ;
subplot(2,2,2), B = karhunen(512,0,1) ; set(gca,’FontSize’,13) ;
title(’Karhunen avec nb = 512’) ; set(gca,’FontSize’,13) ;
subplot(2,2,3), B = karhunen(1024,0,1) ; set(gca,’FontSize’,13) ;
title(’Karhunen avec nb = 1024’) ; set(gca,’FontSize’,13) ;
subplot(2,2,4), B = karhunen(4096,0,1) ; set(gca,’FontSize’,13) ;
title(’Karhunen avec nb = 4096’) ; set(gca,’FontSize’,13) ;
saveas(gcf, ’res karhunen.eps’, ’psc2’) ;
t=toc ;
disp([’Temps passe dans le calcul par methode de Karhunen-Loeve =’ num2str(t) ’s’]) ;
tic
disp ’Cholesky’
figure,
subplot(2,2,1), B = cholesky(128,0,1) ; set(gca,’FontSize’,13) ;
title(’Cholesky avec nb = 128’) ; set(gca,’FontSize’,13) ;
subplot(2,2,2), B = cholesky(512,0,1) ; set(gca,’FontSize’,13) ;
title(’Cholesky avec nb = 512’) ; set(gca,’FontSize’,13) ;
subplot(2,2,3), B = cholesky(1024,0,1) ; set(gca,’FontSize’,13) ;
title(’Cholesky avec nb = 1024’) ; set(gca,’FontSize’,13) ;
subplot(2,2,4), B = cholesky(4096,0,1) ; set(gca,’FontSize’,13) ;
title(’Cholesky avec nb = 4096’) ; set(gca,’FontSize’,13) ;
saveas(gcf, ’res cholesky.eps’, ’psc2’) ;
t=toc ;
disp([’Temps passe dans le calcul par methode de Cholesky =’ num2str(t) ’s’]) ;
tic
disp ’Methode point Median’
figure,
subplot(2,2,1), B = median(128,0,1) ; set(gca,’FontSize’,13) ;
3
title(’Median avec nb = 128’) ; set(gca,’FontSize’,13) ;
subplot(2,2,2), B = median(512,0,1) ; set(gca,’FontSize’,13) ;
title(’Median avec nb = 512’) ; set(gca,’FontSize’,13) ;
subplot(2,2,3), B = median(1024,0,1) ; set(gca,’FontSize’,13) ;
title(’Median avec nb = 1024’) ; set(gca,’FontSize’,13) ;
subplot(2,2,4), B = median(4096,0,1) ; set(gca,’FontSize’,13) ;
title(’Median avec nb = 4096’) ; set(gca,’FontSize’,13) ;
saveas(gcf, ’res median.eps’, ’psc2’) ;
t=toc ;
disp([’Temps passe dans le calcul par methode du point median =’ num2str(t) ’s’]) ;
disp ’Question 2’
CALCULE S = 0 ;
FIGURE = 1 ;
figure,
B = increments(512,1/2,3/4) ; set(gca,’FontSize’,13) ;
title(’Methode des increments sur [1/2;3/4]’) ; set(gca,’FontSize’,13) ;
saveas(gcf, ’res increments2.eps’, ’psc2’) ;
disp ’Question 5’
CALCULE S = 0 ;
FIGURE = 0 ;
demo qu5
disp ’Question 6’
FIGURE = 1 ;
tic
figure, B = brow frac(500,0,1,0.2); set(gca,’FontSize’,13) ;
title(’Brownien Fractionnaire (Cholesky) sur [0;1] avec L=500 et H=0.2’) ;
set(gca,’FontSize’,13) ;
saveas(gcf, ’res brow frac H2.eps’, ’psc2’) ;
figure, B = brow frac(500,0,1,0.8); set(gca,’FontSize’,13) ;
title(’Brownien Fractionnaire sur [0;1] avec L=500 et H=0.8’) ;
set(gca,’FontSize’,13) ;
saveas(gcf, ’res brow frac H8.eps’, ’psc2’) ;
figure, B = brow frac(500,0,1,0.5); set(gca,’FontSize’,13) ;
title(’Brownien Fractionnaire sur [0;1] avec L=500 et H=0.5’) ;
set(gca,’FontSize’,13) ;
saveas(gcf, ’res brow frac H5.eps’, ’psc2’) ;
t=toc ;
disp([’Temps passe dans le calcul des browniens fractionnaires par Cholesky=’ num2str(t) ’s’]) ;
disp ’Question 7’
FIGURE = 1 ;
tic
figure, B = brow frac2(500,0,1,0.2); set(gca,’FontSize’,13) ;
4
title(’Brownien Fractionnaire (qu7) sur [0;1] avec L=500 et H=0.2’) ;
set(gca,’FontSize’,13) ;
saveas(gcf, ’res brow frac2 H2.eps’, ’psc2’) ;
figure, B = brow frac2(500,0,1,0.8); set(gca,’FontSize’,13) ;
title(’Brownien Fractionnaire (qu7) sur [0;1] avec L=500 et H=0.8’) ;
set(gca,’FontSize’,13) ;
saveas(gcf, ’res brow frac2 H8.eps’, ’psc2’) ;
figure, B = brow frac2(500,0,1,0.5); set(gca,’FontSize’,13) ;
title(’Brownien Fractionnaire (qu7) sur [0;1] avec L=500 et H=0.5’) ;
set(gca,’FontSize’,13) ;
saveas(gcf, ’res brow frac2 H5.eps’, ’psc2’) ;
t=toc ;
disp([’Temps passe dans le calcul des browniens fractionnaires par integrale stochastique =’...
num2str(t) ’s’]) ;
%FIGURE = 0 ;
global CALCULE S FIGURE
T = T2-T1 ;
r = sqrt(T/nb).*randn(1,nb-1) ;
B = [0 , cumsum(r)] ;
if CALCULE S
s1 = sum(abs(r)) ;
s2 = sum(abs(r).^2) ;
s3 = sum(abs(r).^3) ;
disp([’Increments s1=’ num2str(s1) ’ :: s2=’ num2str(s2) ’ :: s3=’ num2str(s3)])
end
if FIGURE
plot(T1:(T/nb):T2,[0 B]);
end
T = T2-T1 ;
t=linspace(T/nb,T,nb-1);
% on commence en T/nb et non 0 car sinon gam n’est plus inversible
gam = ones(length(t),1)*t ;
gam = min(gam,gam’) ;
[R,p] = chol(gam);
B = R’ * randn(size(R,2),1) ;
5
B = [0 ; B] ; % toujours on prend B = 0 en t=0
t = [ 0 t ] ;
if FIGURE
plot(T1+t,B);
end
if CALCULE S
s1 = 0 ;
s2 = 0 ;
s3 = 0 ;
for i=2:size(B,1)
s1 = s1 + abs(B(i)-B(i-1)) ;
s2 = s2 + (B(i)-B(i-1))^2 ;
s3 = s3 + abs(B(i)-B(i-1))^3 ;
end
TEST N = 0 ;
T = T2-T1 ;
t=linspace(0,T,nb);
z = randn(1,N+1) ;
n=0 ;
B = z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
for n=1:N
B = B + z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
end
if TEST N
% pour tester l’influence du nombre de termes dans la serie
B1 = z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
B2 = z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
B3 = z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
B4 = z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
for n=1:1000
B1 = B1 + z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
end
6
for n=1:2000
B2 = B2 + z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
end
for n=1:3000
B3 = B3 + z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
end
for n=1:4000
B4 = B4 + z(n+1)*2*sqrt(2*T)/((2*n+1)*pi).*sin((2*n+1)*pi/(2*T).*t) ;
end
end
if FIGURE
plot(t,B);
end
if TEST N
plot(t,[B ; B1 ; B2 ; B3 ; B4]);
end
if CALCULE S
s1 = 0 ;
s2 = 0 ;
s3 = 0 ;
for i=2:size(B,2)
s1 = s1 + abs(B(i)-B(i-1)) ;
s2 = s2 + (B(i)-B(i-1))^2 ;
s3 = s3 + abs(B(i)-B(i-1))^3 ;
end
global CALCULE S
FIGURE = 1 ;
T = T2-T1 ;
t=0:(T/nb):T ;
B = zeros(1,nb+1) ;
B(1) = 0 ;
B(nb+1) = sqrt(T)*randn ;
B = median aux(B,0,nb,T1,T2) ;
if FIGURE
plot(T1+t,B);
end
if CALCULE S
7
s1 = 0 ;
s2 = 0 ;
s3 = 0 ;
for i=2:size(B,2)
s1 = s1 + abs(B(i)-B(i-1)) ;
s2 = s2 + (B(i)-B(i-1))^2 ;
s3 = s3 + abs(B(i)-B(i-1))^3 ;
end
if ((n2-n1)>1)
B((n2+n1)/2+1)=(B(n1+1)+B(n2+1)+sqrt(t2-t1)*randn)/2 ;
Bout = median aux(B,n1,((n2+n1)/2),t1,((t2+t1)/2)) ;
Bout = median aux(Bout,((n2+n1)/2),n2,((t2+t1)/2),t2) ;
else
Bout = B ;
end
a = [0 0.0627 0.1257 0.1891 0.2533 0.3186 0.3853 0.4538 0.5244 0.5978 .6744...
0.7554 0.8416 0.9346 1.0364 1.1503 1.2816 1.4395 1.6449 1.9600 inf] ;
8
global FIGURE
T = T2-T1 ;
t=(T/nb):(T/nb):T ;
gam = zeros(length(t)) ;
diagonale = zeros(length(t)) ;
for i=1:length(t)
F = @(r) (t(i)-r).^(H-0.5) .* (t(i)-r).^(H-0.5) ;
diagonale(i,i) = quadl(F,0,t(i));
for j=(i+1):length(t)
F = @(r) (t(i)-r).^(H-0.5) .* (t(j)-r).^(H-0.5) ;
gam(i,j) = quadl(F,0,min(t(i),t(j)));
end
end
[R,p] = chol(gam);
B = R’ * randn(size(R,2),1) ;
if FIGURE
plot(T1+t,B);
end
FIGURE = 1 ;
T = T2-T1 ;
y = sqrt(T/L).*randn(1,L) ;
B=zeros(1,L) ;
t=0:(T/L):T ;
for i=1:L
B(i)=0 ;
for j=1:i
B(i) = B(i) + (L/T)*y(j)*(P(t(j+1))-P(t(j))) ;
end
end
if FIGURE
9
plot(t,[0 B]);
end
lg = 1000;
% Generation de browniens fractionnaires par la fonction wfbm
% celle methode utilise une methode par ondelettes
figure, fBm03 = wfbm(0.2,lg,’plot’);
figure, fBm05 = wfbm(0.5,lg,’plot’);
figure, fBm08 = wfbm(0.8,lg,’plot’);
10
TP2 MMFI
Simulations d’options put et call
20 juin 2005
Question 1 : Calcul numérique d’options
1. Calcul du call
Dans un modèle de type Black and Scholes, le call est donné par :
C = E[(eβG − K)+ ]
2 /2 log(K) log(K)
C = eβ N (β − ) − KN (− )
β β
En prenant β = 1 et K = 1, on trouve :
C(β = 1, K = 1) = 0.88714
2. Calcul du put
De même, le put est donné par :
P = E[(K − eβG )+ ]
2 /2 log(K) log(K)
P = eβ (N (β − ) − 1) − K(N (− ) − 1)
β β
En prenant β = 1 et K = 1, on trouve :
P (β = 1, K = 1) = 0.23842
1
Question 2 : Simulations d’options par la méthode de Monte-
Carlo
1. Simulation du call
On peut également choisir de simuler directement le call par une méthode de
Monte-Carlo. On prend encore β = 1 et K = 1.
0.8
0.7
0.6
0.5
0.4
2 2.5 3 3.5 4 4.5 5
log10(nombre de tirages)
2
2. Simulation du put
0.32
0.3
0.28
0.26
0.24
0.22
0.2
2 2.5 3 3.5 4 4.5 5
log10(nombre de tirages)
3
Question 3 : Simulations d’options avec réduction de la va-
riance
Une idée assez naturelle est donc de simuler le call à partir du put, car la parité
entre le put et le call est parfaitement connue. C’est ce qu’on appelle une méthode
de réduction de la variance.
On écrit
C = P + (C − P )
On va donc simuler P par une méthode de Monte-Carlo classique et ajouter
2
K − eβ /2 . Cela permet une simulation du call avec de meilleurs intervalles de
confiance.
4
Evolution de l intervalle de confiance (call avec reduction de variance)
0.96
borne inferieure
borne superieure
0.94
0.92
0.9
0.88
0.86
0.84
0.82
2 2.5 3 3.5 4 4.5 5
log10(nombre de tirages)
2. Simulation du call
Comme pour le call de type européen, on peut simuler ce call (de type asia-
tique) par une méthode de Monte-Carlo. On utilise pour cela les valeurs numé-
riques σ = 0.5, r = 1, x = 1 et T = 1.
5
taille de l’échantillon valeur empirique du call intervalle de confiance
0.28
0.27
0.26
0.25
0.24
0.23
0.22
0.21
2 2.5 3 3.5 4 4.5 5
log10(nombre de tirages)
6
Question 5 : Simulations d’options sur moyenne avec ré-
duction de variance
1. Présentation de la méthode
De même que dans le cas du call européen, on va chercher à réduire la variance
en utilisant une variable de contrôle. R
T RT
L’énoncé du TP suggère que e1/T 0 log(S(s))ds et T1 0 S(s)ds sont assez proches,
ce qui nous amène à utiliser la variable de contrôle :
RT
Y = e−rT (eZ − K)+ avec Z = T1 0 log(S(s))ds
7
2. Simulation du call avec réduction de variance
On peut maintenant simuler
1 T
Z RT
1
log(S(s))ds
e−rt ( S(s)ds − K)+ − (e T 0 − K)+
T 0
8
Evolution de l intervalle de confiance (call sur moyenne avec RV)
0.24
borne inferieure
0.238 borne superieure
0.236
0.234
0.232
0.23
0.228
0.226
0.224
0.222
2 2.5 3 3.5 4 4.5 5
log10(nombre de tirages)
0.035
largeur de l intervalle de confiance avec RV
largeur de l intervalle de confiance sans RV
0.03
0.025
0.02
0.015
0.01
0.005
0
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2
log10(T)
9
7
largeur de l intervalle de confiance avec RV
largeur de l intervalle de confiance sans RV
6
0
−2 −1.5 −1 −0.5 0 0.5 1
log10(SIGMA)
10
Annexe - TP3 MMFI
Simulation d’options - Put et Call
10 juin 2005
Table des matières
1 Sortie du programme Matlab (demo tp2.m) 2
1
1 Sortie du programme Matlab (demo tp2.m)
>> demo_tp2
call(beta=1,K=1) = 0.88714
put(beta=1,K=1) = 0.23842
call(beta=1,K=1,N=100) = 0.67992
Intervalle de confiance = [ 0.44851 , 0.91133]
call(beta=1,K=1,N=1000) = 0.7657
Intervalle de confiance = [ 0.66316 , 0.86824]
call(beta=1,K=1,N=10000) = 0.9139
Intervalle de confiance = [ 0.872 , 0.9558]
call(beta=1,K=1,N=100000) = 0.89106
Intervalle de confiance = [ 0.87854 , 0.90358]
put(beta=1,K=1,N=100) = 0.28686
Intervalle de confiance = [ 0.22897 , 0.34476]
put(beta=1,K=1,N=1000) = 0.23397
Intervalle de confiance = [ 0.2156 , 0.25235]
put(beta=1,K=1,N=10000) = 0.23764
Intervalle de confiance = [ 0.23184 , 0.24344]
put(beta=1,K=1,N=100000) = 0.23884
Intervalle de confiance = [ 0.237 , 0.24068]
call(beta=1,K=1,N=100) = 0.88374
Intervalle de confiance = [ 0.82475 , 0.94273]
call(beta=1,K=1,N=1000) = 0.88858
Intervalle de confiance = [ 0.87014 , 0.90702]
call(beta=1,K=1,N=10000) = 0.88734
Intervalle de confiance = [ 0.88153 , 0.89316]
call(beta=1,K=1,N=100000) = 0.88713
Intervalle de confiance = [ 0.88529 , 0.88896]
call_moy(sigma=0.5,r=1,T=1,K=1,N=100) = 0.25478
Intervalle de confiance = [ 0.21669 , 0.29288]
call_moy(sigma=0.5,r=1,T=1,K=1,N=1000) = 0.26463
Intervalle de confiance = [ 0.25209 , 0.27717]
call_moy(sigma=0.5,r=1,T=1,K=1,N=10000) = 0.26622
Intervalle de confiance = [ 0.26212 , 0.27031]
call_moy(sigma=0.5,r=1,T=1,K=1,N=100000) = 0.26584
Intervalle de confiance = [ 0.26455 , 0.26714]
2
VALEUR EMPIRIQUE DU CALL SUR MOYENNE AVEC REDUCTION DE VARIANCE:
call_moy(sigma=0.5,r=1,T=1,K=1,N=100) = 0.23094
Intervalle de confiance = [ 0.223 , 0.23889]
call_moy(sigma=0.5,r=1,T=1,K=1,N=1000) = 0.2324
Intervalle de confiance = [ 0.22962 , 0.23518]
call_moy(sigma=0.5,r=1,T=1,K=1,N=10000) = 0.23177
Intervalle de confiance = [ 0.23088 , 0.23265]
call_moy(sigma=0.5,r=1,T=1,K=1,N=100000) = 0.23231
Intervalle de confiance = [ 0.23203 , 0.23259]
call_moy(sigma=0.5,r=1,T=0.01,K=1,N=1000) = 0.013741
Intervalle de confiance = [ 0.013729 , 0.013752]
call_moy(sigma=0.5,r=1,T=0.01,K=1,N=1000) = 0.013745
Intervalle de confiance = [ 0.012584 , 0.014906]
call_moy(sigma=0.5,r=1,T=0.1,K=1,N=1000) = 0.058298
Intervalle de confiance = [ 0.058136 , 0.058461]
call_moy(sigma=0.5,r=1,T=0.1,K=1,N=1000) = 0.06086
Intervalle de confiance = [ 0.05666 , 0.065061]
call_moy(sigma=0.5,r=1,T=1,K=1,N=1000) = 0.23215
Intervalle de confiance = [ 0.22927 , 0.23504]
call_moy(sigma=0.5,r=1,T=1,K=1,N=1000) = 0.26081
Intervalle de confiance = [ 0.24806 , 0.27357]
call_moy(sigma=0.5,r=1,T=10,K=1,N=1000) = 0.085593
Intervalle de confiance = [ 0.070569 , 0.10062]
call_moy(sigma=0.5,r=1,T=10,K=1,N=1000) = 0.10179
Intervalle de confiance = [ 0.084434 , 0.11914]
call_moy(sigma=0.5,r=1,T=100,K=1,N=1000) = 0.0021952
Intervalle de confiance = [ 0.00013283 , 0.0042575]
call_moy(sigma=0.5,r=1,T=100,K=1,N=1000) = 0.00023589
Intervalle de confiance = [ 6.0252e-05 , 0.00041153]
call_moy(sigma=0.01,r=1,T=1,K=1,N=1000) = 0.26426
Intervalle de confiance = [ 0.26422 , 0.2643]
call_moy(sigma=0.01,r=1,T=1,K=1,N=1000) = 0.26419
Intervalle de confiance = [ 0.26394 , 0.26445]
call_moy(sigma=0.1,r=1,T=1,K=1,N=1000) = 0.26301
Intervalle de confiance = [ 0.26259 , 0.26344]
call_moy(sigma=0.1,r=1,T=1,K=1,N=1000) = 0.26422
Intervalle de confiance = [ 0.26164 , 0.26679]
call_moy(sigma=1,r=1,T=1,K=1,N=1000) = 0.19955
Intervalle de confiance = [ 0.1885 , 0.21059]
call_moy(sigma=1,r=1,T=1,K=1,N=1000) = 0.28421
Intervalle de confiance = [ 0.2582 , 0.31023]
3
call_moy(sigma=10,r=1,T=1,K=1,N=1000) = 0.060006
Intervalle de confiance = [ 0.016339 , 0.10367]
call_moy(sigma=10,r=1,T=1,K=1,N=1000) = 1.7762
Intervalle de confiance = [ -1.6762 , 5.2285]
FIGURE = 0 ;
% fonction erreur
if FIGURE
plot(stderf(-10:0.2:10)), title(’fonction erreur’) ;
set(gca,’FontSize’,15) ;
end
beta = 1 ;
K = 1 ;
4
figure,
plot(log([100,1000,10000,100000])./log(10),evo intconf) ;
set(gca,’FontSize’,15) ;
title(’Evolution de l intervalle de confiance (call eur.)’) ;
xlabel(’log10(nombre de tirages)’) ;
legend(’borne inferieure’,’borne superieure’) ;
set(gca,’FontSize’,15) ;
saveas(gca,’call eur.eps’,’psc2’) ;
alpha = 0.95 ;
ind = 1 ;
for N=[100,1000,10000,100000]
[val,sample] = put estimation(beta,K,N) ;
[binf,bsup] = intconf(sample,alpha) ;
disp([’put(beta=’ num2str(beta) ’,K=’ num2str(K) ’,N=’ num2str(N) ’) = ’ num2str(val) ]) ;
disp([’Intervalle de confiance = [ ’ num2str(binf) ’ , ’ num2str(bsup) ’]’ ]) ;
% stockage des bornes de l’intervalle de confiance
evo intconf(ind,1) = binf ;
evo intconf(ind,2) = bsup ;
ind = ind+1 ;
end
5
plot(log([100,1000,10000,100000])./log(10),evo intconf) ;
set(gca,’FontSize’,15) ;
title(’Evolution de l intervalle de confiance (call avec reduction de variance)’) ;
xlabel(’log10(nombre de tirages)’) ;
legend(’borne inferieure’,’borne superieure’) ;
set(gca,’FontSize’,15) ;
saveas(gca,’call rv eur.eps’,’psc2’) ;
% calcul d’un call sur moyenne par moyenne sur des trajectoires
disp ’ ’
disp ’VALEUR EMPIRIQUE DU CALL SUR MOYENNE :’
disp ’ ’
sigma = 0.5 ;
r = 1 ;
T = 1 ;
K = 1 ;
alpha = 0.95 ;
ind = 1 ;
for N=[100,1000,10000,100000]
[val,sample] = call moy estimation(sigma,r,T,K,N) ;
[binf,bsup] = intconf(sample,alpha) ;
disp([’call moy(sigma=’ num2str(sigma) ’,r=’ num2str(r) ’,T=’ num2str(T)...
’,K=’ num2str(K) ’,N=’ num2str(N) ’) = ’ num2str(val) ]) ;
disp([’Intervalle de confiance = [ ’ num2str(binf) ’ , ’ num2str(bsup) ’]’ ]) ;
% stockage des bornes de l’intervalle de confiance
evo intconf(ind,1) = binf ;
evo intconf(ind,2) = bsup ;
ind = ind+1 ;
end
6
evo intconf(ind,2) = bsup ;
ind = ind+1 ;
end
7
%
disp ’ ’
disp ’INFLUENCE DE SIGMA SUR LE CALL SUR MOYENNE AVEC REDUCTION DE VARIANCE:’
disp ’ ’
sigma = 0.5 ;
r = 1 ;
T = 1 ;
K = 1 ;
N = 1000 ;
alpha = 0.95 ;
ind = 1 ;
clear evo delta intconf
for sigma=[0.01,0.1,1,10]
[val,sample] = call moy estimation reduced var(sigma,r,T,K,N) ;
[binf,bsup] = intconf(sample,alpha) ;
disp([’call moy(sigma=’ num2str(sigma) ’,r=’ num2str(r) ’,T=’ num2str(T)...
’,K=’ num2str(K) ’,N=’ num2str(N) ’) = ’ num2str(val) ]) ;
disp([’Intervalle de confiance = [ ’ num2str(binf) ’ , ’ num2str(bsup) ’]’ ]) ;
% stockage des bornes de l’intervalle de confiance
evo delta intconf(ind,1) = bsup-binf ;
%
[val,sample] = call moy estimation(sigma,r,T,K,N) ;
[binf,bsup] = intconf(sample,alpha) ;
disp([’call moy(sigma=’ num2str(sigma) ’,r=’ num2str(r) ’,T=’ num2str(T)...
’,K=’ num2str(K) ’,N=’ num2str(N) ’) = ’ num2str(val) ]) ;
disp([’Intervalle de confiance = [ ’ num2str(binf) ’ , ’ num2str(bsup) ’]’ ]) ;
disp(’ ’)
% stockage des bornes de l’intervalle de confiance
evo delta intconf(ind,2) = bsup-binf ;
ind = ind+1 ;
end
8
2.4 Calcul d’un call européen par méthode de Monte-Carlo
function [val,sample] = call estimation(beta,K,N)
G = randn(1,N) ;
sample = max(0,exp(beta.*G)-K) ;
val = mean(sample) ;
G = randn(1,N) ;
sample = max(0,K-exp(beta.*G)) ;
val = mean(sample) ;
2.6 Calcul d’un call européen par méthode de Monte-Carlo avec réduction
de variance
function [val,sample] = call estimation reduced var(beta,K,N)
A = exp(beta^2/2) - K ;
G = randn(1,N) ;
sample = max(A,A+K-exp(beta.*G));
val = mean(sample) ;
sample = zeros(1,N) ;
S0 = 1 ; % valeur initiale de S
t = 0:(T/nb):T ;
for i=1:N
aux = sqrt(T/nb).*randn(1,nb) ;
B = [0 , cumsum(aux)] ;
S = S0 .* exp((r-sigma^2/2).*t + sigma.*B) ;
val = mean(sample) ;
9
sample = zeros(1,N) ;
S0 = 1 ; % valeur initiale de S
t = 0:(T/nb):T ;
for i=1:N
aux = sqrt(T/nb).*randn(1,nb) ;
B = [0 , cumsum(aux)] ;
S = S0 .* exp((r-sigma^2/2).*t + sigma.*B) ;
m = exp(-r*T) * max(K-intS/T,0) ;
sample(i) = m ;
end
val = mean(sample) ;
2.9 Calcul d’un call sur moyenne par méthode de Monte-Carlo avec réduction
de variance
function [val,sample] = call moy estimation reduced var(sigma,r,T,K,N)
A = log(S0) + (r-sigma^2)*T/2 ;
B = sigma/T * sqrt(T^3/3) ;
sample = zeros(1,N) ;
t=0:(T/nb):T ;
for i=1:N
aux = sqrt(T/nb).*randn(1,nb) ;
BR = [0 , cumsum(aux)] ;
S = S0 .* exp((r-sigma^2/2).*t + sigma.*BR) ;
logS = log(S) ;
val = mean(sample) ;
10
2.10 Fonction servant au calcul des intervalles de confiance
function [binf,bsup] = intconf(sample,alpha)
N = length(sample) ;
m = mean(sample) ;
sigma = sqrt(var(sample)) ;
beta = -sqrt(2)*erfcinv(1+alpha) ;
binf = m - beta*sigma/sqrt(N) ;
bsup = m + beta*sigma/sqrt(N) ;
11
TP3 MMFI
Résolutions d’équations différentielles
stochastiques
20 juin 2005
Question 1 : Schéma d’Euler classique
1. Présentation de la méthode générale
Le schéma d’Euler permet de résoudre des équations différentielles classiques
du type :
x′ (t) = f (x(t)), x(0) donné
La version discrète du schéma d’Euler permet de travailler avec un nombre fini
T
de points et d’approcher la fonction f solution. Considérons N points, tn = n N
pour n ∈ {0...N }, on calcule :
xN N N N
0 = x(0), xn+1 = xn + f (xn )(tn+1 − tn )
2. Simulation de la solution
Résolvons l’équation différentielle sur [0, 5] :
3
x′ (t) = x(t), x(0) = 1
2
2000
dx=0.50
1800 dx=0.10
dx=0.01
1600 Solution theorique
1400
1200
1000
800
600
400
200
0
0 1 2 3 4 5
1
Question 2 : Application du schéma d’Euler aux équations
différentielles stochastiques
1. Présentation de la méthode
Dans cette question, il s’agit de transposer la méthode d’Euler à des équations
différentielles stochastiques.
On cherche à résoudre une équation (qui décrit par exemple l’évolution d’un
actif financier) du type :
y0N = y(0) N
yn+1 = ynN + aynN (tn+1 − tn ) + bynN (Btn+1 − Btn )
z0N = y(0) N
zn+1 = znN + aznN (tn+1 − tn ) + bznN (Btn − Btn−1 )
w0N = y(0) N
wn+1 = wnN + awnN (tn+1 − tn ) + bwnN (Btn+1 − Btn−1 )/2
w0N = y(0) N
wn+1 = wnN + awnN (tn+1 − tn ) + bwnN (Btn+1 − Btn−1 )/2
ne convient pas.
2
Resolution numerique de l EDS avec T/N=0.01
7
s
y
6 z
w
5
0
0 0.2 0.4 0.6 0.8 1
25
20
15
10
0
0 0.2 0.4 0.6 0.8 1
3
2. Solution obtenue en négligeant un terme d’Ito
Traçons maintenant la fonction Rt = eat+bBt avec le même mouvement brow-
nien que précédemment :
La fonction Rt pourrait être suggérée comme solution en partant de l’écriture
physicienne de l’équation différentielle dSt = aSt dt + bSt dBt , S(0) donné
On remarque que négliger le terme en 21 b2 t rend la trajectoire très différente
et très éloignée des trajectoires précédentes. Il faut donc être très prudent avec
l’écriture physicienne de l’équation différentielle.
d(y N , S) = E[|yTN − ST |]
On évalue cette valeur par une méthode de Monte-Carlo :
1 X N,j
K
E[|yTN − ST |] = lim |yT − STj |
K→∞ K
j=1
4
16
N
Erreur d(y ,S)
14 50*sqrt(N)
12
10
0
1 1.5 2 2.5 3 3.5 4
F IG . 4 – Evolution de l’erreur
5
Annexe - TP3 MMFI
Résolution d’équations différentielles stochastiques
10 juin 2005
Table des matières
1 Sortie du programme Matlab 2
1
1 Sortie du programme Matlab
>> q1
>> q2
>> q3
Nombre de tirages = 10000
Erreur moyenne en N pour y = 6.6922e-05
Erreur moyenne en N pour w = 0.0020995
>> q4
Nombre de tirages = 5000
N = 10
Distance moyenne = 9.1369
Intervalle de confiance = [ 7.6373 , 10.6366]
Temps de calcul = 0.77454 s
N = 31.6228
Distance moyenne = 4.4845
Intervalle de confiance = [ 2.713 , 6.256]
Temps de calcul = 0.73211 s
N = 100
Distance moyenne = 2.1582
Intervalle de confiance = [ 1.1493 , 3.1672]
Temps de calcul = 1.3589 s
N = 316.2278
Distance moyenne = 1.0424
Intervalle de confiance = [ 0.60397 , 1.4808]
Temps de calcul = 3.1248 s
N = 1000
Distance moyenne = 0.60492
Intervalle de confiance = [ 0.37789 , 0.83195]
Temps de calcul = 9.0838 s
N = 3162.2777
Distance moyenne = 0.30074
Intervalle de confiance = [ 0.21242 , 0.38905]
Temps de calcul = 36.8182 s
N = 10000
Distance moyenne = 0.16366
Intervalle de confiance = [ 0.11909 , 0.20822]
Temps de calcul = 107.5796 s
N = length(sample) ;
m = mean(sample) ;
sigma = sqrt(var(sample)) ;
2
beta = -sqrt(2)*erfcinv(1+alpha) ;
binf = m - beta*sigma/sqrt(N) ;
bsup = m + beta*sigma/sqrt(N) ;
hold on
for nb dx=1:length(dx tab)
dx = dx tab(nb dx) ;
t=(xmin:dx:xmax)’ ;
sol = zeros(length(t),1) ;
sol(1) = x0 ;
for i=1:(length(t)-1)
sol(i+1) = sol(i) + 3/2*sol(i)*dx ;
end
plot(t,sol,colors{nb dx}) ;
end
% solution theorique
sol th = exp(3.*t./2) ;
plot(t,sol th,’k’) ;
legend(’dx=0.50’,’dx=0.10’,’dx=0.01’,’Solution theorique’,2)
set(gca,’FontSize’,15);
hold off
saveas(gca,’res edo.eps’,’psc2’) ;
3
xmax=1 ;
a = 3/2 ;
b = 3 ;
t=(xmin:dx:xmax)’ ;
% st
s = exp((a-b^2/2).*t+b.*B) ;
% on initialise y, z et w
y = zeros(length(t),1) ;
z = zeros(length(t),1) ;
w = zeros(length(t),1) ;
y(1) = x0 ;
z(1) = x0 ;
w(1) = x0 ;
i=1 ;
y(i+1) = y(i) + a*y(i)*dx + b*y(i)*(B(i+1)-B(i));
z(i+1) = z(i) + a*z(i)*dx + b*z(i)*(B(i));
w(i+1) = w(i) + a*w(i)*dx + b*w(i)*(B(i+1))/2;
for i=2:(length(t)-1)
y(i+1) = y(i)*(1 + a*dx + b*(B(i+1)-B(i)));
z(i+1) = z(i)*(1 + a*dx + b*(B(i)-B(i-1)));
w(i+1) = w(i)*(1 + a*dx + b*(B(i+1)-B(i-1))/2);
end
figure,
plot(t,[s, y , z, w]) ;
legend([’s’ ; ’y’ ; ’z’ ; ’w’],2)
set(gca,’FontSize’,15);
title([’Resolution numerique de l EDS avec T/N=’ num2str(dx)]) ;
set(gca,’FontSize’,15);
saveas(gca,[’res eds ’ num2str(nb dx) ’.eps’],’psc2’) ;
R=exp(a.*t+b*B) ;
figure,
plot(t,R) ;
set(gca,’FontSize’,15);
title([’R t = exp(a*t+b*B t) avec T/N=’ num2str(dx)]) ;
set(gca,’FontSize’,15);
saveas(gca,[’res RT ’ num2str(nb dx) ’.eps’],’psc2’) ;
end
4
2.4 Comparaison de l’approximation par y et w
clear
close all
randn(’state’,0) ;
clc
a = 3/2 ;
b = 3 ;
dx = 0.01 ;
t=(xmin:dx:xmax)’ ;
E y = zeros(length(nb tirages),1) ;
E w = zeros(length(nb tirages),1) ;
% st
sol th = exp((a-b^2/2).*t+b.*B) ;
% on initialise y, z et w
y = zeros(length(t),1) ;
w = zeros(length(t),1) ;
y(1) = x0 ;
w(1) = x0 ;
i=1 ;
y(i+1) = y(i) + a*y(i)*dx + b*y(i)*(B(i+1)-B(i));
w(i+1) = w(i) + a*w(i)*dx + b*w(i)*(B(i+1))/2;
for i=2:(length(t)-1)
y(i+1) = y(i)*(1 + a*dx + b*(B(i+1)-B(i)));
w(i+1) = w(i)*(1 + a*dx + b*(B(i+1)-B(i-1))/2);
end
end
5
erreur y = mean(E y) ;
erreur w = mean(E w) ;
x0 = 1 ;
xmin=0 ;
xmax=1 ; % T=1
a = 3/2 ;
b = 3 ;
N = N tab(N ind) ;
dx = xmax/N ;
t=(xmin:dx:xmax)’ ;
lt = length(t) ;
% on initialise y
y = zeros(length(t),1) ;
y(1) = x0 ;
for j=1:(length(t)-1)
y(j+1) = y(j)*(1 + a*dx + b*(B(j+1)-B(j)));
end
6
% st
s = exp((a-b^2/2).*t+b.*B) ;
tps = toc ;
disp([’N = ’ num2str(N) ]) ;
disp([’Distance moyenne = ’ num2str(erreur y(N ind)) ]) ;
disp([’Intervalle de confiance = [ ’ num2str(binf) ’ , ’ num2str(bsup) ’]’ ]) ;
disp([’Temps de calcul = ’ num2str(tps) ’ s’]) ;
disp(’ ’) ;
end
figure,
plot(log(N tab)/log(10),[(erreur y)’ , 50./sqrt(N tab)’]) ;
legend(’Erreur d(y^N,S)’,’50*sqrt(N)’) ;
set(gca,’FontSize’,15);
saveas(gca,[’res err y.eps’],’psc2’) ;
7
TP4 MMFI
Schéma de Mihlstein
20 juin 2005
Introduction : Présentation du schéma de Mihlstein
On considère l’équation :
On pose :
Rt
X(t) = X(tk ) + tk dXs
Rt
= X(tk ) + tk σ(X(s))dBs
Rt
≃ X(tk ) + tk σ(X(tk ))dBs
= X(tk ) + σ(X(tk ))(B(t) − B(tk ))
C’est à dire :
1
Bs dBs = (d(Bs2 ) − ds)
2
d’où :
R tk+1 R
1 tk+1
Rt Rt
tk (B(s) − B(tk ))dBs = 2 tk d(Bs2 ) − 21 tkk+1 ds − B(tk ) tkk+1 dBs
1 2 2 1
= 2 (B(tk+1 ) − B(tk ) ) − 2 h − B(tk )(B(tk+1 ) − B(tk ))
1 2
= 2 ((B(tk+1 ) − B(tk )) − h)
1
Question 1 : Application du schéma de Mihlstein à un actif
financier
1. Comparaison avec le schéma d’Euler
Il s’agit maintenant d’appliquer le schéma pour simuler l’évolution d’un actif
financier. On s’intéresse donc à l’équation :
dSt = St (rdt + σdBt ), S(0) = x
On trouve donc :
1 1
S((k+1)h) = S(kh)(1+h(r− σ 2 )+σ[B((k+1)h)−B(kh)]+ σ 2 [B((k+1)h)−B(kh))2 ]
2 2
100
80
60
40
20
0
0 1 2 3 4 5
Le schéma de Milhstein semble meilleur que celui d’Euler, nous allons confir-
mer cela en s’intéressant à l’erreur.
2
E[sup |S(kh) − S(kh)|] ≤ ch2
k
350
300
250
200
150
100
50
0
0 0.002 0.004 0.006 0.008 0.01
h
On constate que le schéma de Milhstein permet d’obtenir une erreur bien in-
férieure au schéma d’Euler. Il est donc plus approprié à la simulation d’un actif
financier.
X
d
dXti = b(Xt )dt + σi,j (Xt )dBj (t)
j=1
3
Pour cela, il nous faudrait simuler le triplet :
Z h Z h
[B1 (h), B2 (h), B1 (s)dB2 (s) − B2 (s)dB1 (s)]
0 0
Rh Rh
Il apparait des difficultés dans la simulation de 0 B1 (s)dB2 (s)− 0 B2 (s)dB1 (s)
0.8
0.6
0.4
0.2
−0.2
−4 −3 −2 −1 0 1 2 3 4
theta
valeur theorique
valeur empirique
borne inferieure de l intervalle de confiance
borne superieure de l intervalle de confiance
4
Nb tirages = 1000, dt = 0.001
1
0.8
0.6
0.4
0.2
0
−4 −3 −2 −1 0 1 2 3 4
theta
valeur theorique
valeur empirique
borne inferieure de l intervalle de confiance
borne superieure de l intervalle de confiance
0.8
0.6
0.4
0.2
−0.2
−4 −3 −2 −1 0 1 2 3 4
theta
valeur theorique
valeur empirique
borne inferieure de l intervalle de confiance
borne superieure de l intervalle de confiance
5
Même si l’approximation semble correcte, on observe que lorsque l’on dimi-
nue le pas d’approximation des mouvements browniens, le résultat ne s’affine pas
(l’intervalle de confiance reste de largeur constante).
Cela provient du fait que la fonction suivante :
6
Annexe - TP4 MMFI
Résolution d’équations différentielles stochastiques par schéma de
Mihlstein
20 juin 2005
Table des matières
1 Sortie du programme Matlab 2
1
1 Sortie du programme Matlab
>> mihlstein_vs_euler
Resolution avec avec T/N = 0.06
Erreur du schema d Euler = 96.1041
Erreur du schema d Euler / (T/N)^2 = 26695.5919
Erreur du schema de Mihlstein = 16.4996
Erreur du schema de Mihlstein / (T/N)^2 = 4583.2264
>> erreur_approx
>> q2
Theta = -4
Moyenne theorique = 0.036619
Nombre de tirages = 1000
Moyenne empirique = 0.033496
Intervalle de confiance = [ -0.010477 , 0.077469]
Theta = -3.5
Moyenne theorique = 0.06034
Nombre de tirages = 1000
Moyenne empirique = 0.046563
Intervalle de confiance = [ 0.0020369 , 0.091088]
Theta = -3
Moyenne theorique = 0.099328
Nombre de tirages = 1000
Moyenne empirique = 0.059735
Intervalle de confiance = [ 0.016283 , 0.10319]
Theta = -2.5
Moyenne theorique = 0.16307
Nombre de tirages = 1000
Moyenne empirique = 0.19481
Intervalle de confiance = [ 0.15139 , 0.23823]
Theta = -2
2
Moyenne theorique = 0.2658
Nombre de tirages = 1000
Moyenne empirique = 0.25596
Intervalle de confiance = [ 0.21434 , 0.29758]
Theta = -1.5
Moyenne theorique = 0.4251
Nombre de tirages = 1000
Moyenne empirique = 0.39691
Intervalle de confiance = [ 0.35897 , 0.43486]
Theta = -1
Moyenne theorique = 0.64805
Nombre de tirages = 1000
Moyenne empirique = 0.643
Intervalle de confiance = [ 0.61413 , 0.67187]
Theta = -0.5
Moyenne theorique = 0.88682
Nombre de tirages = 1000
Moyenne empirique = 0.89629
Intervalle de confiance = [ 0.88488 , 0.90769]
Theta = 0
Moyenne theorique = 1
Nombre de tirages = 1000
Moyenne empirique = 1
Intervalle de confiance = [ 1 , 1]
Theta = 0.5
Moyenne theorique = 0.88682
Nombre de tirages = 1000
Moyenne empirique = 0.89526
Intervalle de confiance = [ 0.88406 , 0.90647]
Theta = 1
Moyenne theorique = 0.64805
Nombre de tirages = 1000
Moyenne empirique = 0.64145
Intervalle de confiance = [ 0.61271 , 0.67018]
Theta = 1.5
Moyenne theorique = 0.4251
Nombre de tirages = 1000
Moyenne empirique = 0.44776
Intervalle de confiance = [ 0.4113 , 0.48423]
Theta = 2
Moyenne theorique = 0.2658
Nombre de tirages = 1000
Moyenne empirique = 0.28642
Intervalle de confiance = [ 0.24575 , 0.32709]
Theta = 2.5
Moyenne theorique = 0.16307
Nombre de tirages = 1000
3
Moyenne empirique = 0.21221
Intervalle de confiance = [ 0.16907 , 0.25535]
Theta = 3
Moyenne theorique = 0.099328
Nombre de tirages = 1000
Moyenne empirique = 0.1005
Intervalle de confiance = [ 0.056803 , 0.1442]
Theta = 3.5
Moyenne theorique = 0.06034
Nombre de tirages = 1000
Moyenne empirique = 0.013025
Intervalle de confiance = [ -0.030898 , 0.056947]
Theta = 4
Moyenne theorique = 0.036619
Nombre de tirages = 1000
Moyenne empirique = 0.0022453
Intervalle de confiance = [ -0.041968 , 0.046459]
Theta = -4
Moyenne theorique = 0.036619
Nombre de tirages = 1000
Moyenne empirique = 0.017409
Intervalle de confiance = [ -0.02714 , 0.061959]
Theta = -3.5
Moyenne theorique = 0.06034
Nombre de tirages = 1000
Moyenne empirique = 0.058504
Intervalle de confiance = [ 0.015361 , 0.10165]
Theta = -3
Moyenne theorique = 0.099328
Nombre de tirages = 1000
Moyenne empirique = 0.10706
Intervalle de confiance = [ 0.063462 , 0.15065]
Theta = -2.5
Moyenne theorique = 0.16307
Nombre de tirages = 1000
Moyenne empirique = 0.12814
Intervalle de confiance = [ 0.085465 , 0.17081]
Theta = -2
Moyenne theorique = 0.2658
Nombre de tirages = 1000
Moyenne empirique = 0.2788
Intervalle de confiance = [ 0.23599 , 0.32161]
Theta = -1.5
Moyenne theorique = 0.4251
Nombre de tirages = 1000
Moyenne empirique = 0.41699
Intervalle de confiance = [ 0.37884 , 0.45513]
4
Theta = -1
Moyenne theorique = 0.64805
Nombre de tirages = 1000
Moyenne empirique = 0.64956
Intervalle de confiance = [ 0.621 , 0.67813]
Theta = -0.5
Moyenne theorique = 0.88682
Nombre de tirages = 1000
Moyenne empirique = 0.87676
Intervalle de confiance = [ 0.8635 , 0.89001]
Theta = 0
Moyenne theorique = 1
Nombre de tirages = 1000
Moyenne empirique = 1
Intervalle de confiance = [ 1 , 1]
Theta = 0.5
Moyenne theorique = 0.88682
Nombre de tirages = 1000
Moyenne empirique = 0.87996
Intervalle de confiance = [ 0.86636 , 0.89357]
Theta = 1
Moyenne theorique = 0.64805
Nombre de tirages = 1000
Moyenne empirique = 0.64255
Intervalle de confiance = [ 0.61322 , 0.67187]
Theta = 1.5
Moyenne theorique = 0.4251
Nombre de tirages = 1000
Moyenne empirique = 0.43258
Intervalle de confiance = [ 0.39488 , 0.47027]
Theta = 2
Moyenne theorique = 0.2658
Nombre de tirages = 1000
Moyenne empirique = 0.28645
Intervalle de confiance = [ 0.24542 , 0.32748]
Theta = 2.5
Moyenne theorique = 0.16307
Nombre de tirages = 1000
Moyenne empirique = 0.13716
Intervalle de confiance = [ 0.093645 , 0.18067]
Theta = 3
Moyenne theorique = 0.099328
Nombre de tirages = 1000
Moyenne empirique = 0.1061
Intervalle de confiance = [ 0.063599 , 0.1486]
Theta = 3.5
5
Moyenne theorique = 0.06034
Nombre de tirages = 1000
Moyenne empirique = 0.046512
Intervalle de confiance = [ 0.0028967 , 0.090126]
Theta = 4
Moyenne theorique = 0.036619
Nombre de tirages = 1000
Moyenne empirique = 0.015021
Intervalle de confiance = [ -0.028784 , 0.058826]
Theta = -4
Moyenne theorique = 0.036619
Nombre de tirages = 1000
Moyenne empirique = 0.02598
Intervalle de confiance = [ -0.018381 , 0.070342]
Theta = -3.5
Moyenne theorique = 0.06034
Nombre de tirages = 1000
Moyenne empirique = 0.060773
Intervalle de confiance = [ 0.017407 , 0.10414]
Theta = -3
Moyenne theorique = 0.099328
Nombre de tirages = 1000
Moyenne empirique = 0.1098
Intervalle de confiance = [ 0.065905 , 0.15369]
Theta = -2.5
Moyenne theorique = 0.16307
Nombre de tirages = 1000
Moyenne empirique = 0.15011
Intervalle de confiance = [ 0.10714 , 0.19308]
Theta = -2
Moyenne theorique = 0.2658
Nombre de tirages = 1000
Moyenne empirique = 0.26938
Intervalle de confiance = [ 0.22844 , 0.31033]
Theta = -1.5
Moyenne theorique = 0.4251
Nombre de tirages = 1000
Moyenne empirique = 0.43908
Intervalle de confiance = [ 0.40175 , 0.47642]
Theta = -1
Moyenne theorique = 0.64805
Nombre de tirages = 1000
Moyenne empirique = 0.65133
Intervalle de confiance = [ 0.6228 , 0.67986]
Theta = -0.5
Moyenne theorique = 0.88682
Nombre de tirages = 1000
6
Moyenne empirique = 0.89591
Intervalle de confiance = [ 0.88471 , 0.9071]
Theta = 0
Moyenne theorique = 1
Nombre de tirages = 1000
Moyenne empirique = 1
Intervalle de confiance = [ 1 , 1]
Theta = 0.5
Moyenne theorique = 0.88682
Nombre de tirages = 1000
Moyenne empirique = 0.89587
Intervalle de confiance = [ 0.8851 , 0.90663]
Theta = 1
Moyenne theorique = 0.64805
Nombre de tirages = 1000
Moyenne empirique = 0.63159
Intervalle de confiance = [ 0.60166 , 0.66151]
Theta = 1.5
Moyenne theorique = 0.4251
Nombre de tirages = 1000
Moyenne empirique = 0.43218
Intervalle de confiance = [ 0.39457 , 0.46979]
Theta = 2
Moyenne theorique = 0.2658
Nombre de tirages = 1000
Moyenne empirique = 0.3034
Intervalle de confiance = [ 0.26203 , 0.34476]
Theta = 2.5
Moyenne theorique = 0.16307
Nombre de tirages = 1000
Moyenne empirique = 0.15203
Intervalle de confiance = [ 0.10863 , 0.19544]
Theta = 3
Moyenne theorique = 0.099328
Nombre de tirages = 1000
Moyenne empirique = 0.11907
Intervalle de confiance = [ 0.075616 , 0.16252]
Theta = 3.5
Moyenne theorique = 0.06034
Nombre de tirages = 1000
Moyenne empirique = 0.0948
Intervalle de confiance = [ 0.050953 , 0.13865]
Theta = 4
Moyenne theorique = 0.036619
Nombre de tirages = 1000
Moyenne empirique = 0.044913
Intervalle de confiance = [ 0.00053639 , 0.08929]
7
2 Listing du code Matlab
2.1 Script servant à comparer la qualité des schémas d’Euler et Mihlstein
clear
close all
rand(’state’,0) % reset generateur aleatoire
r = 1 ;
sigma = 0.5 ;
FIGURE = 1 ;
t=(xmin:dx:xmax)’ ;
% st
s = exp((r-sigma^2/2).*t+sigma.*B) ;
% on initialise y, z et w
y = zeros(length(t),1) ;
z = zeros(length(t),1) ;
y(1) = x0 ;
z(1) = x0 ;
for i=1:(length(t)-1)
y(i+1) = y(i)*(1 + r*dx + sigma*(B(i+1)-B(i))); % euler
z(i+1) = z(i)*(1 + r*dx + sigma*(B(i+1)-B(i)) +...
1/2*sigma^2*(-dx+(B(i+1)-B(i))^2)); % milhstein
end
8
disp(’ ’)
if FIGURE
figure,
plot(t,[s, y , z]) ;
legend(’Solution exacte’,’Schema d Euler’,’Schema de Mihlstein’,2)
set(gca,’FontSize’,15);
title([’Resolution numerique de l EDS avec T/N=’ num2str(dx)]) ;
set(gca,’FontSize’,15);
saveas(gca,[’res euler mihlstein ’ num2str(nb dx) ’.eps’],’psc2’) ;
end
end
r = 1 ;
sigma = 0.5 ;
t=(xmin:dx:xmax)’ ;
for j=1:N
% st
s = exp((r-sigma^2/2).*t+sigma.*B) ;
% on initialise y, z et w
y = zeros(length(t),1) ;
z = zeros(length(t),1) ;
y(1) = x0 ;
z(1) = x0 ;
9
for i=1:(length(t)-1)
y(i+1) = y(i)*(1 + r*dx + sigma*(B(i+1)-B(i))); % euler
z(i+1) = z(i)*(1 + r*dx + sigma*(B(i+1)-B(i)) +...
1/2*sigma^2*(-dx+(B(i+1)-B(i))^2)); % milhstein
end
end
figure,
plot(dx tab,[Err y , Err z, (1000*dx tab’).^2]) ;
legend(’erreur moyenne par euler’,’erreur moyenne par milhstein’,’1000*h^2’,2) ;
set(gca,’FontSize’,15);
title([’Evolution de l erreur en fonction de h’]) ;
xlabel(’h’) ;
set(gca,’FontSize’,15);
saveas(gca,[’res evo err.eps’],’psc2’) ;
N = 1000 ;
dt tab = [0.01,0.001,0.0001] ;
dt = dt tab(dt ind) ;
t=(tmin:dt:tmax)’ ;
10
bsup theta = zeros(size(theta tab)) ;
sample = zeros(1,N) ;
for k=1:N
rv2 = sqrt(dt).*randn(length(t)-1,1) ;
B2 = [0 ; cumsum(rv2)] ;
end
disp([’Theta = ’ num2str(theta) ]) ;
disp([’Moyenne theorique = ’ num2str(moyenne theorique(n theta)) ]) ;
disp([’Nombre de tirages = ’ num2str(N) ]) ;
disp([’Moyenne empirique = ’ num2str(moyenne empirique(n theta)) ]) ;
disp([’Intervalle de confiance = [ ’ num2str(binf) ’ , ’ num2str(bsup) ’]’ ]) ;
disp(’ ’) ;
end
figure,
plot(theta tab,[moyenne theorique , moyenne empirique, binf theta, bsup theta]) ;
set(gca,’FontSize’,15);
xlabel(’theta’) ;
legend(’moyenne theorique’ , ’moyenne empirique’, ’binf theta’,...
’bsup theta’,’Location’,’SouthOutside’) ;
title([’Nb tirages = ’ num2str(N) ’, dt = ’ num2str(dt)]) ;
set(gca,’FontSize’,15);
saveas(gca,[’cosh ’ num2str(dt ind) ’.eps’] ,’psc2’) ;
pause(0.1) ;
end
N = length(sample) ;
m = mean(sample) ;
sigma = sqrt(var(sample)) ;
beta = -sqrt(2)*erfcinv(1+alpha) ;
11
binf = m - beta*sigma/sqrt(N) ;
bsup = m + beta*sigma/sqrt(N) ;
12