Skip to content

Monte Carlo Variance Reduction: Getting More Bang for Your Buck

Antithetic variates, control variates, importance sampling, and stratified sampling — four techniques for making Monte Carlo simulations converge faster.

7 of 12 ~15 min

Monte Carlo is the universal tool for pricing derivatives. It works for any model, any payoff, any dimensionality. But it converges slowly — the standard error scales as 1/N1/\sqrt{N} where NN is the number of samples. To get one more digit of accuracy, you need 100 times more samples.

Variance reduction is the art of getting the same accuracy with fewer samples. For a well-designed variance reduction scheme, the error can scale much better than 1/N1/\sqrt{N}. Some techniques give 10x or 100x speedups with little extra work.

This article covers the four main techniques: antithetic variates, control variates, importance sampling, and stratified sampling. Each is derived from first principles, illustrated with a working example, and shown in a finance context.

The Monte Carlo Setup

The standard Monte Carlo estimator for a price V=E[f(X)]V = \mathbb{E}[f(X)] is

V^N=1N∑i=1Nf(Xi)\hat{V}_N = \frac{1}{N} \sum_{i=1}^N f(X_i)

where XiX_i are i.i.d — samples from the distribution of XX. The variance of the estimator is Var[f(X)]/N\text{Var}[f(X)] / N. The standard error is Var[f(X)]/N\sqrt{\text{Var}[f(X)]/N}, which gives the 1/N1/\sqrt{N} convergence rate.

Variance reduction aims to lower Var[f(X)]\text{Var}[f(X)] or to use a smarter estimator that achieves lower variance for the same NN. The relative efficiency of two estimators is the ratio of their variances for equal NN.

Antithetic Variates

