Cholesky Decomposition
Every valid covariance matrix has a 'square root' that turns independent noise into correlated noise — the Cholesky decomposition is how simulations get correlated random numbers out of a stream of uncorrelated ones.
Prerequisites: Variance, Intuitively, Vector Spaces and Bases
You want to simulate tomorrow's returns for ten correlated stocks. Your computer's random number generator only produces independent numbers — every draw ignorant of every other. How do you turn a stream of independent noise into ten numbers with exactly the correlation structure you specified in a covariance matrix? You need something that plays the role of a "square root" for a matrix, and the Cholesky decomposition is that square root, built specifically for the matrices that show up as covariances.
The analogy: mixing paint to hit a target colour
Suppose you have pure red, pure green, and pure blue paint (independent ingredients) and you want to mix a specific shade of brown (a target with known relationships between its components). You need a recipe: how many parts red, then how many parts green on top, then how many parts blue on top of that. Cholesky is exactly this recipe, written as a matrix. It tells you: take independent standard-normal number one, scale it; take independent number two, mix in a bit of number one, scale the result; take independent number three, mix in bits of both — and so on, until the resulting numbers have exactly the variances and covariances you asked for. Each new ingredient only ever adds to the previous ones, never adjusts something already mixed — that one-directional structure is what makes Cholesky fast and unique.
Writing it down
Take a covariance matrix — symmetric, and positive definite (meaning every portfolio built from these assets has strictly positive variance; no combination is riskless or negatively risky). The Cholesky decomposition finds a lower-triangular matrix (zeros above the diagonal) such that
In words: is a "square root" of in matrix form — multiplying it by its own transpose reconstructs the whole covariance matrix. Because is lower-triangular, its first row only touches the first variable, its second row touches the first two, and so on — that's the "mix in one ingredient at a time" recipe from the paint analogy, made precise.
To generate correlated draws: take a vector of independent standard-normal numbers (mean 0, variance 1, uncorrelated with each other), and compute
In words: multiply your plain independent noise by the recipe matrix , and the output has exactly covariance . Why? Because — the identity matrix is the covariance of independent unit-variance noise, and it drops out of the middle.
The entries of are computed one at a time, top-left to bottom-right, each one from entries already found:
In words: the diagonal entry is "how much new variance this variable has, after subtracting what's already explained by earlier variables" — under a square root, which is exactly why must be positive definite: a negative number under that square root means the matrix wasn't a legitimate covariance matrix at all.
Set the transform to a strong shear (an asymmetric stretch, not a pure rotation) and watch the unit circle become a tilted ellipse. That tilt is correlation: a lower-triangular applied to independent circular noise produces exactly this kind of tilted, elongated cloud — the shape encodes both the variances (axis lengths) and the correlation (tilt angle).
Worked example 1: two correlated assets, entirely by hand
Two assets with variances (20% vol) and (30% vol) and correlation , so . The covariance matrix is .
Step 1, first diagonal: .
Step 2, below it: .
Step 3, second diagonal: .
So . Check: — matches exactly.
Now generate one correlated draw from independent standard normals (picked for round arithmetic): ; . Notice asset 2's draw is built partly from (the shared piece, delivering correlation) and partly from its own independent (the leftover, idiosyncratic piece) — that split is the whole mechanism.
Worked example 2: pricing a spread option via simulation, one path
You want to Monte-Carlo price a spread option paying where have the above, current levels 100 and 100, and . Using the correlated draw above as one day's log-return shock scaled by : daily shocks are and , giving and . The spread is , below the strike, so this single path pays . A real pricer repeats this thousands of times, averages the payoffs, and discounts — but every single path starts from exactly this Cholesky step.
What this means in practice
- It's the engine behind every correlated Monte Carlo simulation — risk factor scenarios, VaR simulation, multi-asset option pricing all lean on .
- It's a fast, reliable way to test if a matrix is a valid covariance matrix. If Cholesky fails (a negative number appears under a square root), isn't positive definite — a real problem when covariance matrices are built from noisy, incomplete, or mismatched data.
- It's cheaper than eigen-decomposition. Where the spectral theorem gives a decomposition useful for understanding structure (principal directions), Cholesky is the workhorse for computation — roughly operations versus a more expensive full eigendecomposition.
The Cholesky decomposition is a triangular "square root" for covariance matrices. Multiplying independent standard-normal noise by produces draws with exactly the target covariance — it is the standard bridge from "my computer can only generate independent randomness" to "I need correlated randomness."
The classic confusion is assuming Cholesky works on any symmetric matrix. It only works on ones that are positive definite — every eigenvalue strictly positive, equivalently every possible portfolio has strictly positive variance. Correlation matrices estimated from limited historical data, or stitched together from different data sources, frequently fail this test (they come out only positive semi-definite, or not even that, once you have more assets than usable data points). Feeding such a matrix to Cholesky either crashes with a negative-square-root error or, worse, silently returns garbage in permissive implementations — always check positive-definiteness (or apply a fix like eigenvalue clipping) before decomposing an estimated covariance matrix.
Related concepts
Practice in interviews
Further reading
- Glasserman, Monte Carlo Methods in Financial Engineering (ch. 2)
- Golub & Van Loan, Matrix Computations (ch. 4)