<jupyter_start><jupyter_text>Selección óptima de portafolios IIEntonces, tenemos que:- La LAC describe las posibles selecciones de riesgo-rendimiento entre un activo libre de riesgo y un activo riesgoso.- Su pendiente es igual al radio de Sharpe del activo riesgoso.- La asignación óptima de capital para cualquier inversionista es el punto tangente de la curva de indiferencia del inversionista con la LAC.Para todo lo anterior, supusimos que ya teníamos el portafolio óptimo (activo riesgoso).En la clase pasada aprendimos a hallar este portafolio óptimo si el conjunto de activos riesgosos estaba conformado únicamente por dos activos:$$w_{1,EMV}=\frac{(E[r_1]-r_f)\sigma_2^2-(E[r_2]-r_f)\sigma_{12}}{(E[r_2]-r_f)\sigma_1^2+(E[r_1]-r_f)\sigma_2^2-((E[r_1]-r_f)+(E[r_2]-r_f))\sigma_{12}}.$$- Sin embargo, la complejidad del problema crece considerablemente con el número de variables, y la solución analítica deja de ser viable cuando mencionamos que un portafolio bien diversificado consta aproximadamente de 50-60 activos.- En esos casos, este problema se soluciona con rutinas numéricas que hagan la optimización por nosotros, porque son una solución viable y escalable a más variables. **Objetivos:**- ¿Cuál es el portafolio óptimo de activos riesgosos cuando tenemos más de dos activos? - ¿Cómo construir la frontera de mínima varianza cuando tenemos más de dos activos?*Referencia:*- Notas del curso "Portfolio Selection and Risk Management", Rice University, disponible en Coursera.___  1. Maximizando el radio de Sharpe ¿Qué pasa si tenemos más de dos activos riesgosos?En realidad es algo muy similar a lo que teníamos con dos activos.- Para dos activos, construir la frontera de mínima varianza es trivial: todas las posibles combinaciones.- Con más de dos activos, recordar la definición: la frontera de mínima varianza es el lugar geométrico de los portafolios que proveen el mínimo riesgo para un nivel de rendimiento dado. Ver en el tablero. Analíticamente:- $n$ activos, - caracterizados por $(\sigma_i,E[r_i])$,- cada uno con peso $w_i$, con $i=1,2,\dots,n$.Entonces, buscamos los pesos tales que\begin{align}\min_{w_1,\dots,w_n} & \quad \sum_{i=1}^{n}w_i^2\sigma_i^2+\sum_{i=1}^{n}\sum_{j=1,j\neq i}^{n}w_iw_j\sigma_{ij}\\\text{s.a.}          & \quad \sum_{i=1}^{n}w_i=1, w_i\geq0\\                     & \quad \sum_{i=1}^{n}w_iE[r_i]=\bar{\mu},\end{align}donde $\bar{\mu}$ corresponde a un nivel de rendimiento objetivo. **Obviamente, tendríamos que resolver este problema para muchos niveles de rendimiento objetivo.**-  Explicar relación con gráfica.-  Recordar clase 10. Lo anterior se puede escribir vectorialmente como: \begin{align}\min_{\boldsymbol{w}} & \quad \boldsymbol{w}^T\Sigma\boldsymbol{w}\\\text{s.a.}          & \quad \boldsymbol{1}^T\boldsymbol{w}=1, \boldsymbol{w}\geq0\\                     & \quad E[\boldsymbol{r}^T]\boldsymbol{w}=\bar{\mu},\end{align}donde:- $\boldsymbol{w}=\left[w_1,\dots,w_n\right]^T$ es el vector de pesos,- $\boldsymbol{1}=\left[1,\dots,1\right]^T$ es un vector de unos,- $E[\boldsymbol{r}]=\left[E[r_1],\dots,E[r_n]\right]^T$ es el vector de rendimientos esperados, y- $\Sigma=\left[\begin{array}{cccc}\sigma_{1}^2 & \sigma_{12}  & \dots  & \sigma_{1n} \\                                   \sigma_{21}  & \sigma_{2}^2 & \dots  & \sigma_{2n} \\                                   \vdots       & \vdots       & \ddots & \vdots      \\                                   \sigma_{n1}  & \sigma_{n2}  & \dots  & \sigma_{n}^2\end{array}\right]$ es la matriz de varianza-covarianza.                                   **Esta última forma es la que comúnmente usamos al programar, por ser eficiente y escalable a problemas de N variables.**  Entonces, ¿para cuántos niveles de rendimiento objetivo tendríamos que resolver el anterior problema con el fin de graficar la frontera de mínima varianza?- Observar que el problema puede volverse muy pesado a medida que incrementamos el número de activos en nuestro portafolio...- Una tarea bastante compleja.  Sucede que, en realidad, sólo necesitamos conocer dos portafolios que estén sobre la *frontera de mínima varianza*.- Si logramos encontrar dos portafolios sobre la frontera, entonces podemos a la vez encontrar todas las posibles combinaciones de estos dos portafolios para trazar la frontera de mínima varianza.- Ver el caso de dos activos.  ¿Qué portafolios usar?Hasta ahora, hemos estudiando profundamente como hallar dos portafolios muy importantes que de hecho yacen sobre la frontera de mínima varianza:1. Portafolio de EMV: máximo SR.2. Portafolio de mínima varianza: básicamente, el mismo problema anterior, sin la restricción de rendimiento objetivo.Luego, tomar todas las posibles combinaciones de dichos portafolios usando las fórmulas para dos activos de medias y varianzas:- w: peso para el portafolio EMV,- 1-w: peso para le portafolio de mínima varianza.  2. Ejemplo ilustrativo.Retomamos el ejemplo de mercados de acciones en los países integrantes del $G5$: EU, RU, Francia, Alemania y Japón.<jupyter_code># Importamos pandas y numpy
import pandas as pd
import numpy as np
# Resumen en base anual de rendimientos esperados y volatilidades
annual_ret_summ = pd.DataFrame(columns=['EU', 'RU', 'Francia', 'Alemania', 'Japon'], index=['Media', 'Volatilidad'])
annual_ret_summ.loc['Media'] = np.array([0.1355, 0.1589, 0.1519, 0.1435, 0.1497])
annual_ret_summ.loc['Volatilidad'] = np.array([0.1535, 0.2430, 0.2324, 0.2038, 0.2298])

