3 votos

La valoración de las opciones de la barrera en Saltar modelo de difusión de

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;

3voto

Andrey Puntos 137

El error es, no almacenar los números aleatorios por el mismo camino, al final:

xbefore = x + c*tau + sigma*sqrt(tau)*randn()

A = muA + sigmaA*randn();

xafter = xbefore + A;

Pero, a continuación, a fin de establecer una ruta de acceso diferente aquí por la creación de un nuevo número al azar:

xT = log(S0)+(c+muA*lambda)*T+sqrt((sigma^2+(muA^2+sigmaA^2)*lambda)*T)*randn();

randn() genera una nueva variable aleatoria cada vez, por lo que necesita para almacenar la ruta de acceso específica para asegurarse de que se toma el mismo camino en xT, y no tomar un nuevo camino mediante el uso de otro *randn() para xT.

por ejemplo, el uso de otra de las variables ficticias:

rand = randn();

para utilizar el mismo número en cada bucle, y

path = path+randn();

para almacenar el total de la ruta para xT en la final.

0voto

The Brawny Man Puntos 447

Tu código tiene un error que se escoge uno al azar salto de tiempo por exprnd(lam), luego realiza un vector de salto veces con saltos de repetir en el mismo intervalo. Se debe elegir un nuevo tiempo aleatorio para cada salto.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X