Optimizacion / app.py
Casarin's picture
Update app.py
efa13ae verified
raw
history blame contribute delete
No virus
2.13 kB
import streamlit as st
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
# Streamlit app layout
st.title("Estimating statistics from two lists of historical values")
with st.form("my_form"):
N = st.number_input("How many elements do you want for each list?", step=1)
# Button to generate the numbers
if st.form_submit_button("Click to generate random numbers' lists"):
# Generate two lists of 100 random numbers each
x = [random.randint(0, 20) for _ in range(N)]
y = [random.randint(0, 20) for _ in range(N)]
# Display the lists in the app
# st.write('List 1:', x)
# st.write('List 2:', y)
if "x" in globals():
x_bar = np.mean(x)
y_bar = np.mean(y)
st.subheader("Expected values")
st.write(f"E(x) = {x_bar:,.2f}")
st.write(f"E(y) = {y_bar:,.2f}")
var_x = np.var(x)
var_y = np.var(y)
st.subheader("Variances")
st.write(f"var(x) = {var_x:,.2f}")
st.write(f"var(y) = {var_y:,.2f}")
cov_xy = np.corrcoef(x, y)[0, 1]
st.subheader("Correlation")
st.write(f"corr(x, y) = {cov_xy:,.2f}")
plt.scatter(x, y)
plt.title("Correlations")
plt.xlabel("x")
plt.ylabel("y")
st.pyplot(plt)
plt.close()
plt.title("Plot of returns")
plt.plot(np.arange(len(x)), x)
plt.plot(np.arange(len(y)), y)
plt.ylim(-10, 40)
plt.xlabel('"time"')
plt.ylabel('"returns"')
st.pyplot(plt)
w_x = (x_bar - y_bar + var_y - cov_xy * np.sqrt(var_x * var_y)) / (
var_x + var_y - 2 * cov_xy * np.sqrt(var_x * var_y)
)
w_y = 1 - w_x
var_r = (w_x**2)*var_x + (w_y**2)*var_y + 2*w_x*w_y*cov_xy*np.sqrt(var_x * var_y)
st.subheader(f"Weights and portfolio returns (this is Plus, but you will need to explain how you obtained the answers)")
st.write("Assuming x and y represent returns of portfolios")
st.write(f"w_x = {w_x:,.2f}")
st.write(f"w_y = {w_y:,.2f}")
st.write(f"E(r) = {w_x*x_bar + w_y*y_bar:,.2f}")
st.write(f"var(r) = {var_r:,.2f}")
else:
st.write(":red[Please, give the number of elements in each list]")