Skip to content
All library documents

Comparing Geometric Brownian Motion with Compounded Normal Returns

Article Quant Q&A · Author: David Serero

Summary

The document presents a simulation question about why two terminal-value calculations produce slightly different standard deviations. One calculation uses the closed-form terminal distribution of geometric Brownian motion, with drift adjusted by half the variance rate. The other compounds a sequence of normally distributed percentage returns, each scaled by volatility, over a fixed number of periods.

The reported outputs are close but not identical. The post does not include an answer or establish which detail explains the gap. It therefore serves mainly as a setup for comparing a continuous-time GBM model with a discrete compounding construction. It does not discuss the assumptions needed to align the models, the return distribution’s interpretation, or numerical simulation error, so the figures alone do not settle the source of the difference.

Key ideas

  • The example compares a closed-form GBM terminal value with compounded period returns.
  • The GBM expression includes a drift adjustment involving volatility.
  • The compounded construction applies normally distributed returns over discrete periods.
  • The reported standard deviations are close but differ slightly.
  • The document poses the discrepancy without providing an explanation.

Tags

Full text
# What is the difference between the geometric brownian motion and cumulative product of percentage returns?


# What is the difference between the geometric brownian motion and cumulative product of percentage returns?












I wonder why the following code: one using GBM and the other using cumulative product of normally distributed percentage returns slightly different values.

```
N = 1000000   # Number of random variables
r = 0
T = 10
sig = 0.15
S0 = 1

#Geometric Brownian Motion
X = (r-0.5*sig**2)*T + sig*ss.norm.rvs( 0 , np.sqrt(T), N)
S_T = S0 * np.exp(X)

#Cumulative product of normally distributed returns 
W = sig * ss.multivariate_normal.rvs( mean=0,  size=(T,N) )
S = np.cumprod(W+1,axis=0)[-1,:]

np.std(S_T) #0.50176
np.std(S) #0.49894
```

Thanks in advance

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.