nse-bot-backend / instrument_utils.py
ash001's picture
Deploy from GitHub Actions to nse-bot-backend
789e5eb verified
import pandas as pd
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
NSE_PATH = BASE_DIR / "instruments_nse.csv"
NFO_PATH = BASE_DIR / "instruments_nfo.csv"
def load_nse_instruments():
if not NSE_PATH.exists():
raise FileNotFoundError("instruments_nse.csv not found. Run main.py first.")
return pd.read_csv(NSE_PATH)
def load_nfo_instruments():
if not NFO_PATH.exists():
raise FileNotFoundError("instruments_nfo.csv not found. Run main.py first.")
return pd.read_csv(NFO_PATH)
def find_nse_symbol(symbol: str):
df = load_nse_instruments()
out = df[df["tradingsymbol"].astype(str).str.upper() == symbol.upper()].copy()
return out
def find_nfo_by_name(name: str):
df = load_nfo_instruments()
out = df[df["name"].astype(str).str.upper() == name.upper()].copy()
return out
def find_nearest_options(underlying: str, option_type: str = None):
df = load_nfo_instruments().copy()
df = df[df["name"].astype(str).str.upper() == underlying.upper()]
df = df[df["instrument_type"].isin(["CE", "PE"])]
if option_type:
df = df[df["instrument_type"].astype(str).str.upper() == option_type.upper()]
if df.empty:
return df
df["expiry"] = pd.to_datetime(df["expiry"], errors="coerce")
df = df.sort_values(["expiry", "strike"])
return df