annual_ret_summ.round(4)
# Matriz de correlación
corr = pd.DataFrame(data= np.array([[1.0000, 0.5003, 0.4398, 0.3681, 0.2663],
                                    [0.5003, 1.0000, 0.5420, 0.4265, 0.3581],
                                    [0.4398, 0.5420, 1.0000, 0.6032, 0.3923],
                                    [0.3681, 0.4265, 0.6032, 1.0000, 0.3663],
                                    [0.2663, 0.3581, 0.3923, 0.3663, 1.0000]]),
                    columns=annual_ret_summ.columns, index=annual_ret_summ.columns)
corr.round(4)
# Tasa libre de riesgo
rf = 0.05<jupyter_output><empty_output><jupyter_text>Esta vez, supondremos que tenemos disponibles todos los mercados de acciones y el activo libre de riesgo.  1. Construir la frontera de mínima varianza  1.1. Encontrar portafolio de mínima varianza<jupyter_code># Importamos funcion minimize del modulo optimize de scipy

## Construcción de parámetros
# 1. Sigma: matriz de varianza-covarianza Sigma = S.dot(corr).dot(S)

# 2. Eind: rendimientos esperados activos individuales

# Función objetivo

# Número de activos

# Dato inicial

# Cotas de las variables

# Restricciones

# Portafolio de mínima varianza

# Pesos, rendimiento, riesgo y razón de Sharpe del portafolio de mínima varianza<jupyter_output><empty_output><jupyter_text>1.2. Encontrar portafolio EMV<jupyter_code># Función objetivo

# Número de activos

# Dato inicial

# Cotas de las variables

# Restricciones

# Portafolio EMV

# Pesos, rendimiento, riesgo y razón de Sharpe del portafolio EMV<jupyter_output><empty_output><jupyter_text>1.3. Construir frontera de mínima varianza También debemos encontrar la covarianza (o correlación) entre estos dos portafolios:<jupyter_code># Covarianza entre los portafolios

# Correlación entre los portafolios

# Vector de w

# DataFrame de portafolios: 
# 1. Índice: i
# 2. Columnas 1-2: w, 1-w
# 3. Columnas 3-4: E[r], sigma
# 4. Columna 5: Sharpe ratio

# Importar librerías de gráficos

# Gráfica de dispersión de puntos coloreando 
# de acuerdo a SR, los activos individuales
# y los portafolios hallados
# Frontera

# Activos ind

# Port. óptimos

# Etiquetas de los ejes

# Leyenda<jupyter_output><empty_output><jupyter_text>**A partir de lo anterior, solo restaría construir la LAC y elegir la distribución de capital de acuerdo a las preferencias (aversión al riesgo).**___<jupyter_code># Vector de wp variando entre 0 y 1.5 con n pasos

# DataFrame de CAL: 
# 1. Índice: i
# 2. Columnas 1-2: wp, wrf
# 3. Columnas 3-4: E[r], sigma
# 4. Columna 5: Sharpe ratio

# Activos ind

# Port. óptimos

# LAC

# Etiquetas de los ejes

# Leyenda

# Para gamma=5

# Ponderaciones finales<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09990169574834111, 'fraction_numerical': 0.03366920619316786, 'mean_word_length': 3.847528290649196, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 9, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '19338', 'license': 'MIT', 'n_tokens_mistral': 3061, 'n_tokens_neox': 2879, 'n_words': 928, 'path': 'Modulo3/Clase14_SeleccionOptimaPortII.ipynb', 'repo_name': 'AndresLaresBarragan/porinvp2022', 'size': '8138'}