Este curso se basará en los conceptos fundamentales del curso Introducción al análisis de cartera en R. Exploraremos conceptos más avanzados en el proceso de optimización de cartera, como restricciones complejas y conjuntos de objetivos, métodos para estimar momentos, optimización con reequilibrio periódico (también conocido como backtesting) y visualizaciones para comprender mejor el problema de optimización. El enfoque del curso es utilizar el paquete PortfolioAnalytics para resolver problemas de optimización de cartera que reflejan aplicaciones del mundo real.
Aunque la Teoría Moderna del Portafolio se introdujo hace más de 60 años, establece un marco para definir y evaluar objetivos. En el marco de la Teoría Moderna de la Cartera, la cartera óptima para que un inversor la mantenga es la cartera que maximiza el rendimiento esperado de la cartera para un nivel de riesgo determinado. El enfoque académico sigue el enfoque de Markowitz utilizando el rendimiento medio como medida de ganancia y la desviación estándar de los rendimientos como medida de riesgo. Sin embargo, la mayoría de los problemas del mundo real consideran diferentes medidas de riesgo, así como múltiples objetivos y restricciones. En este curso, explorará tanto el enfoque estándar de Markowitz como problemas más complejos similares a los que encontrará en la industria.
Comencemos con un ejemplo para demostrar cómo puede usar PortfolioAnalytics para resolver un problema de cartera usando el marco de la teoría moderna de cartera para maximizar el rendimiento medio y minimizar la desviación estándar. Comienza cargando la biblioteca de PortfolioAnalytics y un conjunto de datos de muestra.
library(PortfolioAnalytics)
data(edhec)
data <- edhec[,1:8]
En el ejemplo de esta introducción, utilizará las primeras 8 columnas del conjunto de datos edhec. El conjunto de datos de edhec contiene rendimientos mensuales de los rendimientos del índice de estilo de fondo de cobertura compuesto EDHEC.
Puede crear el objeto de especificación de cartera inicializándolo con los nombres de columna del conjunto de datos como nombres de activos.
port_spec <- portfolio.spec(colnames(data))
port_spec <- add.constraint(portfolio = port_spec, type = 'full_investment')
port_spec <- add.constraint(portfolio = port_spec, type = 'long_only')
port_spec <- add.objective(portfolio = port_spec, type = 'return', name = 'mean')
port_spec <- add.objective(portfolio = port_spec, type = 'risk', name = 'StdDev')
Ahora agrega dos restricciones a la especificación de la cartera, la inversión total y las restricciones de solo tiempo. La restricción de inversión total significa que los pesos deben sumar 1. La restricción de solo largo significa que todos los pesos deben ser positivos. Tiene dos objetivos en el problema de la cartera, uno para maximizar el rendimiento medio de la cartera y otro para minimizar la desviación estándar de la cartera. Para el objetivo de retorno medio, el tipo de objetivo es “retorno” porque desea maximizar el objetivo. El nombre del objetivo es “media” para el rendimiento medio de la cartera. Para el objetivo de riesgo de desviación estándar, el tipo de objetivo es “riesgo” porque desea minimizar el objetivo. El nombre del objetivo es “StdDev” para la desviación estándar de la cartera. No se preocupe si esto es mucho para asimilar por ahora, ¡verá muchos otros ejemplos en este curso! El nombre del objetivo es “media” para el rendimiento medio de la cartera. Para el objetivo de riesgo de desviación estándar, el tipo de objetivo es “riesgo” porque desea minimizar el objetivo. El nombre del objetivo es “StdDev” para la desviación estándar de la cartera. No se preocupe si esto es mucho para asimilar por ahora, ¡verá muchos otros ejemplos en este curso! El nombre del objetivo es “media” para el rendimiento medio de la cartera. Para el objetivo de riesgo de desviación estándar, el tipo de objetivo es “riesgo” porque desea minimizar el objetivo. El nombre del objetivo es “StdDev” para la desviación estándar de la cartera. No se preocupe si esto es mucho para asimilar por ahora, ¡verá muchos otros ejemplos en este curso!
Ahora puede imprimir el objeto de especificación de cartera para ver una representación concisa de la especificación.
print(port_spec)
## **************************************************
## PortfolioAnalytics Portfolio Specification
## **************************************************
##
## Call:
## portfolio.spec(assets = colnames(data))
##
## Number of assets: 8
## Asset Names
## [1] "Convertible Arbitrage" "CTA Global" "Distressed Securities"
## [4] "Emerging Markets" "Equity Market Neutral" "Event Driven"
## [7] "Fixed Income Arbitrage" "Global Macro"
##
## Constraints
## Enabled constraint types
## - full_investment
## - long_only
##
## Objectives:
## Enabled objective names
## - mean
## - StdDev
Verá los nombres de los activos en la cartera, una lista de las restricciones y una lista de los objetivos. En este caso, puede ver que la especificación de la cartera consta de 8 activos, 2 restricciones (inversión total y solo larga) y 2 objetivos (media y desviación estándar).
Aquí, puede ver cómo ejecutar la optimización y visualizar los resultados de la cartera óptima. Para ejecutar la optimización, llame a la función optimize.portfolio() pasando los datos de rendimiento, el objeto de especificación de la cartera y el método de optimización.
opt <- optimize.portfolio(data,
portfolio = port_spec,
optimize_method = 'random',
trace = TRUE)
Tenga en cuenta que especifica Optimize_method = “random” para usar el algoritmo de carteras aleatorias para resolver el problema. También tenga en cuenta que especifica trace = TRUE. Esto almacena los resultados de cada iteración de la optimización.
Puede trazar la cartera óptima en términos de riesgo y recompensa con la función chart.RiskReward, pasando el resultado de la optimización, los nombres de los objetivos que se utilizarán para el riesgo y la rentabilidad, y VERDADERO o FALSO si desea trazar los activos.
chart.RiskReward(opt,
risk.col = 'StdDev',
return.col = 'mean',
chart.assets = TRUE)
El paquete PortfolioAnalytics se utilizará a lo largo de este curso para la optimización y el análisis de la cartera. Usaremos el conjunto de indexes datos que se incluye con el PortfolioAnalytics paquete para los ejercicios restantes de este capítulo. En este ejercicio, cargaremos el paquete y prepararemos los datos para el problema de optimización de cartera en el siguiente ejercicio.
# Cargamos el Paquete
library(PortfolioAnalytics)
# Cargamos la data
data(indexes)
# Extraemos un subconjunto de la data que contenga
# las primeras cuatro columnas
index_returns <- indexes[,1:4]
# Vemos la data
print(head(index_returns))
## US Bonds US Equities Int'l Equities Commodities
## 1980-01-31 -0.0272 0.0610 0.0462 0.0568
## 1980-02-29 -0.0669 0.0031 -0.0040 -0.0093
## 1980-03-31 0.0053 -0.0987 -0.1188 -0.1625
## 1980-04-30 0.0992 0.0429 0.0864 0.0357
## 1980-05-31 0.0000 0.0562 0.0446 0.0573
## 1980-06-30 0.0605 0.0296 0.0600 0.0533
Este primer ejercicio le enseñará cómo resolver un problema simple de optimización de cartera usando PortfolioAnalytics. Aprenderá a crear un objeto de especificación de cartera, agregar restricciones y objetivos, y resolver el problema de optimización. El problema de la cartera es formar una cartera de varianza mínima sujeta a restricciones de inversión total y solo largas. El objetivo es minimizar la variación de la cartera. Hay dos restricciones en este problema: la restricción de inversión completa significa que las ponderaciones deben sumar 1, y la restricción de solo largo significa que todas las ponderaciones deben ser mayores o iguales a 0 (es decir, no se permiten posiciones cortas).
library(ROI)
# Crear la especificacion de la cartera
port_spec <- portfolio.spec(colnames(index_returns))
# Agregue una restricción de inversión completa tal que los pesos sumen 1
port_spec <- add.constraint(portfolio = port_spec, type = 'full_investment')
# Agregue una restricción solo larga de modo que el peso de un activo esté entre 0 y 1
port_spec <- add.constraint(portfolio = port_spec, type = 'long_only')
# Agregar un objetivo para minimizar la desviación estándar de la cartera
port_spec <- add.objective(portfolio = port_spec, type = 'risk', name = 'StdDev')
# Resolver el problema de optimización
opt <- optimize.portfolio(index_returns, portfolio = port_spec, optimize_method = 'ROI')
Ahora que hemos ejecutado la optimización, nos gustaría echar un vistazo a la salida y los resultados. Recuerde que el resultado de la optimización está en una variable llamada opt. En nuestro caso, para la optimización de cartera del ejercicio anterior, nos interesan los pesos óptimos y el valor objetivo estimado. Las ponderaciones se consideran óptimas en el sentido de que el conjunto de ponderaciones minimiza el valor objetivo, la desviación estándar de la cartera y satisface las restricciones de inversión total y solo largo en función de los datos históricos.
Tenga en cuenta que no reconocerá algunas de estas funciones en este momento. ¡No te preocupes! Todos serán presentados a lo largo del curso.
# Print de los resultados de optimizacion
print(opt)
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
##
## Call:
## optimize.portfolio(R = index_returns, portfolio = port_spec,
## optimize_method = "ROI")
##
## Optimal Weights:
## US Bonds US Equities Int'l Equities Commodities
## 0.8544 0.0587 0.0000 0.0869
##
## Objective Measure:
## StdDev
## 0.01668
# Extraemos los pesos optimos
extractWeights(opt)
## US Bonds US Equities Int'l Equities Commodities
## 0.85441777 0.05872385 0.00000000 0.08685838
# Registre los pesos óptimos con
chart.Weights(opt)
No olvides que el Objetivo de la Teoría Moderna de la Cartera es: Maximizar una medida de ganancia por unidad de medida de riesgo
El riesgo se define como la desviación estándar y la ganancia se define como el rendimiento medio
La optimización de la cartera es un problema difícil.
Un desafío es saber qué solucionador usar y las capacidades y límites del solucionador elegido. Un solucionador es un algoritmo diseñado para encontrar la solución óptima a un problema dado. Puede elegir un solucionador basado en el objetivo o formular el objetivo para que se ajuste al solucionador elegido. Idealmente, desea la flexibilidad de cambiar sin esfuerzo entre solucionadores según el problema. En muchos casos, hay más de un solucionador que puede resolver el problema y debe evaluar ambos. Un ejemplo de un solucionador de forma cerrada es un solucionador de programación cuadrática. La principal ventaja de los solucionadores de forma cerrada es que resuelven un problema dado de manera muy rápida y eficiente y devuelven una solución exacta. El principal inconveniente es que el problema debe formularse de una manera muy específica que normalmente es única para el solucionador. Un ejemplo de solucionador global es la optimización de evolución diferencial. Los solucionadores globales tienen la ventaja de poder resolver tipos de problemas más generales y encontrar la solución aproximada del mínimo o máximo global de la función objetivo con mínimos o máximos locales. Sin embargo, los algoritmos utilizados en los solucionadores globales son relativamente más complejos y más intensivos en computación. En este curso, utilizará solucionadores globales y de forma cerrada y aprenderá cómo PortfolioAnalytics supera estos desafíos de optimización de cartera. los algoritmos utilizados en los solucionadores globales son relativamente más complejos y más intensivos en computación. En este curso, utilizará solucionadores globales y de forma cerrada y aprenderá cómo PortfolioAnalytics supera estos desafíos de optimización de cartera.
Para el siguiente ejemplo, considerará un problema de optimización de cartera donde el objetivo es maximizar la utilidad cuadrática, sujeto a restricciones tales como que el peso de cada activo debe ser mayor o igual a cero y los pesos deben sumar 1.
\(Maximize:\hspace{0.3cm} w^{T}*\mu - \lambda*w^{T}*\Sigma*w\)
\(Sujeto ~ a:\hspace{0.3cm} w_{i} > 0, \sum_{i=1}^{n}w_{i} = 1\)
donde,
La intuición detrás de esta formulación es que maximizas el rendimiento de la cartera, con un plazo de penalización por variación de la cartera.
Un valor más alto para lambda significa una penalización más alta para la variación de la cartera.
Puede usar la función solve.QP() del paquete quadprog para resolver el problema de maximización de la utilidad cuadratica como se muestra en las siguientes ecuaciones:
\[\min(-d^Tb + \frac{1}{2}b^TDb)\] sujeto a \[A^Tb \geq b\]
Tenga en cuenta las similitudes entre el la expresión que se muestra aquí y la utilidad cuadrática mostrada anteriormente. Puede sustituir los pesos con el vector \(b\), los rendimientos esperados con el vector \(d\) y la matriz de varianza-covarianza con la matriz D. También observe que los signos son diferentes. Esto está bien porque minimizar el negativo de un objetivo es equivalente a maximizar el objetivo.
El código acontinuación resuelve el problema de optimización de la utilidad cuadrática con solve.QP del paquete quadprog. No se preocupe por entender todo en esta subseccion. El punto principal es demostrar lo que se necesita para configurar y resolver un problema directamente con un solucionador de programación cuadrática en R. Esto es mucho trabajo para un problema simple y propenso a errores. ¿Qué pasa si queremos usar un solucionador diferente? ¿Agregar, eliminar o cambiar restricciones? Tenemos que hacer todo esto para que se ajuste al otro solucionador. Esto puede ser un desafío incluso para problemas triviales. Hay poca compatibilidad con la visualización cuando se usan solucionadores directamente y, a menudo, las visualizaciones son específicas del solucionador.
library(quadprog)
data(edhec)
dat <- edhec[,1:4]
# Creamos la matriz de restricciones
Amat <- cbind(1, diag(ncol(dat)), -diag(ncol(dat)))
# Creamos el vector de restricciones
bvec <- c(1, rep(0, ncol(dat)), -rep(1, ncol(dat)))
# Creamos la matriz objetivo
Dmat <- 10*cov(dat)
# Creamos el vector objetivo
dvec <- colMeans(dat)
# Especificamos el numero de restricciones equivalente
meq <- 1
# Resolvemos el problema de optimizacion
opt <- solve.QP(Dmat, dvec, Amat, bvec, meq)
PortfolioAnalytics fue diseñado específicamente para abordar los problemas discutidos en secciones previas y los ejercicios anteriores.
Los componentes clave de la arquitectura de PortfolioAnalytics son la modularidad y la flexibilidad. Los múltiples tipos y la modularidad de restricciones y objetivos le permiten agregar, eliminar y combinar múltiples tipos de restricciones y objetivos muy fácilmente. Una función objetivo se puede definir como cualquier función R válida. Esto significa que no está limitado a un tipo específico o conjunto de problemas. Al igual que las funciones objetivas, puede definir funciones de momento personalizadas como cualquier función R válida. La visualización ayuda a desarrollar la intuición sobre el problema y comprender el espacio factible de las carteras. Otro beneficio clave es que PortfolioAnalytics admite varios solucionadores y le permite especificar diferentes solucionadores con cambios mínimos o sin cambios en la especificación de la cartera.
La Figura 1.1 es una representación de alto nivel de un marco de optimización de cartera. Las entradas son los activos, las restricciones, los objetivos y los momentos de rendimiento de los activos. Los activos, las restricciones y los objetivos son definidos por el gestor de la cartera. El flujo de trabajo en PortfolioAnalytics sigue este diagrama. Primero, especifica una cartera de activos, luego agrega restricciones y objetivos a la especificación de la cartera. A continuación, ejecuta la optimización dada la especificación de la cartera y las estimaciones de los momentos de retorno de los activos. El paso final es analizar la cartera óptima que es el resultado del solucionador.
Diagrama de un marco de optimización de la Cartera
Con base en lo anterior, podemos preguntarnos ¿Qué no es un objetivo de diseño de PortfolioAnalytics? La respuesta es Solo admite un tipo de solucionador
Ahora aprenderá los detalles de cada paso del flujo de trabajo para resolver problemas de optimización de cartera en PortfolioAnalytics.
El primer paso para configurar un problema de optimización de cartera en PortfolioAnalytics es crear la especificación de cartera. Una vez que haya creado la especificación de la cartera, el siguiente paso es agregar restricciones y objetivos a la especificación de la cartera. El siguiente paso es ejecutar la optimización dada la especificación, las restricciones y los objetivos de la cartera. El paso final es analizar el resultado de la optimización.
El primer paso en el flujo de trabajo es crear la especificación de cartera con la función portfolio.spec(assets = NULL, …). La especificación de cartera es un objeto de S3 que contiene datos, restricciones y objetivos a nivel de cartera. El único argumento necesario para portfolio.spec son los activos. Los otros argumentos son opcionales y no son importantes para este curso. El argumento de activos puede ser un vector de caracteres de nombres de activos, un vector con nombre de pesos iniciales o un escalar que especifica el número de activos. El código demuestra estas diferentes formas de definir el argumento de los activos.
# Vector de caracteres de activos
portfolio.spec(assets = c('SP500','DJIA','Nasdaq','FTSE100','DAX','CAC40'))
# Vector con nombre de activos con pesos iniciales
pesos_iniciales <- c('SP500' = 0.5, 'FTSE100' = 0.3, 'NIKKEI' = 0.2)
portfolio.spec(assets = pesos_iniciales)
# Escalar de número de activos
portfolio.spec(assets = 4)
Agregará restricciones a la especificación de la cartera con la función add.constraint(portfolio, type = c(‘weight_sum’,‘box’,‘full_investment’,…),…). El argumento de cartera es el objeto de especificación de cartera al que desea agregar la restricción. El tipo debe ser uno de los tipos de restricción admitidos. Los tipos de restricciones que más utilizará en el curso son weight_sum y box. El tipo weight_sum es una restricción sobre la suma de los pesos y el tipo box es una restricción sobre el peso mínimo y máximo de un activo individual. Tenga en cuenta que el tipo ‘full_investment’ es un caso especial del tipo ‘weight_sum’ que establece min_sum y max_sum en 1. Los argumentos con nombre se pasan mediante puntos al constructor del tipo de restricción especificado. Puede ver un ejemplo de esto en el codigo que se muestra a continuación donde min es igual a 0.2 y max es igual a 0.6 se pasan para la restricción de cuadro. Esto significa que está agregando una restricción de cuadro de modo que el peso mínimo de cualquier activo sea 0.2 y el peso máximo de cualquier activo sea 0.6. Es importante señalar que cada restricción que agrega es un objeto separado y se almacena en la ranura de restricciones en el objeto de cartera. De esta forma, las restricciones son modulares y se pueden agregar, quitar o modificar fácilmente las restricciones en el objeto de la cartera.
# Inicializamos las especificaciones del portafolio
p <- portfolio.spec(assets = 4)
# Agregamos la restricciones
p <- add.constraint(portfolio = p,type = 'weight_sum',
min_sum = 1, max_sum = 1)
# Agregamos la restriccion box
p <- add.constraint(portfolio = p, type = 'box',min = 0.2, max = 0.6)
De forma similar a la adición de restricciones, agregará objetivos a la especificación de la cartera con la función add.objective(portfolio, type = c(‘return’, ‘risk’, …), name, arguments = NULL, …). El argumento de cartera es el objeto de especificación de cartera al que desea agregar el objetivo. El tipo debe ser uno de los tipos de objetivos admitidos. Los tipos de objetivos que más utilizará en el curso son ‘rentabilidad’ y ‘riesgo’. Un tipo objetivo de ‘rendimiento’ significa que busca maximizar el valor objetivo, mientras que el tipo objetivo de ‘riesgo’ significa que busca minimizar el valor objetivo. El nombre debe corresponder al nombre de la función objetivo. Por ejemplo, “ES” es una función del paquete PerformanceAnalytics que calcula el déficit esperado de la cartera. Los argumentos adicionales a la función objetivo se pueden pasar como una lista con nombre a los argumentos. Puede ver un ejemplo de esto en el código siguiente donde agregamos el objetivo de riesgo para minimizar el déficit esperado de la cartera con un nivel de confianza del 90% (p es igual a 0.90) y usamos el método gaussiano en la estimación. Al igual que las restricciones, cada objetivo que agrega es un objeto separado y se almacena en la ranura de objetivos en el objeto de cartera. De esta manera, los objetivos son modulares y uno puede agregar, eliminar o modificar fácilmente los objetivos en el objeto de la cartera.
p <- portfolio.spec(assets = 4)
p <- add.objective(portfolio = p, type = 'return',name = 'mean')
p <- add.objective(portfolio = p, type = 'risk',name = 'ES',
arguments = list(p = 0.9, method = 'gaussian'))
PortfolioAnalytics admite la optimización de un solo período
Con la función optimize.portfolio(), así como la optimización con reequilibrio periódico, comúnmente denominado backtesting, con la función optimize.portfolio.rebalancing(). La optimización con reequilibrio periódico solo significa que vuelve a ejecutar la optimización en períodos específicos, por ejemplo, anualmente. Esto significa que al final de cada año, se ejecuta la optimización y la cartera se reequilibra a los pesos óptimos.
Este bloque de código, muestra los argumentos para optimize.portfolio(), y optimize.portfolio.rebalancing() y destacamos algunos de ellos aquí. Para ejecutar la optimización, debe pasar una serie temporal de rendimientos de los activos para el argumento R, la especificación de la cartera con los activos, las restricciones y los objetivos para el argumento de la cartera, el método de optimización para el argumento optimizar_método y el nombre de la función de estimación de momentos para el argumento momentFUN. El Capítulo 3 cubrirá los métodos para estimar los momentos. Observe la similitud entre estas dos funciones. Solo tiene que pasar algunos argumentos adicionales para la periodicidad de reequilibrio y los parámetros de backtest para controlar los datos que se utilizan para cada optimización en el período de backtest.
optimize.portfolio(R, portfolio = NULL,
optimize_method = c('DEoptim','random','ROI', ...),
search_size = 20000, trace = TRUE,
momentFUN = 'set.porfolio.moments', ...)
optimize.portfolio.rebalancing(R, portfolio = NULL,
optimize_method = c('DEoptim','random','ROI', ...),
search_size = 20000, trace = TRUE,
rebalance_on = 'quarters',
training_period,
rolling_window,
momentFUN = 'set.portfolio.moments', ...)
El paquete PortfolioAnalytics es compatible tanto con solucionadores globales como con solucionadores de programación lineal y cuadrática. El método de optimización que elija debe basarse en el tipo de problema que está resolviendo.
Solucionadores Globales:
Solucionadores LP y QP:
Por ejemplo, un problema que puede formularse como un problema de programación cuadrática debe resolverse con un solucionador de programación cuadrática, mientras que un problema no convexo debe resolverse con un solucionador global como DEoptim.
El ejemplo de este código muestra la ejecución de una optimización de un solo período y una optimización con reequilibrio periódico. Los datos utilizados para este ejemplo son las primeras 6 columnas del conjunto de datos edhec. Puede ver en la especificación de la cartera que el problema de optimización definido es minimizar la desviación estándar de la cartera sujeta a restricciones de inversión total y solo largas. Para ejecutar la optimización de un solo período, llame aOptimize-dot-portfolio y pase los rendimientos, la cartera y especifique “ROI” como método de optimización. La optimización con reequilibrio periódico se ejecuta llamando aOptimize-dot-portfolio-dot-rebalancing. Al igual que en el caso de optimización de un solo período, usted especifica los rendimientos, la cartera y el método de optimización. Los argumentos adicionales son para los parámetros de reequilibrio. Especifique la frecuencia de reequilibrio anual con rebalance_on igual a “años” y use una vista retrospectiva de 60 períodos para los datos utilizados para cada optimización con training_period y rolling_window. El argumento training_period especifica la cantidad de observaciones que se usarán para la optimización inicial y rolling_window controla la cantidad de observaciones que se usarán para cada optimización. Aprenderá cómo extraer y visualizar los resultados de estas optimizaciones más adelante en este curso.
data(edhec)
ret <- edhec[,1:6]
# Portafolio
p <- portfolio.spec(assets = colnames(ret))
p <- add.constraint(portfolio = p, type = 'full_investment')
p <- add.constraint(portfolio = p, type = 'long_only')
p <- add.objective(portfolio = p, type = 'risk', name = 'StdDev')
# Optimizaciones
opt_single <- optimize.portfolio(R = ret, portfolio = p, optimize_method = 'ROI')
opt_rebal <- optimize.portfolio.rebalancing(R = ret, portfolio = p,
optimize_method = 'ROI',
rebalance_on = 'years',
training_period = 60,
rolling_window = 60)
El paquete PortfolioAnalytics incluye varias funciones para la visualización y extracción de datos de los resultados de optimización.
El análisis es muy importante para comprender y desarrollar la intuición del problema de optimización de cartera. Las funciones de visualización y extracción están diseñadas para funcionar independientemente del solucionador elegido a pesar de las diferencias de cada solucionador. La Figura 2.1 enumera las funciones para visualizar los resultados de la optimización y extraer datos importantes de los resultados de la optimización. Estas funciones graficarán o devolverán los datos independientemente del solucionador utilizado, por lo que no necesariamente necesita conocer los detalles de la salida devuelta por cada solucionador. Las funciones de extracción son útiles si desea devolver los datos como un objeto xts o un marco de datos para su posterior análisis o visualización en una tabla. Para visualizar el resultado de la optimización, debe utilizar las funciones de gráfico. Las siguientes subsecciones demostrarán algunas de estas funciones.
Funciones de Visualización & Extracción de información
A continuación, veremos algunas funciones para analizar los resultados de una optimización de un solo período y una optimización con reequilibrio de períodos. En este ejemplo, el objeto de opción es el resultado de optimize.portfolio(), ver la Figura 2.2.
Ejemplo de Extraccion de Pesos optimos
y el objeto opt_rebal es el resultado de Optimize.portfolio.rebalancing. Tenga en cuenta que utiliza la misma función para extraer los pesos óptimos de ambos objetos de salida de optimización.
En el caso de optimización de un solo período, solo se devuelve un único conjunto de pesos.
Sin embargo, para el caso de optimización con rebalanceo, se devuelven los pesos óptimos en cada período de rebalanceo. Head with n equals 3 se usa para mostrar solo las primeras 3 observaciones aqui. Ver Figura 2.3.
Pesos optimos con reequilibrio en cada periodo
Puede visualizar los pesos óptimos con la función charWeights. Al igual que para extraer las ponderaciones, utiliza la misma función para graficar las ponderaciones de una optimización de un solo período o de una optimización con reequilibrio. Los pesos óptimos para cada optimización se trazan con la función chart.Weights. Tenga en cuenta que para el caso de la optimización de un solo período, solo se traza un único conjunto de ponderaciones. Ver Figura 2.4.
Visualización de Pesos optimos de un solo periodo
Sin embargo, para el backtest se traza una serie temporal de pesos óptimos en cada período de reequilibrio (Figura 2.5). La extracción de las medidas objetivas funciona de la misma manera que los pesos óptimos.
Serie temporal de pesos optimos en cada periodo de reequilibrio
Las medidas objetivas son los valores de los objetivos de la cartera óptima. En este caso, tiene un objetivo en la especificación de la cartera: minimizar la desviación estándar de la cartera. La intuición es que este es el valor mínimo del objetivo encontrado por la optimización. Puede ver el valor objetivo de la cartera óptima para la optimización de un solo período, así como una serie temporal de los valores objetivos en cada período de rebalanceo para la optimización con rebalanceo anual. (Figura 2.6)
Medida objetiva de la desviación estándar
Puede calcular los rendimientos de la cartera con la función Return.portfolio. Debe pasar los rendimientos de los activos y los pesos óptimos en cada período de reequilibrio, que obtiene con la función extractWeights. A continuación, puede visualizar los rendimientos de la cartera con la función charts.PerformanceSummary. El primer panel muestra los rendimientos acumulados, el segundo panel es un gráfico de barras de los rendimientos de cada período y el tercer panel muestra las reducciones. Se produce una reducción cada vez que el rendimiento acumulativo cae por debajo del rendimiento acumulativo máximo.
Medida objetiva de la desviación estándar