Portafolio / app.py
azarazua's picture
Update app.py
5a04ddd verified
raw
history blame contribute delete
No virus
4.97 kB
import streamlit as st
import pandas as pd
import numpy as np
import requests
import matplotlib.pyplot as plt
import io
# Funci贸n para obtener los datos de una acci贸n utilizando Alpha Vantage
def get_stock_data(symbol):
api_key = "QVQGE7YPO68S403J"
url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={symbol}&apikey={api_key}&datatype=csv"
response = requests.get(url)
data = pd.read_csv(io.StringIO(response.text))
data['Date'] = pd.to_datetime(data['Date'])
return data
st.title("Portfolio weights calculator")
help_string = "NOTA: El formato utilizado aqu铆 es llamando cada columna de GOOGLEFINANCE."
check_box = st.checkbox("驴Deseas usar el archivo precargado?")
if check_box:
uploaded_file = "Stocks - Sheet1.csv"
file_name = uploaded_file
else:
uploaded_file = st.file_uploader("Sube aqu铆 tu archivo de excel", type=[".xls", ".xlsx", ".csv"], help=help_string)
file_name = uploaded_file.name if uploaded_file is not None else None
if uploaded_file is not None:
if file_name[-3:] == "csv":
df = pd.read_csv(uploaded_file)
else:
df = pd.read_excel(uploaded_file)
df = df.drop(0, axis=0)
df = df.drop("Unnamed: 2", axis=1).drop("Unnamed: 4", axis=1).rename({"Unnamed: 0": "Date"}, axis=1)
df['Date'] = pd.to_datetime(df['Date']).dt.date
stocks = list(df.columns)[-3:]
stocks_rets = []
for i in stocks:
stocks_rets.append(i+"_ret")
df[i] = df[i].astype(float)
df[i+"_ret"] = (df[i] - df[i].shift(1)) / df[i].shift(1)
st.write(df[["Date"] + stocks_rets])
for stock in stocks:
plt.plot(df["Date"], df[stock], label=stock)
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Plot')
plt.legend()
plt.xticks(rotation=45)
st.pyplot(plt)
ret_list = df[stocks_rets].mean().to_numpy().reshape(-1, 1)
cov_matrix = df[stocks_rets].cov().to_numpy()
# C谩lculo de los pesos del portafolio
n = len(stocks)
weights = np.ones((n, 1)) / n
yearly_returns = np.dot(weights.T, ret_list)[0, 0] * 252
yearly_variance = np.dot(weights.T, np.dot(cov_matrix, weights))[0, 0] * 252
st.write("Los pesos son:", ", ".join([f"{stocks[i]} -> {weights[i,0]:.4f}" for i in range(n)]))
st.write(f"El retorno anualizado del portafolio es: {yearly_returns:.4f}")
st.write(f"La varianza anualizada del portafolio es: {yearly_variance:.4f}")
# Integraci贸n con Alpha Vantage
st.write("\n\n**Datos de las acciones obtenidos de Alpha Vantage:**")
stocks_symbols = ["AMZN", "MELI", "ETSY"]
# Descargar datos de acciones
stocks_data = {symbol: get_stock_data(symbol) for symbol in stocks_symbols}
# Crear DataFrame combinado con los datos de las acciones
df = pd.concat([data.set_index('Date')['close'].rename(symbol) for symbol, data in stocks_data.items()], axis=1)
# Calcular rendimientos diarios
returns = df.pct_change()
# Eliminar primera fila con NaN
returns = returns.dropna()
# Mostrar tabla con los rendimientos diarios
st.write("Rendimientos diarios:")
st.write(returns.head())
# Gr谩fico de series temporales
st.write("Gr谩fico de series temporales:")
plt.figure(figsize=(10, 6))
for symbol in stocks_symbols:
plt.plot(df.index, df[symbol], label=symbol)
plt.xlabel('Fecha')
plt.ylabel('Valor')
plt.title('Gr谩fico de Series Temporales')
plt.legend()
st.pyplot(plt)
# Calcular rendimientos anuales y varianza
weights = np.ones((len(stocks_symbols), 1)) / len(stocks_symbols)
annual_returns = returns.mean() * 252
annual_variance = np.dot(weights.T, np.dot(returns.cov() * 252, weights))
# Mostrar resultados
st.write("Los pesos son:")
for i, symbol in enumerate(stocks_symbols):
st.write(f"{symbol} -> {weights[i, 0]:.4f}")
st.write(f"El retorno anualizado del portafolio es: {annual_returns.sum():.4f}")
st.write(f"La varianza anualizada del portafolio es: {annual_variance[0, 0]:.4f}")
# Funci贸n para obtener los datos de una acci贸n utilizando Alpha Vantage
def get_stock_data(symbol):
api_key = "QVQGE7YPO68S403J"
url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={symbol}&apikey={api_key}&datatype=csv"
response = requests.get(url)
data = pd.read_csv(io.StringIO(response.text))
if 'date' in data.columns: # Manejar formato 1 de Alpha Vantage
data['Date'] = pd.to_datetime(data['date'])
data = data.rename(columns={'close': symbol})
elif 'timestamp' in data.columns: # Manejar formato 2 de Alpha Vantage
data['Date'] = pd.to_datetime(data['timestamp'])
data = data.rename(columns={'adjusted_close': symbol})
else:
raise ValueError("Formato de datos de Alpha Vantage no reconocido")
return data[['Date', symbol]]