Brownian Motion Scaling Can Force Simulated Paths to End at Zero
Summary
The question concerns simulated Brownian motion paths whose cumulative sums unexpectedly return to zero. The code standardizes each increment series by subtracting its sample mean and dividing by its sample standard deviation before applying a cumulative sum. Centering the increments makes their total sum zero, so the cumulative path is constrained to end at zero; this explains the repeated endpoint and the resulting bridge-like shape rather than an unconstrained Brownian path.
The accepted answer also flags a separate issue in the geometric Brownian motion calculation: the drift contribution should accumulate across time. The exchange diagnoses the central scaling problem but does not provide a corrected implementation or discuss alternatives for preserving correlated increments while controlling their distribution. Its lesson is specific to normalizing each finite simulated path: sample standardization changes the path endpoint constraint, even when the raw increments began as Gaussian draws.
Key ideas
- Subtracting the sample mean from each increment series forces its increments to sum to zero.
- A cumulative sum of those centered increments therefore ends at zero, producing a constrained path.
- Standardizing each finite simulated path changes its endpoint behavior even when the inputs are Gaussian.
- The geometric Brownian motion drift term must accumulate over time in the simulation.
Tags
Full text
# Brownian motion simulation - scaling issue
# Brownian motion simulation - scaling issue
I'm trying to simulate some BM for 500 observations.
I got correlated increments as I needed and they are not exactly N(0,1), so I standardize them (x-mean(x))/sd(x). But then the resulting Brownian motions are doing a weird elliptic shape and end up back on the x-axis. So I simulated fresh N(0,1) and used the standardizing function on them again (shouldnt do anything, should it?), but got the same result.
Any idea why is that? Why do they all (100 paths) converge exactly to zero? I guess it must be the normalisation function, but I cannot figure out why would they all go to zero because of that?
My code in R:
```
simGBM<-function(cov=TRUE,secs=100,Tau=500,sigma=0.05,neg.cor=0.3){
if(cov==TRUE){
# s<-apply(simSeries(simCov(secs,neg.cor),Tau),2,normalise)
m<-simCov(secs,neg.cor)
s<-simSeries(m,Tau)
} else {
s<-matrix(rnorm(secs*Tau),ncol=secs)}
dt<-1/(Tau)
BM<-apply(s,2,function(x) cumsum(sqrt(dt)*x))
GBM<-apply(BM,2,function(x) 100*exp((-0.5*sigma*sigma*dt+sigma*x)))
if(cov==TRUE) {return(list(GBM=matrix(GBM,ncol=secs),cov=m))}
else{return(matrix(GBM(ncol=secs)))}
}
normalise<-function(x){
( (x-mean(x))/sd(x) )
}
```
The s is either a series that I simulated with a some covariance structure, or pure white noise. Just to clarify, if I dont use the scaling function everything is ok and looks like it works correctly - checked against 'proven correct' examples.
## Answer by Uditg_ucla (score 1, accepted)
https://quant.stackexchange.com/a/28051
Seems like you are running cumsum on a normalised vector - which'll give you zero as the end value for each path.
Also, in the GBM, the drift term (-sigma^2*dT) needs to accumulate over time.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.