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:
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:
Motores de optimización: cuando el problema deja de ser convexo
La mínima varianza con restricciones lineales es un programa cuadrático limpio (
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
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
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.
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.