Actualmente estoy tratando de fijar el precio de una opción de compra al alza y a la baja con la simulación de Montecarlo. Para una opción con estos parámetros :
- Barrera: 65
- $K$ = 50
- $\sigma$ = 30%
- $R $ = 1%
- $T$ = 1Y
- $S_0$ = 50
Con 10.000 simulaciones y $dt = \frac{1}{500}$ Obtengo un precio de la opción cercano a 0,80 (intervalo de confianza del 95% : [0,76 ; 0,853]) mientras que un pricer da 0,73. Al aumentar el número de simulaciones, el precio aumenta, por lo que es probable que esté haciendo algo mal.
Aquí está el trozo de código python que utilizo:
all_final_payoffs = np.zeros((nb_simulations,1),dtype=float)
for i in tqdm(range(nb_simulations)):
path_generated_asset = np.zeros((1, nb_time), dtype=float)
path_generated_asset[0, 0] = S0
for j in range(1, nb_time):
X = np.random.randn(1)
path_generated_asset[0, j] = simulate_price(path_generated_asset[0, j - 1], interest_rate, volatility, dt, X)
all_final_payoffs[i,0] = compute_barrier_call_payoff(path_generated_asset[0,:],strike,barrier)
option_price = np.mean(all_final_payoffs)*math.exp(-interest_rate*maturity)
Y las dos funciones utilizadas :
def compute_barrier_call_payoff(asset_path,strike,barrier):
if max(asset_path)>=barrier:
return 0
else:
if asset_path[-1]-strike>0:
return asset_path[-1]-strike
return 0
def simulate_price(S,R,Vol,dt,X):
return S*math.exp((R-(Vol**2)/2)*dt + Vol*math.sqrt(dt)*X)
¿Alguien sabe dónde está mi error? Muchas gracias.
Editar : Al aumentar el número de simulaciones a 20.000 y los pasos de tiempo a 2000, obtengo el precio en 3 minutos (muy largo) en Python. El mismo código en C# en el mismo Mac, el programa me da el resultado en 7 segundos. Al aumentar las simulaciones a 50.000 y los pasos de tiempo a 4.000, tarda unos 35 segundos en darme 0,74$.
Edición 2 : El lanzamiento del código Python con Cython y las variables tipificadas tarda 1 minuto.