Variance Reduction Techniques in Simulation › Control Variates

Michael BrenndoerferDecember 3, 202514 min read
Quantitative FinanceAll chapters
Part 6 of 15Numerical Methods for Derivative Pricing
Chapter 35Variance Reduction Techniques in Simulation › Control Variates
Reading section 4 of 12 · Control Variates · 14 minSection 4 of 12 · 14 min

Book contents

Section 4 of 12 · 14 min read

Variance Reduction Techniques in Simulation › Control VariatesOne section · Sections in this chapter4 / 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

Control variates adjust Monte Carlo estimates by exploiting information from related quantities with known expected values. This section presents the mathematical framework and demonstrates practical applications to option pricing.

The Core Intuition

Control variates use a different strategy: instead of modifying how we sample, we adjust our estimate using information from a related quantity whose expected value we know exactly. The idea is analogous to using a calibration standard in measurement. If we know exactly what a reference measurement should be, we can use any deviation to correct our target measurement.

To make this intuition concrete, consider a situation where you want to estimate the average height of students in a university. Suppose you also know the exact average age of all students from registration records. When you sample students, you measure both their height and age. If your sample happens to include more older students than average, the sample average height might be biased high if older students tend to be taller. But since you know the true average age, you can detect this bias in your age measurements and use it to correct your height estimate. This is precisely what control variates do.

Suppose we want to estimate E[X]\mathbb{E}[X] but don't know its exact value. However, we have access to another random variable YY that is correlated with XX and whose expected value E[Y]\mathbb{E}[Y] we do know. During each simulation, we observe both XX and YY. If YY happens to be above its known expected value, and XX and YY are positively correlated, then XX is probably also above its expected value. We can use this information to adjust our estimate of E[X]\mathbb{E}[X] downward.

The beauty of this approach is that it exploits known information without changing the simulation procedure. We still generate the same random samples, but we extract more information from each sample by using the relationship between the target quantity and the control variable.

Mathematical Foundation

The mathematical framework for control variates formalizes the intuition of using known information to correct our estimates. The control variate estimator for E[X]\mathbb{E}[X] is:

μ^CV=Xˉ−c(Yˉ−E[Y])\hat{\mu}_{\text{CV}} = \bar{X} - c(\bar{Y} - \mathbb{E}[Y])

where:

  • μ^CV\hat{\mu}_{\text{CV}}: control variate estimator
  • Xˉ\bar{X}: sample mean of the target variable
  • Yˉ\bar{Y}: sample mean of the control variable
  • E[Y]\mathbb{E}[Y]: known expected value of the control variable
  • cc: adjustment coefficient

This formula has an elegant interpretation. The term (Yˉ−E[Y])(\bar{Y} - \mathbb{E}[Y]) measures how much our sample of YY deviates from its known expectation. This deviation is a diagnostic: it tells us whether our particular sample is biased high or low relative to the true population. The coefficient cc determines how strongly we use this diagnostic information to correct our estimate of E[X]\mathbb{E}[X]. We use this deviation to correct our estimate of E[X]\mathbb{E}[X].

The expected value of this estimator is:

E[μ^CV]=E[Xˉ−c(Yˉ−E[Y])]=E[Xˉ]−c(E[Yˉ]−E[Y])=E[X]−c(E[Y]−E[Y])=E[X]\begin{aligned} \mathbb{E}[\hat{\mu}_{\text{CV}}] &= \mathbb{E}[\bar{X} - c(\bar{Y} - \mathbb{E}[Y])] \\ &= \mathbb{E}[\bar{X}] - c(\mathbb{E}[\bar{Y}] - \mathbb{E}[Y]) \\ &= \mathbb{E}[X] - c(\mathbb{E}[Y] - \mathbb{E}[Y]) \\ &= \mathbb{E}[X] \end{aligned}

where:

  • μ^CV\hat{\mu}_{\text{CV}}: control variate estimator
  • Xˉ,Yˉ\bar{X}, \bar{Y}: sample means of target and control
  • cc: adjustment coefficient
  • E[Y]\mathbb{E}[Y]: expected value of control variable
  • E[X]\mathbb{E}[X]: expected value of target variable

The estimator is unbiased for any choice of cc since E[Yˉ]=E[Y]\mathbb{E}[\bar{Y}] = \mathbb{E}[Y]. This unbiasedness gives us freedom in choosing cc. No matter what coefficient we select, the expected value of our estimator equals the true quantity we seek. This means we can choose cc to minimize variance without worrying about introducing bias.

