| | import streamlit as st |
| | import yfinance as yf |
| | import pandas as pd |
| | import time |
| |
|
| | |
| | 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", |
| | } |
| |
|
| | |
| | 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" |
| | ] |
| | } |
| |
|
| | |
| | st.set_page_config(page_title="π Live Indian Stock Market", layout="wide") |
| |
|
| | st.title("π Live Indian Stock Market Dashboard") |
| |
|
| | |
| | selected_index = st.selectbox("Select an Index", list(indian_indices.keys())) |
| | index_ticker = indian_indices[selected_index] |
| |
|
| | |
| | selected_sector = st.selectbox("Select a Sector", list(sector_stocks.keys())) |
| | sector_tickers = sector_stocks[selected_sector] |
| |
|
| | |
| | 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) |
| | return None |
| | except Exception as e: |
| | st.error(f"β οΈ Error fetching data for {ticker}: {e}") |
| | return None |
| |
|
| | |
| | st.subheader(f"π Live Price for {selected_index}") |
| | live_price_placeholder = st.empty() |
| |
|
| | |
| | st.subheader(f"π Live Sector-Wise Stock Data ({selected_sector})") |
| | sector_table_placeholder = st.empty() |
| |
|
| | |
| | while True: |
| | try: |
| | |
| | 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] |
| |
|
| | |
| | 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" |
| | ) |
| |
|
| | |
| | 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] |
| |
|
| | |
| | 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}%", |
| | }) |
| |
|
| | |
| | if sector_data: |
| | df = pd.DataFrame(sector_data) |
| | sector_table_placeholder.dataframe(df, height=400) |
| |
|
| | |
| | time.sleep(10) |
| |
|
| | except Exception as e: |
| | st.error(f"β οΈ Unexpected error: {e}") |
| | time.sleep(10) |
| |
|