riteshcp/R2
0
1# app.py2 3import streamlit as st4import pandas as pd5import yfinance as yf6import numpy as np7import time8import os9 10st.title('RSI स्कैनर - भारतीय स्टॉक्स')11 12# 'ind_nifty500list.csv' फ़ाइल को पढ़ें13csv_file_path = 'ind_nifty500list.csv' # सुनिश्चित करें कि यह फ़ाइल आपके Hugging Face Space में है14 15# चेक करें कि फ़ाइल मौजूद है16if not os.path.isfile(csv_file_path):17 st.error("स्टॉक सूची फ़ाइल नहीं मिली। कृपया 'ind_nifty500list.csv' फ़ाइल को अपलोड करें।")18else:19 # CSV फ़ाइल को DataFrame में पढ़ें20 stock_df = pd.read_csv(csv_file_path)21 22 # आवश्यक कॉलम मौजूद हैं या नहीं23 required_columns = {'Symbol', 'Company Name'}24 if not required_columns.issubset(stock_df.columns):25 st.error(f"CSV फ़ाइल में निम्नलिखित कॉलम होने चाहिए: {required_columns}")26 else:27 # उपयोगकर्ता इनपुट के लिए साइडबार बनाएं28 st.sidebar.header('स्कैनर सेटिंग्स')29 period_options = ['1mo', '3mo', '6mo', '1y']30 selected_period = st.sidebar.selectbox('डेटा अवधि चुनें', period_options, index=2)31 32 rsi_lower_threshold = st.sidebar.slider('RSI निचली सीमा', min_value=0, max_value=50, value=25)33 rsi_upper_threshold = st.sidebar.slider('RSI ऊपरी सीमा', min_value=50, max_value=100, value=75)34 35 # साप्ताहिक RSI जोड़ने का विकल्प36 st.sidebar.header('RSI सेटिंग्स')37 rsi_timeframe = st.sidebar.selectbox('RSI टाइमफ़्रेम चुनें', ['Daily', 'Weekly'])38 39 st.write("RSI और अन्य तकनीकी संकेतकों की गणना की जा रही है। कृपया प्रतीक्षा करें...")40 41 # प्रगति बार42 progress_bar = st.progress(0)43 total_stocks = len(stock_df)44 stocks_rsi_below = []45 stocks_rsi_above = []46 47 @st.cache_data(show_spinner=False)48 def get_stock_data(symbol, period, interval):49 # स्टॉक डेटा डाउनलोड करें50 return yf.download(symbol, period=period, interval=interval, progress=False)51 52 @st.cache_data(show_spinner=False)53 def get_stock_info(symbol):54 # स्टॉक की जानकारी प्राप्त करें55 ticker = yf.Ticker(symbol)56 info = ticker.info57 industry = info.get('industry', 'N/A')58 market_cap = info.get('marketCap', 'N/A')59 return industry, market_cap60 61 # RSI के लिए इंटरवल सेट करें62 if rsi_timeframe == 'Daily':63 interval = '1d'64 else:65 interval = '1wk'66 67 for idx, row in stock_df.iterrows():68 company_name = row['Company Name']69 symbol = row['Symbol']70 # यदि आवश्यक हो तो '.NS' जोड़ें71 if not symbol.endswith('.NS') and not symbol.endswith('.BO'):72 symbol += '.NS'73 try:74 # स्टॉक डेटा प्राप्त करें (कैश किया गया)75 data = get_stock_data(symbol, selected_period, interval)76 if data.empty:77 continue78 # RSI की गणना करें79 delta = data['Close'].diff()80 up = delta.clip(lower=0)81 down = -delta.clip(upper=0)82 roll_up = up.rolling(window=14).mean()83 roll_down = down.rolling(window=14).mean()84 RS = roll_up / roll_down85 data['RSI'] = 100.0 - (100.0 / (1.0 + RS))86 latest_rsi = data['RSI'].iloc[-1]87 88 # Industry और Market Cap प्राप्त करें89 industry, market_cap = get_stock_info(symbol)90 91 # Market Cap को करोड़ों में बदलें92 if market_cap != 'N/A':93 market_cap = round(market_cap / 1e7, 2) # करोड़ों में94 95 # RSI मान के आधार पर स्टॉक्स को वर्गीकृत करें96 if latest_rsi < rsi_lower_threshold:97 stocks_rsi_below.append({98 'Company Name': company_name,99 'Symbol': symbol,100 'Industry': industry,101 'Market Cap (करोड़ों में)': market_cap,102 'RSI': round(latest_rsi, 2)103 })104 elif latest_rsi > rsi_upper_threshold:105 stocks_rsi_above.append({106 'Company Name': company_name,107 'Symbol': symbol,108 'Industry': industry,109 'Market Cap (करोड़ों में)': market_cap,110 'RSI': round(latest_rsi, 2)111 })112 except Exception as e:113 st.write(f"{symbol} के लिए त्रुटि: {e}")114 continue115 progress_bar.progress((idx + 1) / total_stocks)116 117 # परिणामों को DataFrame में परिवर्तित करें118 df_below = pd.DataFrame(stocks_rsi_below)119 df_above = pd.DataFrame(stocks_rsi_above)120 121 # उपयोगकर्ता से एक स्टॉक चुनने का विकल्प122 st.sidebar.header('स्टॉक विवरण देखें')123 all_companies = stock_df['Company Name'].tolist()124 125 # जब उपयोगकर्ता स्टॉक सूची में से क्लिक करें तो चयन करें126 selected_company = st.sidebar.selectbox('कंपनी चुनें', [''] + all_companies)127 128 st.subheader(f"RSI {rsi_lower_threshold} से कम वाले स्टॉक्स")129 if not df_below.empty:130 # प्रत्येक स्टॉक के लिए बटन जोड़ें131 for idx, row in df_below.iterrows():132 st.write(f"{row['Company Name']} ({row['Symbol']}) - RSI: {row['RSI']}")133 if st.button(f"विवरण देखें - {row['Company Name']}", key=f"below_{idx}"):134 selected_company = row['Company Name']135 # डाउनलोड बटन136 csv_below = df_below.to_csv(index=False).encode('utf-8')137 st.download_button(138 label=f"RSI {rsi_lower_threshold} से कम वाले स्टॉक्स को CSV में डाउनलोड करें",139 data=csv_below,140 file_name=f'stocks_rsi_below_{rsi_lower_threshold}.csv',141 mime='text/csv'142 )143 else:144 st.write("कोई स्टॉक्स नहीं मिले।")145 146 st.subheader(f"RSI {rsi_upper_threshold} से अधिक वाले स्टॉक्स")147 if not df_above.empty:148 # प्रत्येक स्टॉक के लिए बटन जोड़ें149 for idx, row in df_above.iterrows():150 st.write(f"{row['Company Name']} ({row['Symbol']}) - RSI: {row['RSI']}")151 if st.button(f"विवरण देखें - {row['Company Name']}", key=f"above_{idx}"):152 selected_company = row['Company Name']153 # डाउनलोड बटन154 csv_above = df_above.to_csv(index=False).encode('utf-8')155 st.download_button(156 label=f"RSI {rsi_upper_threshold} से अधिक वाले स्टॉक्स को CSV में डाउनलोड करें",157 data=csv_above,158 file_name=f'stocks_rsi_above_{rsi_upper_threshold}.csv',159 mime='text/csv'160 )161 else:162 st.write("कोई स्टॉक्स नहीं मिले।")163 164 if selected_company:165 symbol = stock_df.loc[stock_df['Company Name'] == selected_company, 'Symbol'].values[0]166 if not symbol.endswith('.NS') and not symbol.endswith('.BO'):167 symbol += '.NS'168 data = get_stock_data(symbol, selected_period, interval)169 if not data.empty:170 # RSI की गणना करें171 delta = data['Close'].diff()172 up = delta.clip(lower=0)173 down = -delta.clip(upper=0)174 roll_up = up.rolling(window=14).mean()175 roll_down = down.rolling(window=14).mean()176 RS = roll_up / roll_down177 data['RSI'] = 100.0 - (100.0 / (1.0 + RS))178 179 # MACD की गणना करें180 exp1 = data['Close'].ewm(span=12, adjust=False).mean()181 exp2 = data['Close'].ewm(span=26, adjust=False).mean()182 data['MACD'] = exp1 - exp2183 data['Signal Line'] = data['MACD'].ewm(span=9, adjust=False).mean()184 185 # OBV की गणना करें186 data['OBV'] = (np.sign(data['Close'].diff()) * data['Volume']).fillna(0).cumsum()187 188 # चार्ट प्रदर्शित करें189 st.subheader(f"{selected_company} ({symbol}) के तकनीकी संकेतक")190 191 # RSI चार्ट192 st.write("**RSI**")193 st.line_chart(data['RSI'], height=200)194 195 # MACD चार्ट196 st.write("**MACD**")197 st.line_chart(data[['MACD', 'Signal Line']], height=200)198 199 # OBV चार्ट200 st.write("**On-Balance Volume (OBV)**")201 st.line_chart(data['OBV'], height=200)202 203 # डेटा टेबल दिखाएं204 st.write("**डेटा टेबल**")205 st.write(data[['Close', 'RSI', 'MACD', 'Signal Line', 'OBV']].tail(30))206 207 