<jupyter_start><jupyter_text>Tarea 3. Midiendo rendimiento y riesgo.**Resumen.**> En esta tarea descargarás datos históricos de precios y, con base en ellos, calcularás rendimientos. Luego se te pedirá resumir la distribución de rendimientos para cada instrumento calculando el rendimiento medio y volatilidad. De igual manera, se te pedirá presentar dicho resumen en una base anual.**Criterio de revisión.**> Se te calificará de acuerdo a los resultados finales que reportes, basados en tu análisis.**Antes de comenzar.**> Por favor, copiar y pegar este archivo en otra ubicación. Antes de comenzar, nombrarlo *Tarea3_ApellidoNombre*, sin acentos y sin espacios; por ejemplo, en mi caso el archivo se llamaría *Tarea3_JimenezEsteban*. Resolver todos los puntos en dicho archivo y subir en este espacio.  1. Descarga de datos (10 puntos)Descargar los precios diarios ajustados en el cierre para el índice S&P 500 (^GSPC), y para 15 compañías que compongan dicho índice, durante el periodo comprendido del primero de enero del 2015 hasta el 31 de diciembre del 2019.1. Mostrar el DataFrame de los precios diarios (5 puntos).2. Graficar los precios (5 puntos).<jupyter_code># Importar paquetes
import pandas as pd
import numpy as np
%matplotlib inline
import pandas_datareader.data as web
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
#informacion
names=['FB','GOOGL','MMM','M','ALK','C','COST','EBAY','FDX','F',
       'GPS','HAS','INTC','JPM','MAR','^GSPC']
start_date='2015-01-01'
end_date='2019-12-31'

# Precios diarios
closes=get_adj_closes(tickers=names,start_date=start_date,end_date=end_date)
closes.sample(10)
# Gráfico de histórico de precios diarios
closes.plot(figsize=(10,10),grid=True)<jupyter_output><empty_output><jupyter_text>2. Cálculo de rendimientos diarios (20 puntos)A partir de los precios que descargaste en el anterior punto, calcular los rendimientos porcentuales diarios.1. Mostrar el DataFrame de los rendimientos porcentuales diarios (10 puntos).2. Graficar los rendimientos (10 puntos).<jupyter_code>closes.shift()
# Calcular los rendimientos
ret=((closes-closes.shift())/closes.shift()).dropna()
ret.head()
# Graficar...
ret.plot(figsize=(10,5),grid=True)
#El indice es el que tiene mayor variabilidad<jupyter_output><empty_output><jupyter_text>3. Resumen de distribución de rendimientos (30 puntos)Con base en los rendimientos que calculaste en el punto anterior:1. Calcular el rendimiento medio diario para el índice S&P 500 y para los demás activos. Anualizar los rendimientos (15 puntos). 2. Calcular la volatilidad diaria para el índice S&P 500 y para los demás activos. Anualizar (15 puntos).Por favor, reportar los resultados en DataFrames tal y como lo vimos en clase.<jupyter_code>#Rendimiento medio diario de los 15 activos
mean_ret=ret.mean()
mean_ret
# Volatilidad diaria (desviación estándar)
vol=ret.std()
vol
# Podemos resumir en un DataFrame
ret_summary=pd.DataFrame({'Mean':mean_ret,'Vol':vol})
ret_summary
# Resumen en base anual
annual_ret_summary=pd.DataFrame({'Mean':mean_ret*252,
                                'Vol':vol*np.sqrt(252)})
annual_ret_summary<jupyter_output><empty_output><jupyter_text>4. Gráfico rendimientos esperados vs. volatilidad (40 puntos)Graficar los rendimientos medios anuales contra las desviaciones estándar del índice S&P 500 y de los demás activos. Como vimos en clase, la volatilidad debe ir en el eje $x$ y el rendimiento esperado en el eje $y$. Se deben etiquetar los ejes y dar detalles para un completo entendimiento de la gráfica.1. Gráfico (10 puntos).2. Ajuste una línea recta a los puntos obtenidos. Dar la ecuación (10 puntos).3. A partir del gráfico y de la línea recta ajustada, concluya acerca de la relación rendimiento/riesgo (20 puntos).<jupyter_code># Gráfico rendimiento esperado vs. volatilidad
import matplotlib.pyplot as plt
# Puntos a graficar
x_points=annual_ret_summary.loc[:,'Vol']
y_points=annual_ret_summary.loc[:,'Mean']

