medini-atmane's picture
Update app.py
a857666 verified
Raw
History Blame Contribute Delete
3.3 kB
import streamlit as st
import yfinance as yf
import pandas as pd
import numpy as np
import plotly.express as px
# Page configuration
st.set_page_config(page_title="Portfolio Optimization Dashboard", layout="wide")
# Main Title
st.title("πŸ“Š Markowitz Portfolio Optimization Dashboard")
st.markdown("An interactive application to analyze returns and risks for a portfolio of financial assets using real market data.")
st.title("Dr .medini Atmane university of Eloued Algeria")
# Sidebar for User Inputs
st.sidebar.header("Portfolio Settings")
tickers_input = st.sidebar.text_input("Enter Ticker Symbols (comma-separated)", "AAPL, MSFT, GOOGL")
start_date = st.sidebar.date_input("Start Date", pd.to_datetime("2023-01-01"))
end_date = st.sidebar.date_input("End Date", pd.to_datetime("today"))
# Execution Button
if st.sidebar.button("Analyze Data"):
# Clean and format the input tickers
tickers = [t.strip().upper() for t in tickers_input.split(",")]
with st.spinner('Fetching financial data and calculating returns...'):
try:
# Fetch adjusted closing prices from Yahoo Finance
data = yf.download(tickers, start=start_date, end=end_date)['Close']
# Verify if data is retrieved successfully
if data.empty:
st.error("No data found for these tickers. Please verify the symbols and try again.")
else:
# Calculate daily returns
returns = data.pct_change().dropna()
# 1. Plot Cumulative Returns
st.subheader("πŸ“ˆ Cumulative Returns Performance")
cumulative_returns = (1 + returns).cumprod()
st.line_chart(cumulative_returns)
# Create a two-column layout
col1, col2 = st.columns(2)
with col1:
# 2. Correlation Matrix
st.subheader("πŸ”— Correlation Matrix")
st.markdown("Analyzes how assets move together to ensure effective diversification.")
corr = returns.corr()
# Apply a heatmap style to the dataframe
st.dataframe(corr.style.background_gradient(cmap='Blues'), use_container_width=True)
with col2:
# 3. Annualized Return and Risk Assessment
st.subheader("βš–οΈ Expected Return & Annualized Risk")
# Assuming 252 trading days in a year
annual_returns = returns.mean() * 252
annual_volatility = returns.std() * np.sqrt(252)
# Compile the summary into a DataFrame
summary_df = pd.DataFrame({
"Expected Annual Return": annual_returns,
"Annualized Volatility (Risk)": annual_volatility
})
st.dataframe(summary_df.style.format("{:.2%}"), use_container_width=True)
except Exception as e:
st.error(f"An error occurred while processing the data: {e}")
else:
# Default instruction state
st.info("πŸ‘ˆ Please enter the stock tickers in the sidebar and click 'Analyze Data' to begin.")