File size: 4,969 Bytes
d47bae6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a04ddd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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]]