# Ventana para graficar
plt.figure(figsize=(6,4))
# Graficar puntos
plt.plot(x_points,y_points,'*',ms=10)
##### ms es el tamaño de los puntos en la grafica
plt.grid()
# Etiquetas de los ejes
plt.xlabel('Volatilidad ($\sigma$)')
plt.ylabel('Rendimiento esperado ($E[r]$)')
# Etiqueta de cada instrumento
plt.text(x_points[0],y_points[0],'FB')
plt.text(x_points[1],y_points[1],'GOOGL')
plt.text(x_points[2],y_points[2],'MMM')
plt.text(x_points[3],y_points[3],'M')
plt.text(x_points[4],y_points[4],'ALK')
plt.text(x_points[5],y_points[5],'C')
plt.text(x_points[6],y_points[6],'COST')
plt.text(x_points[7],y_points[7],'EBAY')
plt.text(x_points[8],y_points[8],'FDX')
plt.text(x_points[9],y_points[9],'F')
plt.text(x_points[10],y_points[10],'GPS')
plt.text(x_points[11],y_points[11],'HAS')
plt.text(x_points[12],y_points[12],'INTC')
plt.text(x_points[13],y_points[13],'JPM')
plt.text(x_points[14],y_points[14],'MAR')
plt.text(x_points[15],y_points[15],'^GSPC')

plt.show()

# Importar el módulo optimize de la librería scipy
from scipy.optimize import minimize
# Funcion objetivo y condicion inicial
def objetivo(beta,vol,mean_ret):
    recta=beta[0]+beta[1]*vol
    return ((mean_ret-recta)**2).sum()
# Resolver problema de optimizacion
beta_ini=[0,0]
solucion=minimize(fun=objetivo,
                 x0=beta_ini,
                 args=(annual_ret_summary['Vol'],
                      annual_ret_summary['Mean']))
solucion
beta_opt=solucion.x
beta_opt
x_points=annual_ret_summary.loc[:,'Vol']
y_points=annual_ret_summary.loc[:,'Mean']

# Ventana para graficar
plt.figure(figsize=(6,4))
# Graficar recta ajustada
x_recta=np.linspace(0.10,.3,100)
y_recta=beta_opt[1]*x_recta+beta_opt[0]
plt.plot(x_recta,y_recta,'r',lw=3,label='Recta Ajustada')
plt.legend(loc='best')
plt.grid()

# Etiquetas de los ejes
plt.xlabel('Volatilidad ($\sigma$)')
plt.ylabel('Rendimiento esperado ($E[r]$)')
# Etiqueta de cada instrumento
plt.text(x_points[0],y_points[0],'FB')
plt.text(x_points[1],y_points[1],'GOOGL')
plt.text(x_points[2],y_points[2],'MMM')
plt.text(x_points[3],y_points[3],'M')
plt.text(x_points[4],y_points[4],'ALK')
plt.text(x_points[5],y_points[5],'C')
plt.text(x_points[6],y_points[6],'COST')
plt.text(x_points[7],y_points[7],'EBAY')
plt.text(x_points[8],y_points[8],'FDX')
plt.text(x_points[9],y_points[9],'F')
plt.text(x_points[10],y_points[10],'GPS')
plt.text(x_points[11],y_points[11],'HAS')
plt.text(x_points[12],y_points[12],'INTC')
plt.text(x_points[13],y_points[13],'JPM')
plt.text(x_points[14],y_points[14],'MAR')
plt.text(x_points[15],y_points[15],'^GSPC')

plt.plot(x_points,y_points,'*',ms=10)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1337225861577898, 'fraction_numerical': 0.030902876673312447, 'mean_word_length': 6.519271948608137, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 20, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '148806', 'license': 'MIT', 'n_tokens_mistral': 2865, 'n_tokens_neox': 2711, 'n_words': 632, 'path': 'Tareas/Tarea3_BarraganJavier (1).ipynb', 'repo_name': 'fjbarrg/porinvp2020', 'size': '7022'}