Variance Reduction Techniques in Simulation › Antithetic Variates
Quantitative FinanceAll chapters Variance Reduction Techniques in Simulation › Antithetic VariatesOne section · Sections in this chapter3 / 12 ↓
Reading tools Definitions & inline links
Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.
Article links
Make inline references clickable
Antithetic variates exploit a symmetry in the random sampling process to reduce variance with minimal computational overhead. This section develops the mathematical foundation and provides practical implementation guidance.
The Core Intuition
Antithetic variates exploit a simple but powerful idea: instead of generating independent random samples, we generate pairs of negatively correlated samples. The negative correlation causes high estimates from one sample to partially cancel with low estimates from its partner. This reduces overall variance. To understand why this works, consider what happens when we average two random numbers compared to averaging two numbers that move in opposite directions.
Consider estimating the expected payoff of a call option. Some simulations will produce paths where the asset price ends up high (large payoff), while others will produce paths where it ends up low (zero payoff). If we could pair each "high" outcome with a corresponding "low" outcome, the average of each pair would be closer to the true expected value than either outcome alone. This pairing creates a cancellation effect where extreme values offset each other, producing more stable estimates.
The antithetic technique implements this pairing by using the symmetry of the standard normal distribution. If is a standard normal random variable then is also standard normal with the same distribution. More importantly, and are perfectly negatively correlated. When we use to generate one path and to generate an "antithetic" path, the two paths move in opposite directions, creating the cancellation effect we seek. This symmetry is the structural feature that makes the technique useful.
Mathematical Foundation
To understand precisely how antithetic variates reduce variance, we need to formalize the relationship between the original and antithetic samples and analyze the resulting estimator. Let where is a standard normal random variable and is the function mapping random inputs to payoffs. Define the antithetic variable . Since has the same distribution as , we have . This ensures the antithetic sample does not bias our estimate.
The antithetic estimator uses the average of each pair:
where:
- : the antithetic estimator
- : payoff from the original sample
- : payoff from the antithetic sample
- : payoff function
- : standard normal random variable
This average forms the building block of the antithetic variates method. Rather than treating each simulation independently, we pair simulations and work with the average of each pair. The key question is whether this pairing reduces variance compared to using the same total number of independent samples.
The expected value of equals the expected value we want to estimate:
where:
- : the antithetic estimator
- : payoff from the original sample
- : payoff from the antithetic sample
- : expected value of target variable
This calculation confirms that the antithetic estimator is unbiased. The expected value of our estimate equals the true quantity we want to estimate, regardless of how and are correlated. Unbiasedness is essential because it guarantees that our estimate converges to the correct value as we increase the number of simulations.
Now we analyze the variance of :
where:
- : variance of the antithetic estimator
- : variance of the single sample
- : correlation between and ,
This variance formula reveals the mathematical heart of the antithetic variates method. The key term is , which depends on the correlation between the original and antithetic samples. When independent samples are used, , and the variance of the average of two samples would be . But when the samples are negatively correlated, meaning , the term becomes smaller than 1, reducing the variance below what independent sampling would achieve.
For variance reduction to occur, we need (since we use two samples to compute ). This requires:
where:
- : variance of the single sample
- : correlation between the antithetic pair
which simplifies to . The more negative the correlation, the greater the variance reduction. In the extreme case where , the variance of the pair average drops to zero, meaning the average of and equals the true expected value exactly. While perfect negative correlation is rarely achievable in practice, even moderate negative correlation provides substantial variance reduction.

