# Problema de selección de portafolio con preferencias media-varianza



En la clase pasada hablamos acerca de:
- preferencias,
- funciones de utilidad,
- la actitud de los inversionistas de cara al riesgo,
- la aversión al riesgo, entre otros.

Todas ellas son piezas que necesitamos para responder la pregunta de ¿cómo un inversionista toma la decisión óptima de selección de portafolio?

En esta clase al fin estamos listos para ensamblar estos conceptos y escribir el problema de selección de portafolios. 

En el camino aprenderemos acerca del concepto de **utilidad esperada**, que nos permite trabajar con incertidumbre en el modelado económico (una de las ideas más importantes en economía). Esta idea tiene más de 60 años, y básicamente dice que los individuos, cuando están de cara a incertidumbre, maximizan el valor esperado de su utilidad (solo cierto si somos homo economicus). 

Además del concepto de utilidad esperada, aprenderemos acerca de **preferencias media-varianza**. Es decir, supondremos que los inversionistas toman decisiones basados en un tipo particular de preferencias.

Con lo anterior, estableceremos el problema de selección de portafolios.

**Objetivos:**

- ¿Qué es utilidad esperada?
- ¿Qué son las preferencias media-varianza?
- Funciones de utilidad media-varianza.
- Enunciado y solución del problema básico de selección de portafolio.

*Referencia:*
- Notas del curso "Portfolio Selection and Risk Management", Rice University, disponible en Coursera.
___

## 1. Utilidad esperada
- Básicamente combina las probabilidades de los resultados con cómo los inversionistas se sienten con dichos resultados.
- En otras palabras, la utilidad esperada multiplica la probabilidad de suceso de un evento con la utilidad que genera dicho evento.

Recordemos que las *funciones de utilidad* permiten a los inversionistas expresar cómo se sienten con los resultados, especialmente en los malos ratos. 

Entonces la *utilidad esperada* es una herramienta que nos permite cuantificar cómo nos sentimos en nuestros malos momentos económicos, capturando el riesgo con la probabilidad de ocurrencia de dichos malos momentos. 

Dado este marco de trabajo, cualquier decisión se puede escribir como la maximización de la utilidad esperada:
\begin{align}
\max_{\theta} & \quad E[U(W)], \\
\end{align}
mediante la escogencia de cierta variable $\theta$ (gastos, planes de ahorro, compra de activos, planes de producción, etc.).

Para nuestros propósitos, la variable de decisión serán los pesos o ponderaciones del portafolio.

Adicionalmente, en el contexto de la decisión de distribución de la riqueza entre activos, el problema de maximización tendrá comúnmente las siguientes restricciones:
- universo de inversión,
- posición en los activos dados.

**Ejemplo.** 

Supongamos que un inversionista debe determinar la composición óptima de su portafolio, que contiene activos y bonos. Supongamos que son los únicos instrumentos disponibles.

Sean:
- $w_s$: peso o ponderación de activos en el portafolio,
- $w_b$: peso o ponderación de bonos en el portafolio,
- $r_s$: rendimiento de los activos, y
- $r_b$: rendimiento de los bonos.

De manera que podemos escribir el problema de selección de portafolios como la maximización de la utilidad esperade de nuestra riqueza futura, la cual dependerá de nuestros rendimientos:
 
\begin{align}
\max_{w_s,w_b} &\quad E[U(W)]\\
\text{s. a.}   &\quad W=W_0(1+w_sr_s+w_br_b)\\
               &\quad w_s+w_b=1\\
               &\quad w_s,w_b\geq0
\end{align}


Preguntas:
- ¿Qué significan las restricciones?
- Ya que tenemos planteado este problema básico, ¿qué haría falta para empezar a resolverlo?
___

## 2. Preferencias media-varianza

### 2.1. Utilidad media-varianza

Entonces, ¿qué funciones de utilidad deberíamos de usar en este problema de selección de portafolios?

- La respuesta es: **preferencias media-varianza**.
- Éstas serán representadas en términos de funciones de utilidad como: **utilidad media-varianza**.

Usamos la *utilidad media-varianza* en el problema de selección de portafolios dado que ésta decribe el "trade-off" entre riesgo y rendimiento que enfrentan los inversionistas. La *utilidad media-varianza* está dada por la siguiente expresión:

