Antithetic Variates
Motivation: why this matters in quant finance
Plain Monte Carlo halves its standard error only by quadrupling the sample size. Antithetic variates is the cheapest of the variance-reduction techniques: a one-line change to the simulation code that, for monotone payoffs, can cut variance by a factor of 2 or more for free.
The idea: each draw has an "antithetic twin" . If the payoff is a monotone function of , then the values at and are negatively correlated, so their average has lower variance than two independent samples.
The informal idea
Standard MC: take i.i.d. draws , compute , average.
Antithetic MC: take draws, pair each with , average over pairs:
The key quantity is
Formal statement
Let (or any distribution symmetric about 0), and consider the antithetic estimator
Compared to plain MC variance , antithetic reduces variance by factor . For maximum benefit, , giving 100% variance reduction (antithetic samples cancel exactly).
Algorithm and example
import numpy as np
def mc_call_antithetic(S0, K, T, r, sigma, N, seed=42):
rng = np.random.default_rng(seed)
Z = rng.standard_normal(N // 2)
drift = (r - 0.5*sigma**2)*T
diff = sigma*np.sqrt(T)
ST_plus = S0 * np.exp(drift + diff*Z)
ST_minus = S0 * np.exp(drift - diff*Z)
payoff = 0.5 * (np.maximum(ST_plus - K, 0) + np.maximum(ST_minus - K, 0))
discounted = np.exp(-r*T) * payoff
return discounted.mean(), discounted.std(ddof=1) / np.sqrt(N // 2)
S0, K, T, r, sigma = 100, 100, 1, 0.05, 0.2
p, se = mc_call_antithetic(S0, K, T, r, sigma, N=100_000)
print(f"Antithetic: {p:.4f} ± {1.96*se:.4f}")
# Compare with plain MC at the same total samples N=100_000:
def mc_call_plain(S0, K, T, r, sigma, N, seed=42):
rng = np.random.default_rng(seed)
Z = rng.standard_normal(N)
ST = S0 * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)
discounted = np.exp(-r*T) * np.maximum(ST - K, 0)
return discounted.mean(), discounted.std(ddof=1) / np.sqrt(N)
p_plain, se_plain = mc_call_plain(S0, K, T, r, sigma, N=100_000)
print(f"Plain: {p_plain:.4f} ± {1.96*se_plain:.4f}")
print(f"Variance ratio (plain/AV): {(se_plain*np.sqrt(100_000))**2 / (se*np.sqrt(50_000))**2:.3f}")
# Antithetic: 10.4521 ± 0.0529
# Plain: 10.4287 ± 0.0901
# Variance ratio (plain/AV): ~3.0 (varies)For an ATM call: variance reduction by factor . Equivalent to running plain MC with 3x the sample size — a significant win for one extra line of code.
Key properties
-
Free for symmetric payoffs. If (e.g., a straddle), antithetic gives zero variance: every pair averages to the same value. Of course in this case the answer is also trivially the constant , so we'd notice. More usefully: for a symmetric payoff like a butterfly, antithetic eliminates almost all the variance.
-
Effective for monotone payoffs. Calls (monotonically increasing in ) and puts (monotonically decreasing in ) get to depending on moneyness, giving 50-90% variance reduction.
-
Useless for non-monotone payoffs. Asian options on log-stock paths are not directly monotone in any single — antithetic gives small benefit. Barrier options can have positive correlation between and (both knock out for extreme paths), which actually increases variance.
-
Pairs only. Antithetic naturally generates pairs. Higher-order generalisations (using rotations of in higher dimensions) exist but rarely outperform simpler control variates.
-
Compatible with other techniques. Antithetic stacks with control variates, importance sampling, and stratified sampling. Often used together for compound variance reduction.
Worked example: deep ITM vs OTM
ATM call : , variance reduction.
Deep ITM : payoff is essentially (linear), , near-perfect cancellation. Variance reduction .
Asian call: payoff depends on the average path. Antithetic helps but with to (less negative). variance reduction.
Barrier knock-out: complicated. Sometimes helps, sometimes doesn't. Empirical check is required before deploying.
Common confusions and pitfalls
-
Variance estimator must use pairs. When estimating SE from antithetic samples, treat the pair average as a single sample. Don't compute SE over individual values; use pair averages.
-
must come from a symmetric distribution. The trick uses for . For non-symmetric base distributions (e.g., simulating an exponential), the equivalent is for uniforms, then transform.
-
Doesn't always help. Profile your specific payoff. If , antithetic is worse than plain MC. The simplest check: compute sample correlation between and on a small pilot run.
-
Not a substitute for high-quality RNG. Antithetic gives variance reduction; it does not fix bias, model error, or bad RNGs. Get the basics right first.
-
Multi-dimensional caution. For vector , antithetic flips all components: . For some payoffs, partial flips can be more effective (rotated antithetic), though this is more intricate.
Where this goes next
- Control variates — a more flexible variance-reduction tool.
- Importance sampling — best for OTM options where antithetic fails.
- Quasi-Monte Carlo — replaces randomness entirely.