# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Análisis de Estilo en Portafolios

# <img style="float: right; margin: 0px 0px 15px 15px;" src="http://www.picpedia.org/finance/images/stock-portfolio.jpg" width="400px" height="400px" />
#
# > Al analizar si invertir o no en un portafolio (fondo de inversión), nos podríamos preguntar qué tan bueno es el administrador de dicho fondo.
#
# > Bien, esto nos lleva a preguntarnos cómo es que se conforma un portafolio, cuál es el proceso mediante el cual se seleccionan los activos.
#
# > Se puede consultar que los portafolios se venden con ciertas tendencias claramente marcadas (portafolios de compañías de alta capitalización, portafolios de compañías de baja capitalización, portafolios de compañías con baja diferencia de valor en libros y valor bursátil, ...).
#
# > Entonces, surgen dos preguntas:
# > 1. ¿Presenta en realidad el portafolio un comportamiento acorde al estilo que se promete?
# > 2. Si los activos que conforman el portafolio pertenecen a un grupo selecto, ¿qué tan bueno es el administrador escogiendo dichos activos?
#
# **Objetivos**
#
# - Descomponer el exceso de rendimientos de un portafolio, en los *rendimientos debidos al estilo* y los *rendimientos debidos a la selección*.
#
# - *rendimiento debido a la selección* = resta entre rendimiento del portafolio, y una mezcla pasiva de estilos similares.
#
# **Solo el rendimiento debido a la selección se le puede atribuir al talento del administrador.**
# ___

# ## 1. Fundamentos básicos
#
# - El análisis de estilo es una técnica poderosa y sofisticada para medir qué tan bueno es un administrador de fondos.
#
# - Describe qué tan bueno es un administrador, analizando estadísticamente cómo los rendimientos del portafolio actúan, contra los rendimientos de lo que incluye el portafolio.
#
# - En realidad nos interesa poco qué activos individuales contiene el portafolio. Más bien, miramos cómo se relaciona a diferentes estilos de inversión.

# - Pero, ¿qué es un estilo de inversión?
#  - Se puede pensar como un índice (método de inversión pasiva), o un *benchmark* (inversión base para comparar).
#  
# - Podemos pensar como si partiéramos el mercado en una matriz tres por tres, basados en la capitalización y en la diferencia entre valor en libros y valor de mercado.
#
# |                                |                                |                               |
# | ------------------------------ | ------------------------------ | ----------------------------- |
# | Alta capitalización, Alta BM   | Alta Capitalización, Medio BM  | Alta Capitalización, Bajo BM  |
# | Media capitalización, Alta BM  | Media Capitalización, Medio BM | Media Capitalización, Bajo BM |
# | Baja capitalización, Alta BM   | Baja Capitalización, Medio BM  | Baja Capitalización, Bajo BM  |
#
# - Entonces, por ejemplo, un administrador de fondos que invierte mayormente en activos de baja capitalización, diríamos que sigue un *estilo de baja capitalización*.

# - Cabe destacar que estos no son los únicos estilos de inversión: también hay *estilo de bonos de gobierno*, por ejemplo.

# Entonces, el análisis de estilo puede ser usado en varias formas:
#
# 1. Demostrar que un fondo de inversión sigue el objetivo que se plantea (si es de baja capitalización, etc)
#
# 2. Para descubrir cuál es el verdadero estilo de inversión del portafolio.
#
# 3. Evaluar que tan bueno es el administrador del fondo seleccionando los activos adecuados dentro del estilo prometido (valuación).

# ## 2. ¿Cómo se hace?
#
# - Para explorar el funcionamiento del análisis de estilo, analizaremos el fondo **Vanguard Small-Cap Index Fund Admiral Shares (VSMAX)**.
#
# - También necesitaremos los índices que marcan los diferentes estilos de inversión. Para ello usaremos las esquinas RUSSELL:
#  - Russell 1000 Growth (^RLG)
#  - Russell 1000 Value (^RLV)
#  - Russell 2000 Growth (^RUO)
#  - Russell 2000 Value (^RUJ)
#
# Descarguemos datos diarios en los últimos 5 años.

# +
# Importamos librerías
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# %matplotlib inline

import pandas_datareader.data as web


# -

