Update README.md
Browse files
README.md
CHANGED
|
@@ -1,3 +1,150 @@
|
|
| 1 |
---
|
| 2 |
license: mit
|
|
|
|
|
|
|
| 3 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
license: mit
|
| 3 |
+
language:
|
| 4 |
+
- es
|
| 5 |
---
|
| 6 |
+
# Importar las librer铆as necesarias
|
| 7 |
+
import pandas as pd
|
| 8 |
+
import numpy as np
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
import requests
|
| 11 |
+
import json
|
| 12 |
+
|
| 13 |
+
# Definir los ETFs y las acciones que queremos analizar
|
| 14 |
+
etfs = ["SPY", "EEM", "GLD", "QQQ", "IWM"]
|
| 15 |
+
acciones = ["AAPL", "AMZN", "MSFT", "TSLA", "GOOG"]
|
| 16 |
+
|
| 17 |
+
# Definir las fechas de inicio y fin del an谩lisis
|
| 18 |
+
inicio = "2020-01-01"
|
| 19 |
+
fin = "2024-02-17"
|
| 20 |
+
|
| 21 |
+
# Definir la tasa de descuento para el VPN y la TIR
|
| 22 |
+
tasa = 0.05
|
| 23 |
+
|
| 24 |
+
# Definir la funci贸n para obtener los datos de Yahoo Finance
|
| 25 |
+
def obtener_datos(simbolo, inicio, fin):
|
| 26 |
+
# Construir la url de la API de Yahoo Finance
|
| 27 |
+
url = f"https://query1.finance.yahoo.com/v7/finance/download/{simbolo}?period1={inicio}&period2={fin}&interval=1d&events=history&includeAdjustedClose=true"
|
| 28 |
+
# Hacer la petici贸n y obtener la respuesta
|
| 29 |
+
respuesta = requests.get(url)
|
| 30 |
+
# Convertir la respuesta en un dataframe de pandas
|
| 31 |
+
datos = pd.read_csv(respuesta.text, parse_dates=["Date"], index_col="Date")
|
| 32 |
+
# Devolver el dataframe
|
| 33 |
+
return datos
|
| 34 |
+
|
| 35 |
+
# Crear un diccionario vac铆o para almacenar los dataframes de los ETFs y las acciones
|
| 36 |
+
dataframes = {}
|
| 37 |
+
|
| 38 |
+
# Iterar por cada ETF y obtener sus datos
|
| 39 |
+
for etf in etfs:
|
| 40 |
+
# Obtener los datos del ETF
|
| 41 |
+
datos = obtener_datos(etf, inicio, fin)
|
| 42 |
+
# A帽adir el dataframe al diccionario con el s铆mbolo del ETF como clave
|
| 43 |
+
dataframes[etf] = datos
|
| 44 |
+
|
| 45 |
+
# Iterar por cada acci贸n y obtener sus datos
|
| 46 |
+
for accion in acciones:
|
| 47 |
+
# Obtener los datos de la acci贸n
|
| 48 |
+
datos = obtener_datos(accion, inicio, fin)
|
| 49 |
+
# A帽adir el dataframe al diccionario con el s铆mbolo de la acci贸n como clave
|
| 50 |
+
dataframes[accion] = datos
|
| 51 |
+
|
| 52 |
+
# Definir la funci贸n para calcular el VPN de una inversi贸n
|
| 53 |
+
def calcular_vpn(flujos, tasa):
|
| 54 |
+
# Inicializar el VPN con el valor del flujo inicial
|
| 55 |
+
vpn = flujos[0]
|
| 56 |
+
# Iterar por cada flujo posterior al inicial
|
| 57 |
+
for i in range(1, len(flujos)):
|
| 58 |
+
# Actualizar el VPN con el valor del flujo actualizado
|
| 59 |
+
vpn += flujos[i] / (1 + tasa) ** i
|
| 60 |
+
# Devolver el VPN
|
| 61 |
+
return vpn
|
| 62 |
+
|
| 63 |
+
# Definir la funci贸n para calcular la TIR de una inversi贸n
|
| 64 |
+
def calcular_tir(flujos):
|
| 65 |
+
# Usar la funci贸n np.irr de numpy para calcular la TIR
|
| 66 |
+
tir = np.irr(flujos)
|
| 67 |
+
# Devolver la TIR
|
| 68 |
+
return tir
|
| 69 |
+
|
| 70 |
+
# Definir la funci贸n para calcular el ROI de una inversi贸n
|
| 71 |
+
def calcular_roi(ganancia, costo):
|
| 72 |
+
# Calcular el ROI como la relaci贸n entre la ganancia y el costo
|
| 73 |
+
roi = ganancia / costo
|
| 74 |
+
# Devolver el ROI
|
| 75 |
+
return roi
|
| 76 |
+
|
| 77 |
+
# Crear un diccionario vac铆o para almacenar las m茅tricas de los ETFs y las acciones
|
| 78 |
+
metricas = {}
|
| 79 |
+
|
| 80 |
+
# Iterar por cada ETF y calcular sus m茅tricas
|
| 81 |
+
for etf in etfs:
|
| 82 |
+
# Obtener el dataframe del ETF
|
| 83 |
+
datos = dataframes[etf]
|
| 84 |
+
# Calcular el precio inicial y final del ETF
|
| 85 |
+
precio_inicial = datos["Adj Close"][0]
|
| 86 |
+
precio_final = datos["Adj Close"][-1]
|
| 87 |
+
# Calcular el dividendo total del ETF
|
| 88 |
+
dividendo_total = datos["Dividends"].sum()
|
| 89 |
+
# Calcular el flujo inicial y final de la inversi贸n en el ETF
|
| 90 |
+
flujo_inicial = -precio_inicial
|
| 91 |
+
flujo_final = precio_final + dividendo_total
|
| 92 |
+
# Calcular el VPN, la TIR y el ROI de la inversi贸n en el ETF
|
| 93 |
+
vpn = calcular_vpn([flujo_inicial, flujo_final], tasa)
|
| 94 |
+
tir = calcular_tir([flujo_inicial, flujo_final])
|
| 95 |
+
roi = calcular_roi(flujo_final, -flujo_inicial)
|
| 96 |
+
# A帽adir las m茅tricas al diccionario con el s铆mbolo del ETF como clave
|
| 97 |
+
metricas[etf] = {"VPN": vpn, "TIR": tir, "ROI": roi}
|
| 98 |
+
|
| 99 |
+
# Iterar por cada acci贸n y calcular sus m茅tricas
|
| 100 |
+
for accion in acciones:
|
| 101 |
+
# Obtener el dataframe de la acci贸n
|
| 102 |
+
datos = dataframes[accion]
|
| 103 |
+
# Calcular el precio inicial y final de la acci贸n
|
| 104 |
+
precio_inicial = datos["Adj Close"][0]
|
| 105 |
+
precio_final = datos["Adj Close"][-1]
|
| 106 |
+
# Calcular el dividendo total de la acci贸n
|
| 107 |
+
dividendo_total = datos["Dividends"].sum()
|
| 108 |
+
# Calcular el flujo inicial y final de la inversi贸n en la acci贸n
|
| 109 |
+
flujo_inicial = -precio_inicial
|
| 110 |
+
flujo_final = precio_final + dividendo_total
|
| 111 |
+
# Calcular el VPN, la TIR y el ROI de la inversi贸n en la acci贸n
|
| 112 |
+
vpn = calcular_vpn([flujo_inicial, flujo_final], tasa)
|
| 113 |
+
tir = calcular_tir([flujo_inicial, flujo_final]) # Corregir el par茅ntesis
|
| 114 |
+
roi = calcular_roi(flujo_final, -flujo_inicial)
|
| 115 |
+
# A帽adir las m茅tricas al diccionario con el s铆mbolo de la acci贸n como clave # Corregir la asignaci贸n
|
| 116 |
+
metricas[accion] = {"VPN": vpn, "TIR": tir, "ROI": roi}
|
| 117 |
+
|
| 118 |
+
# Convertir el diccionario de m茅tricas en un dataframe de pandas # Corregir la conversi贸n
|
| 119 |
+
metricas = pd.DataFrame(metricas)
|
| 120 |
+
|
| 121 |
+
# Mostrar el dataframe de m茅tricas
|
| 122 |
+
print(metricas)
|
| 123 |
+
|
| 124 |
+
# Importar la librer铆a plotly para crear gr谩ficos interactivos
|
| 125 |
+
import plotly.express as px
|
| 126 |
+
|
| 127 |
+
# Crear un gr谩fico de barras que muestre el VPN de cada ETF y acci贸n
|
| 128 |
+
fig1 = px.bar(metricas.T, x=metricas.T.index, y="VPN", title="VPN de los ETFs y las acciones")
|
| 129 |
+
# Mostrar el gr谩fico
|
| 130 |
+
fig1.show()
|
| 131 |
+
|
| 132 |
+
# Crear un gr谩fico de barras que muestre la TIR de cada ETF y acci贸n
|
| 133 |
+
fig2 = px.bar(metricas.T, x=metricas.T.index, y="TIR", title="TIR de los ETFs y las acciones")
|
| 134 |
+
# Mostrar el gr谩fico
|
| 135 |
+
fig2.show()
|
| 136 |
+
|
| 137 |
+
# Crear un gr谩fico de barras que muestre el ROI de cada ETF y acci贸n
|
| 138 |
+
fig3 = px.bar(metricas.T, x=metricas.T.index, y="ROI", title="ROI de los ETFs y las acciones")
|
| 139 |
+
# Mostrar el gr谩fico
|
| 140 |
+
fig3.show()
|
| 141 |
+
|
| 142 |
+
# Usar un gpt para generar el texto que explique los gr谩ficos
|
| 143 |
+
texto = """
|
| 144 |
+
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.
|
| 145 |
+
|
| 146 |
+
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.
|
| 147 |
+
|
| 148 |
+
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.
|
| 149 |
+
|
| 150 |
+
El tercer gr谩fico muestra el ROI de cada ETF y acci贸n, que es la
|