Black-Scholes
Closed-form benchmark used to assess pricing accuracy across every scenario.
European & Binary Calls under the Risk-Neutral Measure
A Monte Carlo pricing framework comparingEuler-Maruyama, Milstein and Black-Scholesacross European and binary call options.
The project examines risk-neutral pricing, stochastic discretisation, parameter sensitivity, numerical error, convergence and antithetic variates through a Python-based simulation framework.
Main simulation paths
Steps per year
Option types
Parameter sensitivities
Price European and binary call options as discounted risk-neutral expectations and benchmark the numerical estimates against closed-form Black-Scholes values.
European Call
max(ST − K, 0)
Binary Call
1ST > K
Closed-form benchmark used to assess pricing accuracy across every scenario.
First-order stochastic time discretisation of geometric Brownian motion.
Higher-order discretisation incorporating the diffusion derivative correction term.
Paired shocks Z and −Z used to investigate variance reduction and estimator efficiency.
Underlying spot
Strike
Time to expiry
Volatility
Risk-free rate
Underlying spot
Strike
Maturity
Volatility
Risk-free rate
Payoff structure was the dominant driver of Monte Carlo error, with European calls exhibiting materially greater payoff dispersion than binary calls.
Euler and Milstein produced broadly similar pricing accuracy, with sampling variability often dominating discretisation differences.
Higher volatility and longer maturity increased numerical difficulty by widening the terminal payoff distribution.
Monte Carlo standard errors declined with the expected M−1/2 convergence rate as the number of paths increased.






The project was implemented in Python with reusable functions for Black-Scholes pricing, stochastic simulation, payoff generation, sensitivity analysis and convergence testing.
def mc_mean_se(samples: np.ndarray) -> Tuple[float, float]:
samples = np.asarray(samples, dtype=float)
return (
float(samples.mean()),
float(samples.std(ddof=1) / np.sqrt(samples.size))
)dW = sqrtdt * z[:, j]
corr = 0.5 * sigma**2 * (dW**2 - dt)
s *= (
1.0
+ r * dt
+ sigma * dW
+ corr
)The simulation framework reproduced the expected risk-neutral pricing behaviour and demonstrated that practical Monte Carlo accuracy was driven primarily by payoff dispersion and sampling variability. The project also showed that the theoretical higher-order accuracy of Milstein did not automatically translate into a material option-pricing advantage when compared with Euler at daily time steps.