# app.py import streamlit as st import pandas as pd import yfinance as yf import numpy as np import time import os st.title('RSI स्कैनर - भारतीय स्टॉक्स') # 'ind_nifty500list.csv' फ़ाइल को पढ़ें csv_file_path = 'ind_nifty500list.csv' # सुनिश्चित करें कि यह फ़ाइल आपके Hugging Face Space में है # चेक करें कि फ़ाइल मौजूद है if not os.path.isfile(csv_file_path): st.error("स्टॉक सूची फ़ाइल नहीं मिली। कृपया 'ind_nifty500list.csv' फ़ाइल को अपलोड करें।") else: # CSV फ़ाइल को DataFrame में पढ़ें stock_df = pd.read_csv(csv_file_path) # आवश्यक कॉलम मौजूद हैं या नहीं required_columns = {'Symbol', 'Company Name'} if not required_columns.issubset(stock_df.columns): st.error(f"CSV फ़ाइल में निम्नलिखित कॉलम होने चाहिए: {required_columns}") else: # उपयोगकर्ता इनपुट के लिए साइडबार बनाएं st.sidebar.header('स्कैनर सेटिंग्स') period_options = ['1mo', '3mo', '6mo', '1y'] selected_period = st.sidebar.selectbox('डेटा अवधि चुनें', period_options, index=2) rsi_lower_threshold = st.sidebar.slider('RSI निचली सीमा', min_value=0, max_value=50, value=25) rsi_upper_threshold = st.sidebar.slider('RSI ऊपरी सीमा', min_value=50, max_value=100, value=75) # साप्ताहिक RSI जोड़ने का विकल्प st.sidebar.header('RSI सेटिंग्स') rsi_timeframe = st.sidebar.selectbox('RSI टाइमफ़्रेम चुनें', ['Daily', 'Weekly']) st.write("RSI और अन्य तकनीकी संकेतकों की गणना की जा रही है। कृपया प्रतीक्षा करें...") # प्रगति बार progress_bar = st.progress(0) total_stocks = len(stock_df) stocks_rsi_below = [] stocks_rsi_above = [] @st.cache_data(show_spinner=False) def get_stock_data(symbol, period, interval): # स्टॉक डेटा डाउनलोड करें return yf.download(symbol, period=period, interval=interval, progress=False) @st.cache_data(show_spinner=False) def get_stock_info(symbol): # स्टॉक की जानकारी प्राप्त करें ticker = yf.Ticker(symbol) info = ticker.info industry = info.get('industry', 'N/A') market_cap = info.get('marketCap', 'N/A') return industry, market_cap # RSI के लिए इंटरवल सेट करें if rsi_timeframe == 'Daily': interval = '1d' else: interval = '1wk' for idx, row in stock_df.iterrows(): company_name = row['Company Name'] symbol = row['Symbol'] # यदि आवश्यक हो तो '.NS' जोड़ें if not symbol.endswith('.NS') and not symbol.endswith('.BO'): symbol += '.NS' try: # स्टॉक डेटा प्राप्त करें (कैश किया गया) data = get_stock_data(symbol, selected_period, interval) if data.empty: continue # RSI की गणना करें delta = data['Close'].diff() up = delta.clip(lower=0) down = -delta.clip(upper=0) roll_up = up.rolling(window=14).mean() roll_down = down.rolling(window=14).mean() RS = roll_up / roll_down data['RSI'] = 100.0 - (100.0 / (1.0 + RS)) latest_rsi = data['RSI'].iloc[-1] # Industry और Market Cap प्राप्त करें industry, market_cap = get_stock_info(symbol) # Market Cap को करोड़ों में बदलें if market_cap != 'N/A': market_cap = round(market_cap / 1e7, 2) # करोड़ों में # RSI मान के आधार पर स्टॉक्स को वर्गीकृत करें if latest_rsi < rsi_lower_threshold: stocks_rsi_below.append({ 'Company Name': company_name, 'Symbol': symbol, 'Industry': industry, 'Market Cap (करोड़ों में)': market_cap, 'RSI': round(latest_rsi, 2) }) elif latest_rsi > rsi_upper_threshold: stocks_rsi_above.append({ 'Company Name': company_name, 'Symbol': symbol, 'Industry': industry, 'Market Cap (करोड़ों में)': market_cap, 'RSI': round(latest_rsi, 2) }) except Exception as e: st.write(f"{symbol} के लिए त्रुटि: {e}") continue progress_bar.progress((idx + 1) / total_stocks) # परिणामों को DataFrame में परिवर्तित करें df_below = pd.DataFrame(stocks_rsi_below) df_above = pd.DataFrame(stocks_rsi_above) # उपयोगकर्ता से एक स्टॉक चुनने का विकल्प st.sidebar.header('स्टॉक विवरण देखें') all_companies = stock_df['Company Name'].tolist() # जब उपयोगकर्ता स्टॉक सूची में से क्लिक करें तो चयन करें selected_company = st.sidebar.selectbox('कंपनी चुनें', [''] + all_companies) st.subheader(f"RSI {rsi_lower_threshold} से कम वाले स्टॉक्स") if not df_below.empty: # प्रत्येक स्टॉक के लिए बटन जोड़ें for idx, row in df_below.iterrows(): st.write(f"{row['Company Name']} ({row['Symbol']}) - RSI: {row['RSI']}") if st.button(f"विवरण देखें - {row['Company Name']}", key=f"below_{idx}"): selected_company = row['Company Name'] # डाउनलोड बटन csv_below = df_below.to_csv(index=False).encode('utf-8') st.download_button( label=f"RSI {rsi_lower_threshold} से कम वाले स्टॉक्स को CSV में डाउनलोड करें", data=csv_below, file_name=f'stocks_rsi_below_{rsi_lower_threshold}.csv', mime='text/csv' ) else: st.write("कोई स्टॉक्स नहीं मिले।") st.subheader(f"RSI {rsi_upper_threshold} से अधिक वाले स्टॉक्स") if not df_above.empty: # प्रत्येक स्टॉक के लिए बटन जोड़ें for idx, row in df_above.iterrows(): st.write(f"{row['Company Name']} ({row['Symbol']}) - RSI: {row['RSI']}") if st.button(f"विवरण देखें - {row['Company Name']}", key=f"above_{idx}"): selected_company = row['Company Name'] # डाउनलोड बटन csv_above = df_above.to_csv(index=False).encode('utf-8') st.download_button( label=f"RSI {rsi_upper_threshold} से अधिक वाले स्टॉक्स को CSV में डाउनलोड करें", data=csv_above, file_name=f'stocks_rsi_above_{rsi_upper_threshold}.csv', mime='text/csv' ) else: st.write("कोई स्टॉक्स नहीं मिले।") if selected_company: symbol = stock_df.loc[stock_df['Company Name'] == selected_company, 'Symbol'].values[0] if not symbol.endswith('.NS') and not symbol.endswith('.BO'): symbol += '.NS' data = get_stock_data(symbol, selected_period, interval) if not data.empty: # RSI की गणना करें delta = data['Close'].diff() up = delta.clip(lower=0) down = -delta.clip(upper=0) roll_up = up.rolling(window=14).mean() roll_down = down.rolling(window=14).mean() RS = roll_up / roll_down data['RSI'] = 100.0 - (100.0 / (1.0 + RS)) # MACD की गणना करें exp1 = data['Close'].ewm(span=12, adjust=False).mean() exp2 = data['Close'].ewm(span=26, adjust=False).mean() data['MACD'] = exp1 - exp2 data['Signal Line'] = data['MACD'].ewm(span=9, adjust=False).mean() # OBV की गणना करें data['OBV'] = (np.sign(data['Close'].diff()) * data['Volume']).fillna(0).cumsum() # चार्ट प्रदर्शित करें st.subheader(f"{selected_company} ({symbol}) के तकनीकी संकेतक") # RSI चार्ट st.write("**RSI**") st.line_chart(data['RSI'], height=200) # MACD चार्ट st.write("**MACD**") st.line_chart(data[['MACD', 'Signal Line']], height=200) # OBV चार्ट st.write("**On-Balance Volume (OBV)**") st.line_chart(data['OBV'], height=200) # डेटा टेबल दिखाएं st.write("**डेटा टेबल**") st.write(data[['Close', 'RSI', 'MACD', 'Signal Line', 'OBV']].tail(30))