# Función para descargar precios de cierre ajustados:
def get_adj_closes(tickers, start_date=None, end_date=None):
    # Fecha inicio por defecto (start_date='2010-01-01') y fecha fin por defecto (end_date=today)
    # Descargamos DataFrame con todos los datos
    closes = web.DataReader(name=tickers, data_source='yahoo', start=start_date, end=end_date)
    # Solo necesitamos los precios ajustados en el cierre
    closes = closes['Adj Close']
    # Se ordenan los índices de manera ascendente
    closes.sort_index(inplace=True)
    return closes

# +
# Nombres de instrumentos que vamos a importar

# Fechas de inicio y fin

# -

# Descargamos datos


# Graficamos


# Obtenemos rendimientos

# Rendimientos diarios


# Graficamos


# El análisis de estilo no es más que una regresión lineal de los (excesos de) rendimientos del portafolio que se va a analizar (*variable dependiente*), respecto a los diferentes estilos de inversión (*variables independientes o explicativas*).
#
# 1. De forma que se asignan pesos (o ponderaciones) a cada uno de los estilos elegidos y una ponderación adicional como intercepto <font color=blue> (ver en el tablero)</font>.
#
#  $$r_{p,t}=\alpha+w_1I_{1,t}+w_2I_{2,t}+\dots+w_nI_{n,t}+\epsilon_t,$$
#  
#  donde $\epsilon_t$ es el término de error (residual). Se incluye la restricción de que dichos pesos deben sumar uno (1), para interpretarlos como porcentajes:
#  
#  $$w_1+w_2+\dots+w_n=1.$$

# 2. Se calculan los residuales (error) al cuadrado en cada paso, y se minimiza el total: **mínimos cuadrados**.
#  
#  <font color=blue> (ver en el tablero)</font>.
#  
#  $$\min_{\alpha,w_1,\dots,w_n} \sum_{t=0}^T\epsilon_t^2=\sum_{t=0}^T\left(r_{p,t}-\alpha-w_1I_{1,t}-w_2I_{2,t}-\dots-w_nI_{n,t}\right)^2$$
#  
#  sujeto a $w_1+w_2+\dots+w_n=1.$

# 3. Calcular el estadístico $R$-cuadrado: en qué porcentaje la variación de los rendimientos de los índices explican la variación de los rendimientos del portafolio.
#
#  $$R^2=1-\frac{var(\epsilon)}{var(r_p)}$$

# Entonces, necesitamos un optimizador

# Importamos la librería optimize de scipy


# Debemos escribir la función a optimizar

# Función a minimizar (residuales)


# Datos de entrada al optimizador

# Datos


# Restricciones

# Restricciones




# Resolvemos

# Resolvemos








# Restricción


# ### ¿Qué podemos concluir?

#  - Russell 1000 Growth (^RLG)
#  - Russell 1000 Value (^RLV)
#  - Russell 2000 Growth (^RUO)
#  - Russell 2000 Value (^RUJ)

# Entonces, el fondo **Vanguard Small-Cap Index Fund Admiral Shares (VSMAX)**, está conformado en un

# w_1


# por activos de alta capialización y con baja diferencia BM (Russell 1000 Growth); está conformado en un

# w_2


# por activos de alta capitalización con alta diferencia BM (Russell 1000 Value); está conformado en un

# w_3


# por activos de baja capitalización con baja diferencia BM (Russell 2000 Growth); y está conformado en un

# w_4


# por activos de baja capitalización con alta diferencia BM (Russell 2000 Value). El restante

# alpha


# de los rendimientos diarios, **es atribuible al administrador del fondo por la selección particular de los activos.**

# Por tanto, **el estilo predominante del fondo es de baja capitalizacion** ($\approx 70\%$).

# Calculamos el $R^2$

# Calculamos residuales (error)


# Calculamos Rsq


# Estadísticamente, el modelo propuesto explica el $98.51\%$ de la variación total de los rendimientos del portafolio.

# Gráficamente

# Graficar los rendimientos del portafolio y los que se obtendrían con los índices


# # Anuncios parroquiales
#
# ## 1. Ver clase 0 para revisar objetivos.
#
# ## 2. La siguiente clase describiremos el proyecto. El resto de clase es de repaso.

# <script>
#   $(document).ready(function(){
#     $('div.prompt').hide();
#     $('div.back-to-top').hide();
#     $('nav#menubar').hide();
#     $('.breadcrumb').hide();
#     $('.hidden-print').hide();
#   });
# </script>
#
# <footer id="attribution" style="float:right; color:#808080; background:#fff;">
# Created with Jupyter by <NAME>.
# </footer>

StarcoderdataJupyterScriptsDedupFiltered