R2 / app.py
riteshcp's picture
Create app.py
f9078c9 verified
Raw History Blame Contribute Delete
10.7 kB
# 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))