File size: 5,580 Bytes
8a3e273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import streamlit as st
import pandas as pd
from utils.stock_data import get_stock_data, format_number
from utils.recommendation_engine import analyze_stock

def recommendations_page():
    st.title("AI Stock Recommendations")

    # Load symbols
    try:
        symbols = pd.read_csv("attached_assets/symbol.csv", names=['Symbol'], skiprows=1)
        symbols_list = symbols['Symbol'].dropna().tolist()
    except Exception as e:
        st.error(f"Error loading symbols: {str(e)}")
        return

    # Analysis parameters
    min_confidence = st.selectbox("Minimum Confidence Level", ["Low", "Medium", "High"])

    if st.button("Generate Recommendations"):
        with st.spinner("Analyzing all NSE stocks..."):
            recommendations = []

            # Progress bar for analysis
            progress_bar = st.progress(0)
            total_stocks = len(symbols_list)

            # Analyze each stock
            for idx, symbol in enumerate(symbols_list):
                df, error = get_stock_data(symbol, period='3mo', interval='1d')
                if error:
                    continue

                analysis = analyze_stock(symbol, df)
                if analysis:
                    recommendations.append(analysis)

                # Update progress
                progress_bar.progress((idx + 1) / total_stocks)

            if recommendations:
                # Convert to DataFrame
                rec_df = pd.DataFrame(recommendations)

                # Filter by confidence
                confidence_levels = {'Low': 0, 'Medium': 1, 'High': 2}
                min_conf_level = confidence_levels[min_confidence]
                rec_df = rec_df[rec_df['confidence'].map(lambda x: confidence_levels[x]) >= min_conf_level]

                # Sort by technical score
                rec_df = rec_df.sort_values('technical_score', ascending=False)

                # Display recommendations
                st.subheader("Stock Recommendations")

                # Format DataFrame for display
                display_df = rec_df.copy()
                display_df['price_change'] = display_df['price_change'].round(2).astype(str) + '%'
                display_df['technical_score'] = display_df['technical_score'].round(2)

                # Generate recommendation basis
                basis_list = []
                for _, row in display_df.iterrows():
                    signals = []
                    if row['technical_score'] > 50:
                        signals.append("Strong technical indicators")
                    if 'RSI' in row['signal_summary'] and row['signal_summary']['RSI'] == 'Oversold':
                        signals.append("Oversold (RSI)")
                    if 'MACD' in row['signal_summary'] and row['signal_summary']['MACD'] == 'Buy':
                        signals.append("Bullish MACD crossover")
                    if 'Moving Average' in row['signal_summary'] and row['signal_summary']['Moving Average'] == 'Bullish':
                        signals.append("Above key moving averages")
                    basis_list.append(", ".join(signals) if signals else "Multiple factors")

                display_df['Basis'] = basis_list

                # Color-code recommendations
                def color_recommendations(val):
                    if 'Strong Buy' in val:
                        return 'background-color: #9fff9c'
                    elif 'Buy' in val:
                        return 'background-color: #c8ffc6'
                    elif 'Strong Sell' in val:
                        return 'background-color: #ffc6c6'
                    elif 'Sell' in val:
                        return 'background-color: #ffdede'
                    return ''

                # Display styled table
                st.dataframe(
                    display_df[['symbol', 'recommendation', 'confidence', 'technical_score', 
                              'price_change', 'last_price', 'Basis']]
                    .style
                    .apply(lambda x: [color_recommendations(val) for val in x], axis=1, subset=['recommendation'])
                    .format({'last_price': '₹{:.2f}'})
                )

                # Display analysis insights
                st.subheader("Analysis Insights")
                total_analyzed = len(recommendations)
                buy_signals = len(rec_df[rec_df['recommendation'].isin(['Buy', 'Strong Buy'])])
                sell_signals = len(rec_df[rec_df['recommendation'].isin(['Sell', 'Strong Sell'])])

                col1, col2, col3 = st.columns(3)
                col1.metric("Total Stocks Analyzed", total_analyzed)
                col2.metric("Buy Signals", buy_signals)
                col3.metric("Sell Signals", sell_signals)

                # Display market sentiment
                st.subheader("Market Sentiment")
                buy_percentage = (buy_signals / total_analyzed) * 100
                if buy_percentage > 60:
                    sentiment = "Bullish"
                    color = "green"
                elif buy_percentage < 40:
                    sentiment = "Bearish"
                    color = "red"
                else:
                    sentiment = "Neutral"
                    color = "gray"

                st.markdown(f"Overall Market Sentiment: <span style='color: {color}'>{sentiment}</span>", 
                          unsafe_allow_html=True)

            else:
                st.warning("No recommendations generated. Please try with different parameters.")

if __name__ == "__main__":
    recommendations_page()