2 votos

Beta variable en el tiempo con filtro Kalman

Si estás acostumbrado a jugar con R , disfrutará del siguiente código reproducible:

# =================================================== #
# An example of state-space monitor via Kalman filter #
# =================================================== #

op <- par(no.readonly = TRUE)
Sys.setenv(TZ = 'UTC')

# Contents:

# 1. Installing packages
# 2. Loading packages
# 3. Custom functions
# 4. Downloading and preparing data
# 5. Cross-Betas Kalman filtering

# *********************************
# 1. Installing packages
# *********************************

install.packages('KFAS')
install.packages('latticeExtra')
install.packages('quantmod')

# *********************************
# 2. Loading packages
# *********************************

require(compiler)
require(latticeExtra)
require(KFAS)
require(quantmod)

# *********************************
# 3. Custom functions
# *********************************

# This function returns the time varying state-space representation 
# parameters of a linear model which represents y ~ X

Kalman.beta <- cmpfun(function(y, X)
{
  model <- regSSM(y = y, X = cbind(1, X), H = NA, Q = diag(NA, 2))
  object <- fitSSM(inits = rep(0, 3), model = model)$model
      KFAS <- KFS(object = object)
      alpha.beta <- xts(t(KFAS$alphahat), index(y))
  colnames(alpha.beta) <- rep(paste(colnames(y), 'vs' , colnames(X)), 2)
  return(alpha.beta)
})  

# *********************************
# 4. Downloading and preparing data
# *********************************

env <- new.env()
Symbols <- c('SPY', 'QQQ', 'XLF', 'TLT')
getSymbols(Symbols = Symbols, env = env, from = '1950-01-01')
args <- eapply(env = env, FUN = function(x){ClCl(x)})
X <- na.omit(do.call(what = merge, args = args))
colnames(X) <- Symbols
xyplot(X)

# *********************************
# 5. Cross-Betas Kalman filtering
# *********************************

Betas <- NULL
k <- 0

for(i in 1:ncol(X))
{
  for(j in (1:ncol(X))[-i])
  {
    k <- k + 1
    Betas[[k]] <- Kalman.beta(y = X[,i], X = X[,j])[,2]
  }
}

Beta.matrix <- do.call(what = merge, args = Betas)
colnames(Beta.matrix) <- gsub(pattern = '.', fixed = TRUE, 
                              x = colnames(Beta.matrix), replacement = ' ')
xyplot(Beta.matrix, superpose = FALSE, auto.key = FALSE,
       main = '')

¿Qué hace este código? Básicamente utiliza el filtro de Kalman para estimar la variación del tiempo $\beta_{t}$ de cada activo en comparación con los demás y trazarlos.

¿Qué pasa con eso?

Si se utiliza un modelo de regresión lineal simple para estimar $\beta$ constante en el tiempo verás que suele ocurrir, como ejemplo, que $\beta_{t}<1<\beta$ o $\beta_{t}>0>\beta$ para la mayor parte de la serie temporal... ¡lo cual es realmente contraintuitivo!

Cómo es posible que el SPY esté correlacionado negativamente con el QQQ cuando es bastante obvio que están fuertemente correlacionados y $\beta \approx 1$ ? Y así sucesivamente...

¿Cómo se explica esto?

¿Hay algún problema con mi código?

2voto

kbrinley Puntos 664

Definitivamente no se trata de un problema del filtro Kalman: si se sustituye esta línea de código

args <- eapply(env = env, FUN = function(x){ClCl(x)})

con este

args <- eapply(env = env, FUN = function(x){ClCl(x)})[Symbols]

eapply() mantendrá el orden de la consulta original de Yahoo de quantmod . Puede comprobarlo y verá cada $\beta_{t}$ partidos sobre el $\beta$ de la regresión lineal OLS simple tipo CAPM.

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