Recientemente comencé a usar el paquete R PortfolioAnalytics
para realizar una optimización de cartera. Y estoy tratando de entender exactamente qué está calculando la función optimize.portfolio.rebalancing
. En particular, me pregunto por qué los pesos calculados (a partir del segundo período en adelante) son diferentes a los que obtengo al llamar directamente a optimize.portfolio
.
Yo tenía la impresión de que optimize.portfolio.rebalancing
era básicamente un "envoltorio alrededor de optimize.portfolio
" (según el manual), así que pensé que la función simplemente llama a optimize.portfolio
repetidamente para períodos de longitud rolling_window
. Pero entonces, ¿los resultados no deberían ser idénticos a lo que una llamada manual a optimize.portfolio
con los mismos períodos exactos produce? ¿O es que optimize.portfolio.rebalancing
realiza algunos cálculos adicionales? ¿Qué me falta?
Aquí hay un ejemplo mínimo que ilustra mi pregunta:
data("edhec")
returns <- edhec[, 1:4]
funds <- colnames(returns)
portfolio <- portfolio.spec(assets = funds)
portfolio <- add.constraint(portfolio = portfolio, type = "full_investment")
portfolio <- add.constraint(portfolio = portfolio, type = "long_only")
portfolio <- add.objective(portfolio = portfolio, type = "risk", name = "ES")
portfolio.rebalanced <- optimize.portfolio.rebalancing(R = returns,
portfolio = portfolio,
optimize_method = "ROI",
rebalance_on = "quarters",
training_period = 12,
rolling_window = 12)
# verificar si optimize.portfolio da los mismos resultados: primer período
portfolio.optimized <- optimize.portfolio(R = returns["::1997-12-31",],
portfolio = portfolio,
optimize_method = "ROI")
portfolio.optimized
portfolio.rebalanced$opt_rebalancing$`1997-12-31`
# ¡SÍ!
# pero: último período
portfolio.optimized <- optimize.portfolio(R = returns["2006-08-31::2009-08-31",],
portfolio = portfolio,
optimize_method = "ROI")
portfolio.optimized
portfolio.rebalanced$opt_rebalancing$`2009-08-31`
# ¡NO! ¿Qué está mal?
0 votos
Estoy pensando que si es una ventana rodante y no una ventana expansiva, podría dejar caer las observaciones posteriores y tener en cuenta solo las 12 últimas... ¡Simularé algo y lo comprobaré!
0 votos
¿Qué otras bibliotecas usas? Estoy recibiendo errores si ejecuto el mismo código Error: "package:ROI" %in% search() || requireNamespace("ROI", quietly = TRUE) no es VERDADERO
0 votos
Olvidé mencionar las bibliotecas requeridas: quantmod, PerformanceAnalytics, PortfolioAnalytics y ROI están cargadas. Además, ROI.plugin.glpk y ROI.plugin.quadprog. No estoy seguro, cuáles de estas son realmente necesarias.
0 votos
Con respecto a tener en cuenta solo las últimas 12 observaciones... sí, eso es lo que estoy esperando. Y esto es lo que estoy intentando hacer manualmente calculando
"2006-08-31::2009-08-31"
(3 años, entonces 12 trimestres, ¿verdad?). Funciona para el primer período, pero no a partir del segundo período en adelante (ver los períodos enportfolio.rebalanced$opt_rebalancing$...
), así que estoy pensando que los siguientes períodos están ajustados de alguna manera.1 votos
Creo que es un problema con la alimentación de datos, porque si pones el reequilibrio en 'quarters', solo toma como puntos de finalización el final de marzo, junio,... y lo estás comparando con el final de agosto... así que intenta cambiar eso a 2009-08-31... también deberías tener solo 12 meses de entrenamiento, así que no desde 2006, sino 2008? Me gustaría investigar más a fondo, pero todavía no puedo hacer que funcione :D, dice: Error: paste0("package:", plugin) %in% search() || requireNamespace(plugin, .... no es VERDADERO, hay algo mal con el ROI...
0 votos
Estoy comprobándolo contra finales de agosto, ya que este es uno de los períodos listados dentro del atributo
portfolio.rebalanced$opt_rebalancing$...
, así que pienso que este es uno de los puntos finales utilizados. Pero es una buena sugerencia, lo intentaré. Además, creo que, al establecerrebalance_on
comoquarters
ytraining_period
como 12 significa que se reequilibra utilizando períodos de longitud 12 (trimestres), pero lo hace cada trimestre.0 votos
En cuanto a hacer que funcione: Los mismos errores aparecieron aquí también. Básicamente significa que algún plugin que es utilizado por el procedimiento no está instalado. Logré hacerlo funcionar instalando todo lo relacionado con el plugin ROI: Así que,
ROI
en sí mismo, por supuesto, yROI.plugin.glpk
yROI.plugin.quadprog
. Y, por si acaso,Rglpk
yquadprog
, pero realmente no estoy seguro si todos estos son necesarios. De todas maneras, gracias por intentarlo. :)