File size: 2,991 Bytes
c0c59ce
 
 
85b7a89
958b14a
85b7a89
5bd687d
 
958b14a
c0c59ce
 
 
 
958b14a
85b7a89
 
c0c59ce
958b14a
85b7a89
 
 
 
 
 
 
 
9c66447
958b14a
9c66447
958b14a
85b7a89
958b14a
 
4e9c027
958b14a
 
 
 
 
011359b
958b14a
a80c9bd
85b7a89
 
c0c59ce
958b14a
 
 
c618439
7cf670a
958b14a
7cf670a
 
 
 
958b14a
 
 
 
 
7cf670a
 
 
 
 
958b14a
 
7cf670a
 
958b14a
7cf670a
 
958b14a
 
 
7cf670a
958b14a
 
9c66447
a80c9bd
85b7a89
 
 
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
import streamlit as st
import yfinance as yf
import pandas as pd

# Load S&P 500 averages from a CSV file
def load_sp500_averages(filepath):
    return pd.read_csv(filepath, header=0, names=['Ratio', 'Average']).set_index('Ratio')

# Fetch financial data for a single stock
def fetch_stock_data(ticker_symbol):
    ticker = yf.Ticker(ticker_symbol)
    info = ticker.info
    
    # Calculate Book-to-Market Ratio
    pb_ratio = info.get('priceToBook')
    book_to_market_ratio = 1 / pb_ratio if pb_ratio and pb_ratio > 0 else None
    
    # Extract relevant financial information, including Book-to-Market Ratio
    financials = {
        'P/E Ratio': info.get('forwardPE'),
        'P/B Ratio': pb_ratio,
        'P/S Ratio': info.get('priceToSalesTrailing12Months'),
        'Debt to Equity Ratio': info.get('debtToEquity'),
        'Return on Equity': info.get('returnOnEquity'),
        'Book-to-Market Ratio': book_to_market_ratio,
    }
    
    return financials, info

# ... rest of your existing functions ...

# User interface in Streamlit
st.title('S&P 500 Stock Comparison Tool')

# Check if companies are in the S&P 500
@st.cache
def get_sp500_list():
    table = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
    return table[0]['Symbol'].tolist()

sp500_list = get_sp500_list()

# Load S&P 500 averages
sp500_averages = load_sp500_averages(sp500_averages_path)

# Calculate combined scores for stocks in the S&P 500
scores_df = calculate_combined_scores_for_stocks(sp500_list, sp500_averages)
scores_df_sorted = scores_df.sort_values(by='Combined Score', ascending=False)

# Use columns for side-by-side layout
col1, col2 = st.columns([1, 3])

# First column for the sorted overview
with col1:
    st.subheader("Stock Overview")
    # Create a DataFrame for the sidebar with color-coded combined scores
    scores_df_sorted['color'] = scores_df_sorted['Combined Score'].apply(
        lambda x: 'green' if x > 0 else 'red' if x < 0 else 'grey')
    for index, row in scores_df_sorted.iterrows():
        color = row['color']
        st.markdown(f"<span style='color: {color};'>{row['Stock']}: {row['Combined Score']}</span>", unsafe_allow_html=True)

# Second column for detailed financial ratios and company information
with col2:
    st.subheader("Stock Details")
    # Dropdown to select stock for details
    ticker_symbol = st.selectbox('Select a stock for details', options=sp500_list)
    if ticker_symbol:
        with st.spinner(f'Fetching data for {ticker_symbol}...'):
            stock_data, info = fetch_stock_data(ticker_symbol)
            comparison, _ = compare_to_index(stock_data, sp500_averages)
            
            # Display company name and description
            st.write(f"**{info.get('longName')}**")
            st.write(info.get('longBusinessSummary'))
            
            # Display financial ratios in a table
            st.table(pd.DataFrame.from_dict(stock_data, orient='index', columns=['Value']))