import streamlit as st import yfinance as yf import pandas as pd import time # 🎯 Define Indian Indices indian_indices = { "NIFTY 50": "^NSEI", "SENSEX": "^BSESN", "BANK NIFTY": "^NSEBANK", "NIFTY IT": "^CNXIT", "NIFTY PHARMA": "^CNXPHARMA", "NIFTY AUTO": "^CNXAUTO", "NIFTY FMCG": "^CNXFMCG", "NIFTY METAL": "^CNXMETAL", "NIFTY ENERGY": "^CNXENERGY", "NIFTY REALTY": "^CNXREALTY", "NIFTY INFRA": "^CNXINFRA", "NIFTY MEDIA": "^CNXMEDIA", "NIFTY PSU BANK": "^CNXPSUBANK", } # 🔹 More Extensive List of Sector Stocks sector_stocks = { "IT": [ "TCS.NS", "INFY.NS", "HCLTECH.NS", "TECHM.NS", "WIPRO.NS", "LTIM.NS", "COFORGE.NS", "PERSISTENT.NS", "MINDTREE.NS", "MPHASIS.NS", "OFSS.NS", "CYIENT.NS", "ZENSARTECH.NS" ], "Banking & Finance": [ "HDFCBANK.NS", "ICICIBANK.NS", "SBIN.NS", "AXISBANK.NS", "KOTAKBANK.NS", "IDFCFIRSTB.NS", "PNB.NS", "BANDHANBNK.NS", "FEDERALBNK.NS", "RBLBANK.NS", "YESBANK.NS", "INDUSINDBK.NS", "CANBK.NS" ], "Energy & Oil": [ "RELIANCE.NS", "ONGC.NS", "POWERGRID.NS", "NTPC.NS", "BPCL.NS", "IOC.NS", "GAIL.NS", "TATAPOWER.NS", "JSWENERGY.NS", "NHPC.NS", "ADANIENERGY.NS", "ADANIGREEN.NS", "ADANITRANS.NS" ], "Automobile": [ "TATAMOTORS.NS", "M&M.NS", "MARUTI.NS", "HEROMOTOCO.NS", "EICHERMOT.NS", "BAJAJ-AUTO.NS", "TVSMOTOR.NS", "ASHOKLEY.NS", "ESCORTS.NS", "SMLISUZU.NS", "FORCEMOT.NS", "BOSCHLTD.NS", "AMARAJABAT.NS" ], "Consumer Goods": [ "HINDUNILVR.NS", "ITC.NS", "NESTLEIND.NS", "BRITANNIA.NS", "TITAN.NS", "DABUR.NS", "MARICO.NS", "COLPAL.NS", "GODREJCP.NS", "EMAMILTD.NS", "BAJAJCON.NS", "RADICO.NS", "HATSUN.NS" ], "Metals & Mining": [ "TATASTEEL.NS", "HINDALCO.NS", "JSWSTEEL.NS", "COALINDIA.NS", "VEDL.NS", "SAIL.NS", "NALCO.NS", "MOIL.NS", "HINDZINC.NS", "APLAPOLLO.NS", "JINDALSTEL.NS", "GODAWARI.NS", "SHYAMMETL.NS" ], "Pharmaceuticals": [ "SUNPHARMA.NS", "DRREDDY.NS", "CIPLA.NS", "DIVISLAB.NS", "LUPIN.NS", "AUROPHARMA.NS", "BIOCON.NS", "TORNTPHARM.NS", "ABBOTINDIA.NS", "GLENMARK.NS", "ZYDUSLIFE.NS", "ALKEM.NS", "IPCALAB.NS" ], "Infrastructure & Realty": [ "LT.NS", "ULTRACEMCO.NS", "SHREECEM.NS", "GRASIM.NS", "DLF.NS", "GODREJPROP.NS", "PHOENIXLTD.NS", "OBEROIRLTY.NS", "IBREALEST.NS", "NCC.NS", "SOBHA.NS", "BRIGADE.NS", "PRESTIGE.NS" ] } # 📌 Streamlit Page Configuration st.set_page_config(page_title="📈 Live Indian Stock Market", layout="wide") st.title("📈 Live Indian Stock Market Dashboard") # 🏦 Index Selection selected_index = st.selectbox("Select an Index", list(indian_indices.keys())) index_ticker = indian_indices[selected_index] # 🔹 Sector Selection selected_sector = st.selectbox("Select a Sector", list(sector_stocks.keys())) sector_tickers = sector_stocks[selected_sector] # 📊 Function to Fetch Live Data with Error Handling def fetch_live_data(ticker): try: stock = yf.Ticker(ticker) live_data = stock.history(period="1d", interval="1m") return live_data except yf.YFRateLimitError: st.warning("⚠️ Yahoo Finance rate limit reached. Retrying after 30 seconds...") time.sleep(30) # Wait before retrying return None except Exception as e: st.error(f"⚠️ Error fetching data for {ticker}: {e}") return None # 📊 Fetch Live Data for Index st.subheader(f"📊 Live Price for {selected_index}") live_price_placeholder = st.empty() # 📈 Fetch Live Data for Sector Stocks st.subheader(f"📈 Live Sector-Wise Stock Data ({selected_sector})") sector_table_placeholder = st.empty() # 🚀 Continuous Live Streaming Using Loop while True: try: # Fetch Live Index Data live_data = fetch_live_data(index_ticker) if live_data is not None and not live_data.empty: latest_price = live_data["Close"].iloc[-1] # ✅ FIX: Get previous close safely historical_data = yf.Ticker(index_ticker).history(period="2d") previous_close = historical_data["Close"].iloc[-2] if len(historical_data) > 1 else latest_price price_change = latest_price - previous_close percentage_change = (price_change / previous_close) * 100 live_price_placeholder.metric( f"{selected_index} Live Price", f"₹{latest_price:.2f}", f"{price_change:.2f} ({percentage_change:.2f}%)", delta_color="inverse" if price_change < 0 else "normal" ) # Fetch Live Data for Sector Stocks sector_data = [] for stock in sector_tickers: stock_info = fetch_live_data(stock) if stock_info is not None and not stock_info.empty: latest_price = stock_info["Close"].iloc[-1] # ✅ FIX: Get previous close safely historical_data = yf.Ticker(stock).history(period="2d") prev_close = historical_data["Close"].iloc[-2] if len(historical_data) > 1 else latest_price price_change = latest_price - prev_close percentage_change = (price_change / prev_close) * 100 sector_data.append({ "Stock": stock, "Price (₹)": latest_price, "Change (₹)": price_change, "Change (%)": f"{percentage_change:.2f}%", }) # Convert to DataFrame & Display if sector_data: df = pd.DataFrame(sector_data) sector_table_placeholder.dataframe(df, height=400) # ✅ Refresh Every **10 Seconds** time.sleep(10) except Exception as e: st.error(f"⚠️ Unexpected error: {e}") time.sleep(10) # Prevent app from breaking and wait before retrying