Forum Sign in Register

Optimización de Carteras en R con PortfolioAnalytics: Objetivos CVaR, Restricciones Reales y Backtests con Rebalanceo

Started by Support 1 week ago · 0 replies RSS

La optimización media-varianza es fácil de describir y traicionera de usar: aliméntela con estimaciones históricas en bruto y concentrará alegremente su capital en lo que mejor funcionó por casualidad, para desmoronarse fuera de muestra. El paquete de R PortfolioAnalytics existe para hacer la construcción de carteras sobrevivible en la práctica: permite declarar restricciones realistas y objetivos no gaussianos, resolver con varios motores y — esto es lo crítico — backtestear la optimización completa con rebalanceo periódico. En este artículo recorremos el flujo de trabajo.

El diseño: la cartera como especificación

PortfolioAnalytics separa lo que usted quiere de cómo se resuelve. Se construye un objeto de especificación y se le apilan restricciones y objetivos:


library(PortfolioAnalytics)
library(PerformanceAnalytics)

data(edhec) # retornos mensuales, 13 estrategias
R <- edhec[, 1:8]

port <- portfolio.spec(assets = colnames(R))
port <- add.constraint(port, type = "full_investment") # pesos suman 1
port <- add.constraint(port, type = "long_only")
port <- add.constraint(port, type = "box",
min = 0.02, max = 0.30) # limites por activo
port <- add.objective(port, type = "risk", name = "ES",
arguments = list(p = 0.95)) # minimizar CVaR 95%


La última línea es la razón de ser del paquete: el objetivo de riesgo es el Expected Shortfall (CVaR), no la varianza. La varianza castiga por igual las subidas y las bajadas y subestima el riesgo de cola en series asimétricas y de colas gordas; el ES pregunta directamente "¿cómo de malo es el promedio de mi peor 5% de meses?" — que suele ser la pregunta que de verdad importa. Con la misma facilidad puede minimizar la desviación típica, maximizar el retorno por unidad de ES, penalizar la rotación o combinar varios objetivos ponderados.

Restricciones que hacen la cartera desplegable

Los mandatos reales se definen por sus restricciones, y aquí es donde el paquete brilla:

  • Restricciones box — mínimo/máximo por activo, la defensa más simple contra las soluciones de esquina que lo apuestan todo a un nombre.
  • Restricciones de grupo — limitar la exposición por sector, región o tipo de estrategia (p. ej., las estrategias cripto en conjunto por debajo del 20%).
  • Restricciones de rotación y costes — limitar cuánto puede alejarse cada rebalanceo de los pesos actuales.
  • Límites de posiciones — acotar el número de posiciones distintas de cero para una cartera dispersa y seguible.


Motores de optimización: cuando el problema deja de ser convexo

La mínima varianza con restricciones lineales es un programa cuadrático limpio (
optimize_method = "quadprog"
o los plugins de ROI). Pero en cuanto el objetivo es ES con límites de posiciones, el problema deja de ser convexo y PortfolioAnalytics recurre a métodos globales:
"DEoptim"
(evolución diferencial) y carteras
"random"
. Las carteras aleatorias merecen mención aparte: se generan y evalúan miles de vectores de pesos factibles, lo que no solo optimiza sino que cartografía el espacio factible — al graficar todos los candidatos en el plano riesgo-retorno se ve cuánto mejor es el "óptimo" que una cartera factible típica. A menudo la respuesta honesta es "no mucho", y esa también es información valiosa.

La parte que casi todos se saltan: backtestear la optimización

Una única optimización sobre toda la muestra es un ejercicio dentro de muestra. La prueba desplegable es
optimize.portfolio.rebalancing()
:


bt <- optimize.portfolio.rebalancing(
R, port,
optimize_method = "random", search_size = 5000,
rebalance_on = "quarters",
training_period = 60, # primer ajuste: 60 meses
rolling_window = 60 # reestimacion sobre ventana movil
)
wts <- extractWeights(bt)
perf <- Return.portfolio(R, weights = wts)
charts.PerformanceSummary(perf)


Cada trimestre el optimizador ve solo la ventana anterior, produce pesos, y la serie de retornos resultante es genuinamente fuera de muestra. Compárela contra la cartera equiponderada — el benchmark que décadas de investigación muestran vergonzosamente difícil de batir en cuanto se cuentan el error de estimación y los costes. Si su cartera optimizada no supera a 1/N neta de rotación, despliegue 1/N.

Trampas habituales

  • El error de estimación domina. Las estimaciones de retorno esperado son tan ruidosas que un optimizador sin restricciones amplifica el ruido en pesos extremos. Los objetivos solo-riesgo (mínima varianza, mínimo ES) con cajas sensatas son mucho más robustos que la optimización media-riesgo completa.
  • Más historia no es automáticamente mejor — una ventana de 15 años promedia alegremente regímenes muertos. Ajuste la ventana de estimación a la velocidad a la que derivan las relaciones entre sus activos.
  • Datos mensuales para decisiones mensuales. Optimizar pesos mensuales a partir de ruido diario añade rotación; agregue primero.
  • Los resultados de la búsqueda aleatoria varían con la semilla — fíjela, y suba search_size hasta que la frontera se estabilice.


En resumen

PortfolioAnalytics convierte la construcción de carteras en R de una fórmula de manual en un proceso auditable: restricciones declarativas, objetivos de riesgo de cola, motores globales para los casos no convexos y — la función que más importa — backtests walk-forward con rebalanceo que le dicen si todo el aparato bate de verdad a la cartera equiponderada. Optimice el riesgo, restrinja los pesos y deje que la curva de capital fuera de muestra tenga la última palabra.

Sign in to reply.