Estoy tratando de evaluar el valor de una opción Barrera utilizando el método de Monte carlo. El stock sigue un salto modelo de difusión. Estoy utilizando el método descrito en Metwally y Atiya. Los autores describen los pasos para escribir el algoritmo en matlab decir, debe ser fácil. He implementado el primer algoritmo en matlab, que se describe en este documento, pero mis resultados no son los mismos que los de los autores. Por ejemplo, mi siguiente código da 5.1 pero de acuerdo a los autores de los resultados debe ser 9.013.
El otro problema que tengo es que la probabilidad de $P_i$ es negativo o más de 1 a veces durante la simulación. Podría la fórmula en el papel de malo?. ¿Cómo puede ser codificado para evitar esto. Yo la he utilizado como lo es en el papel.
clc
clear all
t = cputime;
%%%%%%%%%%%%%%%%%%% Parameters %%%%%%%%%%%%%%%%
S0 = 100.0;
X = 110.0;
H = 85.0;
R = 1.0;
r = 0.05;
sigma = 0.25;
T = 1.0;
%%%%%%%%%%%%%%%% Jump Parameters %%%%%%%%%%%%%%
lam = 2.0;
muA = 0.0;
sigmaA = 0.1;
%%%%%%%%%%%%%%% calculated parameters %%%%%%%%%%
k = exp(muA+0.5*sigmaA*sigmaA)-1;
c = r-0.5*sigma^2-lam*k;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 1e5; % Monte carlo runs
DP = zeros(N,1);
for n = 1:N
I = 1;
jumpTimes = 0:exprnd(lam):T; %interjump times Exp(lam)
K = size(jumpTimes,2)-1;
jumpTimes(end+1) = T;
x = log(S0);
for i = 1:K+1
tau = jumpTimes(i+1)-jumpTimes(i);
xbefore = x + c*tau + sigma*sqrt(tau)*randn();
p = 1.0-exp(-2.0*(log(H)-x)*(log(H)-xbefore)/(tau*sigma^2));
p = p*(xbefore > log(H));
b = (jumpTimes(i+1)-jumpTimes(i))/(1.0-p);
s = jumpTimes(i)+b*rand();
if s <= jumpTimes(i+1) && s >= jumpTimes(i)
gamma = exp(-(x-xbefore+c*tau)^2/(2*sigma^2*tau))/(sigma*sqrt(2*pi*tau));
g = (x-log(H))/(2*gamma*pi*sigma^2)*(s-jumpTimes(i))^(-1.5)*(jumpTimes(i+1)-s)^(-0.5)*...
exp(-((xbefore-log(H)-c*(jumpTimes(i+1)-s))^2/(2*(jumpTimes(i+1)-s)*sigma^2)+...
(x-log(H)+c*(s-jumpTimes(i)))^2/(2*(s-jumpTimes(i))*sigma^2)));
DP(n)= R*b*g*exp(-r*s);
I = 0;
break
end
A = muA + sigmaA*randn();
xafter = xbefore + A;
if xafter <= log(H)
DP(n) = R*exp(-r*jumpTimes(i+1));
I = 0;
break
end
x = xafter;
end
if I==1 % no crossing happened
DP(n) = exp(-r*T)*max(exp(xbefore) - X, 0.0);
end
end
DOC = mean(DP)
e = (cputime-t)/60;