6 votos

¿Función para convertir la matriz de covarianza aritmética en logarítmica?

¿Existe una función en R que tome la mu y la Sigma de una matriz de covarianza aritmética y devuelva la mu y la Sigma de una matriz de covarianza basada en logaritmos?

Tengo el código de una función que implementa lo inverso -- de covarianza logarítmica a covarianza lineal -- en R (pegado abajo por si es útil). Tenga en cuenta que este código implementa las matemáticas de Meucci en la página 5 del Apéndice del adjunto .:

linreturn <- function(mu,Sigma) {   
  m <- exp(mu+diag(Sigma)/2)-1   
  x1 <- outer(mu,mu,"+")   
  x2 <- outer(diag(Sigma),diag(Sigma),"+")/2   
  S <- exp(x1+x2)*(exp(Sigma)-1)
  list(mean=m,vcov=S)
}

Código de simulación que valida el enfoque anterior:

# Experiment with two assets

    # initialize with average log returns and log-based covariance matrix
    m1 <- c( .05 , .12 , .1 )
    S1 <- matrix( c( .1 , .05 , .02 , .05 , .1 , .03 , .02 , .03 , .1 ), nrow = 3 )

    # simulate log-return draws from log-based covariance matrix assuming normal distribution
        set.seed(1001)   
        library(MASS)
        logReturns <- MASS::mvrnorm(2000000,mu=m1,Sigma=S1)

        # convert to arithmetic returns
        arithmeticReturn = exp( logReturns ) - 1
        colMeans( arithmeticReturn )
        # create arithmetric based covariance matrix
        var( arithmeticReturn )

    # compare simulation results with linreturn function    
    linreturn( m1, S1 )

Alternativamente, ¿existe una función en MATLAB que realice el procedimiento? (Podría analizar el código abierto y portar esto a R).

Gracias

4voto

jldugger Puntos 7490

Si he entendido bien el código (ignorando el " $-1$ "en el cálculo de $m$ ), su entrada es un $n$ -vector $\mu = (\mu_1, \ldots, \mu_n)$ y una simétrica $n$ por $n$ matriz $\Sigma = (\sigma_{ij})$ . La salida es un $n$ -vector $m$ con

$$m_i = \exp(\mu_i + \sigma_{ii}/2)$$

y un $n$ por $n$ matriz $S$ con

$$S_{ij} = \exp(\mu_i + \mu_j + (\sigma_{ii}+\sigma_{jj})/2)(\exp(\sigma_{ij})-1) = m_i(\exp(\sigma_{ij})-1)m_j.$$

Si esto es correcto, entonces podemos resolver fácilmente para $\mu$ et $\Sigma$ en términos de $m$ et $S$ esencialmente mediante la inversión de estas operaciones. Comience por formar la matriz diagonal $M$ cuyas entradas diagonales son $1/m_i$ Es decir, que.., $M_{ii}=1/m_i$ et $M_{ij}=0$ para $i\ne j$ . De la parte derecha de la fórmula anterior se deduce inmediatamente que

$$M S M + 1_n = \exp(\sigma_{ij})$$

y recuperamos fácilmente $\Sigma$ tomando los logaritmos término a término. Con estos valores en la mano,

$$\mu_i = \log(m_i) - \sigma_{ii}/2.$$

Editar

El código de la pregunta utiliza "retornos lineales" en lugar de medios. No hay ningún problema: a partir de los "rendimientos" $m_i$ calculado como $\exp(\mu_i + \sigma_{ii}/2)-1$ , primero se añade de nuevo el $1$ y proceder como en el caso anterior.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X