NandanData's picture
Upload 9 files
42c2fbe verified
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.")