4 votos

¿Cuántas tiradas de Monte Carlo necesito para fijar el precio de una llamada?

Tengo que fijar el precio de varias llamadas utilizando Monte Carlo. Obviamente, hay un gran equilibrio entre el número de ejecuciones y el precio justo de la opción de compra. Sé que puedo comprobar cómo cambia la aproximación si disminuyo el número de simulaciones, pero me preguntaba si hay un valor aproximado.

Por el momento, estoy realizando 1000 simulaciones. Pero, ¿quizás 500 sean suficientes?

6voto

gorkem Puntos 6

Realmente, depende de sus parámetros, es decir $r$ , $\sigma$ , $K$ , $T$ , $S_0$ . Por ejemplo, he aquí algunos resultados de la aplicación de los criterios de parada que explico en mi respuesta aquí . Se trata del número de iteraciones necesarias para que exista una probabilidad aproximada del 0,95 de que el precio de compra MC difiera del precio de compra exacto en menos de 0,01 (un céntimo, por ejemplo):

$r = 0.02$ , $\sigma = 0.2$ , $K = 10$ , $T = 1$ , $S_0 = 10$ 72.382 iteraciones

$r = 0.02$ , $\sigma = 0.2$ , $K = 10$ , $T = 10$ , $S_0 = 10$ : 1.391.379 iteraciones

$r = 0.02$ , $\sigma = 0.5$ , $K = 10$ , $T = 1$ , $S_0 = 10$ 625.365 iteraciones

Aquí está mi implementación en MATLAB de los criterios de parada, si quieres probar por ti mismo:

%%% Estimates the price of a European call option using MC.
% Continues MC estimation until we reach a 0.05 probability that
% MC call price differs by more than "tol" units from exact 
% call price.

function C = CallPricePointEstimate()
%%% BS parameters  - Try varying these to see how number of iters (n)
% changes %%%
K = 10;
S = 10;
r = 0.02;
T = 1;
sigma = 0.5;

%%% MC parameters %%%
% number of stock prices to generate, may need more, which are
% generated in the MC loop below if idx > N_MC
N_MC = 1000000;
tol = 0.01;  % price within $tol
bound = 5;  % something larger than tol
n = 1;  % current iteration number

%%% generate normal RVs and price paths %%%
Z = normrnd((r-sigma^2/2)*T, sigma*sqrt(T), N_MC, 1);
ST = S*exp(Z);

%%% init MC accumulators %%%
sampleMean = 0;
sampleVar = 0;
oldMean = 0;

idx = 1;  % will reset to 1 if idx > N_MC
%%% MC loop %%%
while ((bound > tol) || (n < 30))
    % if idx > N_MC, need to generate more normals
    if (idx > N_MC)
        Z = normrnd((r-sigma^2/2)*T, sigma*sqrt(T), N_MC, 1);
        ST = S*exp(Z);
        idx = 1;
    end
    payoff = exp(-r*T)*max((ST(idx) - K),0);

    % update mean and var
    sampleMean = oldMean + (payoff - oldMean)/n;
    if (n>1)
        sampleVar = (1-(1/(n-1)))*sampleVar + n*(sampleMean - oldMean)^2;
    end
    oldMean = sampleMean;

    bound = 1.96*sqrt(sampleVar/n);  %%% updated this line %%%
    n = n+1;
    idx = idx+1;
end

%%% Display num samples, statistics and vfy bound = tol %%%
n
sampleMean;
sampleVar;
bound;

C = sampleMean;  % call price

%%% exact BS price using BS formula %%%
d1 = 1/(sigma*sqrt(T)) * (log(S/K) + (r + sigma^2/2)*T);
d2 = d1 - sigma*sqrt(T);
exact = S*normcdf(d1) - K*exp(-r*T)*normcdf(d2)

Actualización: Me he dado cuenta de un error en mi código: donde bound actualizado, sampleVar/sqrt(n) debe ser sqrt(sampleVar/n) . Esto da lugar a una convergencia más rápida para unos parámetros determinados. Se ha actualizado el número de iteraciones necesarias.

2voto

Markus H Puntos 111

Esto dependerá de la naturaleza del problema. Ya ha mencionado una estrategia perfectamente buena: observe su estimación actual después de N muestras: ¿cambió significativamente? Si tienes una idea de la escala de la respuesta al problema, entonces podrás establecer un criterio de convergencia sobre la base de este cambio.

Sin embargo, supongamos que la opción que se le presenta es la más cara, ya que para conseguir una buena cobertura de la zona que le interesa (una pequeña parte del espacio total) necesitará muchas muestras. En un caso de este tipo, hay que ser precavido, incluso si la estimación parece establecerse rápidamente. A veces, un problema puede beneficiarse del muestreo mediante una secuencia cuasialeatoria que muestre de forma más "uniforme" el espacio disponible ( aquí hay una pregunta relacionada ).

Es posible que te salgas con la tuya con 500, pero algunos problemas pueden requerir 1.000.000.

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