He estado jugando con el paquete R PortfolioAnalytics y he invertido más tiempo del que estoy dispuesto a admitir para intentar resolver este problema:
Cuando sigo el ejemplo de cambio de régimen con los datos edhec de la viñeta ( https://gist.github.com/rossb34/10328671 ) el código elige los 2 regímenes individuales diferentes y funciona, pero si utilizo mi conjunto de datos, las optimizaciones de la cartera única en cada régimen parecen utilizar sólo uno de los regímenes. El mismo problema ocurre si genero algunos datos al azar. Creo que tal vez tenga que ver con el objeto xts, pero no tengo ni idea. Cualquier ayuda se agradece.
Aquí está el código con datos aleatorios, al final ejecutando "opt1 \$regime" and "opt2\$ régimen" da el mismo número en lugar de 1 y 2, respectivamente:
library(PortfolioAnalytics)
set.seed(123)
obs <- matrix(rnorm(2680)/100,,10)
dates <- seq(as.Date("1999-02-01"), length = 268, by = "months")
dates
data<-xts(x = obs, order.by = dates)
colnames(data)<-c("a","b","c","d","e","f","g","h","i","j")
R<-data
set.seed(123)
regime <- xts(sample(1:2, nrow(R), replace=TRUE, prob=c(0.3, 0.7)), index(R))
port1 <- portfolio.spec(assets=colnames(R))
port1 <- add.constraint(port1, "weight_sum", min_sum=0.99, max_sum=1.01)
port1 <- add.constraint(port1, "box", min=0.1, max=0.5)
port1 <- add.objective(port1, type="risk", name="ES", arguments=list(p=0.9))
port1 <- add.objective(port1, type="risk_budget", name="ES", arguments=list(p=0.9), max_prisk=0.5)
#' Construct portfolio for regime 2.
port2 <- portfolio.spec(assets=colnames(R))
port2 <- add.constraint(port2, "weight_sum", min_sum=0.99, max_sum=1.01)
port2 <- add.constraint(port2, "box", min=0, max=0.6)
port2 <- add.objective(port2, type="risk", name="StdDev")
port2 <- add.objective(port2, type="risk_budget", name="StdDev", max_prisk=0.5)
#' Combine the portfolios.
portfolios <- combine.portfolios(list(port1, port2))
#' Now we construct the regime model and corresponding portfolios to use for
#' each regime.
regime.port <- regime.portfolios(regime, portfolios)
regime.port
#' This optimization should result in out portfolio for regime 1, but it picks regime 2.
opt1 <- optimize.portfolio(R, regime.port,
optimize_method="random",
search_size=200,
trace=TRUE)
opt1
opt1$regime
#' This optimization should result in out portfolio for regime 2, this one picks regime 2 as well.
opt2 <- optimize.portfolio(R[1:(nrow(R)-1)], regime.port,
optimize_method="random",
search_size=200,
trace=TRUE)
opt2
opt2$regime