testing / stls.py
jarvisx17's picture
Update stls.py
7fd33d4 verified
raw
history blame
4.3 kB
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta
from pymongo import MongoClient
import pytz
import os
mongo_url = os.environ['MongoURL']
df_logo = pd.read_csv('https://raw.githubusercontent.com/jarvisx17/nifty500/main/Nifty500.csv')
df_logo = df_logo[['Symbol', "logo"]]
tz = pytz.timezone('Asia/Kolkata')
def UpdatedCollectionName():
current_time = datetime.now(tz)
collection_name = current_time.strftime('%Y-%m-%d')
if current_time.time() >= datetime.strptime('15:30', '%H:%M').time():
collection_name = (current_time + timedelta(days=1)).strftime('%Y-%m-%d')
return collection_name
else:
return collection_name
def get_rsi(close, lookback=14):
ret = close.diff()
up = []
down = []
for i in range(len(ret)):
if ret.iloc[i] < 0:
up.append(0)
down.append(ret.iloc[i])
else:
up.append(ret.iloc[i])
down.append(0)
up_series = pd.Series(up, index=close.index)
down_series = pd.Series(down, index=close.index).abs()
up_ewm = up_series.ewm(com=lookback - 1, adjust=False).mean()
down_ewm = down_series.ewm(com=lookback - 1, adjust=False).mean()
rs = up_ewm / down_ewm
rsi = 100 - (100 / (1 + rs))
rsi_df = pd.DataFrame(rsi, columns=['RSI'])
return rsi_df
def Stocks():
# end_date = datetime.today()
utc_now = datetime.utcnow()
indian_timezone = pytz.timezone('Asia/Kolkata')
indian_now = utc_now.replace(tzinfo=pytz.utc).astimezone(indian_timezone)
end_date = utc_now
end_date = end_date.replace(tzinfo=pytz.utc).astimezone(indian_timezone)
end_date = end_date.replace(tzinfo=pytz.utc).astimezone(indian_timezone)
start_date = end_date - timedelta(days=365)
nifty500_symbols = []
nifty500 = pd.read_csv('https://archives.nseindia.com/content/indices/ind_nifty500list.csv')
for symbol in nifty500.Symbol:
symbol = f'{symbol}.NS'
nifty500_symbols.append(symbol)
nifty500_data = pd.DataFrame()
print("Downloading data...")
for symbol in nifty500_symbols:
try:
stock_data = yf.download(symbol, start=start_date, end=end_date, progress=False)
stock_data['Symbol'] = symbol
nifty500_data = pd.concat([nifty500_data, stock_data], axis=0)
except Exception as e:
print(f"Error fetching data for {symbol}: {e}")
nifty500_data.reset_index(inplace=True)
nifty500_data['RSI'] = nifty500_data.groupby('Symbol')['Close'].apply(lambda x: get_rsi(x, lookback=14))
nifty500_data['SMA20'] = nifty500_data.groupby('Symbol')['Close'].transform(lambda x: x.rolling(window=20).mean())
nifty500_data['PercentageChange'] = nifty500_data.groupby('Symbol')['Close'].pct_change() * 100
nifty500_data_last_2_rows = nifty500_data.groupby('Symbol').tail(2)
nifty500_data_last_2_rows.reset_index(drop=True, inplace=True)
nifty500_data_last_2_rows['Prev_RSI'] = nifty500_data_last_2_rows.groupby('Symbol')['RSI'].shift(1)
filtered_data_by_stock = []
for symbol, group in nifty500_data_last_2_rows.groupby('Symbol'):
filtered_stock_data = group[(group['RSI'] >= 60) & (group['Prev_RSI'] < 60)]
if not filtered_stock_data.empty:
filtered_data_by_stock.append(filtered_stock_data)
filtered_data = pd.concat(filtered_data_by_stock)
filtered_data.reset_index(drop=True, inplace=True)
filtered_data[['Open', 'High','Low', 'Close', 'RSI', 'Prev_RSI','SMA20', 'PercentageChange']] = filtered_data[['Open', 'High','Low', 'Close', 'RSI', 'Prev_RSI', 'SMA20', 'PercentageChange']].round(2)
filtered_data = filtered_data.sort_values(by='PercentageChange', ascending=False)
filtered_data.reset_index(drop=True, inplace=True)
filtered_data = pd.merge(filtered_data, df_logo, on='Symbol', how='inner')
filtered_data = filtered_data[['Symbol', 'Date', 'Open', 'High', 'Low', 'Close', 'RSI', 'Prev_RSI','PercentageChange', "logo"]]
client = MongoClient(mongo_url)
db = client['mydatabase']
collection_name = UpdatedCollectionName()
collection = db[collection_name]
data_dict = filtered_data.to_dict(orient='records')
collection.insert_many(data_dict)
return filtered_data.to_dict(orient="records")