import streamlit as st import pandas as pd from model import fetch_data, calculate_indicators, calculate_support_resistance, predict_future_prices from visualizations import ( plot_stock_price, plot_predictions, plot_technical_indicators, plot_risk_levels, plot_feature_importance, plot_candlestick, plot_volume, plot_moving_averages, plot_feature_correlations ) def sidebar(): st.sidebar.title("Stock Analysis Dashboard") ticker = st.sidebar.text_input("Enter Stock Ticker Symbol:", value='SBILIFE.NS') start_date = st.sidebar.date_input("Start Date", value=pd.to_datetime('2021-01-01')) end_date = st.sidebar.date_input("End Date", value=pd.to_datetime('2024-09-01')) algorithm = st.sidebar.selectbox("Select Prediction Algorithm", ['Linear Regression', 'ARIMA','Decision Tree', 'Random Forest', 'XGBoost', 'CatBoost', 'LSTM', 'SARIMA']) return ticker, start_date, end_date, algorithm def display_analysis(data, algorithm): if data is not None: try: support_price, resistance_price = calculate_support_resistance(data) future_prices, mae, r2, accuracy, conf_matrix = predict_future_prices(data, algorithm) if future_prices is not None: st.write("### Technical Indicators") indicators = { 'SMA_50': data['SMA_50'].iloc[-1], 'EMA_50': data['EMA_50'].iloc[-1], 'RSI': data['RSI'].iloc[-1], 'MACD': data['MACD'].iloc[-1], 'MACD_Signal': data['MACD_Signal'].iloc[-1], 'Bollinger_High': data['Bollinger_High'].iloc[-1], 'Bollinger_Low': data['Bollinger_Low'].iloc[-1], 'ATR': data['ATR'].iloc[-1], 'OBV': data['OBV'].iloc[-1] } for key, value in indicators.items(): with st.expander(f"{key} Description"): st.write(f"{key}: {value:.2f}") st.write(get_indicator_description(key)) st.write("### Support and Resistance Levels") st.write(f"Support Price: {support_price:.2f}") st.write(f"Resistance Price: {resistance_price:.2f}") st.write("### Future Price Predictions") st.write(pd.DataFrame({'Day': range(1, len(future_prices) + 1), 'Predicted Price': future_prices})) if accuracy is not None and conf_matrix is not None: st.write(f"**Model Accuracy:** {accuracy:.2f}") st.write("**Confusion Matrix:**") st.pyplot(ConfusionMatrixDisplay(conf_matrix).plot()) if mae is not None and r2 is not None: st.write(f"**Mean Absolute Error (MAE):** {mae:.2f}") st.write(f"**R-squared (R2):** {r2:.2f}") else: st.error("Model selection or prediction failed. Please check your inputs and try again.") except Exception as e: st.error(f"An error occurred during analysis: {e}") else: st.error("Failed to fetch data. Please check the stock ticker symbol and date range.") def get_indicator_description(indicator): descriptions = { 'SMA_50': "SMA_50 (50-day Simple Moving Average): Yeh 50 din ka average hai jo bataata hai stock ka long-term trend. Agar yeh price line se upar hai, toh stock ka trend upward hai.", 'EMA_50': "EMA_50 (50-day Exponential Moving Average): Yeh bhi ek average hai lekin recent prices ko zyada weightage deta hai. Stock ka short-term trend dikhata hai.", 'RSI': "RSI (Relative Strength Index): Yeh indicator stock ke overbought ya oversold condition ko dikhata hai. 70 se zyada overbought, aur 30 se kam oversold hai.", 'MACD': "MACD: Yeh indicator short-term aur long-term moving averages ke beech ka difference dikhata hai.", 'MACD_Signal': "MACD Signal: Yeh line MACD ke signal ko dikhata hai. Jab MACD line isse cross karti hai, toh trend change hota hai.", 'Bollinger_High': "Bollinger High: Yeh line stock price ki upper boundary dikhati hai. Agar price isse upar hai, toh stock overbought ho sakta hai.", 'Bollinger_Low': "Bollinger Low: Yeh line stock price ki lower boundary dikhati hai. Agar price isse neeche hai, toh stock oversold ho sakta hai.", 'ATR': "ATR (Average True Range): Yeh indicator stock ki volatility dikhata hai. Zyada ATR matlab zyada price fluctuations.", 'OBV': "OBV (On-Balance Volume): Yeh volume aur price ke relationship ko dikhata hai. Jab OBV badh raha hai, toh stock ka demand badh raha hai." } return descriptions.get(indicator, "Description not available") def display_visualizations(data, algorithm): if data is not None: choice = st.sidebar.selectbox( "Choose a type of visualization", [ "Stock Price", "Predictions vs Actual", "Technical Indicators", "Risk Levels", "Feature Importance", "Candlestick", "Volume", "Moving Averages", "Feature Correlations" ] ) try: if choice == "Stock Price": plot_stock_price(data) elif choice == "Predictions vs Actual": future_prices, _, _, _, _ = predict_future_prices(data, algorithm) if future_prices is not None: st.line_chart(pd.DataFrame({'Actual Prices': data['Close'], 'Predicted Prices': pd.Series(future_prices).values})) else: st.error("Failed to fetch predictions.") elif choice == "Technical Indicators": indicators = { 'SMA_50': data['SMA_50'], 'EMA_50': data['EMA_50'], 'RSI': data['RSI'], 'MACD': data['MACD'], 'MACD_Signal': data['MACD_Signal'], 'Bollinger_High': data['Bollinger_High'], 'Bollinger_Low': data['Bollinger_Low'], 'ATR': data['ATR'], 'OBV': data['OBV'] } plot_technical_indicators(data, indicators) elif choice == "Risk Levels": plot_risk_levels(data) elif choice == "Feature Importance": plot_feature_importance() elif choice == "Candlestick": plot_candlestick(data) elif choice == "Volume": plot_volume(data) elif choice == "Moving Averages": plot_moving_averages(data) elif choice == "Feature Correlations": plot_feature_correlations(data) except Exception as e: st.error(f"An error occurred during visualization: {e}") else: st.error("Failed to fetch data. Please check the stock ticker symbol and date range.")