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?