Now we analyze the variance of the control variate estimator to understand how to choose the optimal coefficient. The variance of the control variate estimator is:

Var(μ^CV)=Var(Xˉ−c(Yˉ−E[Y]))=Var(Xˉ)+c2Var(Yˉ)−2cCov(Xˉ,Yˉ)(properties of variance)=1n[σX2+c2σY2−2cσXY](variance of sample mean)\begin{aligned} \text{Var}(\hat{\mu}_{\text{CV}}) &= \text{Var}(\bar{X} - c(\bar{Y} - \mathbb{E}[Y])) \\ &= \text{Var}(\bar{X}) + c^2\text{Var}(\bar{Y}) - 2c\text{Cov}(\bar{X}, \bar{Y}) && \text{(properties of variance)} \\ &= \frac{1}{n}\left[\sigma_X^2 + c^2\sigma_Y^2 - 2c\sigma_{XY}\right] && \text{(variance of sample mean)} \end{aligned}

where:

  • Var(μ^CV)\text{Var}(\hat{\mu}_{\text{CV}}): variance of the control variate estimator
  • σX2\sigma_X^2: variance of XX
  • σY2\sigma_Y^2: variance of YY
  • σXY\sigma_{XY}: covariance between XX and YY
  • cc: adjustment coefficient
  • nn: number of simulations

This expression reveals the trade-off in choosing cc. The first term σX2/n\sigma_X^2/n is the variance of standard Monte Carlo. The second term c2σY2/nc^2\sigma_Y^2/n adds variance proportional to how aggressively we use the control. The third term −2cσXY/n-2c\sigma_{XY}/n subtracts variance when cc and the covariance have the same sign. The optimal choice of cc balances the benefit of using the control against the cost of adding its variability.

To minimize variance, we take the derivative with respect to cc and set it to zero:

ddcVar(μ^CV)=1n[2cσY2−2σXY]=0\frac{d}{dc}\text{Var}(\hat{\mu}_{\text{CV}}) = \frac{1}{n}[2c\sigma_Y^2 - 2\sigma_{XY}] = 0

where:

  • cc: control variate coefficient
  • nn: number of simulations
  • σY2\sigma_Y^2: variance of the control variable
  • σXY\sigma_{XY}: covariance between target and control

Solving for cc:

c∗=σXYσY2=Cov(X,Y)Var(Y)c^* = \frac{\sigma_{XY}}{\sigma_Y^2} = \frac{\text{Cov}(X, Y)}{\text{Var}(Y)}

where:

  • c∗c^*: optimal control variate coefficient
  • σXY\sigma_{XY}: covariance between XX and YY
  • σY2\sigma_Y^2: variance of YY

This optimal coefficient is precisely the slope from regressing XX on YY. This connection to regression provides both intuition and practical implementation. The regression slope measures how much XX changes per unit change in YY, which is exactly what we need to know to correct for deviations in YY from its mean. In practice, we can estimate c∗c^* by running an ordinary least squares regression of XX on YY using our simulation data.

Variance Reduction with Optimal Coefficient

Having derived the optimal coefficient, we can now determine exactly how much variance reduction the control variate method achieves. Substituting c∗c^* back into the variance formula:

Var(μ^CV∗)=σX2n(1−ρXY2)\text{Var}(\hat{\mu}_{\text{CV}}^*) = \frac{\sigma_X^2}{n}\left(1 - \rho_{XY}^2\right)

where:

  • Var(μ^CV∗)\text{Var}(\hat{\mu}_{\text{CV}}^*): variance of the optimized control variate estimator
  • σX2/n\sigma_X^2/n: variance of the standard Monte Carlo estimator
  • ρXY\rho_{XY}: correlation between target XX and control YY

This elegant result shows that the variance is reduced by a factor of (1−ρXY2)(1 - \rho_{XY}^2) compared to standard Monte Carlo. The variance reduction factor is:

VRF=11−ρXY2\text{VRF} = \frac{1}{1 - \rho_{XY}^2}

where:

  • VRF\text{VRF}: Variance Reduction Factor
  • ρXY\rho_{XY}: correlation between target XX and control YY

This formula reveals that variance reduction depends entirely on the squared correlation between XX and YY. A control variate with correlation ∣ρ∣=0.9|\rho| = 0.9 yields a variance reduction factor of 1/(1−0.81)≈5.31/(1-0.81) \approx 5.3. With ∣ρ∣=0.99|\rho| = 0.99, the factor jumps to approximately 50. The squared correlation appearing in this formula explains why finding highly correlated controls is so valuable: the benefit grows rapidly as correlation approaches 1.

