I am trying to set up a time varying factor model for the purpose of return decomposition via kalman filter.

Following this example and slightly modifying it so as to accommodate for more than one input parameters (i.e S&P 500, Equity L/S index etc) I am getting the betas for the two benchmarks but, as expected, they don't necessarily sum up to 1.

Is there any way to add a constraint during the MLE that the output parameters have to sum up to one?

EDIT...adding the code below, it's basically the same code as in the example with just adding another index and removing the intercept(alpha)

library(PerformanceAnalytics, quietly = TRUE,  warn.conflicts = FALSE)

# extract HAM1 and SP500 excess returns
HAM1 = 100*(managers[,"HAM1", drop=FALSE] - managers[,"US 3m TR", drop=FALSE])
factor_indices = cbind(100*(managers[,"SP500 TR", drop=FALSE] - managers[,"US 3m TR", drop=FALSE]),100*(managers[,"EDHEC LS EQ", drop=FALSE]))
factor_indices= factor_indices['1997-01-31/']
HAM1 = HAM1['1997-01-31/']
colnames(factor_indices) = c("SP500","EQLS")

# Specifying a set model parameters
s2_v = 1      # Variance of observations
s2_sp = 0.01 
s2_eqls = 0.01  
# Construct a regression model
tvp.dlm = dlmModReg(X=factor_indices, addInt=FALSE, dV=s2_v, dW=c(s2_sp, s2_eqls))

# looking at the various component

ols.fit = lm(HAM1 ~ factor_indices)

start.vals = c(1,0.01,0.01)

names(start.vals) = c("lns2_v", "lns2_sp", "lns2_eqls")

# function to build Time Varying Parameter state space model
buildTVP <- function(parm, x.mat){
  parm <- exp(parm)
  return( dlmModReg(X=x.mat, dV=parm[1],addInt=FALSE, dW=c(parm[2], parm[3])) )

# Estimate the model
TVP.mle = dlmMLE(y=HAM1, parm=start.vals, x.mat=factor_indices, build=buildTVP, hessian=T)

# get sd estimates
#se2 <- sqrt(exp(TVP.mle$par))
#names(se2) = c("s_obs", "s_alpha", "s_beta")

TVP.dlm <- buildTVP(TVP.mle$par, factor_indices)
TVP.f <- dlmFilter(y = HAM1, mod = TVP.dlm)
# Optimal estimates of θ_t given information available at time T.
TVP.s <- dlmSmooth(TVP.f)

# extract smoothed states 
sp.s = xts(TVP.s$s[-1,1,drop=FALSE], as.Date(rownames(TVP.s$s[-1,])))
eqls.s  = xts(TVP.s$s[-1,2,drop=FALSE], as.Date(rownames(TVP.s$s[-1,])))
colnames(sp.s) = "sp"
colnames(eqls.s)  = "eqls"
  • $\begingroup$ Can you please post your code? $\endgroup$
    – AK88
    Jun 7, 2017 at 11:59
  • $\begingroup$ sure, added above $\endgroup$
    – sen_saven
    Jun 8, 2017 at 8:21
  • $\begingroup$ While trying to reproduce the results given in lalas blog I stumbled upon following from the dlm reference manual: Only **univariate** regression is currently covered. But you are trying to run a multivariate regression. Were you aware of this? $\endgroup$
    – AK88
    Jun 8, 2017 at 10:08
  • $\begingroup$ I noticed that, but I think that I am trying to run a multiple (or multivariable) regression, there is a discussion about the terminology in this link stats.stackexchange.com/questions/2358/… $\endgroup$
    – sen_saven
    Jun 8, 2017 at 10:50
  • $\begingroup$ Well, you seem to have 2 independent variables instead of 1. $\endgroup$
    – AK88
    Jun 8, 2017 at 10:53


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.