nse-bot-backend / run_backtest_universe.py
ash001's picture
Deploy from GitHub Actions to nse-bot-backend
789e5eb verified
from pathlib import Path
import pandas as pd
from strategy_engine import scan_symbol_for_day, OUTPUT_COLUMNS
BASE_DIR = Path(__file__).resolve().parent
UNIVERSE_PATH = BASE_DIR / "option_stock_universe.csv"
OUT_DIR = BASE_DIR / "outputs"
TRADE_DATE = "2026-02-26"
MODE = "priority" # "priority" or "all"
# MODE = "all"
def load_universe():
df = pd.read_csv(UNIVERSE_PATH)
df["symbol"] = df["symbol"].astype(str).str.upper()
df["sector"] = df["sector"].fillna("").astype(str)
df["priority_rank"] = pd.to_numeric(df["priority_rank"], errors="coerce").fillna(999)
return df
def pick_universe(df, mode):
if mode == "priority":
return df[df["priority_rank"] == 1].copy()
if mode == "all":
return df.copy()
raise ValueError("MODE must be 'priority' or 'all'")
def main():
OUT_DIR.mkdir(exist_ok=True)
universe = load_universe()
universe = pick_universe(universe, MODE)
print(f"Universe mode: {MODE}")
print(f"Symbols to scan: {len(universe)}")
for variant in ["v1", "v2"]:
print(f"\nRunning {variant} ...")
option_cache = {}
frames = []
for _, row in universe.iterrows():
symbol = row["symbol"]
sector = row["sector"]
print(f"Scanning {symbol} ...")
try:
df = scan_symbol_for_day(
stock_symbol=symbol,
sector=sector,
trade_date=TRADE_DATE,
variant=variant,
option_cache=option_cache,
)
if not df.empty:
frames.append(df)
print(f" Trades found: {len(df)}")
else:
print(" No trades")
except Exception as e:
print(f" Error: {e}")
if frames:
result = pd.concat(frames, ignore_index=True)
else:
result = pd.DataFrame(columns=OUTPUT_COLUMNS)
out_path = OUT_DIR / f"paper_trades_{TRADE_DATE}_{MODE}_{variant}.csv"
result.to_csv(out_path, index=False)
print(f"\nSaved: {out_path}")
print(f"Total rows: {len(result)}")
if __name__ == "__main__":
main()