使用 R 进行布朗运动模拟
Brownian motion simulation using R
时间倒数[0,100]布朗运动的模拟,路径是模拟n=1000点绘制的。我生成以下代码:
n <- 1000
t <- 100
bm <- c(0, cumsum(rnorm(n,0,sqrt(t/n))))
steps <- seq(0,t,length=n+1)
plot(steps,bm,type="l")
我怎样才能模拟标准布朗运动的 50 个样本路径,并用不同的颜色显示每条路径,就像一堆轨迹?
我认为它会类似于 replicate(50,bm)
,但是当我这样做时 xy.coords 中出现错误。
感谢您的帮助!
布朗桥在[0,1]上的模拟,路径是模拟n=1000个点绘制的。我生成以下代码
n <- 1000
t <- seq(0,1,length=n)
No.Ex<-10
bm <- c(0,cumsum(rnorm(n-1,0,1)))/sqrt(n)
B = replicate(No.Ex,{
bb <- bm - t*bm[n]
})
matplot(B, type = "l", col = cols, lty = 1)
生成几何布朗运动样本路径的代码
simGBM<- function(P0, mu, sigma, T, nSteps, nRepl){
dt<- T/nSteps
muT<- (mu-sigma^2/2)*dt
sigmaT<- sqrt(dt)*sigma
pathMatrix<- matrix(nrow = nRepl, ncol = nSteps+1)
pathMatrix[,1]<- P0
for(i in 1:nRepl){
for(j in 2:(nSteps+1)){
pathMatrix[i,j]<- pathMatrix[i,j-1]*exp(rnorm(1, muT, sigmaT))
}
}
return(pathMatrix)
}
P0<- 1 #initial price
mu<- 0.1 #drift
sigma<- 0.5 #volatility
T<- 100/360 #100 days of a commercial year
nSteps<- 50 #No of steps
nRepl<- 100 #No of replications
paths<- simGBM(P0, mu, sigma, T, nSteps, nRepl)
yBounds<- c(min(paths),max(paths)) #bounds of simulated prices
plot(paths[1,], ylim = yBounds, type = 'l',col = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
for(k in 2:numRepl) lines(paths[k,], col = k)
我正在尝试使用 matplot 函数,但无法生成相同的图形
cols = rainbow(nSteps)
matplot(paths, ylim = yBounds, type = "l", col = cols, lty = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
这个怎么样
n = 1000
t = 100
No.Ex = 10
steps = seq(0,t,length=n+1)
A = replicate(No.Ex, {
bm <- c(0, cumsum(rnorm(n,0,sqrt(t/n))))
})
cols = rainbow(No.Ex)
matplot(A, type = "l", col = cols, lty = 1)
我修改了答案并采纳了 Stephane Laurent 的 matplot
建议。这给出了下图。
编辑:
为了在评论中回答您的问题,我认为您应该保留我 bm
的初始代码,即 bm <- c(0, cumsum(rnorm(n,0,sqrt(t/n))))
。然后一切都很好!感谢您指出漂亮的 matplot
命令 @Stephane Laurent。
EDIT2:我刚刚意识到你提出了一个关于布朗桥的新问题。你可以试试这个代码
n <- 1000
t <- seq(0,1,length=n)
No.Ex<-10
B = replicate(No.Ex,{
bm <- c(0, cumsum(rnorm(n - 1,0,sqrt(t/n))))
bb <- bm - t*rep(bm[length(bm)], length.out = length(bm))
})
matplot(B, type = "l", col = cols, lty = 1)
这会产生
此外,对于几何布朗运动,请尝试对您的代码进行这种修改,减少重复次数
simGBM<- function(P0, mu, sigma, T, nSteps, nRepl){
dt<- T/nSteps
muT<- (mu-sigma^2/2)*dt
sigmaT<- sqrt(dt)*sigma
pathMatrix<- matrix(nrow = nRepl, ncol = nSteps+1)
pathMatrix[,1]<- P0
for(i in 1:nRepl){
for(j in 2:(nSteps+1)){
pathMatrix[i,j]<- pathMatrix[i,j-1]*exp(rnorm(1, muT, sigmaT))
}
}
return(pathMatrix)
}
P0<- 1 #initial price
mu<- 0.1 #drift
sigma<- 0.5 #volatility
T<- 100/360 #100 days of a commercial year
nSteps<- 50 #No of steps
nRepl<- 10 #No of replications
paths<- simGBM(P0, mu, sigma, T, nSteps, nRepl)
yBounds<- c(min(paths),max(paths)) #bounds of simulated prices
plot(paths[1,], ylim = yBounds, type = 'l',col = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
for(k in 2:nRepl) lines(paths[k,], col = k)
cols = rainbow(nSteps)
matplot(paths, ylim = yBounds, type = "l", col = cols, lty = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
在我的机器上,这会产生
时间倒数[0,100]布朗运动的模拟,路径是模拟n=1000点绘制的。我生成以下代码:
n <- 1000
t <- 100
bm <- c(0, cumsum(rnorm(n,0,sqrt(t/n))))
steps <- seq(0,t,length=n+1)
plot(steps,bm,type="l")
我怎样才能模拟标准布朗运动的 50 个样本路径,并用不同的颜色显示每条路径,就像一堆轨迹?
我认为它会类似于 replicate(50,bm)
,但是当我这样做时 xy.coords 中出现错误。
感谢您的帮助!
布朗桥在[0,1]上的模拟,路径是模拟n=1000个点绘制的。我生成以下代码
n <- 1000
t <- seq(0,1,length=n)
No.Ex<-10
bm <- c(0,cumsum(rnorm(n-1,0,1)))/sqrt(n)
B = replicate(No.Ex,{
bb <- bm - t*bm[n]
})
matplot(B, type = "l", col = cols, lty = 1)
生成几何布朗运动样本路径的代码
simGBM<- function(P0, mu, sigma, T, nSteps, nRepl){
dt<- T/nSteps
muT<- (mu-sigma^2/2)*dt
sigmaT<- sqrt(dt)*sigma
pathMatrix<- matrix(nrow = nRepl, ncol = nSteps+1)
pathMatrix[,1]<- P0
for(i in 1:nRepl){
for(j in 2:(nSteps+1)){
pathMatrix[i,j]<- pathMatrix[i,j-1]*exp(rnorm(1, muT, sigmaT))
}
}
return(pathMatrix)
}
P0<- 1 #initial price
mu<- 0.1 #drift
sigma<- 0.5 #volatility
T<- 100/360 #100 days of a commercial year
nSteps<- 50 #No of steps
nRepl<- 100 #No of replications
paths<- simGBM(P0, mu, sigma, T, nSteps, nRepl)
yBounds<- c(min(paths),max(paths)) #bounds of simulated prices
plot(paths[1,], ylim = yBounds, type = 'l',col = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
for(k in 2:numRepl) lines(paths[k,], col = k)
我正在尝试使用 matplot 函数,但无法生成相同的图形
cols = rainbow(nSteps)
matplot(paths, ylim = yBounds, type = "l", col = cols, lty = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
这个怎么样
n = 1000
t = 100
No.Ex = 10
steps = seq(0,t,length=n+1)
A = replicate(No.Ex, {
bm <- c(0, cumsum(rnorm(n,0,sqrt(t/n))))
})
cols = rainbow(No.Ex)
matplot(A, type = "l", col = cols, lty = 1)
我修改了答案并采纳了 Stephane Laurent 的 matplot
建议。这给出了下图。
编辑:
为了在评论中回答您的问题,我认为您应该保留我 bm
的初始代码,即 bm <- c(0, cumsum(rnorm(n,0,sqrt(t/n))))
。然后一切都很好!感谢您指出漂亮的 matplot
命令 @Stephane Laurent。
EDIT2:我刚刚意识到你提出了一个关于布朗桥的新问题。你可以试试这个代码
n <- 1000
t <- seq(0,1,length=n)
No.Ex<-10
B = replicate(No.Ex,{
bm <- c(0, cumsum(rnorm(n - 1,0,sqrt(t/n))))
bb <- bm - t*rep(bm[length(bm)], length.out = length(bm))
})
matplot(B, type = "l", col = cols, lty = 1)
这会产生
此外,对于几何布朗运动,请尝试对您的代码进行这种修改,减少重复次数
simGBM<- function(P0, mu, sigma, T, nSteps, nRepl){
dt<- T/nSteps
muT<- (mu-sigma^2/2)*dt
sigmaT<- sqrt(dt)*sigma
pathMatrix<- matrix(nrow = nRepl, ncol = nSteps+1)
pathMatrix[,1]<- P0
for(i in 1:nRepl){
for(j in 2:(nSteps+1)){
pathMatrix[i,j]<- pathMatrix[i,j-1]*exp(rnorm(1, muT, sigmaT))
}
}
return(pathMatrix)
}
P0<- 1 #initial price
mu<- 0.1 #drift
sigma<- 0.5 #volatility
T<- 100/360 #100 days of a commercial year
nSteps<- 50 #No of steps
nRepl<- 10 #No of replications
paths<- simGBM(P0, mu, sigma, T, nSteps, nRepl)
yBounds<- c(min(paths),max(paths)) #bounds of simulated prices
plot(paths[1,], ylim = yBounds, type = 'l',col = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
for(k in 2:nRepl) lines(paths[k,], col = k)
cols = rainbow(nSteps)
matplot(paths, ylim = yBounds, type = "l", col = cols, lty = 1, main = "Simulation of sample paths of GBM", xlab = "Time", ylab = "Price")
在我的机器上,这会产生