import pandas as pd import numpy as np import os import streamlit as st # Define path to the Stocks folder inside the Data folder stocks_path = "/root/.cache/kagglehub/datasets/borismarjanovic/price-volume-data-for-all-us-stocks-etfs/versions/3/Data/Stocks" # Function to analyze stock data def analyze_stock(stock_file, desired_return, risk_tolerance): df_stock = pd.read_csv(stock_file, sep=",") # Adjust separator if needed df_stock['Date'] = pd.to_datetime(df_stock['Date']) df_stock = df_stock.sort_values(by='Date') # Calculate daily returns df_stock['Daily Return'] = df_stock['Close'].pct_change() # Calculate annualized return and volatility annualized_return = df_stock['Daily Return'].mean() * 252 volatility = df_stock['Daily Return'].std() * np.sqrt(252) # Return analysis results return stock_file, annualized_return, volatility # Streamlit app for user inputs and stock analysis def main(): st.title("Investment Advisory System") st.sidebar.header("User Inputs") desired_return = st.sidebar.number_input("Enter your desired annual return (as a decimal, e.g., 0.1 for 10%)", min_value=0.0, value=0.1) risk_tolerance = st.sidebar.number_input("Enter your risk tolerance (standard deviation, e.g., 0.2 for 20%)", min_value=0.0, value=0.2) st.write(f"Desired Annual Return: {desired_return * 100}%") st.write(f"Risk Tolerance (Volatility): {risk_tolerance * 100}%") st.header("Stock Analysis Results") # Create a list to hold matching stocks matching_stocks = [] # Iterate through all stock files in the Stocks folder for stock_file in os.listdir(stocks_path): stock_file_path = os.path.join(stocks_path, stock_file) if stock_file.endswith('.txt'): # Process only text files stock_name, annualized_return, volatility = analyze_stock(stock_file_path, desired_return, risk_tolerance) # Display results for each stock st.write(f"### {stock_name}") st.write(f"**Annualized Return**: {annualized_return * 100:.2f}%") st.write(f"**Annualized Volatility**: {volatility * 100:.2f}%") # Check if the stock meets the user's criteria if annualized_return >= desired_return and volatility <= risk_tolerance: matching_stocks.append(stock_name) st.success("This stock matches your criteria!") else: st.warning("This stock does not meet your preferences.") # Display matched stocks at the end if matching_stocks: st.header("Matching Stocks") for stock in matching_stocks: st.write(f"- {stock}") else: st.write("No stocks matched your preferences.") if __name__ == "__main__": main()