When Antithetic Variates Work
The correlation depends on the function . For monotonic functions antithetic variates are highly effective. Consider a call option payoff, which increases with the underlying asset price. High values of lead to high terminal prices and high payoffs; low values of (or equivalently, high values of ) lead to low terminal prices and low payoffs. The payoffs from and move in opposite directions, creating strong negative correlation.
To understand this more concretely, imagine a call option with a strike price at the current asset level. When we draw a positive value of , the asset drifts upward, ending above the strike and producing a positive payoff. The antithetic sample uses , which pushes the asset downward, likely ending below the strike with zero payoff. The average of a positive payoff and zero is closer to the true expected value than either extreme would be alone. This systematic pairing of high and low outcomes is what drives the variance reduction.
Antithetic variates reduce variance when the payoff function is monotonic in the underlying random variables. For option pricing, this typically holds because option values increase (for calls) or decrease (for puts) with the underlying asset price.
For non-monotonic payoffs, such as straddles or butterfly spreads, the effectiveness diminishes because the payoff might increase and then decrease as the underlying moves, breaking the negative correlation. A straddle, for instance, pays off when the underlying moves far from the strike in either direction. Both and could produce large movements, just in opposite directions, so both could yield high payoffs. The pairing no longer creates the cancellation effect that drives variance reduction.
Implementation for European Options
Let's implement antithetic variates for pricing a European call option and compare it to standard Monte Carlo simulation.
import numpy as np
def monte_carlo_european_call(
S0, K, T, r, sigma, n_simulations, antithetic=False
):
"""
Price a European call option using Monte Carlo simulation.
Parameters:
- S0: Initial stock price
- K: Strike price
- T: Time to maturity (years)
- r: Risk-free rate
- sigma: Volatility
- n_simulations: Number of simulations
- antithetic: Whether to use antithetic variates
"""
np.random.seed(42) # For reproducibility
if antithetic:
# Generate half as many random numbers
n_pairs = n_simulations // 2
Z = np.random.standard_normal(n_pairs)
# Original paths
ST_original = S0 * np.exp(
(r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * Z
)
payoff_original = np.maximum(ST_original - K, 0)
# Antithetic paths (using -Z)
ST_antithetic = S0 * np.exp(
(r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * (-Z)
)
payoff_antithetic = np.maximum(ST_antithetic - K, 0)
# Average of pairs
payoff_pairs = (payoff_original + payoff_antithetic) / 2
price = np.exp(-r * T) * np.mean(payoff_pairs)
std_error = np.exp(-r * T) * np.std(payoff_pairs) / np.sqrt(n_pairs)
else:
# Standard Monte Carlo
Z = np.random.standard_normal(n_simulations)
ST = S0 * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * Z)
payoffs = np.maximum(ST - K, 0)
price = np.exp(-r * T) * np.mean(payoffs)
std_error = np.exp(-r * T) * np.std(payoffs) / np.sqrt(n_simulations)
return price, std_errorNow let's compare the two methods. We'll use parameters for a typical at-the-money option and compute the Black-Scholes price as our benchmark.
from scipy.stats import norm
def black_scholes_call(S0, K, T, r, sigma):
"""Calculate Black-Scholes price for a European call option."""
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)
# Option parameters
S0 = 100 # Initial stock price
K = 100 # Strike price (at-the-money)
T = 1.0 # 1 year to maturity
r = 0.05 # 5% risk-free rate
sigma = 0.2 # 20% volatility
# Analytical price
bs_price = black_scholes_call(S0, K, T, r, sigma)
# Monte Carlo estimates
n_sims = 100000
mc_price, mc_se = monte_carlo_european_call(
S0, K, T, r, sigma, n_sims, antithetic=False
)
av_price, av_se = monte_carlo_european_call(
S0, K, T, r, sigma, n_sims, antithetic=True
)European Call Option Pricing Comparison ================================================== Black-Scholes Price: \$10.4506 Standard Monte Carlo: Price: \$10.4739 Standard Error: \$0.0466 Error from BS: \$0.0233 Antithetic Variates: Price: \$10.4529 Standard Error: \$0.0329 Error from BS: \$0.0023 Variance Reduction Factor: 2.01x
The antithetic variates method achieves a substantially lower standard error while using the same total number of random samples. The variance reduction factor indicates how many times more efficient the antithetic method is compared to standard Monte Carlo.
Key Parameters
The key parameters for the Black-Scholes option pricing model used in these simulations are:
- S0: Initial stock price. The starting value of the underlying asset.
- K: Strike price. The price at which the option can be exercised.
- T: Time to maturity in years.
- r: Risk-free interest rate, continuously compounded.
- σ: Volatility of the underlying asset's returns.
Visualizing the Correlation Effect
To understand why antithetic variates work, let's visualize the relationship between original and antithetic payoffs.
# Generate payoff pairs for visualization
np.random.seed(123)
n_viz = 1000
Z_viz = np.random.standard_normal(n_viz)
ST_original = S0 * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * Z_viz)
ST_antithetic = S0 * np.exp(
(r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * (-Z_viz)
)
payoff_original = np.maximum(ST_original - K, 0)
payoff_antithetic = np.maximum(ST_antithetic - K, 0)
The strong negative correlation visible in the scatter plot is what drives the variance reduction. When the original path produces a large payoff, the antithetic path tends to produce a small payoff, and their average is closer to the true expected value than either would be alone.