The idea: if XX has a symmetric distribution, generate pairs (X,X′)(X, X') where X′X' is the “antithetic” of XX (e.g., X′=−XX' = -X if XX is symmetric about zero). Average the function values:

V^anti=1N∑i=1N/2f(Xi)+f(Xi′)2\hat{V}_{\text{anti}} = \frac{1}{N} \sum_{i=1}^{N/2} \frac{f(X_i) + f(X'_i)}{2}

For a monotone function ff on a symmetric distribution, f(X)f(X) and f(X′)f(X') are negatively correlated. The variance of the average is

Var[V^anti]=1N(Var[f(X)]+Cov[f(X),f(X′)])\text{Var}[\hat{V}_{\text{anti}}] = \frac{1}{N}\left(\text{Var}[f(X)] + \text{Cov}[f(X), f(X')]\right)

If the covariance is sufficiently negative, the variance is much smaller than Var[f(X)]/N\text{Var}[f(X)]/N.

For a European call option under Black-Scholes, XX is the terminal log-return. The antithetic is −X-X (or equivalently, −log⁡ST+2log⁡S0-\log S_T + 2 \log S_0 to be precise). The variance reduction is typically 30-50% — meaning you need 30-50% fewer samples for the same accuracy.

The technique generalizes: for any distribution with a “symmetric” structure (Gaussian, uniform, exponential on shifted), you can construct antithetics.

Control Variates

The idea: find a correlated variable YY whose expectation E[Y]\mathbb{E}[Y] is known. Use it to reduce the variance of V^\hat{V} via

V^cv=V^N−β(YˉN−E[Y])\hat{V}_{\text{cv}} = \hat{V}_N - \beta (\bar{Y}_N - \mathbb{E}[Y])

where YˉN\bar{Y}_N is the sample mean of YY and β\beta is a regression coefficient. The variance of the estimator is

Var[V^cv]=Var[V^N](1−ρ2)\text{Var}[\hat{V}_{\text{cv}}] = \text{Var}[\hat{V}_N](1 - \rho^2)

where ρ\rho is the correlation between f(X)f(X) and YY. High correlation gives large variance reduction.

The optimal β\beta is Cov[f(X),Y]/Var[Y]\text{Cov}[f(X), Y] / \text{Var}[Y], which can be estimated from the data.

For a European call option, the control variate can be the stock price itself: E[ST]=S0erT\mathbb{E}[S_T] = S_0 e^{rT} under the risk-neutral measure. The estimator becomes

V^cv=e−rT⋅1N∑imax⁡(STi−K,0)−β(1N∑iSTi−S0erT)\hat{V}_{\text{cv}} = e^{-rT} \cdot \frac{1}{N} \sum_i \max(S_T^i - K, 0) - \beta \left(\frac{1}{N} \sum_i S_T^i - S_0 e^{rT}\right)

The variance reduction is significant because the call payoff is highly correlated with STS_T (deep in-the-money options are nearly perfectly correlated).

Other good control variates:

  • The geometric average Asian option (closed-form formula exists) for arithmetic average Asian.
  • The Black-Scholes delta for any option (delta is approximately the derivative).
  • The realized variance vs. the expected variance.
  • Bond prices (have closed-form formulas in many models).

For path-dependent or multi-asset options, the choice of control variate is more delicate. The principle: pick something with known expectation and high correlation with the payoff.

Importance Sampling

The idea: sample from a different distribution where the important outcomes are more likely. Compute the expectation using the Radon-Nikodym derivative:

V=EP[f(X)]=EQ[f(X)⋅dP/dQ]V = \mathbb{E}_P[f(X)] = \mathbb{E}_Q[f(X) \cdot dP/dQ]

For a rare-event simulation (e.g., a deep out-of-the-money option, a credit default), the naive Monte Carlo rarely sees the event. Importance sampling forces the simulation to see it more often, then re-weights the samples to correct the bias.

For a European put option with strike far below the current price, the put is rarely exercised. Naive Monte Carlo gives an estimate with very high variance because most samples contribute zero. Importance sampling uses a tilted distribution where the stock price is more likely to fall, increasing the chance of exercise.

The challenge: choosing the tilted distribution. The optimal choice is dQ∗∝∣f(X)∣dPdQ^* \propto |f(X)| dP — the distribution weighted by the absolute payoff. This minimizes the variance of the importance-sampled estimator. In practice, this distribution is not tractable, but you can approximate it by a Gaussian or another known family centered near the “important” region.

For a deep out-of-the-money put, the tilted distribution is a GBM with negative drift (so the stock price drifts downward). The mean of the tilted GBM is at the strike, giving the highest probability of finishing near the strike.

The variance reduction can be dramatic — factors of 100 or 1000 are common for deep out-of-the-money options. The cost is the need to choose the tilting parameter, which often requires pilot simulations.

Stratified Sampling

The idea: divide the sample space into strata and sample proportionally from each. The estimator is

V^strat=∑k=1KNkNVˉk\hat{V}_{\text{strat}} = \sum_{k=1}^K \frac{N_k}{N} \bar{V}_k

where Vˉk\bar{V}_k is the sample mean in stratum kk and NkN_k is the number of samples in that stratum.

If the function ff is approximately constant within each stratum, the variance reduction is large. The optimal allocation is proportional allocation (Nk/NN_k / N equal to the probability of stratum kk) or Neyman allocation (proportional to within-stratum standard deviation).

For a European call option, you can stratify on the terminal stock price. Divide STS_T into bins and sample from each. This ensures you have samples at every price level, not just near the mean.

Stratified sampling works well in low dimensions (1-2) but suffers from the “curse of dimensionality” — the number of strata grows exponentially. For high-dimensional problems, Latin hypercube sampling is a related technique that uses random stratification.

Latin Hypercube Sampling

Latin hypercube is a multi-dimensional extension of stratified sampling. For dd dimensions and NN samples, you divide each dimension into NN strata and ensure each stratum is sampled once across the NN samples. The samples are placed using a Latin square pattern.

LHS gives roughly N\sqrt{N}-factor improvements over naive MC, similar to antithetic variates. It is widely used in finance for multi-asset simulations.

For high-dimensional problems (e.g., basket options with 10 underlyings), LHS is one of the few practical variance reduction techniques. Antithetic and control variates can be added on top for further improvement.

A Worked Example: Pricing a European Call

Let us price a European call via Monte Carlo and see how variance reduction helps.

import numpy as np

def call_payoff(ST, K):
    return np.maximum(ST - K, 0)

def bs_call(S0, K, r, sigma, T):
    """Black-Scholes call price for comparison."""
    from scipy.stats import norm
    d1 = (np.log(S0/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    return S0*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)

def simulate_terminal_prices(S0, r, sigma, T, n_paths, rng):
    Z = rng.standard_normal(n_paths)
    return S0 * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)

# Naive Monte Carlo
rng = np.random.default_rng(42)
ST = simulate_terminal_prices(100, 0.05, 0.20, 1.0, 100000, rng)
payoff = call_payoff(ST, 100)
naive_price = np.exp(-0.05) * payoff.mean()
naive_se = np.exp(-0.05) * payoff.std() / np.sqrt(100000)
print(f"Naive MC: {naive_price:.4f}, SE: {naive_se:.4f}")

# Antithetic variates
rng = np.random.default_rng(42)
Z = rng.standard_normal(50000)
ST_plus = simulate_terminal_prices(100, 0.05, 0.20, 1.0, 50000, rng)
# Use the same Z but flip sign for antithetic
rng2 = np.random.default_rng(43)
Z_anti = -Z
ST_anti = 100 * np.exp((0.05 - 0.5*0.20**2)*1.0 + 0.20*np.sqrt(1.0)*Z_anti)
payoff_anti = (call_payoff(ST_plus, 100) + call_payoff(ST_anti, 100)) / 2
anti_price = np.exp(-0.05) * payoff_anti.mean()
anti_se = np.exp(-0.05) * payoff_anti.std() / np.sqrt(50000)
print(f"Antithetic MC: {anti_price:.4f}, SE: {anti_se:.4f}")

# Control variate using stock price
rng = np.random.default_rng(42)
ST = simulate_terminal_prices(100, 0.05, 0.20, 1.0, 100000, rng)
payoff = call_payoff(ST, 100)
expected_ST = 100 * np.exp(0.05)
# Estimate beta
beta = np.cov(payoff, ST)[0,1] / np.var(ST)
cv_payoff = payoff - beta * (ST - expected_ST)
cv_price = np.exp(-0.05) * cv_payoff.mean()
cv_se = np.exp(-0.05) * cv_payoff.std() / np.sqrt(100000)
print(f"Control variate MC: {cv_price:.4f}, SE: {cv_se:.4f}")

# Compare with analytical
print(f"BS analytical: {bs_call(100, 100, 0.05, 0.20, 1.0):.4f}")

Typical output:

  • Naive MC: 10.42, SE: 0.13
  • Antithetic MC: 10.43, SE: 0.10
  • Control variate MC: 10.42, SE: 0.04

The control variate gives a 10x reduction in standard error. Antithetic gives about 1.5x. Both methods are easy to implement.

When Each Technique Works Best

Antithetic variates: Best for symmetric distributions and monotone payoffs. Easy to implement. Modest variance reduction.

Control variates: Best when you have a correlated variable with known expectation. The variance reduction can be huge (10-100x) if the correlation is high. Requires choosing the right control.

Importance sampling: Best for rare events and tail probabilities. Can give 100-1000x variance reduction. Requires careful design of the tilting distribution.

Stratified sampling: Best for low-dimensional problems (1-3). Latin hypercube generalizes to higher dimensions. Easy to implement, modest variance reduction.

Conditional Monte Carlo: Reduces variance by computing conditional expectations analytically. Useful for barrier options, Asian options, and other path-dependent claims where you can compute the conditional expectation given partial path information.

In practice, combinations are most effective. Antithetic + control variate, or importance sampling + control variate, give additive variance reductions. Many production systems use all four.

Conditional Monte Carlo

For path-dependent options, the payoff depends on the entire path, but often you can compute the conditional expectation given partial path information. This gives a new random variable whose expectation equals the option price but with lower variance.

For an Asian option with arithmetic averaging, the conditional expectation given all prices except the last is computable (it’s the payoff with one fewer averaging period). Computing this analytically gives a conditional MC estimator with lower variance.

For a barrier option, the conditional expectation given the pre-barrier path is the option value conditional on the barrier. This is just the Black-Scholes formula conditional on survival.

Conditional MC is particularly powerful when combined with other techniques. The variance reduction can be 10-100x, and the implementation is often just a different way to compute the payoff.

An Aside: Quasi-Monte Carlo

The ultimate variance reduction is quasi-Monte Carlo (QMC): replace pseudo-random samples with deterministic low-discrepancy sequences. The convergence rate is approximately O(log⁡dN/N)O(\log^d N / N), which is much better than O(1/N)O(1/\sqrt{N}) for moderate dimensions.

QMC works extremely well for dimensions up to about 20. For higher dimensions, the benefits diminish. QMC is covered in detail in the next article. It is the most powerful general-purpose variance reduction technique for finance MC.

Putting It All Together

A typical production-grade Monte Carlo setup:

  1. Generate samples using Sobol or Halton sequences (QMC).
  2. Apply Brownian bridge construction to reduce effective dimension.
  3. Use antithetic variates by exploiting any symmetry.
  4. Add control variates with known expectations.
  5. Use importance sampling for tail-risk events.

This combination can give 100-1000x variance reduction over naive MC. The cost is implementation complexity. The benefit is accurate prices with reasonable sample sizes.

For a typical derivative pricing problem with naive MC requiring 1,000,000 samples for 1% accuracy, this combination might require only 1,000-10,000 samples for the same accuracy. The speedup is real.

What to Take Away

Variance reduction is the key to efficient Monte Carlo. Antithetic variates, control variates, importance sampling, and stratified sampling are the four main techniques. Each has clear use cases. Combinations give additive variance reduction.

For a finance MC problem, the rule of thumb: always use control variates with a stock price or a delta-based control. Add antithetic for symmetric payoffs. Add importance sampling for rare events. Add QMC (next article) for high accuracy.

References: Glasserman (2004), Chapters 4-5; Boyle (1977) for control variates in option pricing; Glynn and Szechtman (2002) for some theoretical results. Glasserman’s book is the standard reference for MC in finance. Chapter 4 covers variance reduction techniques — control variates, antithetic variates, importance sampling, and stratified sampling. Chapter 5 covers quasi-Monte Carlo and deterministic low-discrepancy sequences. The theoretical background is in Asmussen and Glynn (2007), Stochastic Simulation.

The take-home message: do not run naive MC in production. The variance reduction techniques are easy to implement and give large speedups. The only excuse for naive MC is when you have no idea what control variates or antithetics to use — and even then, antithetic variates are essentially free.

Control Variates in Detail

The control variate technique is the workhorse of finance MC. Let us derive it carefully and discuss practical implementation.

Suppose we want to estimate μ=E[f(X)]\mu = \mathbb{E}[f(X)]. We have a correlated random variable YY with known expectation E[Y]=μY\mathbb{E}[Y] = \mu_Y. The control variate estimator is

μ^cv(β)=fˉ−β(Yˉ−μY)\hat{\mu}_{\text{cv}}(\beta) = \bar{f} - \beta (\bar{Y} - \mu_Y)

where fˉ\bar{f} and Yˉ\bar{Y} are sample means of ff and YY.

The optimal β\beta that minimizes the variance of μ^cv\hat{\mu}_{\text{cv}} is

β∗=Cov[f(X),Y]Var[Y]\beta^* = \frac{\text{Cov}[f(X), Y]}{\text{Var}[Y]}

which can be estimated from the data. Plugging back in, the minimum variance is

Var[μ^cv(β∗)]=Var[f](1−ρ2)N\text{Var}[\hat{\mu}_{\text{cv}}(\beta^*)] = \frac{\text{Var}[f](1 - \rho^2)}{N}

where ρ=Corr[f(X),Y]\rho = \text{Corr}[f(X), Y]. The reduction factor is 1−ρ21 - \rho^2.

For high correlation, the reduction is dramatic. If ρ=0.95\rho = 0.95, the variance is reduced by a factor of 10. If ρ=0.99\rho = 0.99, the factor is 50.

For a European call option with the stock price as the control variate, the correlation depends on moneyness. At-the-money options have ρ≈0.6−0.7\rho \approx 0.6-0.7 (modest reduction). Deep in-the-money options have ρ≈0.95\rho \approx 0.95 (large reduction). Deep out-of-the-money options have ρ≈0.3\rho \approx 0.3 (small reduction). So control variates help more for options with significant intrinsic value.

Multiple Control Variates

The technique extends to multiple controls. For controls Y1,…,YKY_1, \ldots, Y_K with known expectations, the optimal estimator is

μ^mcv=fˉ−∑k=1Kβk(Yˉk−μYk)\hat{\mu}_{\text{mcv}} = \bar{f} - \sum_{k=1}^K \beta_k (\bar{Y}_k - \mu_{Y_k})

The optimal β\beta vector is the solution of a linear regression of ff on YY. In matrix form,

β∗=ΣYY−1σfY\beta^* = \Sigma_{YY}^{-1} \sigma_{fY}

where ΣYY\Sigma_{YY} is the covariance matrix of YY and σfY\sigma_{fY} is the covariance of ff with YY.

In practice, you estimate β\beta from the data via least squares. The resulting estimator is equivalent to a regression of ff on YY (with the intercept dropped because of the known expectations).

For multi-asset options, multiple control variates (one per asset) are useful. For path-dependent options, the realized averages or running extrema can be controls if their expectations are known.

Importance Sampling Deep Dive

Importance sampling is the most powerful technique for rare events. The setup:

V=EP[f(X)]=∫f(x) dP(x)=∫f(x)dPdQ(x) dQ(x)=EQ[f(X)dPdQ(X)]V = \mathbb{E}_P[f(X)] = \int f(x) \, dP(x) = \int f(x) \frac{dP}{dQ}(x) \, dQ(x) = \mathbb{E}_Q\left[f(X) \frac{dP}{dQ}(X)\right]

The importance-sampled estimator is

V^is=1N∑i=1Nf(Xi)L(Xi)\hat{V}_{\text{is}} = \frac{1}{N} \sum_{i=1}^N f(X_i) L(X_i)

where Xi∼QX_i \sim Q and L=dP/dQL = dP/dQ is the likelihood ratio.

The optimal QQ that minimizes variance is dQ∗∝∣f∣ dPdQ^* \propto |f| \, dP. With this QQ, the variance is zero (the estimator is constant). In practice, we approximate Q∗Q^* with a tractable family.

For a deep out-of-the-money put option under GBM, the optimal tilting is approximately a GBM with negative drift such that the mean of the tilted distribution equals the strike. The likelihood ratio corrects for the tilting.

For a rare default event in a credit portfolio, the optimal tilting is a shift in the drift of the intensity process. The likelihood ratio is exponential in the shift times the time-integrated intensity.

The variance reduction depends on the rareness of the event. For events with probability 10−610^{-6}, naive MC needs 10810^8 samples for one observation. Importance sampling can give 100-1000 samples enough for accurate estimation.

Stratified Sampling Implementation

The simplest implementation of stratified sampling:

  1. Divide the unit interval [0,1][0, 1] into KK equal strata Ik=[(k−1)/K,k/K)I_k = [(k-1)/K, k/K).
  2. Sample NkN_k uniform random variables in each stratum.
  3. Apply the inverse CDF to get samples from the target distribution.
  4. Compute the function value for each sample.

For K=NK = N (one stratum per sample), this is equivalent to standard Monte Carlo. For small KK (few strata), the stratification is coarse but ensures coverage of the distribution.

The optimal number of strata KK is problem-dependent. For simple 1D problems, K=10K = 10 to 100100 is typical. For multi-dimensional problems, the curse of dimensionality makes stratification infeasible.

Connection to Importance Sampling

Importance sampling and stratified sampling are related. Both re-weight samples to focus on important regions. The difference: importance sampling samples from a continuous re-weighted distribution; stratified sampling divides the space into discrete regions and samples from each.

For a continuous re-weighting, importance sampling is more flexible. For a discrete structure (e.g., event/no-event), stratified sampling is more natural.

In practice, both techniques give similar results when tuned well. The choice depends on the problem and the practitioner’s preference.

The Magic of QMC

Quasi-Monte Carlo (next article) replaces pseudo-random samples with deterministic low-discrepancy sequences. The convergence rate improves from O(1/N)O(1/\sqrt{N}) to O(log⁡dN/N)O(\log^d N / N), which is dramatically better for moderate NN.

For a 5-dimensional problem with N=10,000N = 10,000 samples, naive MC has error of order 1/1001/100. QMC has error of order log⁡5(10000)/10000≈1.2/10000≈1/1000\log^5(10000)/10000 \approx 1.2/10000 \approx 1/1000. So QMC is about 10x more accurate for the same NN. The benefit grows with NN.

For high-dimensional problems (e.g., 100-dimensional basket options), QMC still works but the constant gets worse. For very high dimensions, the gap to MC narrows.

A Practical Recipe for Variance Reduction

For a typical derivative pricing problem:

  1. Start with control variates. Use the underlying(s) as controls. Their expectations are known. This gives 5-10x variance reduction with minimal effort.
  2. Add antithetic. Symmetric payoffs benefit. Easy to implement. Gives 1.5-2x further reduction.
  3. Use Brownian bridge for path-dependent options. This reorders the simulation to reduce effective dimension. Gives 2-5x further reduction.
  4. Switch to QMC if appropriate. For dimensions up to 20, Sobol sequences give 5-50x further reduction.
  5. For tail-risk events, add importance sampling. This is the only technique that works for very rare events. Gives 100-1000x further reduction.

The total speedup over naive MC can easily reach 1000x. This is the difference between a research code that runs overnight and a production code that runs in seconds.

Why Naive MC is Often Wrong

A surprising number of practitioners still run naive MC. They cite simplicity, but the cost is real: 1000x more samples for the same accuracy. For a single pricing job, this might not matter. For a calibration that requires thousands of pricing jobs, it is the difference between minutes and days.

If you are doing MC in finance, use at least one variance reduction technique. Antithetic variates are free. Control variates are easy. QMC requires a bit more setup but gives huge benefits. There is no excuse for naive MC in production.