Spaces:
Sleeping
Sleeping
import streamlit as st | |
import yfinance as yf | |
import plotly.graph_objects as go | |
from datetime import datetime, timedelta | |
import pandas as pd | |
st.set_page_config(layout="wide", page_title="Stock Analysis Dashboard") | |
def format_number(num): | |
"""Format large numbers to readable format with B/M suffix""" | |
if num >= 1e9: | |
return f"₹{num/1e9:.2f}B" | |
elif num >= 1e6: | |
return f"₹{num/1e6:.2f}M" | |
else: | |
return f"₹{num:,.2f}" | |
def create_price_chart(ticker_data): | |
"""Create interactive price chart using Plotly""" | |
fig = go.Figure(data=[go.Candlestick(x=ticker_data.index, | |
open=ticker_data['Open'], | |
high=ticker_data['High'], | |
low=ticker_data['Low'], | |
close=ticker_data['Close'])]) | |
fig.update_layout( | |
title="Stock Price Movement", | |
yaxis_title="Price", | |
xaxis_title="Date", | |
template="plotly_dark" | |
) | |
return fig | |
def create_volume_chart(ticker_data): | |
"""Create volume chart using Plotly""" | |
fig = go.Figure(data=[go.Bar(x=ticker_data.index, y=ticker_data['Volume'])]) | |
fig.update_layout( | |
title="Trading Volume", | |
yaxis_title="Volume", | |
xaxis_title="Date", | |
template="plotly_dark" | |
) | |
return fig | |
def main(): | |
st.title("📊 Stock Information") | |
st.markdown("**Developed by : Venugopal Adep**") | |
# Input section | |
col1, col2 = st.columns([2,2]) | |
with col1: | |
ticker_symbol = st.text_input("Enter Stock Ticker (e.g., RELIANCE.NS for Indian stocks):") | |
with col2: | |
period = st.selectbox("Select Time Period:", | |
["1mo", "3mo", "6mo", "1y", "2y", "5y", "max"], | |
index=2) | |
if ticker_symbol: | |
try: | |
# Fetch stock data | |
stock = yf.Ticker(ticker_symbol) | |
info = stock.info | |
hist_data = stock.history(period=period) | |
# Company Overview Section | |
st.header("Company Overview") | |
col1, col2, col3 = st.columns([1,1,1]) | |
with col1: | |
st.metric("Current Price", format_number(info.get('currentPrice', 0))) | |
st.metric("Market Cap", format_number(info.get('marketCap', 0))) | |
with col2: | |
day_change = info.get('regularMarketChangePercent', 0) | |
st.metric("Day Change", f"{day_change:.2f}%") | |
st.metric("P/E Ratio", f"{info.get('forwardPE', 0):.2f}") | |
with col3: | |
st.metric("52 Week High", format_number(info.get('fiftyTwoWeekHigh', 0))) | |
st.metric("52 Week Low", format_number(info.get('fiftyTwoWeekLow', 0))) | |
# Price Charts | |
st.header("Price Analysis") | |
tab1, tab2 = st.tabs(["Price Chart", "Volume Chart"]) | |
with tab1: | |
st.plotly_chart(create_price_chart(hist_data), use_container_width=True) | |
with tab2: | |
st.plotly_chart(create_volume_chart(hist_data), use_container_width=True) | |
# Detailed Information | |
st.header("Detailed Information") | |
col1, col2 = st.columns([1,1]) | |
with col1: | |
st.subheader("Company Profile") | |
st.write("**Sector:**", info.get('sector', 'N/A')) | |
st.write("**Industry:**", info.get('industry', 'N/A')) | |
st.write("**Country:**", info.get('country', 'N/A')) | |
st.write("**Website:**", info.get('website', 'N/A')) | |
st.subheader("Key Statistics") | |
metrics_df = pd.DataFrame({ | |
'Metric': [ | |
'Beta', | |
'Dividend Yield (%)', | |
'Trailing P/E', | |
'Forward P/E', | |
'PEG Ratio', | |
'Price to Book' | |
], | |
'Value': [ | |
f"{info.get('beta', 0):.2f}", | |
f"{info.get('dividendYield', 0)*100:.2f}", | |
f"{info.get('trailingPE', 0):.2f}", | |
f"{info.get('forwardPE', 0):.2f}", | |
f"{info.get('pegRatio', 0):.2f}", | |
f"{info.get('priceToBook', 0):.2f}" | |
] | |
}) | |
st.dataframe(metrics_df, hide_index=True) | |
with col2: | |
st.subheader("Business Summary") | |
st.write(info.get('longBusinessSummary', 'No summary available')) | |
st.subheader("Financial Metrics") | |
financial_df = pd.DataFrame({ | |
'Metric': [ | |
'Revenue Growth', | |
'Gross Margins', | |
'Operating Margins', | |
'Profit Margins', | |
'Return on Equity', | |
'Return on Assets' | |
], | |
'Value': [ | |
f"{info.get('revenueGrowth', 0)*100:.2f}%", | |
f"{info.get('grossMargins', 0)*100:.2f}%", | |
f"{info.get('operatingMargins', 0)*100:.2f}%", | |
f"{info.get('profitMargins', 0)*100:.2f}%", | |
f"{info.get('returnOnEquity', 0)*100:.2f}%", | |
f"{info.get('returnOnAssets', 0)*100:.2f}%" | |
] | |
}) | |
st.dataframe(financial_df, hide_index=True) | |
# Historical Data Download Section | |
st.header("Download Historical Data") | |
csv = hist_data.to_csv() | |
st.download_button( | |
label="📥 Download Historical Data", | |
data=csv, | |
file_name=f"{ticker_symbol}_historical_data.csv", | |
mime="text/csv" | |
) | |
except Exception as e: | |
st.error(f"Error fetching data for {ticker_symbol}. Please check the ticker symbol and try again.") | |
st.error(f"Error details: {str(e)}") | |
if __name__ == "__main__": | |
main() |