Portafolio Optimo
∆ %=Rentabilidad mensual= ( ( Valor n−Valor n−1 )
Valor n−1 )
∆ %=Rentabilidad mensual=
( Valor n−1
Valor n−1 )
−¿1
Ponderación = (1/Numero de acción)
Retorno Esperado (Mensual Promedio) = PROMEDIO (Columna Rentabilidad Mensual)
Volatilidad =DESVEST.P(Columna Rentabilidad Mensual)
Rentabilidad
Dominancia=Coeficiente de variacion= =Veces
Volatilidad (D std P)
Referencia: Valor más alto mayor dominancia
Evalúa el desempeño de una inversión o activo. Si la dominancia de Tesla es de 0.27, significa que la rentabilidad de Tesla en relación
con su volatilidad es de 0.27.
Beta=PENDIENTE (Columna Rentabilidad Mensual Acción, Columna Rentabilidad Mensual S&P500)
Beta =1.1
La beta es una medida de la volatilidad de un activo financiero en relación con el mercado en general. Una
beta de 1.1 para Tesla significa que, en promedio, Tesla tiende a ser aproximadamente un 10% más volátil
que el mercado en su conjunto. Por ejemplo, si el mercado aumenta un 1%, es probable que Tesla, en
promedio, aumente alrededor de un 1.1%.
Rentabilidad−Rf
Indice Sharper= =Veces
Volatilidad (D std P)
Referencia: Reducir el riesgo individual es necesario compañías con valores altos
El índice de Sharpe es una medida que evalúa el rendimiento de una inversión en relación con su riesgo. Una
lectura de 0.5 en el índice de Sharpe sugiere que la inversión ha generado un rendimiento adicional (retorno
sobre la inversión) de 0.5 unidades por cada unidad de riesgo asumida.
Rentabilidad−Rf
Indice Treynor= =Veces h
β
Referencia: un portafolio con riesgo hacia mercado más bajo es necesario compañías con valores altos
El índice de Treynor es una medida de desempeño financiero que evalúa el rendimiento de una inversión en
relación con el riesgo sistemático asumido, representado por la beta. Una lectura de 1.2 en el índice de
Treynor indica que la inversión ha generado un rendimiento adicional de 1.2 unidades por cada unidad de
beta. En términos simples, el índice de Treynor mide cuánto retorno adicional se ha obtenido por unidad de
riesgo sistémico (riesgo relacionado con el mercado en general).
5 Year Treasury Rate
1
12
Tasa de interes mensual=( 1+r ) −1
12
Tasa de interes ANUAL= ( 1+ r ) −1
Portafolio Total
Rentabilidad del Portafolio = SUMAPRODUCTO (Ponderación j; Retorno esperado j)
Varianza del Portafolio =MMULT (MMULT (Ponderación j; Matriz de Varianza y
Covarianza); TRANSPONER (Ponderación j))
Nota: ControlSHIFEnter
Volatilidad = RAIZ (Varianza del Portafolio)
Beta del Portafolio =SUMAPRODUCTO (Ponderación j; Betas j)
Entre mayor covarianza: Relacionado entre sí y menos diverso el riesgo
t
ℜ ( P )=W∗r
Donde
r = [ R1 R2 ⋯ R n ]
w=[ w1 w2 ⋯ w n ]
RI ( P )= √ w∗s∗wt
Donde
w=[ w1 w2 ⋯ w n ]
[ ]
2
σ1 σ 12 ⋯ σ1n
2
s= σ 21 σ … σ 2 n
2
⋮ ⋮
σ n 1 σ n 2 ⋱ σ 2n
Información del portafolio
RE(P)=SUMAPRODUCTO (Ponderación, Retorno esperado)
Varianza del Portafolio =MMULT (MMULT(Ponderación, Matriz Covarianza – Varianza),
TRANSPONER(Ponderación))
Volatilidad (Desv. Estándar) = RAIZ (Varianza del Portafolio)
Beta del Portafolio=SUMAPRODUCTO (ponderación, Beta de cada activo)
Creación de los 20 Portafolios
Ponderaciones de portafolio
Portafolio 1 Portafolio 20
Portafolio de mínima varianza Portafolio de máxima Rentabilidad
Establecer Objetivo: Varianza Establecer Objetivo: RE(P)
Para: Min Para: Max
Cambiando las celdas de las variables: Cambiando las celdas de las variables:
Seleccionar las ponderaciones Seleccionar las ponderaciones
Sujeto a las restricciones Sujeto a las restricciones
Celda suma del total =1 Celda suma del total =1
Selección de las celdas de la estructura ≥0 Selección de las celdas de la estructura ≥0
Rango=(Riesgo max- Riesgo min)/n-1
Riesgo del Portafolio n= Riesgo del Portafolion-1+Rango
Determinación de Rentabilidad por nivel de riesgo
Establecer Objetivo: RE(P)
Para: Max
Cambiando las celdas de las variables: Seleccionar las ponderaciones
Sujeto a las restricciones
Celda suma del total =1
Selección de las celdas de la estructura ≥0
Volatilidad del portafolio= Riesgo del Portafolion
Creación de la línea tangente al portafolio
Max: índice Sharpe del portafolio
Sujeto a las restricciones
Celda suma del total =1
Selección de las celdas de la estructura ≥0
Código Google Colab
Código:001
# 1. Instalar librerías necesarias
!pip install --upgrade yfinance openpyxl --quiet
# 2. Importar librerías
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
from google.colab import files
# 3. Definir lista de activos
tickers = [
"AAPL", "MSFT", "AMZN", "NVDA", "GOOGL", "META", "TSLA", # Las 7
Magníficas
"SPY", # ETF que replica el S&P 500
"IEF" # ETF de bonos del Tesoro 7–10 años
]
# 4. Definir rango de fechas últimos 5 años desde hoy
from datetime import datetime, timedelta
hoy = datetime.today()
inicio = hoy - timedelta(days=5*365)
# 5. Descargar precios ajustados diarios
datos = yf.download(tickers, start=inicio.strftime('%Y-%m-%d'),
end=hoy.strftime('%Y-%m-%d'), auto_adjust=False)
# 6. Extraer precios ajustados de cierre y convertir a mensual
precios_diarios = datos["Adj Close"]
precios_mensuales = precios_diarios.resample('M').last()
# 7. Guardar como Excel
archivo = "Precios_7_Magnificas_SP500_Bonos_Mensual.xlsx"
precios_mensuales.to_excel(archivo)
# 8. Descargar el archivo
files.download(archivo)
# 9. Graficar precios mensuales
plt.figure(figsize=(14, 7))
for ticker in tickers:
plt.plot(precios_mensuales.index, precios_mensuales[ticker],
label=ticker)
plt.title("Precios mensuales ajustados (últimos 5 años)")
plt.xlabel("Fecha")
plt.ylabel("Precio (USD)")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
Código:002
# ============================
# 1. Librerías (ya instaladas antes)
# ============================
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
from datetime import datetime, timedelta
# ============================
# 2. Descargar datos
# ============================
tickers = [
"AAPL", "MSFT", "AMZN", "NVDA", "GOOGL", "META", "TSLA", # Las 7
Magníficas
"^GSPC", # S&P 500
"^FVX" # Bonos del Tesoro ~5 años
]
hoy = datetime.today()
inicio = hoy - timedelta(days=5*365)
datos = yf.download(tickers, start=inicio.strftime('%Y-%m-%d'),
end=hoy.strftime('%Y-%m-%d'), auto_adjust=False)
# ============================
# 3. Precios ajustados mensuales y rentabilidad
# ============================
precios_diarios = datos["Adj Close"]
precios_mensuales = precios_diarios.resample('ME').last() # Corrected
'M' to 'ME'
rentabilidad_mensual = precios_mensuales.pct_change().dropna() # en
decimal
# ============================
# 4. Cálculo de métricas de desempeño
# ============================
# Calculate monthly risk-free rate based on the mean of ^FVX
# Assuming ^FVX is an annual rate in percentage, convert to monthly
decimal rate
rf = (precios_diarios["^FVX"].mean() / 100 + 1)**(1/12) - 1 #
Corrected risk-free rate calculation
tickers_acciones = ["AAPL", "MSFT", "AMZN", "NVDA", "GOOGL", "META",
"TSLA"]
sp500 = rentabilidad_mensual["^GSPC"]
resumen = pd.DataFrame(index=tickers_acciones + ["^GSPC"])
resumen["Retorno Esperado (%)"] =
rentabilidad_mensual[tickers_acciones + ["^GSPC"]].mean() * 100
resumen["Desv. Estándar (%)"] = rentabilidad_mensual[tickers_acciones
+ ["^GSPC"]].std() * 100
resumen["Dominancia"] = resumen["Retorno Esperado (%)"] /
resumen["Desv. Estándar (%)"]
# Beta y Treynor
for ticker in tickers_acciones + ["^GSPC"]:
# Ensure both series have the same index before calculating
covariance and variance
common_index =
rentabilidad_mensual.index.intersection(sp500.index)
cov = np.cov(rentabilidad_mensual.loc[common_index, ticker],
sp500.loc[common_index])[0,1]
beta = cov / sp500.loc[common_index].var()
resumen.loc[ticker, "Beta"] = beta
# Sharpe y Treynor
resumen["Sharpe"] = (resumen["Retorno Esperado (%)"]/100 - rf) /
(resumen["Desv. Estándar (%)"]/100)
resumen["Treynor"] = (resumen["Retorno Esperado (%)"]/100 - rf) /
resumen["Beta"]
# ============================
# 5. Guardar en Excel
# ============================
archivo = "Resumen_Desempeno_5y.xlsx"
with pd.ExcelWriter(archivo, engine='openpyxl') as writer:
precios_mensuales.to_excel(writer, sheet_name="Precios Mensuales")
(rentabilidad_mensual*100).round(2).to_excel(writer,
sheet_name="Rentabilidad Mensual (%)")
resumen.round(4).to_excel(writer, sheet_name="Resumen Desempeno
5y")
files.download(archivo)
# ============================
# 6. Mostrar tabla resumen
# ============================
print("Resumen de Desempeño 5 años:")
print(resumen.round(4).to_markdown())
# ============================
# 7. Graficar evolución acumulada de $1 invertido
# ============================
plt.figure(figsize=(14, 7))
((rentabilidad_mensual + 1).cumprod()).plot(figsize=(14,7)) #
Corrected cumulative product calculation
plt.title("Evolución acumulada de $1 invertido (últimos 5 años)")
plt.xlabel("Fecha")
plt.ylabel("Multiplicador del capital")
plt.grid(True)
plt.show()