Notice that the sign of the correlation does not matter because we square it. Whether the control is positively or negatively correlated with the target, the optimal coefficient will have the appropriate sign to correct for deviations. What matters is the strength of the relationship, not its direction.

Out[10]:
Visualization
Curve of variance reduction factor versus absolute correlation magnitude, rising sharply toward infinity as correlation approaches one.
Variance reduction factor (VRF) for control variates as a function of correlation magnitude $|\rho|$ between target variable $X$ and control variable $Y$. The curve shows the theoretical relationship VRF = $1/(1-\rho^2)$. Three reference points are marked: at $|\rho| = 0.8$, VRF = 2.8x; at $|\rho| = 0.9$, VRF = 5.3x; and at $|\rho| = 0.95$, VRF = 10.3x. The curve demonstrates exponential benefits as correlation increases, with dramatic improvements in efficiency for highly correlated controls.
Optimal Control Variate Coefficient

The optimal coefficient for control variates equals the regression slope of XX on YY. In practice, we estimate this coefficient from our simulation data using ordinary least squares, which introduces a small bias but typically provides near-optimal variance reduction.

Choosing Control Variates for Option Pricing

The most natural control variate for option pricing is the underlying asset itself. For a call option, define:

  • XX = discounted call option payoff = e−rTmax⁡(ST−K,0)e^{-rT}\max(S_T - K, 0)
  • YY = discounted terminal asset price = e−rTSTe^{-rT}S_T

Under risk-neutral pricing, we know that E[Y]=E[e−rTST]=S0\mathbb{E}[Y] = \mathbb{E}[e^{-rT}S_T] = S_0 (the current stock price). This provides a perfect control variate since:

  1. We observe STS_T in every simulation (we need it to compute the payoff anyway)
  2. The expected value E[e−rTST]=S0\mathbb{E}[e^{-rT}S_T] = S_0 is known exactly
  3. STS_T is highly correlated with the call payoff

The first point is particularly important from a computational perspective. Using the terminal stock price as a control adds zero additional simulation cost because we already compute STS_T to evaluate the option payoff. The information is free; we just need to use it intelligently. The second point provides the anchor that makes control variates work: the martingale property of discounted prices under the risk-neutral measure gives us exact knowledge of E[Y]\mathbb{E}[Y]. The third point ensures substantial variance reduction because the call payoff is a monotonically increasing function of the terminal stock price.

Implementation for European Options

In[11]:
Code
def monte_carlo_call_control_variate(S0, K, T, r, sigma, n_simulations):
    """
    Price a European call option using control variate technique.
    Uses the discounted terminal stock price as the control variate.
    """
    np.random.seed(42)

    Z = np.random.standard_normal(n_simulations)
    ST = S0 * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * Z)

    # Discounted payoffs
    X = np.exp(-r * T) * np.maximum(ST - K, 0)  # Option payoff
    Y = np.exp(-r * T) * ST  # Control variate

    # Known expected value of control variate
    E_Y = S0

    # Estimate optimal coefficient using regression
    cov_XY = np.cov(X, Y)[0, 1]
    var_Y = np.var(Y)
    c_optimal = cov_XY / var_Y

    # Control variate adjusted estimate
    X_adjusted = X - c_optimal * (Y - E_Y)

    price = np.mean(X_adjusted)
    std_error = np.std(X_adjusted) / np.sqrt(n_simulations)

    # Also compute standard MC for comparison
    price_std = np.mean(X)
    std_error_std = np.std(X) / np.sqrt(n_simulations)

    return {
        "price_cv": price,
        "se_cv": std_error,
        "price_std": price_std,
        "se_std": std_error_std,
        "optimal_c": c_optimal,
        "correlation": np.corrcoef(X, Y)[0, 1],
    }
In[12]:
Code
# Run control variate simulation
results = monte_carlo_call_control_variate(
    S0, K, T, r, sigma, n_simulations=100000
)
Out[13]:
Console
Control Variate Method Results
==================================================
Black-Scholes Price:      \$10.4506

Standard Monte Carlo:
  Price:                  \$10.4739
  Standard Error:         \$0.0466

Control Variate:
  Price:                  \$10.4586
  Standard Error:         \$0.0177

Optimal Coefficient c*:   0.6738
Correlation (X, Y):       0.9247
Variance Reduction Factor: 6.90x

