Monte Carlo Simulation for Equity Valuation

advancedPublished: 2025-12-30

Why Point Estimates Lie (The Distribution Problem)

Traditional DCF models produce a single number. The stock is worth $50. But that precision masks deep uncertainty. Revenue growth could be 5% or 12%. Margins could expand or compress. The discount rate depends on assumptions about risk premiums that shift over time.

The point is: Monte Carlo simulation replaces single assumptions with probability distributions, then runs thousands of iterations to show you the range of possible outcomes.

Instead of "the company is worth $50," Monte Carlo tells you "the company is worth between $40 and $65 with 80% probability, with a mean of $52 and median of $51."

How Monte Carlo Works: The Basic Mechanics

Step 1: Identify key uncertain inputs (revenue growth, operating margin, WACC, terminal growth, CapEx intensity)

Step 2: Assign probability distributions to each input based on historical data, analyst expectations, or informed judgment

Step 3: Run 1,000-10,000 iterations, each time randomly sampling from each distribution

Step 4: Calculate the valuation output for each iteration

Step 5: Analyze the resulting distribution of values (mean, median, standard deviation, percentiles)

The durable lesson: Each iteration represents one possible future. The distribution of outcomes shows you not just what might happen, but how likely each outcome is.

Selecting Probability Distributions

The hardest part of Monte Carlo is choosing appropriate distributions. Different variables behave differently.

Normal Distribution

Use when: Values cluster around a mean with symmetric upside and downside

Examples: Revenue growth rates in mature industries, margin variability around a trend

Parameters: Mean and standard deviation

Shape: Bell curve, symmetric around the mean

Example configuration:

  • Revenue growth: Normal distribution, mean = 4%, standard deviation = 2%
  • This implies roughly 68% probability of growth between 2% and 6%

Triangular Distribution

Use when: You can specify minimum, maximum, and most likely values

Examples: Operating margin where you know floors and ceilings, CapEx as percent of revenue

Parameters: Minimum, mode (most likely), maximum

Shape: Triangle peaking at the mode

Example configuration:

  • Operating margin: Triangular distribution, min = 9%, mode = 12%, max = 15%
  • This reflects asymmetric beliefs about margin outcomes

Log-Normal Distribution

Use when: Values cannot be negative and are right-skewed

Examples: Stock prices, company valuations, revenue in high-growth scenarios

Parameters: Mean and standard deviation of the natural logarithm

Shape: Asymmetric, bounded at zero, with a long right tail

Why this matters: Stock prices cannot go negative, so using a normal distribution for terminal value can produce nonsensical results. Log-normal prevents this.

Uniform Distribution

Use when: All values within a range are equally likely

Examples: When you genuinely have no idea where a variable will fall within bounds

Parameters: Minimum and maximum

Shape: Flat rectangle

The point is: If you cannot justify a more specific distribution, uniform at least bounds the range.

Setting Up the Simulation

Practical implementation:

Most practitioners use Excel with an add-in (like @RISK or Crystal Ball) or Python with libraries like NumPy.

Python pseudo-code:

import numpy as np

iterations = 10000
results = []

for i in range(iterations):
    # Sample from distributions
    revenue_growth = np.random.normal(0.04, 0.02)
    margin = np.random.triangular(0.09, 0.12, 0.15)
    wacc = np.random.normal(0.09, 0.01)
    terminal_growth = np.random.uniform(0.02, 0.03)

    # Calculate DCF value
    value = calculate_dcf(revenue_growth, margin, wacc, terminal_growth)
    results.append(value)

# Analyze distribution
mean_value = np.mean(results)
median_value = np.median(results)
percentile_10 = np.percentile(results, 10)
percentile_90 = np.percentile(results, 90)

Excel approach:

  1. Create input cells with distribution parameters
  2. Use functions like NORM.INV(RAND(), mean, stdev) to generate random samples
  3. Link to your DCF calculation
  4. Use a data table or VBA macro to run iterations
  5. Collect outputs in a range for analysis

The durable lesson: The mechanics are straightforward. The difficulty is in calibrating distributions to reflect reality.

Handling Correlations

In reality, inputs are not independent. Revenue growth and margin often move together. High WACC environments usually coincide with lower growth expectations.

Example correlations:

Variable PairTypical Relationship
Revenue growth and marginSometimes positive (operating leverage), sometimes negative (growth investment)
Revenue growth and WACCOften negative in recessions (lower growth, higher risk premiums)
CapEx and revenue growthPositive (growth requires investment)

Why this matters:

