Brownian Motion
Brownian Motion simulation in R.
Definición:
Un proceso estocástico \(\{B(t), t\geq 0\}\)
es un movimiento Browniano si cumple las siguientes propiedades:
1.- \(B(0) = 0\)
2.- \(\{B(t), t\geq 0\}\)
tiene incrementos independientes y estacionarios.
3.- Para \(t>0\)
, B(t) tiene distribución normal con media cero y varianza \(t\)
.
Simulación:
Sea
$$0 = t_0 < t_1 < t_2 < , ..., < t_{n-1} < t_n = T$$
\
Consideremos una partición sobre \([0, T]\)
dada por \(\Delta t = T/n\)
, tal que
$$0 = t_0 < t_1=\Delta t < t_2 = 2\Delta t < , ..., < t_{n-1} = (n-1)\Delta t< t_n = n \Delta t = T$$
\
entonces para simular trajectorias del movimiento Browniano consideremos los incrementos
$$B(t_1) - B(t_0) \sim N(0, t_1 - t_0) = N(0, \Delta t - 0) = \sqrt{\Delta t} N(0, 1)$$
$$ B(t_2) - B(t_1) \sim N(0, t_2 - t_1) = N(0, 2\Delta t-\Delta t) = \sqrt{\Delta t} N(0, 1)$$
$$ \vdots $$
$$ B(t_n) - B(t_{n-1}) \sim N(0, t_n - t_{n-1}) = N(0, n\Delta t-(n-1)\Delta t) = \sqrt{\Delta t} N(0, 1)$$ \
Sumando los incrementos se tiene que
$$ B(t_n) - B(t_0) \sim \sum_{i=1}^{n} \sqrt{\Delta t} N(0, 1)$$
dado que \(B(t_0) = 0\)
entonces
$$ B(t_n) \sim \sqrt{\Delta t} \sum_{i=1}^{n} N(0, 1)$$
y dado que \(\sqrt{\Delta t} = T/n\)
, finalmente tenemos que
$$ B(t_n) \sim \sqrt{\frac{T}{n}} \sum_{i=1}^{n} N(0, 1)$$
# Función para simular un movimiento Browniano
simMB <- function(t, nSteps, nReps){
dt <- t/ nSteps
#
simMat <- matrix(nrow=nReps, ncol=(nSteps+1))
simMat[ ,1] <- 0
for(i in 1:nReps){
for(j in 2:(nSteps + 1)){
simMat[i,j] <- simMat[i,j-1] + sqrt(dt)*rnorm(1,0,1)
}
}
names <- c('Rep', sapply(0:nSteps, function(i) paste('S',i,sep='')))
df <- data.frame('Rep'=1:nReps, simMat)
colnames(df) <- names
return(df)
}
Ejemplo 1: Una trayectoria del Movimiento Browniano
# valores
t <- 1000
nSteps <- 1000 # número de pasos
nReps <- 1 # número de trajectorias
bm1 <- simMB(t, nSteps, nReps)
# data
df <- bm1 %>%
pivot_longer(!Rep, names_to='Step', values_to='value') %>%
mutate(t = as.numeric(substring(Step,2,10))*t/nSteps,
Rep = as.character(Rep))
head(df)
## # A tibble: 6 × 4
## Rep Step value t
## <chr> <chr> <dbl> <dbl>
## 1 1 S0 0 0
## 2 1 S1 -0.391 1
## 3 1 S2 -0.735 2
## 4 1 S3 0.977 3
## 5 1 S4 -0.826 4
## 6 1 S5 -0.813 5
# valores teóricos
moments <- data.frame('t'=seq(from=0, to=1, length=nSteps+1)*t) %>%
mutate('mean' = 0,
'sd_inf' = mean - 2*sqrt(t),
'sd_sup' = mean + 2*sqrt(t))
# Gráfico
options(repr.plot.width=16, repr.plot.height=8)
p1 <- ggplot(df, mapping=aes(x=t, y=value, color=Rep)) +
geom_line() +
geom_step(moments, mapping=aes(x=t,y=mean),col='red',size=0.7, alpha=0.5) +
geom_step(moments, mapping=aes(x=t,y=sd_sup),col='blue',size=0.7,linetype = "dashed") +
geom_step(moments, mapping=aes(x=t,y=sd_inf),col='blue',size=0.7,linetype = "dashed") +
labs( title = paste(nReps, "Trajectoria(s) del MB")) +
theme(legend.position = "none") +
scale_colour_grey(start = 0.2,end = 0.8)
#coord_cartesian(xlim = c(0, tmax))
p1
Ejemplo 2: Mil trayectorias del movimiento Browniano
# valores
t <- 1000
nSteps <- 1000 # número de pasos
nReps <- 1000 # número de trajectorias
bm1 <- simMB(t, nSteps, nReps)
# data
df <- bm1 %>%
pivot_longer(!Rep, names_to='Step', values_to='value') %>%
mutate(t = as.numeric(substring(Step,2,10))*t/nSteps,
Rep = as.character(Rep))
# valores teóricos
moments <- data.frame('t'=seq(from=0, to=1, length=nSteps+1)*t) %>%
mutate('mean' = 0,
'sd_inf' = mean - 2*sqrt(t),
'sd_sup' = mean + 2*sqrt(t))
# Gráfico
options(repr.plot.width=16, repr.plot.height=8)
p1 <- ggplot(df, mapping=aes(x=t, y=value, color=Rep)) +
geom_line() +
geom_step(moments, mapping=aes(x=t,y=mean),col='red',size=0.7, alpha=0.5) +
geom_step(moments, mapping=aes(x=t,y=sd_sup),col='blue',size=0.7,linetype = "dashed") +
geom_step(moments, mapping=aes(x=t,y=sd_inf),col='blue',size=0.7,linetype = "dashed") +
labs( title = paste(nReps, "Trajectoria(s) del MB")) +
theme(legend.position = "none") +
scale_colour_grey(start = 0.2,end = 0.8)
#coord_cartesian(xlim = c(0, tmax))
p1
Movimiento Browniano en dos dimensiones
# Función del movimiento Browniano en dos dimensiones
plot.BM2d <- function(base, n.steps){
df <- base
df_2d <- df %>%
gather(key='t',value='valor',-Rep) %>%
filter(Rep == 1 | Rep== 2) %>%
spread(Rep, valor) %>%
rename(Rep1 = '1', Rep2='2')%>%
mutate(t = as.numeric(substring(t,2,10))) %>%
arrange(t) %>%
filter(t <= n.steps)
b2 <- ggplot(df_2d,aes(x=Rep1,y=Rep2))+
geom_point(color="blue") +
geom_point(df_2d%>%filter(t == 1),mapping=aes(x=Rep1,y=Rep2),color="green") +
geom_point(df_2d%>%filter(t == max(t)),mapping=aes(x=Rep1,y=Rep2),color="red") +
geom_path() +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks.x=element_blank(),
axis.ticks.y=element_blank())
return(b2)
}
Ejemplo 1
# Ejemplo 1:
t <- 1
n.steps <- 10000 # número de pasos
n.sim <- 1000 # número de trayectorias
# Gráfico
df <- simMB(t, n.steps, n.sim)
p3 <- plot.BM2d(df, n.steps)
p3