Analisis de datos para finanzas - Pandas
Instituto Tecnologicos de las Américas ITLA
Clase 2024.09.21
email: gdelarosa@[Link]
PANDAS
RESPONDE LAS SIGUIENTES PREGUNTAS
¿Que son los rendimientos de acciones?
Los rendimientos de acciones son las ganancias o pérdidas generadas por la inversión en
acciones, expresadas como un porcentaje del precio inicial de la acción.
¿Que es la volatilidad de un portafolio?
La volatilidad de un portafolio mide la variabilidad de sus rendimientos en el tiempo,
indicando el riesgo asociado a la inversión.
¿Que es la correlación de activos?
La correlación de activos es una medida que indica cómo se mueven dos activos en relación
entre sí, lo que ayuda a entender la diversificación y el riesgo en un portafolio.
Ejercicio 1: Análisis de Rendimiento de Acciones
Descripción: Utiliza un DataFrame con precios históricos de varias acciones y calcula el
rendimiento diario y acumulado.
Tareas:
1- Carga un conjunto de datos con precios históricos de acciones.
In [15]: import pandas as pd
df = pd.read_excel('C:/Users/Admin/OneDrive - Instituto Tecnológico de Las Américas
# Convertir la columna 'fecha' a tipo datetime
df['fecha'] = pd.to_datetime(df['fecha'])
print("Primeras 5 filas del DataFrame:")
print([Link](5))
Primeras 5 filas del DataFrame:
fecha valor accion
0 2024-01-02 185.64 AAPL
1 2024-01-03 184.25 AAPL
2 2024-01-04 181.91 AAPL
3 2024-01-05 181.18 AAPL
4 2024-01-08 185.56 AAPL
2- Calcula el rendimiento diario de cada acción utilizando la fórmula: 𝑃𝑡 − 𝑃𝑡 1 𝑃𝑡 − 1
In [16]: # Ordenar el DataFrame por acción y fecha
df = df.sort_values(by=['accion', 'fecha'])
# Calcular el rendimiento diario
df['rendimiento_diario'] = [Link]('accion')['valor'].pct_change()
print("Rendimiento diario de cada acción:")
print(df[['fecha', 'accion', 'rendimiento_diario']])
Rendimiento diario de cada acción:
fecha accion rendimiento_diario
0 2024-01-02 AAPL NaN
1 2024-01-03 AAPL -0.007488
2 2024-01-04 AAPL -0.012700
3 2024-01-05 AAPL -0.004013
4 2024-01-08 AAPL 0.024175
.. ... ... ...
915 2024-09-18 TSLA -0.002940
916 2024-09-19 TSLA 0.073592
917 2024-09-20 TSLA -0.023245
918 2024-09-23 TSLA 0.049318
919 2024-09-24 TSLA 0.017080
[920 rows x 3 columns]
3- Calcula el rendimiento acumulado de cada acción.
In [19]: # Calcular el rendimiento acumulado
df['rendimiento_acumulado'] = (1 + df['rendimiento_diario']).cumprod() - 1
# Calcular el rendimiento acumulado total por acción
rendimiento_acumulado_total = [Link]('accion').agg(
rendimiento_acumulado_total=('rendimiento_acumulado', 'last')
).reset_index()
print("Rendimiento acumulado total de cada acción:")
print(rendimiento_acumulado_total)
Rendimiento acumulado total de cada acción:
accion rendimiento_acumulado_total
0 AAPL 0.224790
1 AMZN 0.584474
2 GOOGL 0.861072
3 MSFT 1.153629
4 TSLA 1.204344
4 - Identifica los días con el mayor y menor rendimiento para cada acción.
In [18]: mayor_rendimiento = [Link][[Link]('accion')['rendimiento_diario'].idxmax()]
menor_rendimiento = [Link][[Link]('accion')['rendimiento_diario'].idxmin()]
print("\nDías con el mayor rendimiento:")
print(mayor_rendimiento)
print("\nDías con el menor rendimiento:")
print(menor_rendimiento)
Días con el mayor rendimiento:
fecha valor accion rendimiento_diario
111 2024-06-11 207.15 AAPL 0.072649
206 2024-02-02 171.81 AMZN 0.078666
448 2024-04-26 171.95 GOOGL 0.102244
600 2024-03-12 415.28 MSFT 0.026599
817 2024-04-29 194.05 TSLA 0.153069
Días con el menor rendimiento:
fecha valor accion rendimiento_diario
148 2024-08-05 209.27 AAPL -0.048167
331 2024-08-02 167.90 AMZN -0.087847
388 2024-01-31 140.10 GOOGL -0.075003
692 2024-07-24 428.90 MSFT -0.035855
876 2024-07-24 215.99 TSLA -0.123346
Ejercicio 2: Volatilidad de un Portafolio
Descripción: Utiliza datos de precios para calcular la volatilidad de un portafolio compuesto
por varias acciones.
Tareas:
1 - Crea un DataFrame con precios de cierre ajustados de 5 acciones.
In [21]: print("DataFrame:")
print(df)
DataFrame:
fecha valor accion rendimiento_diario rendimiento_acumulado
0 2024-01-02 185.64 AAPL NaN NaN
1 2024-01-03 184.25 AAPL -0.007488 -0.007488
2 2024-01-04 181.91 AAPL -0.012700 -0.020093
3 2024-01-05 181.18 AAPL -0.004013 -0.024025
4 2024-01-08 185.56 AAPL 0.024175 -0.000431
.. ... ... ... ... ...
915 2024-09-18 227.20 TSLA -0.002940 0.969666
916 2024-09-19 243.92 TSLA 0.073592 1.114617
917 2024-09-20 238.25 TSLA -0.023245 1.065462
918 2024-09-23 250.00 TSLA 0.049318 1.167327
919 2024-09-24 254.27 TSLA 0.017080 1.204344
[920 rows x 5 columns]
2 - Calcula la rentabilidad diaria de cada acción.
In [22]: # Ordenar el DataFrame por acción y fecha
df = df.sort_values(by=['accion', 'fecha'])
# Calcular el rendimiento diario
df['rendimiento_diario'] = [Link]('accion')['valor'].pct_change()
print("Rendimiento diario de cada acción:")
print(df[['fecha', 'accion', 'rendimiento_diario']])
Rendimiento diario de cada acción:
fecha accion rendimiento_diario
0 2024-01-02 AAPL NaN
1 2024-01-03 AAPL -0.007488
2 2024-01-04 AAPL -0.012700
3 2024-01-05 AAPL -0.004013
4 2024-01-08 AAPL 0.024175
.. ... ... ...
915 2024-09-18 TSLA -0.002940
916 2024-09-19 TSLA 0.073592
917 2024-09-20 TSLA -0.023245
918 2024-09-23 TSLA 0.049318
919 2024-09-24 TSLA 0.017080
[920 rows x 3 columns]
3 - Calcula la volatilidad (desviación estándar de la rentabilidad) de cada acción.
In [23]: # Calcular la volatilidad (desviación estándar de la rentabilidad diaria) para cada
volatilidad = [Link]('accion')['rendimiento_diario'].std().reset_index()
# Renombrar la columna para mayor claridad
[Link] = ['accion', 'volatilidad']
# Mostrar los resultados
print("Volatilidad de cada acción:")
print(volatilidad)
Volatilidad de cada acción:
accion volatilidad
0 AAPL 0.015099
1 AMZN 0.017546
2 GOOGL 0.017641
3 MSFT 0.012362
4 TSLA 0.036720
4 - Combina las acciones en un portafolio y calcula la volatilidad del portafolio, suponiendo
pesos iguales.
In [27]: # 1. Calcular la matriz de covarianza de los rendimientos diarios
cov_matrix = [Link](index='fecha', columns='accion', values='rendimiento_diario')
# 2. Definir los pesos iguales para cada acción
n_acciones = len(cov_matrix) # Número de acciones
weights = [1/n_acciones] * n_acciones # Pesos iguales
# 3. Calcular la volatilidad del portafolio
port_volatility = (weights @ cov_matrix @ weights)**0.5
# 4. Mostrar el resultado
print(f"Volatilidad del portafolio: {port_volatility:.4f}")
Volatilidad del portafolio: 0.0144
Ejercicio 3: Correlación de Activos
Descripción: Examina la correlación entre diferentes activos financieros utilizando datos
históricos.
Tareas:
1 - Carga un conjunto de datos con precios históricos de varios activos (acciones, bonos,
etc.).
In [28]: print("DataFrame:")
print(df)
DataFrame:
fecha valor accion rendimiento_diario rendimiento_acumulado \
0 2024-01-02 185.64 AAPL NaN NaN
1 2024-01-03 184.25 AAPL -0.007488 -0.007488
2 2024-01-04 181.91 AAPL -0.012700 -0.020093
3 2024-01-05 181.18 AAPL -0.004013 -0.024025
4 2024-01-08 185.56 AAPL 0.024175 -0.000431
.. ... ... ... ... ...
915 2024-09-18 227.20 TSLA -0.002940 0.969666
916 2024-09-19 243.92 TSLA 0.073592 1.114617
917 2024-09-20 238.25 TSLA -0.023245 1.065462
918 2024-09-23 250.00 TSLA 0.049318 1.167327
919 2024-09-24 254.27 TSLA 0.017080 1.204344
rendimiento_portafolio
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
.. ...
915 NaN
916 NaN
917 NaN
918 NaN
919 NaN
[920 rows x 6 columns]
2 - Calcula la rentabilidad diaria de cada activo.
In [29]: # Ordenar el DataFrame por acción y fecha
df = df.sort_values(by=['accion', 'fecha'])
# Calcular el rendimiento diario
df['rendimiento_diario'] = [Link]('accion')['valor'].pct_change()
print("Rendimiento diario de cada acción:")
print(df[['fecha', 'accion', 'rendimiento_diario']])
Rendimiento diario de cada acción:
fecha accion rendimiento_diario
0 2024-01-02 AAPL NaN
1 2024-01-03 AAPL -0.007488
2 2024-01-04 AAPL -0.012700
3 2024-01-05 AAPL -0.004013
4 2024-01-08 AAPL 0.024175
.. ... ... ...
915 2024-09-18 TSLA -0.002940
916 2024-09-19 TSLA 0.073592
917 2024-09-20 TSLA -0.023245
918 2024-09-23 TSLA 0.049318
919 2024-09-24 TSLA 0.017080
[920 rows x 3 columns]
3 - Utiliza [Link]() para calcular la matriz de correlación entre los activos.
In [30]: # Reorganizar el DataFrame para que cada acción sea una columna
df_pivot = [Link](index='fecha', columns='accion', values='rendimiento_diario')
# Calcular la matriz de correlación entre los activos
correlation_matrix = df_pivot.corr()
print("Matriz de correlación entre las acciones:")
print(correlation_matrix)
Matriz de correlación entre las acciones:
accion AAPL AMZN GOOGL MSFT TSLA
accion
AAPL 1.000000 0.335181 0.387976 0.447870 0.408583
AMZN 0.335181 1.000000 0.535232 0.678475 0.321195
GOOGL 0.387976 0.535232 1.000000 0.621287 0.203096
MSFT 0.447870 0.678475 0.621287 1.000000 0.312052
TSLA 0.408583 0.321195 0.203096 0.312052 1.000000
4 - Identifica los pares de activos con mayor y menor correlación.
In [46]: mayor_correlacion = ('MSFT', 'AMZN', 0.678475)
menor_correlacion = ('TSLA', 'GOOGL', 0.203096)
print(f"Mayor correlación: {mayor_correlacion[0]} - {mayor_correlacion[1]}: {mayor_
print(f"Menor correlación: {menor_correlacion[0]} - {menor_correlacion[1]}: {menor_
Mayor correlación: MSFT - AMZN: 0.678475
Menor correlación: TSLA - GOOGL: 0.203096