Objetivo: (1) Implementar el Método Explícito de Euler para resolver la EDP de los precios de las opciones bajo el modelo de Schwartz de reversión a la media. (2) Comparar con una simulación Monte Carlo.
Me quedo con el punto 1 (ver esto pregunta ) así que mientras tanto estoy trabajando en el punto 2. Básicamente, tengo 200 precios spot mensuales de una materia prima (petróleo) siguiendo la SDE de Schwartz de reversión a la media dS=α(μ−logS)Sdt+σSdW . Esta materia prima es el activo subyacente del contrato a plazo con precio a la entrega F(S,T) donde S es el precio al contado en el momento 0 y T es el tiempo de expiración. Un contrato de este tipo equivale a tener una opción con payoff(ST)=ST−K donde K=F(S,T) es el precio de ejercicio.
Dejar τ=T−t sea el tiempo hasta el vencimiento, la fórmula para el precio del contrato a plazo es
F(S,τ)=exp(e−ατlogS+(μ−σ22α−μ−rα)(1−e−ατ)+σ24α(1−e−2ατ))
y el valor de la opción equivalente es V(S,t)=e−r(T−t)F(S,t) . ( α,σ,μ se estiman a partir de los datos)
Conociendo esta información, ¿cómo ejecutar (estoy usando matlab pero otros lenguajes también valen) una simulación Monte Carlo para fijar el precio de la opción?
He leído que estos son los pasos
- generar un gran número de trayectorias de precios aleatorias para el activo subyacente
- para cada camino, calcule el beneficio de la opción
- calcula la media de todos los pagos
- descontar la media a hoy
pero como estoy trabajando con datos reales de precios al contado del petróleo, estoy un poco confuso: ¿cómo podemos obtener el valor de la opción teniendo una materia prima subyacente con precios al contado conocidos generando trayectorias aleatorias de precios al contado?
Además, ¿cómo realizar los siguientes pasos utilizando las fórmulas anteriores?
EDIT: Primer intento
He escrito el código que calcula lo que creo (¿puedes confirmarlo?) que es la solución exacta para la valoración de opciones ( V_exact
) y, a continuación, calcula la solución aproximada mediante simulación Monte Carlo ( V_Monte_Carlo
). La simulación MC utiliza el primer precio al contado (datos reales) y los parámetros estimados para calcular "aleatoriamente" los siguientes precios al contado. Para calcular los precios al contado, en lugar de utilizar la ecuación de dS que escribí más arriba es más fácil usar este que se obtiene de dS dejando X=logS .
Xt=X0e−αt+μ∗(1−e−αt)+σe−αt∫t0eαsdWs⏟Z
donde μ∗=μ−σ22α y Z∼σ√1−e−2αt2α⋅N(0,1)
Estos son los pasos de la simulación Monte Carlo:
- El primer precio
F
del contrato a plazo - y por tanto de la opciónV
también - se fija en 0, ya que no hay ningún coste por suscribir un contrato a plazo. Calcule el primer valor de X tomando el logaritmo del primer precio al contado - calcula el siguiente valor de X mediante la fórmula (2)
- calcular el siguiente valor del precio al contado tomando el exponencial de X
- calcular el siguiente precio
F
del contrato a plazo mediante la fórmula (1) - calcular el siguiente precio
V
de la opción mediante V(S,t)=e−r(T−t)F(S,t) - calcular la media
V_Monte_Carlo
de los precios de las opciones - repita los pasos 2-6 hasta que se hayan calculado todos los valores
Sin embargo, como se puede ver en la imagen inferior, la curva de los precios de las opciones obtenida con la simulación MC es suave, mientras que lo que yo esperaba era una curva similar a la de la solución exacta. Así que cometí algún error en alguna parte
% S = oil spot prices
S = [ 22.93 15.45 12.61 12.84 15.38 13.43 11.58 15.10 14.87 14.90 15.22 16.11 18.65 17.75 18.30 18.68 19.44 20.07 21.34 20.31 19.53 19.86 18.85 17.27 17.13 16.80 16.20 17.86 17.42 16.53 15.50 15.52 14.54 13.77 14.14 16.38 18.02 17.94 19.48 21.07 20.12 20.05 19.78 18.58 19.59 20.10 19.86 21.10 22.86 22.11 20.39 18.43 18.20 16.70 18.45 27.31 33.51 36.04 32.33 27.28 25.23 20.48 19.90 20.83 21.23 20.19 21.40 21.69 21.89 23.23 22.46 19.50 18.79 19.01 18.92 20.23 20.98 22.38 21.78 21.34 21.88 21.69 20.34 19.41 19.03 20.09 20.32 20.25 19.95 19.09 17.89 18.01 17.50 18.15 16.61 14.51 15.03 14.78 14.68 16.42 17.89 19.06 19.65 18.38 17.45 17.72 18.07 17.16 18.04 18.57 18.54 19.90 19.74 18.45 17.33 18.02 18.23 17.43 17.99 19.03 18.85 19.09 21.33 23.50 21.17 20.42 21.30 21.90 23.97 24.88 23.71 25.23 25.13 22.18 20.97 19.70 20.82 19.26 19.66 19.95 19.80 21.33 20.19 18.33 16.72 16.06 15.12 15.35 14.91 13.72 14.17 13.47 15.03 14.46 13.00 11.35 12.51 12.01 14.68 17.31 17.72 17.92 20.10 21.28 23.80 22.69 25.00 26.10 27.26 29.37 29.84 25.72 28.79 31.82 29.70 31.26 33.88 33.11 34.42 28.44 29.59 29.61 27.24 27.49 28.63 27.60 26.42 27.37 26.20 22.17 19.64 19.39 19.71 20.72 24.53 26.18 27.04 25.52 26.97 28.39 ];
r = .1; % yearly instantaneous interest rate
T = 1/2; % expiry time
alpha = 0.0692;
sigma = 0.0876; % values estimated from data
mu = 3.0582;
t = linspace(0,T,numel(S));
tau = T-t;
lambdahat = (mu-r)/alpha;
muhat = mu-sigma^2/2/alpha-lambdahat;
%% Is this V the exact solution?
% this F is the formula (1) on stackexchange
F = exp( exp(-alpha*tau).*log(S) + muhat*(1-exp(-alpha*tau)) + sigma^2/4/alpha*(1-exp(-2*alpha*tau)) );
% K = F(end); % shouldn't we use also the strike price?
V_exact = exp( -r*tau ) .* F; % V contains the prices of the option
plot(t,S)
hold on
plot(t,V_exact)
%% Monte Carlo simulation
n = numel(S);
N = 10000; % number of samples
mustar = mu-sigma^2/2/alpha;
X = zeros(N,n);
X(:,1) = log(S(1));
S = zeros(N,n);
S(:,1) = S(1);
F = zeros(N,n);
V = zeros(N,n);
V_Monte_Carlo = zeros(1,n);
dt = 1; % which values for dt has to be pick?
for k = 2:n
tau = T-t(k);
% this X is the formula (2) on stackexchange
X(:,k) = X(k-1)*exp(-alpha*dt) + mustar*(1-exp(-alpha*dt)) + sigma*sqrt(1-exp(-2*alpha*dt))/sqrt(2*alpha)*randn(N,1);
S(:,k) = exp(X(:,k));
F(:,k) = exp( exp(-alpha*tau).*log(S(:,k)) + muhat*(1-exp(-alpha*tau)) + sigma^2/4/alpha*(1-exp(-2*alpha*tau)) );
V(:,k) = exp(-r*tau)*F(:,k);
V_Monte_Carlo(k) = mean(V(:,k));
end
plot(t,V_Monte_Carlo,'g')
legend('Spot prices (S)','Option prices (V) from exact solution','Option prices from Monte-Carlo simulation')