5 votos

¿Cómo hacer un puente browniano con números casi aleatorios en el modelo Heston?

Tengo que utilizar el método Euler Monte Carlo para calcular el precio de la opción bajo la configuración del modelo Heston.

Sé por algún artículo que la convergencia es volátil para el modelo de Heston con un esquema simple de Monte Carlo y Euler, así que uso el Secuencia de Sobol para generar números casi aleatorios. Sin embargo, ahora el problema viene a que la serie generada está correlacionada en diferentes pasos de tiempo.

En detalle, está bien cuando uso norminv para transformar los números cuasi aleatorios a una distribución normal estándar. Sin embargo, después de usar la correlación $\rho$ para hacer series correlacionadas en el mismo paso de tiempo, resulta que las series en diferentes pasos de tiempo también están correlacionadas. Si ignoro este problema, el resultado de mi función sería significativamente mayor que la solución analítica dada por https://quanto.inria.fr/premia/koPremia .

¿Debo utilizar un puente browniano para resolver este problema? Si es así, ¿cómo lo hago en MATLAB ? ¿O cómo podría eliminar la correlación de las series en números casi aleatorios?

Aquí está mi código MATLAB para el método Monte Carlo simple. El problema es que no converge en absoluto.

function [price,error] = heston_mc(S0, K, V0, rho, kappa, theta, eta, r, T, n, m, rseed)

    %V0 is the initial variance, and kappa is the mean reversion speed of
    %variance, theta the mean reversion level, neta the volatility of
    %variance.

    %Generate correlated random numbers

    if ~exist('rseed','var')
        rseed = 42;
    end

    seed = RandStream.create('mcg16807','seed',rseed);
    z = randn(seed, n-1, 2*m);
    zX = z(:, 1:m);
    zV = rho*zX + sqrt(1-rho^2)*z(:, m+1:2*m);
    delta = T/n;
    V = [repmat(V0,1,m); zeros(n-1,m)];
    X = [repmat(log(S0), 1, m); zeros(n-1, m)];

    for i = 2:n
        X(i, :) = X(i-1, :) + (r-max(V(i-1, :), 0)/2)*delta + sqrt(delta)*sqrt(max(V(i-1, :), 0)).*zX(i-1, :);
        V(i, :) = V(i-1, :) + kappa*(theta-max(V(i-1, :),0))*delta + eta*sqrt(delta)*sqrt(max(V(i-1, :), 0)).*zV(i-1, :);
    end

    option = exp(-r*T)*max(exp(X(end, :))-K, 0);
    price = mean(option);
    error = std(option)/sqrt(m);
end

3 votos

Los cuasi-aleatorios no ayudarán con el problema de que el esquema de Euler es malo para Heston y requiere una gran cantidad de pasos de tiempo para obtener un buen comportamiento. Ahora hay muchos trabajos sobre esquemas mejores. Véase ssrn.com/abstract=1617187 y sus referencias.

6voto

No es necesario utilizar el Secuencia de Sobol para generar números casi aleatorios en MATLAB. Sabemos que el modelo de Heston está representado por el sistema bi-variable de ecuaciones diferenciales estocásticas (SDE):

\begin{align} & d{{S}_{t}}=rS_tdt+{\sqrt\upsilon_t} d{{W}_{1}}(t) \\ & d{{\upsilon}_{t}}=\kappa(\theta-\upsilon_t) dt+\sigma{\sqrt\upsilon_t}d{{W}_{2}}(t), \\ \end{align} donde \begin{align} dW_1(t)dW_2(t)=\rho dt. \end{align}

Todos los esquemas de simulación, al igual que el esquema de Euler para el modelo de Heston, contienen los mismos pasos básicos. En primer lugar, se generan dos variables aleatorias normales independientes y se hacen dependientes aplicando una descomposición de Cholesky. Estas se multiplican por $\sqrt{\Delta t}$ para convertirlos en incrementos del movimiento browniano proxy. En segundo lugar, obtenemos el $v_{t+\Delta t}$ . En tercer lugar, obtenemos el valor actualizado $S_{t+\Delta t}$ o $x_t=\ln S_{t+\Delta t}$ .

  1. Inicializar $S_0$ al precio al contado (o $x_0$ al precio al contado del registro), e inicializar $v_0$ al parámetro de varianza actual.
  2. Generar dos variables aleatorias normales independientes $Z_1$ y $Z_2$ y definir $Z_v= Z_1$ y $Z_S=\rho Z_v+\sqrt{1-\rho^2}Z_2$ . Proxy el movimiento browniano por $dW_1(t)=\sqrt{\Delta t}Z_S$ y $dW_2(t)=\sqrt{\Delta t}Z_v$ .
  3. Obtener el valor actualizado $v_{t+\Delta t}$ .
  4. Dado $v_{t+\Delta t}$ , se obtiene el valor actualizado $S_{t+\Delta t}$ (o $x_{t+\Delta t}$ ) y volver al paso 2.

Implementación en el MATLAB

Por favor, inserte $\kappa, \theta, \sigma, v_0, S_0, r, q, \rho, T, M, and N$

Enter image description here

El ejemplo de Jianwei Zhu

Enter image description here

Salida

Enter image description here

0 votos

Mi código es similar al tuyo, pero sólo utilizo un bucle y un vector de todas las trayectorias en un paso de tiempo, a saber, a $1*M$ vector, ¿debería cambiar a un bucle doble? Pero no creo que eso suponga una diferencia.

0 votos

¡¡¡@zackhui si, pero mi método es convergente!!!

2 votos

@ zackhui tu esquema de euler difiere del de Behrouz, ya que a tu V se le permite tener valores iniciales negativos en cada paso. tal vez ese sea el problema.

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