If you simulate revenue growth and margin independently when they are actually correlated, you can produce scenarios that would never occur in reality (e.g., 15% growth with 5% margins when historical data shows they move together).

Advanced technique: Cholesky decomposition

This mathematical method generates correlated random variables from a correlation matrix. Most simulation add-ins handle this automatically if you specify correlations.

The point is: Ignoring correlations overstates the tails of your distribution. The best and worst outcomes in your simulation may be implausible combinations.

Interpreting Results

Monte Carlo output is a distribution, not a number. Here is how to extract insight.

Key statistics:

StatisticWhat It Tells You
MeanAverage value across all iterations
MedianMiddle value; less sensitive to outliers
Standard deviationSpread of outcomes
10th percentileDownside case (90% of outcomes above this)
90th percentileUpside case (90% of outcomes below this)
Probability below current priceChance the stock is overvalued

Sample output interpretation:

"Monte Carlo simulation with 10,000 iterations produces a mean enterprise value of $52M and median of $51M. The 10th-90th percentile range is $42M to $65M. There is a 35% probability the stock is worth less than its current $48 trading price."

Visual tools:

  • Histogram: Shows the shape of the value distribution
  • Cumulative probability chart: Shows probability of being below any given value
  • Tornado chart of contribution to variance: Shows which inputs drive the most spread

The durable lesson: The width of the distribution matters as much as the center. A mean of $50 with a tight range ($48-52) is very different from a mean of $50 with a wide range ($30-80).

Common Errors and How to Avoid Them

Error 1: Assuming normal distributions for everything

Stock prices, valuations, and many financial metrics are bounded at zero and positively skewed. Using normal distributions allows impossible negative values.

Fix: Use log-normal for valuations and prices. Use triangular or bounded distributions where floors exist.

Error 2: Ignoring correlations between variables

Independent simulations can produce implausible combinations. A scenario with high growth, high margins, and low discount rates simultaneously may be unrealistic.

Fix: Explicitly model correlations or use scenario-based simulation where you sample coherent combinations.

Error 3: Running too few iterations

With only 100 iterations, results are statistically unstable. Run the simulation twice and you get different answers.

Fix: Run at least 1,000 iterations; 10,000 is better. Check that mean and percentiles stabilize as you add iterations.

The point is: If adding more iterations changes your conclusions, you have not run enough.

Error 4: Garbage in, garbage out

Monte Carlo does not make bad assumptions better. It just propagates them across many iterations. If your revenue growth distribution is wrong, your value distribution will be wrong.

Fix: Calibrate distributions carefully. Use historical data where available. Conduct sensitivity on the distribution parameters themselves.

When to Use Monte Carlo (And When Not To)

Monte Carlo adds value when:

  • Key inputs have wide uncertainty ranges
  • You need to communicate risk, not just expected value
  • Management decisions depend on probability of specific outcomes (e.g., probability of earning above cost of capital)
  • You are valuing options or contingent claims embedded in equity

Monte Carlo is overkill when:

  • Inputs are well-known and uncertainty is low
  • Simple sensitivity analysis suffices
  • You lack data to calibrate distributions properly

The durable lesson: Monte Carlo is not a substitute for good fundamental analysis. It is a tool for translating your uncertainty about inputs into uncertainty about outputs.

Connecting to Investment Decisions

Ultimately, the simulation informs action:

Valuation range overlaps with current price:

The stock trades at $48. Your simulation shows a median of $50 with a 10th-90th range of $40-65. The stock is roughly fairly valued with modest upside and meaningful downside risk.

Probability of downside:

Your simulation shows 30% probability of the stock being worth less than $40. If the stock trades at $48, there is meaningful downside risk in adverse scenarios.

Asymmetric payoffs:

If the 10th percentile is $40 (20% downside from $50) but the 90th percentile is $70 (40% upside), the distribution is positively skewed. The expected value is higher than the median.

The point is: Monte Carlo does not tell you whether to buy. It tells you the range of outcomes so you can size positions appropriately and set expectations.

Next Steps

  1. Take an existing DCF model and identify 4-5 inputs with meaningful uncertainty. Define reasonable ranges for each.

  2. Choose appropriate distributions for each input. Use normal for symmetric variables, triangular for bounded asymmetric variables, log-normal for non-negative outcomes.

  3. Implement a simple Monte Carlo in Excel (using RAND() and distribution functions) or Python. Run 1,000 iterations.

  4. Analyze the output distribution. Calculate mean, median, 10th/90th percentiles. Create a histogram.

  5. Compare the median value to current market price. Calculate the probability the stock is worth less than its trading price. Use this to inform position sizing.

Related Articles