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.