CONTENTS

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 ZZ has an "antithetic twin" Z-Z. If the payoff is a monotone function of ZZ, then the values at ZZ and Z-Z are negatively correlated, so their average has lower variance than two independent samples.

The informal idea

Standard MC: take NN i.i.d. draws Z1,,ZNN(0,1)Z_1, \dots, Z_N \sim N(0,1), compute f(Zi)f(Z_i), average.

Antithetic MC: take N/2N/2 draws, pair each ZiZ_i with Zi-Z_i, average over NN pairs:

θ^AV=1Ni=1N/2(f(Zi)+f(Zi))=2Ni=1N/2f(Zi)+f(Zi)2.\hat\theta_{AV} = \frac{1}{N}\sum_{i=1}^{N/2}\left(f(Z_i) + f(-Z_i)\right) = \frac{2}{N}\sum_{i=1}^{N/2}\frac{f(Z_i) + f(-Z_i)}{2}.

The key quantity is

Var ⁣(f(Z)+f(Z)2)=14(2Var(f(Z))+2Cov(f(Z),f(Z)))=12Var(f(Z))(1+ρ),\text{Var}\!\left(\frac{f(Z) + f(-Z)}{2}\right) = \frac{1}{4}\big(2\text{Var}(f(Z)) + 2\text{Cov}(f(Z), f(-Z))\big) = \frac{1}{2}\text{Var}(f(Z))(1 + \rho),
where ρ=Corr(f(Z),f(Z))\rho = \text{Corr}(f(Z), f(-Z)). If ρ=0\rho = 0 (independent), antithetic gives the same variance per pair as two independent samples — no benefit. If ρ<0\rho < 0 (negative correlation), antithetic reduces variance.

Formal statement

Let ZN(0,Id)Z \sim N(0, I_d) (or any distribution symmetric about 0), and consider the antithetic estimator

θ^AV=1N/2i=1N/2f(Zi)+f(Zi)2.\hat\theta_{AV} = \frac{1}{N/2}\sum_{i=1}^{N/2}\frac{f(Z_i) + f(-Z_i)}{2}.
Variance.
Var(θ^AV)=2NVar(f(Z))2(1+ρ)=Var(f(Z))N(1+ρ).\text{Var}(\hat\theta_{AV}) = \frac{2}{N}\cdot\frac{\text{Var}(f(Z))}{2}(1 + \rho) = \frac{\text{Var}(f(Z))}{N}(1 + \rho).

Compared to plain MC variance Var(f(Z))/N\text{Var}(f(Z))/N, antithetic reduces variance by factor (1+ρ)(1 + \rho). For maximum benefit, ρ1\rho \to -1, giving 100% variance reduction (antithetic samples cancel exactly).

Cost. NN payoff evaluations either way. Antithetic does N/2N/2 random draws and NN payoff evaluations; plain MC does NN random draws and NN payoff evaluations. So antithetic is slightly cheaper in random-number generation but otherwise the same compute.
When ρ<0\rho < 0. A sufficient condition is ff monotone in each component of ZZ.

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 3\sim 3. 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 f(Z)=f(Z)f(Z) = f(-Z) (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 f(Z)f(Z), 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 ZZ) and puts (monotonically decreasing in ZZ) get ρ0.5\rho \approx -0.5 to 0.9-0.9 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 ZkZ_k — antithetic gives small benefit. Barrier options can have positive correlation between f(Z)f(Z) and f(Z)f(-Z) (both knock out for extreme paths), which actually increases variance.
  • Pairs only. Antithetic naturally generates pairs. Higher-order generalisations (using rotations of ZZ 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 S0=K=100S_0 = K = 100: ρ0.85\rho \approx -0.85, 6×\sim 6\times variance reduction.

Deep ITM S0=100,K=50S_0 = 100, K = 50: payoff is essentially STKS_T - K (linear), ρ1\rho \approx -1, near-perfect cancellation. Variance reduction >100×> 100\times.

Deep OTM S0=100,K=200S_0 = 100, K = 200: most paths yield 0 from both ZZ and Z-Z — high correlation ρ+0.7\rho \approx +0.7 (both members of a pair are usually 00). Antithetic increases variance. Use importance sampling instead.

Asian call: payoff depends on the average path. Antithetic helps but with ρ0.4\rho \approx -0.4 to 0.5-0.5 (less negative). 2×\sim 2\times 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 (f(Zi)+f(Zi))/2(f(Z_i) + f(-Z_i))/2 as a single sample. Don't compute SE over NN individual values; use N/2N/2 pair averages.
  • ZZ must come from a symmetric distribution. The trick uses Z=dZ-Z \overset{d}{=} Z for ZN(0,I)Z \sim N(0, I). For non-symmetric base distributions (e.g., simulating an exponential), the equivalent is 1U1 - U for uniforms, then transform.
  • Doesn't always help. Profile your specific payoff. If ρ>0\rho > 0, antithetic is worse than plain MC. The simplest check: compute sample correlation between f(Z)f(Z) and f(Z)f(-Z) 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 ZRdZ \in \mathbb{R}^d, antithetic flips all components: Z=(Z1,,Zd)-Z = (-Z_1, \dots, -Z_d). For some payoffs, partial flips can be more effective (rotated antithetic), though this is more intricate.

Where this goes next

Exercises

Test your understanding with 3 exercises for this lesson.