--- license: mit language: - es --- # Importar las librerías necesarias import pandas as pd import numpy as np import matplotlib.pyplot as plt import requests import json # Definir los ETFs y las acciones que queremos analizar etfs = ["SPY", "EEM", "GLD", "QQQ", "IWM"] acciones = ["AAPL", "AMZN", "MSFT", "TSLA", "GOOG"] # Definir las fechas de inicio y fin del análisis inicio = "2020-01-01" fin = "2024-02-17" # Definir la tasa de descuento para el VPN y la TIR tasa = 0.05 # Definir la función para obtener los datos de Yahoo Finance def obtener_datos(simbolo, inicio, fin): # Construir la url de la API de Yahoo Finance url = f"https://query1.finance.yahoo.com/v7/finance/download/{simbolo}?period1={inicio}&period2={fin}&interval=1d&events=history&includeAdjustedClose=true" # Hacer la petición y obtener la respuesta respuesta = requests.get(url) # Convertir la respuesta en un dataframe de pandas datos = pd.read_csv(respuesta.text, parse_dates=["Date"], index_col="Date") # Devolver el dataframe return datos # Crear un diccionario vacío para almacenar los dataframes de los ETFs y las acciones dataframes = {} # Iterar por cada ETF y obtener sus datos for etf in etfs: # Obtener los datos del ETF datos = obtener_datos(etf, inicio, fin) # Añadir el dataframe al diccionario con el símbolo del ETF como clave dataframes[etf] = datos # Iterar por cada acción y obtener sus datos for accion in acciones: # Obtener los datos de la acción datos = obtener_datos(accion, inicio, fin) # Añadir el dataframe al diccionario con el símbolo de la acción como clave dataframes[accion] = datos # Definir la función para calcular el VPN de una inversión def calcular_vpn(flujos, tasa): # Inicializar el VPN con el valor del flujo inicial vpn = flujos[0] # Iterar por cada flujo posterior al inicial for i in range(1, len(flujos)): # Actualizar el VPN con el valor del flujo actualizado vpn += flujos[i] / (1 + tasa) ** i # Devolver el VPN return vpn # Definir la función para calcular la TIR de una inversión def calcular_tir(flujos): # Usar la función np.irr de numpy para calcular la TIR tir = np.irr(flujos) # Devolver la TIR return tir # Definir la función para calcular el ROI de una inversión def calcular_roi(ganancia, costo): # Calcular el ROI como la relación entre la ganancia y el costo roi = ganancia / costo # Devolver el ROI return roi # Crear un diccionario vacío para almacenar las métricas de los ETFs y las acciones metricas = {} # Iterar por cada ETF y calcular sus métricas for etf in etfs: # Obtener el dataframe del ETF datos = dataframes[etf] # Calcular el precio inicial y final del ETF precio_inicial = datos["Adj Close"][0] precio_final = datos["Adj Close"][-1] # Calcular el dividendo total del ETF dividendo_total = datos["Dividends"].sum() # Calcular el flujo inicial y final de la inversión en el ETF flujo_inicial = -precio_inicial flujo_final = precio_final + dividendo_total # Calcular el VPN, la TIR y el ROI de la inversión en el ETF vpn = calcular_vpn([flujo_inicial, flujo_final], tasa) tir = calcular_tir([flujo_inicial, flujo_final]) roi = calcular_roi(flujo_final, -flujo_inicial) # Añadir las métricas al diccionario con el símbolo del ETF como clave metricas[etf] = {"VPN": vpn, "TIR": tir, "ROI": roi} # Iterar por cada acción y calcular sus métricas for accion in acciones: # Obtener el dataframe de la acción datos = dataframes[accion] # Calcular el precio inicial y final de la acción precio_inicial = datos["Adj Close"][0] precio_final = datos["Adj Close"][-1] # Calcular el dividendo total de la acción dividendo_total = datos["Dividends"].sum() # Calcular el flujo inicial y final de la inversión en la acción flujo_inicial = -precio_inicial flujo_final = precio_final + dividendo_total # Calcular el VPN, la TIR y el ROI de la inversión en la acción vpn = calcular_vpn([flujo_inicial, flujo_final], tasa) tir = calcular_tir([flujo_inicial, flujo_final]) # Corregir el paréntesis roi = calcular_roi(flujo_final, -flujo_inicial) # Añadir las métricas al diccionario con el símbolo de la acción como clave # Corregir la asignación metricas[accion] = {"VPN": vpn, "TIR": tir, "ROI": roi} # Convertir el diccionario de métricas en un dataframe de pandas # Corregir la conversión metricas = pd.DataFrame(metricas) # Mostrar el dataframe de métricas print(metricas) # Importar la librería plotly para crear gráficos interactivos import plotly.express as px # Crear un gráfico de barras que muestre el VPN de cada ETF y acción fig1 = px.bar(metricas.T, x=metricas.T.index, y="VPN", title="VPN de los ETFs y las acciones") # Mostrar el gráfico fig1.show() # Crear un gráfico de barras que muestre la TIR de cada ETF y acción fig2 = px.bar(metricas.T, x=metricas.T.index, y="TIR", title="TIR de los ETFs y las acciones") # Mostrar el gráfico fig2.show() # Crear un gráfico de barras que muestre el ROI de cada ETF y acción fig3 = px.bar(metricas.T, x=metricas.T.index, y="ROI", title="ROI de los ETFs y las acciones") # Mostrar el gráfico fig3.show() # Usar un gpt para generar el texto que explique los gráficos texto = """ Este bashboard muestra las métricas de inversión de los ETFs y las acciones que has elegido, desde el 1 de enero de 2020 hasta el 17 de febrero de 2024. Las métricas son el VPN, la TIR y el ROI, que miden la rentabilidad, el riesgo y el beneficio de cada inversión. El primer gráfico muestra el VPN de cada ETF y acción, que es la diferencia entre el valor actual de los ingresos futuros y el valor actual de los costos futuros de una inversión. Un VPN positivo indica que la inversión es rentable, mientras que un VPN negativo indica que la inversión es deficitaria. Como se puede observar, todos los ETFs y acciones tienen un VPN positivo, lo que significa que han generado más ingresos que costos en el periodo analizado. El ETF que tiene el mayor VPN es el SPY, que replica el índice S&P 500, seguido por el QQQ, que replica el índice Nasdaq 100. La acción que tiene el mayor VPN es la de Tesla, que ha tenido un crecimiento espectacular en los últimos años. El segundo gráfico muestra la TIR de cada ETF y acción, que es la tasa de descuento que hace que el VPN de una inversión sea igual a cero. La TIR representa la rentabilidad anual de una inversión. Una TIR mayor que el costo de capital indica que la inversión es rentable, mientras que una TIR menor que el costo de capital indica que la inversión es deficitaria. Como se puede observar, todos los ETFs y acciones tienen una TIR mayor que el costo de capital, que hemos asumido que es del 5%, lo que significa que han sido inversiones rentables en el periodo analizado. El ETF que tiene la mayor TIR es el GLD, que replica el precio del oro, seguido por el IWM, que replica el índice Russell 2000. La acción que tiene la mayor TIR es la de Tesla, que ha tenido una rentabilidad impresionante en los últimos años. El tercer gráfico muestra el ROI de cada ETF y acción, que es la