Skip to content
All library documents

Correlated Monte Carlo Simulation for Relative Stock Performance

Article Quant Q&A · Author: Dibbs

Summary

The document outlines a Monte Carlo approach for valuing performance share units whose payout depends on a company’s share-price performance relative to a peer group. It estimates daily log-return means, volatilities, and correlations from historical prices, combines the correlations and volatilities into a covariance matrix, and uses its Cholesky decomposition to generate correlated random shocks for geometric Brownian motion price paths.

For validation, the answer suggests using the simulated paths to price an option and comparing the result with its Black–Scholes value. Agreement as the number of simulations grows can help check whether the simulation mechanics are implemented consistently with the model. This is a model-based implementation check, not evidence that the historical estimates or geometric Brownian motion represent future returns well. The discussion does not provide numerical diagnostics or address details such as time-step scaling, covariance-matrix quality, or how to handle assumptions specific to relative-performance payouts.

Key ideas

  • Estimate return means, volatilities, and correlations from historical log returns for each stock.
  • Use a covariance matrix and its Cholesky factor to generate correlated shocks.
  • Simulate each stock’s price path using geometric Brownian motion.
  • Compare simulated option values with Black–Scholes prices as a check of implementation consistency.
  • A successful model check does not establish that the model or historical estimates describe future market behavior.

Tags

Full text
# Monte-Carlo Simulation - approx 20 Stocks with Correlation


# Monte-Carlo Simulation - approx 20 Stocks with Correlation












Believe it or not, but I studied quant finance probably 20 years ago and I haven't put my knowledge to good use in a while, so I'm a little rusty.

I need to run a Monte-Carlo simulation on a share price to value performance share units which have 0-200% performance factor based on relative share price performance vs. ~20 or so peers.

Looking at my old textbooks, I see very little examples on how to incorporate correlation between returns.

Can someone validate my approach and also give me a few pointers as to what should I look at to make sure my numerical implementation in Octave is good?

Approach to generate price paths

- Compute daily log returns for each company (last 252 days)

- Compute std and mean (calibrated on last 252 trading days)

- Compute correlation matrix of daily log returns matrix

- Create matrix of volatility/correlation

- Generate matrix of random numbers, multiplied by cholesky decomposition of the matrix generated in step 4

- Generate price path for each company via GBM

How would I go about validating my results are good?

How do I compare for example, the mean and std deviation of the end prices for one company with a theoretical solution?

Thank you

--

```
## Clear Workspace
clear

## Import Data (Daily Price Data - Newest (top) to Oldest) - Last 252 trading years
PriceData = dlmread ('PriceData.csv',',')

# Projections over 1.25 years
Numberofdays = 252*1.25;

PriceDataLogReturns = log(PriceData(1:end-1,:)./PriceData(2:end,:));
GBMParameters(1,:)=std(PriceDataLogReturns);
GBMParameters(2,:)=mean(PriceDataLogReturns);
InitialPrices = PriceData(:,end)

#Generate Correlation Matrix From Log Returns
CorrelMatrix = corr(PriceDataLogReturns);

#Create volatility matrix
Sigma = zeros(19,19);
for NbPeers = 1:1:19
   for NbPeers2 = 1:1:19
      if NbPeers==NbPeers2
      Sigma(NbPeers,NbPeers2) = GBMParameters(1,NbPeers)^2;
      else
      Sigma(NbPeers,NbPeers2) = GBMParameters(1,NbPeers)*GBMParameters(1,NbPeers2)*CorrelMatrix(NbPeers,NbPeers2);
      end
   end
end

C=chol(Sigma);

for MC = 1:1:1000
B = randn(19,Numberofdays);
V = C'*B;
Prices = zeros(Numberofdays +1,19);
Prices(1,:) = PriceData(1,:);
for i = 2:1:Numberofdays +1
  for NbPeers = 1:1:19 #Should be 19 // Set to 1 if only pulling for ATRL
Prices(i,NbPeers) = Prices(i-1,NbPeers)*exp((GBMParameters(2,NbPeers) - (0.5*GBMParameters(1,NbPeers)^2))*1 +sqrt(1)*V(NbPeers,i-1));
end

end

EndPrices(:,MC) = Prices(end,:)';
end

PSUReturns = (EndPrices./InitialPrices' - 1)*100;
```

## Answer by KaiSqDist (score 1)

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

Monte Carlo simulation (MCS), as you probably already know, can be used for simulating spot price evolutions with a drift and random component to deduce option prices.

My personal opinion as to how to validate the mean and SD of your prices is - try to apply MCS to price an option on that underlying asset, and make sure the price of that option coincides with the Black-Scholes price, which should have some common variables with the MCS simulation. At the very least, if the two prices converge, you would know the mechanics of your MCS is working correctly.

If you are asking about an economical type of validation, I don't have one.

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.