Monte Carlo Simulation for Business Decisions
Our model says $800,000 profit — but every input is a guess. Monte Carlo simulation draws thousands of possible futures and tells you the probability of each, including the chance you actually lose money.
What you'll learn
- What Monte Carlo simulation is and why single-point estimates hide critical risk
- How to read a profit distribution: mean, loss probability, and percentile ranges
- Why sensitivity analysis and expected value are incomplete on their own
- How to interpret a 5th and 95th percentile as a practical 90% confidence range
- The garbage-in-garbage-out limit of Monte Carlo and how to avoid it
Before you start
The last lesson ended on a tempting idea: stop nudging one knob at a time between two endpoints, and instead turn all the knobs at random, thousands of times, each drawn from its own probability distribution. This lesson does exactly that.
Your sensitivity analysis from the previous lesson confirmed that demand is the input that moves profit the most. Your expected-value calculation confirmed that the average outcome is positive. But your CFO just asked a harder question: What is the probability we actually lose money?
Neither tool answers that. Sensitivity analysis varies one input at a time and gives you a table of what-ifs. Expected value averages outcomes but requires you to hand-specify the probability of each scenario. Neither gives you the full distribution of profit across all the ways demand, cost, and price could realistically combine.
That is exactly what Monte Carlo simulation does.
What Monte Carlo simulation is
Monte Carlo simulation — named after the famous casino district because it relies on repeated random sampling — is a technique where, instead of plugging one best-guess value into each uncertain input, you draw each input from a probability distribution (a mathematical description of all the values a variable could plausibly take and how likely each is), compute the output, and repeat this process thousands of times. The result is not a single number but a whole distribution of outcomes: a histogram of profits showing every region from worst case to best case, along with the probability of landing in each region.
In one sentence: sensitivity analysis shows you which knob matters most; Monte Carlo turns every knob simultaneously, at random, ten thousand times, and shows you the resulting spread.
Why one number is dangerous
Suppose your business plan prints: Profit = $800,000. That number is computed from:
Profit = (Price - Unit Cost) x Demand - Fixed Costs
= ($50 - $30) x 100,000 - $1,200,000
= $800,000
The $800,000 is real — if every assumption hits its exact target. But demand is not a fixed fact. It is a guess. If demand comes in at 70,000 units instead of 100,000 units, profit collapses to $200,000. If it comes in at 55,000 units, you are in the red.
A single number tells you the destination assuming perfect aim. Monte Carlo tells you the distribution of landing spots given realistic aim.
Building the simulation: one uncertain input
In this lesson we hold price and cost fixed (they are negotiated contracts) and treat demand as the one uncertain input. We believe demand is centered on 100,000 units with a standard deviation of 20,000 units, and we model it as a Normal distribution (the symmetric bell-curve shape, appropriate when the variable is the aggregate of many independent small factors — which demand typically is). Standard deviation of 20,000 means that roughly two-thirds of the time demand falls within 20,000 units of the mean, and about 95% of the time it falls within 40,000 units.
The simulation runs the profit formula 10,000 times, each time drawing a fresh random demand from that distribution.
import numpy as np
rng = np.random.default_rng(0) # fixed seed: same result every run
N = 10_000 # number of simulated futures
# The one uncertain input: next year's demand (units). We believe it's
# centered on 100,000 with a standard deviation of 20,000.
demand = rng.normal(100_000, 20_000, N)
# Same profit model as the sensitivity lesson, run for every draw:
profit = (50 - 30) * demand - 1_200_000 # (price - cost) * demand - fixed
print("simulations :", N)
print("mean profit : $" + f"{profit.mean():,.0f}")
print("chance of a loss : " + f"{100 * (profit < 0).mean():.1f}%")
print("5th percentile (bad) : $" + f"{np.percentile(profit, 5):,.0f}")
print("95th percentile (good) : $" + f"{np.percentile(profit, 95):,.0f}")
simulations : 10000
mean profit : $802,525
chance of a loss : 2.3%
5th percentile (bad) : $148,911
95th percentile (good) : $1,455,818
Reading the output
The simulation prints five numbers. Here is what each means for your decision.
Mean profit: ~$800,000. This matches the single-point estimate exactly — which is expected. When the input distribution is symmetric (Normal) and the profit formula is linear in demand, the average output equals the output at the average input. Monte Carlo confirms the earlier calculation rather than replacing it.
Chance of a loss: ~2.3%. This is the number the single-point model cannot produce at all. Roughly 1 in 43 simulated futures ends in an outright loss. Whether that is acceptable depends on your context: 2.3% might be fine for a small discretionary project and disqualifying for a bet-the-company investment.
5th percentile: ~$149,000. In 5% of simulated futures — the worst tail — profit falls to around $149,000 or below. This is your downside guard: even in a bad year, the model says you are more likely than not to clear $149,000.
95th percentile: ~$1,456,000. In the best 5% of futures, profit reaches about $1.46 million. The gap between the 5th and 95th percentiles — roughly $149,000 to $1.46 million — is your 90% confidence range (the interval that captures the middle 90% of outcomes). A range of over $1.3 million wide is a sobering reminder of how much a single uncertain input can matter.
What the distribution adds that the point estimate hid
| What you knew before | What Monte Carlo adds |
|---|---|
| Expected profit: $800,000 | Full profit distribution across 10,000 futures |
| (Nothing) | P(loss) = 2.3%, roughly 1 in 43 |
| (Nothing) | 90% of outcomes land between ~$149k and ~$1.46M |
| Demand is the most sensitive input | Demand uncertainty alone creates a $1.3M wide range |
The mean is the same. But a decision-maker evaluating whether to greenlight this project now has something entirely different: a quantified risk profile. They can ask whether the 2.3% loss probability exceeds the firm’s risk tolerance, whether the downside of $149,000 at the 5th percentile is survivable, and whether the upside justifies the spread.
Connecting the three tools
It helps to see these lessons as a progression:
- Sensitivity analysis (previous lesson): vary one input at a time, hold the rest fixed. Tells you which input to worry about most. Does not give probabilities.
- Expected value (two lessons back): assign explicit probabilities to a few hand-chosen scenarios, compute the weighted average. Gives a single average payoff. Requires you to pre-specify every scenario.
- Monte Carlo simulation (this lesson): specify a full probability distribution for each uncertain input, sample thousands of times, read the resulting output distribution. Gives the full range plus the probability of any region — including P(loss).
Each tool answers a different question. A rigorous analysis uses all three.
What to do with the output
A Monte Carlo result is an input to a conversation, not a final answer. Typical next steps:
-
Stress-test the distribution assumption. Run the simulation again with a wider standard deviation (say, 30,000 instead of 20,000) and see how much P(loss) changes. If P(loss) jumps from 2.3% to 8%, the result is sensitive to the assumption — which should prompt more research into the demand forecast.
-
Set a risk threshold before seeing the numbers. Decide in advance: “We will proceed if P(loss) is below 5%.” This prevents the common trap of anchoring to whatever the simulation prints and declaring it acceptable after the fact.
-
Report the range, not just the mean. Presenting “$800,000 profit” to a board is incomplete. Presenting “$800,000 average profit, 2.3% chance of a loss, 90% of outcomes between $149,000 and $1.46 million” is decision-grade information.
In one breath
Monte Carlo simulation replaces each best-guess input with a probability distribution, draws a random value from each, runs the model, and repeats thousands of times — turning one number into a full picture of outcomes. Here, treating demand as Normal (mean 100,000, sd 20,000) and running 10,000 futures gives a mean profit of ~$800,000 (it confirms the point estimate), but adds what that estimate could never show: a 2.3% chance of an outright loss and a 90% range (5th–95th percentile) from ~$149k to ~$1.46M. That spread — and the loss probability — is the risk profile a decision-maker actually needs. The three tools form a ladder: sensitivity ranks which input matters, expected value averages a few hand-picked scenarios, Monte Carlo gives the whole distribution. Its hard limit is garbage-in-garbage-out: assume a thin-tailed Normal when reality is fat-tailed and your tidy 2.3% is fiction.
Practice
Quick check
A question to carry forward
That closes the decision-analysis chapter — expected value, decision trees, sensitivity, and now Monte Carlo. But look at the one ingredient every single one of them quietly assumed: a probability distribution for demand, centred on 100,000 units. Where did that number come from? We just asserted it. In reality, “demand will be about 100,000” is itself a prediction — and a lazy one if it ignores that last year trended upward and every December spikes.
So the question to carry forward is: how do you turn a history of actual numbers into a defensible forecast of the future — one that respects trend and seasonality instead of guessing a flat average? That opens the next chapter, forecasting. Monte Carlo simulated futures from an assumed distribution; forecasting derives the expected path from the patterns already sitting in your historical data.
Practice this in an interview
All questionsThe default 0.5 threshold optimises for balanced accuracy but is rarely the right choice for business objectives. The correct threshold is found by translating the business cost of false positives and false negatives into a cost matrix, then sweeping the threshold on a held-out set to find the point that minimises expected cost or maximises expected profit. Operational constraints — such as review-team capacity — further bound the feasible region.
Offline metrics often don't predict business impact, so you run a controlled online experiment: split live traffic between the current champion and the new challenger and compare a pre-registered business metric with a statistical significance test. You size the test for adequate power, watch guardrail metrics like latency and errors, and only ship if the lift is statistically and practically significant. Variance-reduction techniques like CUPED let you reach significance faster.
The optimal threshold depends on the business cost of false positives versus false negatives, not on defaulting to 0.5. You choose it by plotting the PR or ROC curve on a held-out set, computing the metric that captures your cost function (e.g., F-beta, revenue, expected cost) at each threshold, and selecting the point that maximises it. Threshold tuning is free and should always precede resampling or model changes.
Market-sizing questions test whether you can decompose a complex number into estimable sub-components, make explicit and reasonable assumptions, sanity-check against known benchmarks, and communicate uncertainty without losing structure. The answer itself matters less than the reasoning chain.