12 votos

Dos movimientos brownianos correlacionados

¿Es cierto? _( ver aquí (nota 2, p.22 / p.14, sin pruebas)_ que podemos obtener dos movimientos brownianos discretizados $W_t^1, W_t^2$ con correlación $\rho$ haciendo

$$d W_t^1 \sim \mathcal N(0,\sqrt{dt})$$

$$d W_t^2 = \rho\, d W_t^1 + \sqrt{1-\rho^2} dZ_t$$ con $dZ_t \sim \mathcal N(0,\sqrt{dt})$ ?

Si esto es cierto, podríamos simularlos fácilmente en Python haciendo:

enter image description here

import numpy as np
import matplotlib.pyplot as plt

n = 1000000; dt = 0.01; rho = 0.8
dW1 = np.random.normal(0, np.sqrt(dt), n)
dW2 = rho * dW1 + np.sqrt(1 - rho **2) * np.random.normal(0, np.sqrt(dt), n)
W1 = np.cumsum(dW1)
W2 = np.cumsum(dW2)
plt.plot(W1)
plt.plot(W2)
plt.show()

¿Es esto correcto?

13voto

scottishwildcat Puntos 146

Primero hay que corregir la fórmula a: $$ W_t^2 = \rho W_t^1 + \sqrt{1-\rho^2} Z_t, $$ donde $Z_t$ es un BM independiente de $W_t^1$ Si calculas la varianza y la covarianza, verás que es cierto: $$ V[W_t^1] = t $$ y $$ V[W_t^2] = \rho^2 V[W_t^1] + (1-\rho^2) V[Z_t] = \rho^2 t + (1-\rho^2) t = t, $$ que es la varianza deseada.

Para la covarianza se obtiene $$ Cov[W_t^1,W_t^2] = \rho Cov[W_t^1, W_t^1] + \sqrt{1-\rho^2} Cov[W_t^1, Z_t] $$ que da (porque $Cov[W_t^1, W_t^1] = V[W_t^1]$ y por indpenencia de $W_t^1$ y $Z_t$ : $$ Cov[W_t^1,W_t^2] = \rho t + 0, $$ y señalando que $\sqrt{V[W_t^1]} = \sqrt{V[W_t^2]} = \sqrt{t}$ obtenemos $$ Cor[W_t^1,W_t^2] = \frac{Cov[W_t^1,W_t^2]}{\sqrt{V[W_t^1]} \sqrt{V[W_t^2]} } = \frac{\rho t}{t} = \rho. $$

0 votos

Gracias por esta prueba @Richard. ¿Crees que mi código de simulación está bien? Parece que está bien. Otra cosa : creo que tu primera ecuación es un enlace de "correlación" entre los movimientos brownianos $W_t^1$ y $W_t^2$ mientras que mi ecuación era un enlace entre el movimiento browniano incrementos $d W_t^1$ y $d W_t^2$ . Sumando los incrementos ( suma acumulada ), parece que se llegaría a la misma fórmula que la tuya. (por supuesto cuando se trata de movimiento browniano discretizado)

0 votos

Hola, y no, no lo creo. Necesitas root cuadrada porque los multiplicadores constantes entran en la varianza con su cuadrado. y no importa si hablamos de incrementos o de los procesos lo que importa es la varianza y la covarianza. Escribiendo $W_t = W_t - W_0$ con $W_0 =0$ se puede ver que no importa si hablamos de incrementos o del proceso. En general podemos escribir $W_t = W_s + W_t-W_s$ y $W_t-W_s$ es independiente de $W_s$ para $t>s$ .

0 votos

No que en la respuesta de abajo el segundo parámetro en $N(x,y)$ es la varianza y no la volatilidad.

12voto

Fattie Puntos 11

Aquí está el enfoque general que puedes seguir para generar dos variables aleatorias correlacionadas. Supongamos que, X e Y son dos variables aleatorias, tales que: $$X \sim N(\mu_1, \sigma_1^2)$$ $$Y \sim N(\mu_2, \sigma_2^2)$$ y $$cor(X,Y)=\rho$$ Ahora considere: $y=bx + e_i$ , donde $x$ $(=\frac{X-\mu_1}{\sigma_1}$ ) y $y$ $(=\frac{Y-\mu_2}{\sigma_2}$ ) siguen ambos una distribución normal estándar , tal que $cor(x,y)=\rho. $ Para la variante normal estándar, $b= \rho$ . Así que tenemos:

$$y=\rho x + e_i$$

Ahora, aquí está el algoritmo, usted puede seguir:

1) Generar $n$ Variable normal estándar para $x$ .

2) Desde, $e_i \sim N(0, 1-\rho^2)$ . Así que genera $n$ Variable normal como $e_i$ de una distribución normal con media 0 y varianza $1-\rho^2$ .

3) Obtenga $y=\rho x + e_i$ .

4) Convierta sus números normales en normales (recuerde que la correlación es independiente del cambio de origen y escala)

Código R para simular el GBM correlacionado:

corGBM <- function(n, r, t=1/365, plot=TRUE) {
#n is number of samples 
#r is correlation
#t is tick step
x <- rnorm(n, mean=0, sd= 1)
se <- sqrt(1 - r^2) #standard deviation of error
e <- rnorm(n, mean=0, sd=se)
y <- r*x + e

X <- cumsum(x* sqrt(t))
Y <- cumsum(y* sqrt(t))
Max <- max(c(X,Y))
Min <- min(c(X,Y))

if(plot) {
plot(X, type="l", ylim=c(Min, Max))
lines(Y, col="blue")
}
return(cor(x,y))
}

#sample result
corGBM(10000,.85)
[1] 0.8523341

enter image description here

0 votos

Creo que hay algunos problemas en tu código R: a) no estás generando movimiento browniano sino sólo incrementos. Tienes que sumarlos para obtener el movimiento browniano. b) defines r2 pero no la utilizas c) incluso si ambas notaciones funcionan, ¿por qué escribir r ** 2 y luego r^2 ? d) no se llama a la función correlatedvalue . ¿Puedes incluir el código para trazar los dos movimientos brownianos correlacionados? (En general, creo que tu método es más o menos el mismo que usé en Python en mi post original, pero es interesante tenerlo en R para aprender, ¡gracias!)

0 votos

@Basj Gracias por tus valiosas aportaciones. He añadido un código en R para simular dos movimientos brownianos geométricos. Espero que te sirva de ayuda.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X