MarketCompass / app.py
riteshcp's picture
Update app.py
21aaa71 verified
import streamlit as st
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta, time
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# Define the list of ticker symbols for user selection
TICKER_SYMBOLS = [
"AADHARHFC", "AARTIIND", "AAVAS", "ABBOTINDIA", "ACE", "ADANIENSOL", "ADANIENT", "ADANIGREEN", "ADANIPORTS",
"ADANIPOWER", "ATGL", "AWL", "ABCAPITAL", "ABFRL", "ABREL", "ABSLAMC", "AEGISLOG", "AFFLE", "AJANTPHARM",
"AKUMS", "APLLTD", "ALKEM", "ALKYLAMINE", "ALOKINDS", "AMBER", "AMBUJACEM", "ANANDRATHI", "ANANTRAJ",
"ANGELONE", "APARINDS", "APOLLOHOSP", "APOLLOTYRE", "APTUS", "ACI", "ASAHIINDIA", "ASHOKLEY", "ASIANPAINT",
"ASTERDM", "ASTRAZEN", "ASTRAL", "ATUL", "AUROPHARMA", "AVANTIFEED", "DMART", "AXISBANK", "BASF", "BEML",
"BLS", "BSE", "BAJAJ-AUTO", "BAJFINANCE", "BAJAJFINSV", "BAJAJHLDNG", "BALAMINES", "BALKRISIND", "BALRAMCHIN",
"BANDHANBNK", "BANKBARODA", "BANKINDIA", "MAHABANK", "BATAINDIA", "BAYERCROP", "BERGEPAINT", "BDL", "BEL",
"BHARATFORG", "BHEL", "BPCL", "BHARTIARTL", "BHARTIHEXA", "BIKAJI", "BIOCON", "BIRLACORPN", "BSOFT",
"BLUEDART", "BLUESTARCO", "BBTC", "BOSCHLTD", "BRIGADE", "BRITANNIA", "MAPMYINDIA", "CCL", "CESC", "CGPOWER",
"CIEINDIA", "CRISIL", "CAMPUS", "CANFINHOME", "CANBK", "CAPLIPOINT", "CGCL", "CARBORUNIV", "CASTROLIND",
"CEATLTD", "CELLO", "CENTRALBK", "CDSL", "CENTURYPLY", "CERA", "CHALET", "CHAMBLFERT", "CHEMPLASTS",
"CHENNPETRO", "CHOLAHLDNG", "CHOLAFIN", "CIPLA", "CUB", "CLEAN", "COALINDIA", "COCHINSHIP", "COFORGE",
"COLPAL", "CAMS", "CONCORDBIO", "CONCOR", "COROMANDEL", "CRAFTSMAN", "CREDITACC", "CROMPTON", "CUMMINSIND",
"CYIENT", "DLF", "DABUR", "DALBHARAT", "DATAPATTNS", "DEEPAKFERT", "DEEPAKNTR", "DELHIVERY", "DEVYANI",
"DIVISLAB", "DIXON", "LALPATHLAB", "DRREDDY", "EIDPARRY", "EIHOTEL", "EASEMYTRIP", "EICHERMOT", "ELECON",
"ELGIEQUIP", "EMAMILTD", "EMCURE", "ENDURANCE", "ENGINERSIN", "EQUITASBNK", "ERIS", "ESCORTS", "EXIDEIND",
"NYKAA", "FEDERALBNK", "FACT", "FINEORG", "FINCABLES", "FINPIPE", "FSL", "FORTIS", "GRINFRA", "GAIL",
"GMRINFRA", "GRSE", "GICRE", "GILLETTE", "GLAND", "GLAXO", "GLENMARK", "MEDANTA", "GODFRYPHLP", "GODREJAGRO",
"GODREJCP", "GODREJIND", "GODREJPROP", "GRANULES", "GRAPHITE", "GRASIM", "GESHIP", "GUJGASLTD", "GMDCLTD",
"GNFC", "GPPL", "GSFC", "GSPL", "HEG", "HBLPOWER", "HCLTECH", "HDFCAMC", "HDFCBANK", "HDFCLIFE", "HFCL",
"HAPPSTMNDS", "HAVELLS", "HEROMOTOCO", "HSCL", "HINDALCO", "HAL", "HINDCOPPER", "HINDPETRO", "HINDUNILVR",
"HINDZINC", "POWERINDIA", "ICICIBANK", "ICICIGI", "ICICIPRULI", "ISEC", "IDBI", "IDFCFIRSTB", "IFCI", "IIFL",
"INOXINDIA", "ITC", "ITI", "INDIACEM", "INDIANB", "INFY", "IRCTC", "INDIGO", "JINDALSTEL", "JSWSTEEL", "JUBLFOOD",
"KEC", "KPITTECH", "KOTAKBANK", "LTIM", "LICHSGFIN", "LUPIN", "MRF", "MGL", "M&M", "MARICO", "MARUTI", "MFSL",
"NESTLEIND", "ONGC", "PAYTM", "PNB", "RELIANCE", "SBIN", "SUNPHARMA", "TATACHEM", "TATAMOTORS", "TCS", "TITAN",
"UPL", "VEDL", "WIPRO", "YESBANK", "ZEEL", "ZOMATO", "ZYDUSLIFE"
]
# Streamlit App Title
st.title("Pivot Point Calculator for Indian Share Market")
# Ticker Selection
selected_ticker = st.selectbox("Select a Ticker Symbol", TICKER_SYMBOLS)
# Date input
start_date = st.date_input("Select Start Date for Historical Data")
end_date = st.date_input("Select End Date for Historical Data")
# Function to check if the market is open
def is_market_open():
now = datetime.now().time()
market_open_time = time(9, 15) # NSE opens at 9:15 AM
market_close_time = time(15, 30) # NSE closes at 3:30 PM
return market_open_time <= now <= market_close_time
# Function to calculate pivot point and support/resistance levels
def calculate_pivot_levels(stock_data):
try:
high = stock_data['High'].iloc[-1]
low = stock_data['Low'].iloc[-1]
close = stock_data['Close'].iloc[-1]
pivot = (high + low + close) / 3
resistance1 = (2 * pivot) - low
support1 = (2 * pivot) - high
resistance2 = pivot + (high - low)
support2 = pivot - (high - low)
resistance3 = high + 2 * (pivot - low)
support3 = low - 2 * (high - pivot)
levels = {
'Pivot Point': pivot,
'Resistance 1': resistance1,
'Support 1': support1,
'Resistance 2': resistance2,
'Support 2': support2,
'Resistance 3': resistance3,
'Support 3': support3
}
return levels
except Exception as e:
st.error(f"Error calculating pivot levels: {str(e)}")
return None
# Function to fetch stock data with retry logic and proper error handling
@st.cache_data(ttl=300) # Cache for 5 minutes
def get_stock_data(symbol):
try:
nse_symbol = f"{symbol}.NS"
today = datetime.today().date()
# Set up a retry session to handle intermittent connection issues
session = requests.Session()
retries = Retry(total=5, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))
# Use the session to download data
stock = yf.download(
nse_symbol,
start=today - timedelta(days=5),
end=today + timedelta(days=1),
interval='1d',
progress=False,
session=session
)
if not stock.empty:
return stock.tail(1)
else:
st.warning("No data available for the selected stock.")
return pd.DataFrame()
except Exception as e:
st.error(f"Error fetching data for {symbol}: {str(e)}")
return pd.DataFrame()
# Load Data
if st.button("Calculate Pivot Points"):
if selected_ticker:
# Download historical data using yfinance
try:
data = get_stock_data(selected_ticker)
if not data.empty:
# Display historical data
st.subheader("Historical Data")
st.dataframe(data.tail())
# Calculate pivot points and support/resistance levels
levels = calculate_pivot_levels(data)
if levels:
st.subheader(f"Pivot Point Calculations for {selected_ticker}")
for level_name, value in levels.items():
st.write(f"{level_name}: {float(value):.2f}")
else:
st.error("No data available for the selected ticker and date range. Please try again.")
except Exception as e:
st.error(f"An error occurred: {e}")
else:
st.error("Please select a valid ticker symbol.")