$$U=E[r_p]-\frac{1}{2}\gamma\sigma_p^2,$$

donde
- $E[r_p]$ es el rendimiento esperado del portafolio,
- $\sigma_p^2$ es la varianza del portafolio, y
- $\gamma$ es el coeficiente de aversión al riesgo. 

#### Intuición acerca de la función de utilidad media-varianza:
- Sólo se preocupa por medias :) y varianzas :(.
- Incrementa con: rendimiento esperado del portafolio.
- Decrece con: varianza del portafolio.
- Malos tiempos: rendimientos son bajos y las volatilidades son altas.
- Conecta bastante bien con la teoría moderna de portafolios, la cual caracteriza los rendimientos con medias y varianzas únicamente.
- Criticada por su limitación: supone que los inversionistas sólo se preocupan por medias y varianzas.

### 2.2. Curvas de indiferencia

*¿Recuerdan las curvas de nivel que se ven en cálculo de varias variables?*
- Bien, acá nos servirán para representar la utilidad media-varianza gráficamente.
- En el contexto de utilidad media-varianza, las curvas de nivel se llaman **curvas de indiferencia**.

Dados ciertos niveles de utilidad $U_1>U_2>U_3$, las curvas de indiferencia relativas a estos niveles de utilidad, son los lugares geométricos en el espacio de rendimiento esperado vs. volatilidad representados por las siguientes expresiones

$$U_1=E[r_p]-\frac{1}{2}\gamma\sigma_p^2\Rightarrow E[r_p]=\frac{1}{2}\gamma\sigma_p^2+U_1,$$

$$U_2=E[r_p]-\frac{1}{2}\gamma\sigma_p^2\Rightarrow E[r_p]=\frac{1}{2}\gamma\sigma_p^2+U_2,$$

$$U_3=E[r_p]-\frac{1}{2}\gamma\sigma_p^2\Rightarrow E[r_p]=\frac{1}{2}\gamma\sigma_p^2+U_3.$$

**Gráficamente**


```python
# Importar numpy y pyplot
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
```


```python
# Coeficiente de aversión al riesgo (entre 1 y 10 comúnmente)
g = 7
# Niveles de utilidad
U1, U2, U3 = 0.35, 0.2, 0.05
# Vector de volatilidades (sugerido 0%-60%)
sp = np.linspace(0, 0.6)
# Curvas de indiferencia
Erp1 = 1 / 2 * g * sp**2 + U1
Erp2 = 1 / 2 * g * sp**2 + U2
Erp3 = 1 / 2 * g * sp**2 + U3
```


```python
# Gráfica
plt.figure(figsize=(6, 4))
plt.plot(sp, Erp1, label=f'Curva de indiferencia $U_1$={U1}')
plt.plot(sp, Erp2, label=f'Curva de indiferencia $U_2$={U2}')
plt.plot(sp, Erp3, label=f'Curva de indiferencia $U_3$={U3}')
plt.xlabel('Volatilidad $\sigma$')
plt.ylabel('Rendimiento esperado $E[r]$')
plt.grid()
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
```

Bueno, ¿y porqué se llaman curvas de indiferencia?, ¿qué representa una cuva de indiferencia?

- Porque sobre una misma curva el nivel de utilidad es el mismo (es indiferente).
- Son todas las combinaciones de riesgo y rendimiento que producen un mismo nivel de utilidad.

Volviendo al problema de selección de portafolios, queremos la utilidad más alta.
- ¿Cuál de las anteriores curvas de indiferencia corresponde a la utilidad más alta?
- Intuitivamente, ¿porqué?
- Curvas de indiferencia para niveles de utilidad más altos, estarán...

Notamos además que las anteriores curvas de indiferencia son *paralelas* una con otra. Claro, las dibujamos con el mismo coeficiente de aversión al riesgo.

$$\frac{d E[r_p]}{d\sigma_p}=\frac{d }{d\sigma_p}\left[\frac{1}{2}\gamma\sigma_p^2+U\right]=\gamma\sigma_p.$$

¿Cómo cambian estas curvas para coeficientes de aversión al riesgo más altos?


```python
# Coeficientes de aversión al riesgo (entre 1 y 10 comúnmente)
g1, g2, g3 = 3, 5, 7
# Nivel de utilidad
U = 0.2
# Vector de volatilidades (sugerido 0%-60%)
sp = np.linspace(0, 0.6)
# Curvas de indiferencia
Erp1 = 1 / 2 * g1 * sp**2 + U
Erp2 = 1 / 2 * g2 * sp**2 + U
Erp3 = 1 / 2 * g3 * sp**2 + U
```


```python
# Gráfica
plt.figure(figsize=(6, 4))
plt.plot(sp, Erp1, label=f'Curva de indiferencia $\gamma_1$={g1}')
plt.plot(sp, Erp2, label=f'Curva de indiferencia $\gamma_2$={g2}')
plt.plot(sp, Erp3, label=f'Curva de indiferencia $\gamma_3$={g3}')
plt.xlabel('Volatilidad $\sigma$')
plt.ylabel('Rendimiento esperado $E[r]$')
plt.grid()
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
```

¿Cómo interpretamos las anteriores gráficas?, ¿qué pasa con las personas más aversas al riesgo?
- Se puede ver de dos maneras: para un mismo nivel de rendimiento esperado, una persona más aversa al riesgo soporta un nivel menor de riesgo; equivalentemente, para un mismo nivel de riesgo, una persona más aversa al riesgo requerirá un nivel de rendimiento esperado más alto.

Con todo lo anterior, el problema de selección de portafolios se puede plantear como *encontrar la curva de indeferencia más alta dado el conjunto de oportunidades de inversión y restricciones*.

## 3. Problema de selección de portafolios: una ilustración

Ahora ilustraremos el problema de selección de portafolios con algunos datos. 
- Por ahora solo queremos ilustrar gráficamente cómo se resuelve este problema. Trabajar en la intuición.
- En las siguientes dos clases nos enfocaremos en cómo resolverlo analíticamente.

Acá tenemos el rendimiento medio anual y la volatilidad para dos instrumentos usando datos de EU: instrumentos de deuda (bonos) y acciones. Supondremos que el inversionista solo puede invertir en estas dos clases de instrumentos.


```python
# Importamos pandas
import pandas as pd
```


```python
# Datos
data = pd.DataFrame(index=['Stocks','Bonds', 'CorrSB'], columns=['Mean', 'Std'])
data['Mean'] = [0.119, 0.0591, 0.113]
data['Std'] = [0.1915, 0.0833, None]
data
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Mean</th>
      <th>Std</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>Stocks</th>
      <td>0.1190</td>
      <td>0.1915</td>
    </tr>
    <tr>
      <th>Bonds</th>
      <td>0.0591</td>
      <td>0.0833</td>
    </tr>
    <tr>
      <th>CorrSB</th>
      <td>0.1130</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>



Entonces, ¿cuál es la distribución de riqueza óptima?, o más bien, ¿cuál es la composición óptima del portafolio para un inversionista dado su nivel de aversión al riesgo?

**Primero.** Recordamos que, para dos activos, podemos trazar la frontera de mínima varianza tomando todas las posibles combinaciones de los dos activos.

De nuevo, sean:
- $w_s=w$: peso o ponderación de activos en el portafolio,
- $w_b=1-w$: peso o ponderación de bonos en el portafolio,
- $r_s$: rendimiento de los activos, y
- $r_b$: rendimiento de los bonos.

Entonces

$$E[r_p]=wE[r_{s}]+(1-w)E[r_b]$$

$$\sigma_p^2=w^2\sigma_{s}^2+(1-w)^2\sigma_b^2+2w(1-w)\rho_{s,b}\sigma_s\sigma_b$$


```python
# Vector de w variando entre 0 y 1 con n pasos
n = 101
w = np.linspace(0, 1, n)
# Rendimientos esperados individuales
Ers = data.loc['Stocks', 'Mean']
Erb = data.loc['Bonds', 'Mean']
# Volatilidades individuales
ss = data.loc['Stocks', 'Std']
sb = data.loc['Bonds', 'Std']
# Correlacion
rsb = data.loc['CorrSB', 'Mean']
```


```python
# Crear un DataFrame cuyas columnas sean rendimiento
# y volatilidad del portafolio para cada una de las w
# generadas
portafolios = pd.DataFrame(data={'w': w,
                                 'Media': w * Ers + (1 - w) * Erb,
                                 'Vol': (w**2 * ss**2 + (1 - w)**2 * sb**2 + 2 * w * (1 - w) * ss * sb * rsb)**0.5
                                })
portafolios
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>w</th>
      <th>Media</th>
      <th>Vol</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.00</td>
      <td>0.059100</td>
      <td>0.083300</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.01</td>
      <td>0.059699</td>
      <td>0.082705</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0.02</td>
      <td>0.060298</td>
      <td>0.082155</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0.03</td>
      <td>0.060897</td>
      <td>0.081650</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0.04</td>
      <td>0.061496</td>
      <td>0.081191</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>96</th>
      <td>0.96</td>
      <td>0.116604</td>
      <td>0.184246</td>
    </tr>
    <tr>
      <th>97</th>
      <td>0.97</td>
      <td>0.117203</td>
      <td>0.186054</td>
    </tr>
    <tr>
      <th>98</th>
      <td>0.98</td>
      <td>0.117802</td>
      <td>0.187866</td>
    </tr>
    <tr>
      <th>99</th>
      <td>0.99</td>
      <td>0.118401</td>
      <td>0.189681</td>
    </tr>
    <tr>
      <th>100</th>
      <td>1.00</td>
      <td>0.119000</td>
      <td>0.191500</td>
    </tr>
  </tbody>
</table>
<p>101 rows × 3 columns</p>
</div>




```python
# Gráfica
plt.figure(figsize=(6, 4))
plt.plot(portafolios['Vol'], portafolios['Media'], label='Portafolios')
plt.plot(sb, Erb, 'or', label='Bonds')
plt.plot(ss, Ers, 'ob', label='Stocks')
plt.xlabel('Volatilidad $\sigma$')
plt.ylabel('Rendimiento esperado $E[r]$')
plt.grid()
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
```

**Segundo.** Graficamos en la misma ventana, curvas de indiferencia.


```python
# Niveles de utilidad 
U1, U2, U3 = 0.05, 0.06, 0.0723
# Coeficiente de aversión al riesgo
g = 3
# Curvas de indiferencia
sp = np.linspace(0.06, 0.2)
Erp1 = 1 / 2 * g * sp**2 + U1
Erp2 = 1 / 2 * g * sp**2 + U2
Erp3 = 1 / 2 * g * sp**2 + U3
```


```python
# Gráfica
plt.figure(figsize=(6, 4))
plt.plot(portafolios['Vol'], portafolios['Media'], label='Portafolios')
plt.plot(sb, Erb, 'or', label='Bonds')
plt.plot(ss, Ers, 'ob', label='Stocks')
plt.plot(sp, Erp1, label=f'Curva de indiferencia $U_1$={U1}')
plt.plot(sp, Erp2, label=f'Curva de indiferencia $U_2$={U2}')
plt.plot(sp, Erp3, label=f'Curva de indiferencia $U_3$={U3}')
plt.xlabel('Volatilidad $\sigma$')
plt.ylabel('Rendimiento esperado $E[r]$')
plt.grid()
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
#plt.axis([0.09, 0.11, 0.08, 0.09])
```

**Tercero.** La elección óptima está dada por la curva de indiferencia para el nivel de utilidad más alto que es tangente a la frontera media-varianza.
- Claramente, esta selección depende del coeficiente de aversión al riesgo.


```python
# Gráfica con zoom
# Gráfica
plt.figure(figsize=(6, 4))
plt.plot(portafolios['Vol'], portafolios['Media'], label='Portafolios')
plt.plot(sb, Erb, 'or', label='Bonds')
plt.plot(ss, Ers, 'ob', label='Stocks')
plt.plot(sp, Erp1, label=f'Curva de indiferencia $U_1$={U1}')
plt.plot(sp, Erp2, label=f'Curva de indiferencia $U_2$={U2}')
plt.plot(sp, Erp3, label=f'Curva de indiferencia $U_3$={U3}')
plt.xlabel('Volatilidad $\sigma$')
plt.ylabel('Rendimiento esperado $E[r]$')
plt.grid()
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
plt.axis([0.12, 0.14, 0.09, 0.105])
```

# Anuncios parroquiales

## 1. Quiz la siguiente clase.



<footer id="attribution" style="float:right; color:#808080; background:#fff;">
Created with Jupyter by Esteban Jiménez Rodríguez.
</footer>