The control variate method achieves impressive variance reduction because the terminal stock price is highly correlated with the call option payoff.

Out[14]:
Visualization
Scatter plot of discounted option payoffs versus discounted terminal stock prices with an OLS regression line and a vertical reference line at the known control variate mean.
Scatter plot showing the relationship between discounted option payoffs $X$ and discounted terminal stock prices $Y$ (the control variate). Each point represents one simulated path. The regression line indicates the optimal adjustment relationship with slope $c^* \approx 0.695$, estimated from the data using ordinary least squares. The vertical dashed line marks the known expected value $\mathbb{E}[Y] = S_0 = 100$. Payoffs to the right of this line are adjusted downward, while those to the left are adjusted upward.

Delta-Based Control Variates

For more sophisticated control variates, we rely on the martingale property of the discounted asset price. Since e−rtSte^{-rt}S_t is a martingale under the risk-neutral measure, the stochastic integral of the delta-hedging strategy with respect to the discounted price process has zero expectation:

E[∫0TΔt d(e−rtSt)]=0\mathbb{E}\left[\int_0^T \Delta_t \, d(e^{-rt}S_t)\right] = 0

where:

  • TT: time to expiration
  • Δt\Delta_t: option delta at time tt
  • StS_t: asset price at time tt
  • rr: risk-free interest rate
  • d(e−rtSt)d(e^{-rt}S_t): change in the discounted asset price

This formula represents the expected profit from a continuously rebalanced delta hedge. The delta Δt\Delta_t is the sensitivity of the option price to the underlying asset price at each instant. A perfect delta hedge should have zero expected gain because it perfectly offsets the option's risk. This theoretical result from continuous-time finance provides an ideal control variate.

Discretizing this integral gives us a control variate based on the option's delta. The intuition is that a delta-hedged option position should have zero expected gain, and gives a strong control. In practice, we simulate the hedging strategy by computing the delta at each time step using the Black-Scholes formula, then accumulating the gains and losses from the hedge as the stock price evolves along the simulated path. The discrepancy between the hedge outcome and zero can be used to correct our option price estimate.

In[15]:
Code
def monte_carlo_call_delta_control(
    S0, K, T, r, sigma, n_simulations, n_steps=252
):
    """
    Price a European call option using delta-based control variate.
    """
    np.random.seed(42)
    dt = T / n_steps

    # Initialize paths
    S = np.zeros((n_simulations, n_steps + 1))
    S[:, 0] = S0

    # Generate paths
    Z = np.random.standard_normal((n_simulations, n_steps))
    for t in range(n_steps):
        S[:, t + 1] = S[:, t] * np.exp(
            (r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z[:, t]
        )

    # Compute delta at each time step
    def bs_delta(S, K, tau, r, sigma):
        if tau <= 0:
            return np.where(S > K, 1.0, 0.0)
        d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * tau) / (
            sigma * np.sqrt(tau)
        )
        return norm.cdf(d1)

    # Control variate: sum of delta * (dS - r*S*dt)
    control = np.zeros(n_simulations)
    for t in range(n_steps):
        tau = T - t * dt
        delta = bs_delta(S[:, t], K, tau, r, sigma)
        dS = S[:, t + 1] - S[:, t]
        control += np.exp(-r * (t + 1) * dt) * delta * (dS - r * S[:, t] * dt)

    # Option payoff
    payoff = np.exp(-r * T) * np.maximum(S[:, -1] - K, 0)

    # Optimal coefficient (expected value of control is 0)
    c_optimal = np.cov(payoff, control)[0, 1] / np.var(control)

    payoff_adjusted = payoff - c_optimal * control

    price = np.mean(payoff_adjusted)
    se = np.std(payoff_adjusted) / np.sqrt(n_simulations)
    se_std = np.std(payoff) / np.sqrt(n_simulations)

    return price, se, se_std
In[16]:
Code
delta_price, delta_se, delta_se_std = monte_carlo_call_delta_control(
    S0, K, T, r, sigma, n_simulations=50000, n_steps=100
)
Out[17]:
Console
Delta-Based Control Variate Results
==================================================
Black-Scholes Price:      \$10.4506
Delta CV Price:           \$10.4519
Standard Error (CV):      \$0.002905
Standard Error (no CV):   \$0.0658
Variance Reduction Factor: 513.5x

The delta-based control variate provides dramatic variance reduction because it exploits the martingale structure of the risk-neutral pricing framework.