Skip to content
All library documents

Simulating Correlated Asset Returns for Monte Carlo VaR

Article Quant Q&A · Author: Maf Pipo

Summary

The document outlines a Monte Carlo approach to estimating portfolio value-at-risk for a portfolio with multiple assets. It starts with the portfolio’s current value and an estimated covariance matrix, then uses a matrix square root such as a Cholesky factor to transform independent standard normal draws into correlated shocks. Those shocks feed a geometric Brownian motion model for each asset’s terminal price; the simulated prices are then used to revalue the portfolio and calculate its return. Repeating the process produces a distribution of portfolio returns that can be sorted to assess downside outcomes.

The explanation clarifies that each simulation uses a vector with one shock per asset, with dependence introduced through the covariance matrix. It gives the mathematical transformation and a sample implementation for several variables. The discussion is introductory: it does not specify how to estimate drift or volatility, choose a VaR confidence level or horizon, handle non-normal returns, or validate model assumptions. The code example is illustrative and should not be treated as a complete risk model.

Key ideas

  • A multivariate simulation uses one independent standard normal draw for each asset in a scenario.
  • A covariance matrix square root transforms independent draws into shocks with the desired covariance structure.
  • Correlated shocks can drive asset terminal prices under a geometric Brownian motion assumption.
  • Portfolio returns are computed by revaluing the holdings across many simulated scenarios.
  • VaR estimates depend on the calibration data and the assumptions used for returns and portfolio valuation.

Tags

Full text
# Monte Carlo model with multiple assets step by step


# Monte Carlo model with multiple assets step by step












Here are the following steps to calculate Monte Carlo VaR. I am learning how to proceed with each steps and I would need somebody who can explain. Do I have to create only 1 vector in step 4 (even if i have multi asset portfolio) ? In which case I don't understand which mu and sigma i use to created my standard normal variates since I want to mimic estimators from my assets log returns.

Here are the steps I have managed to pickup using different sources:

- Estimate the portfolio's current value $P_0$.

- Build the portfolio's covariance matrix using stock historical data.

- Create the Cholesky decomposition of the covariance matrix.

- Generate a vector of n independent standard normal variates

- multiply the matrix resulting from the Cholesky decomposition with the vector of standard normal variates in order to get a vector of correlated variates.

- Calculate the assets' terminal prices using geometric brownian motion. $S_i(T) = S_i(0) \cdot e^{((\mu-\frac{\sigma^2}{2})T + \sigma \sqrt{T} \epsilon_i})$, where $\epsilon_i$ corresponds to the correlated random variate for asset $i$ obtained from the vector of correlated variates.

- reevaluate the portfolio's value at time $T$, $P_T$, using the stock prices generated in the previous step.

- Calculate the portfolio return using $R_T=\frac{P_T−P_0}{P_0}$

- Repeat steps 4-8 many times (for example $n=10,000$ simulations).

- Sort the returns in ascending order.

## Answer by phdstudent (score 2)

https://quant.stackexchange.com/a/41792

Here's an example correlating 3 random normal variables that you can apply to your monte carlo:

Let:

$$ \bf Y \sim \mathcal N(0, \Sigma) $$

where $\textbf{Y} = (Y_1,\dots,Y_n)$ is the vector of normal random variables, and $\Sigma$ the given covariance matrix.

The process is:

- Simulate a vector of uncorrelated Gaussian random variables, $\bf Z $

- Then find a square root of $\Sigma$, i.e. a matrix $\bf C$ such that $\bf C \bf C^\intercal = \Sigma$.

Then the target vector is given by $$ \bf Y = \bf C \bf Z. $$

Here is a dummy matlab code:

```
N = 500000
u_1 = normrnd(zeros(N,1),1);
u_2 = normrnd(zeros(N,1),1);
u_3 = normrnd(zeros(N,1),1);
u_4 = normrnd(zeros(N,1),1);

rv = [u_1 '; u_2'; u_3'; u_4'];

VarCov = [Some positive semi-definite matrix here 4x4];

ch = chol(VarCov);
result = ch * rv;
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.