4 votos

PortfolioAnalytics y la cuestión del cambio de régimen

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

1voto

tilly willy Puntos 109

https://gist.github.com/rossb34/10328671 difiere en las carteras pasadas como argumentos en los diferentes pasos. Pruébalo así e informa. Esencialmente, dice:

  portfolio <- list(port1, port2)
  # ...
  opt_regime <- regime.backtest(R, portfolio, regime, ...)
  # ...
  opt_port1 <- optimize.portfolio.rebalancing(R, port1, ...)
  opt_port2 <- optimize.portfolio.rebalancing(R, port2, ...)

Así que en su código, intente después de cambiar la siguiente manera:

  opt1 <- optimize.portfolio(... port1 ...) # instead of regime.port
  opt2 <- optimize.portfolio(... port2 ...) # instead of regime.port

0voto

xrost Puntos 129

El problema no es con el objeto xts, sino con el esquema de optimización de la cartera:

Investigar el tema a través de la código fuente , parece que el opt$regime produce el elemento en regime igual al último índice del R (datos) matriz . Una instantánea tomada del código fuente da paso a esta comprensión:

regimeswitching

donde observamos cómo regime.idx es el valor numérico de regime[index(last(R))] . El valor regime.idx se guarda posteriormente en la matriz de salida con el nombre régimen , lo que implica que opt$regime le da regime.idx (véase la parte inferior del código fuente).


¿Qué relación tiene esto con su problema?

Al generar los regímenes mediante la función de muestreo, se utiliza un método de muestreo ligeramente diferente al proporcionado en el enlace de Github:

#Github way (here, R corresponds to the edhec dataset as seen in the Github link):

set.seed(123)
regime_Github <- xts(sample(1:2, nrow(R), replace=TRUE), index(R))

#Your way (here, R corresponds to your random generated data):

set.seed(123)
regime_You <- xts(sample(1:2, nrow(R), replace=TRUE, prob=c(0.3, 0.7)), index(R))

Estos dos métodos dan resultados diferentes. A continuación se muestra una imagen del últimos seis elementos para cada régimen:

codepicture

Desde la matriz de datos, R y regime tienen la misma indexación, implica que opt1$regime da como resultado el último elemento del vector de régimen, que en tu caso es 2 (y a través del ejemplo de Github es 1) . En opt2$regime saldrá el penúltimo elemento del vector de régimen, y lo mismo para la muestra de Github (2 y 2 respectivamente). Además, si establece R[1:(nrow(R)-4)] en opt2 se puede observar cómo opt2$regime será el régimen 1 para su propia muestra de régimen. Esta es la razón por la que se obtienen diferentes regímenes cuando se utiliza el conjunto de datos edhec como se ve en el enlace de Github frente a su propio conjunto de datos generado proporcionado anteriormente .


No estoy del todo seguro de si esto afecta al procedimiento de optimización de la cartera o a algo más. Espero que esto al menos le dé una idea de su problema .

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