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.")