"An AI trader that actually reads the market"
BetaStockGPT is an automated day-trading system. It aggregates sentiment from as many sources as possible, picks a short list of stocks likely to go up the next day, buys at open, and sells at close. No overnight holds, no manual work. Just sentiment-driven intraday trading on autopilot.
Every evening after market close, it scrapes news articles, analyst recommendations, fund manager picks, advisory services, and financial portals. All of that gets turned into a composite sentiment score for hundreds of stocks. An internal algorithm weighs these signals, filters for consistency, and spits out a shortlist of stocks most likely to move up the next day.
Every morning, it places buy orders at open, watches positions through the day, and sells everything before close. Repeats daily. The dashboard shows live positions, P&L, and which sources contributed to each pick, so I can see what's actually working and adjust weights over time.
Runs the whole trading engine. ML model training with scikit-learn and LightGBM, strategy logic, backtesting, broker API clients, and data pipeline orchestration.
Real-time trading dashboard with WebSocket-driven live updates. Shows position cards, P&L charts (Recharts), signal confidence gauges, and trade history. Built to be glanceable during market hours.
Backend API connecting the Python engine to the React dashboard. Serves position data, strategy config, backtesting results, and manages WebSocket connections for live streaming.
Stores trade logs, historical OHLCV data, model performance metrics, and config. Postgres for analytics queries, real-time subscriptions for pushing trade updates to the dashboard.
Custom scrapers for financial news, fund manager recommendations, and advisory services. Normalizes all of it into a unified scoring system that ranks stocks by next-day upside probability.
Runs on a daily cycle with three stages. First, the evening pipeline: after market close, scrapers hit financial news sites, fund manager feeds, advisory portals, and analyst columns. Each source gets parsed, cleaned, and turned into structured sentiment signals (bullish/bearish/neutral per stock, weighted by that source's historical accuracy).
Second, the scoring engine: all signals go into the algorithm that cross-references sentiment across sources, checks for consensus, and applies weighted scoring. Stocks with strong bullish signals from multiple independent sources make the final list. It also applies basic filters like market cap thresholds, volume minimums, and sector diversification to avoid concentrated bets.
Third, execution: at open the next morning, it places buy orders via the broker API. Monitors positions and P&L through the day. Before close, everything gets squared off. The dashboard streams all of this live, and every trade is logged to Supabase for historical tracking and per-source performance analysis.
Every source has a different format, update schedule, and reliability level. Some publish picks as tables, others bury them in paragraphs, and some change their HTML layout randomly. Making scrapers that handle all of this, and weighting each source by its actual track record, was the biggest ongoing challenge. I built a source health monitor that tracks each scraper's success rate and automatically downgrades or pauses unreliable ones.
Broker APIs are unreliable in ways you don't expect. Shoonya's API sometimes returns success but the order never shows up in the book. Connections drop during volatile opens, exactly when the system needs to place all its buys. I built a reconciliation loop that polls the order book after every placement and checks it against expected state. Mismatches trigger retries or fallback to market orders. Circuit breakers on every API call prevent cascading failures when the broker is having a bad day.
The hard part wasn't scraping. It was figuring out how to weight the signals. Not all sources are equally good, and their accuracy shifts with market conditions. A fund manager pick that works in a bull market can be useless during sideways chop. I built a rolling backtester that replays historical sentiment against actual outcomes, tracking per-source accuracy over different windows. Weights get continuously adjusted based on recent performance, so the system gravitates toward whatever's actually working right now.