All work

01Financial research platform

EquityIQ

A financial screening platform that helps retail investors compare companies across valuation, profitability, growth and risk filters — and read the story behind the numbers.

PythonStreamlitPandasPlotlyGemini AIGroq / Llama 3.3yfinanceFinnhub API
EquityIQ stock screening dashboard showing filters and valuation charts

Overview

A financial screening platform that helps retail investors compare companies across valuation, profitability, growth and risk filters — and read the story behind the numbers.

  • Screens 550+ stocks across the S&P 500 and Nifty 50 with 30+ customisable filters.
  • Annual-report analyser extracts key insights from uploaded financial documents.
  • DCF valuation modelling and a live news-sentiment monitor.

The problem

Retail investors research stocks across a dozen disconnected tabs: one site for fundamentals, another for filings, another for news. Screening tools that combine them are usually paywalled, and annual reports are hundreds of pages long, so most people never read the primary source at all.

Who it is for

Retail investors and students of the market who want institutional-style screening without an institutional subscription.

My responsibilities

  • Designed and built the entire application — data layer, analytics and interface.
  • Modelled the screening logic: 30+ filters across valuation, profitability, growth and risk.
  • Integrated market data (yfinance, Finnhub) and LLM providers (Gemini, Groq/Llama 3.3) behind a single Python service layer.
  • Implemented the DCF valuation model and the interactive Plotly charting.

Product & technical decisions

Streamlit so the analytics and the interface share one language

The hard part of this product is the data work — cleaning financial statements, computing ratios consistently across two markets, running valuation models. Streamlit keeps that logic and the UI in one Python codebase, which meant no serialisation boundary to maintain and far faster iteration on the analysis itself.

Pandas as the single analytical vocabulary

Every provider returns a different shape. Normalising all of it into DataFrames early meant filters, charts and the DCF model could all be written against one consistent schema instead of against each API.

Two LLM providers, chosen per job

Long annual reports need a large context window (Gemini); short interactive summaries need low latency (Groq running Llama 3.3). Routing each task to the model that suits it keeps the document analysis thorough without making the interactive parts feel slow.

Charts as an interface, not decoration

Plotly visualisations are interactive so comparison happens inside the chart — hover a peer, isolate a series — rather than forcing the user back to a table.

Architecture

How the pieces fit together, from the surface the user touches down to the sources of truth.

Interface

  • Streamlit app
  • Plotly charts

Analysis

  • Screener (30+ filters)
  • DCF model
  • Report analyser

Data layer

  • Pandas normalisation

Sources

  • yfinance
  • Finnhub API
  • Gemini
  • Groq / Llama 3.3

InterfaceApplication logicData & authThird-party

Key functionality

Multi-market screener

A single screening interface covering 550+ tickers across the S&P 500 and Nifty 50, with more than 30 filters spanning valuation multiples, profitability ratios, growth rates and risk measures. Filters compose, so an investor can express a whole thesis in one query instead of sorting spreadsheets.

Annual-report analyser

Upload a company's annual report and Gemini extracts the substance — business model, risk disclosures, management commentary — so the primary source becomes readable in minutes rather than an afternoon.

DCF valuation model

A discounted-cash-flow model with adjustable growth and discount-rate assumptions, so the output is a range that responds to the user's own view rather than a single opaque "fair value" number.

Live news sentiment

A sentiment monitor built on the Finnhub API that surfaces how coverage of a company is trending alongside its fundamentals.

What went wrong, and what I did

Navigation that reloaded the whole app

Constraint
Moving between sections used raw <a href="?nav=..."> links. Every click was a full browser navigation: the JavaScript bundle reloaded, the Streamlit WebSocket reconnected, the script reran from the top, and the user watched a blank-page flash in between.
Wrong turn
I treated internal navigation like a conventional multipage website and reached for anchor links. The URL updated correctly, which made it look right — but it bypassed Streamlit's session-aware rerun model and restarted the page on every navigation.
What I shipped
Replaced anchor navigation with Streamlit buttons that write to st.query_params and call st.rerun(), so the session survives and only the content re-renders. While I was in there I merged Market Pulse and News Radar into one workflow rather than maintaining two features doing near-identical AI sentiment analysis.
Effect
Playwright recorded zero full-page load events while switching between sections. The reload flash is gone, the session no longer reconnects on navigation, and the duplicated news workflow is one feature instead of two.

Where it stands

EquityIQ is deployed and publicly usable — the full feature set above is live rather than a prototype.

  • 550+ stocks screened
  • 30+ composable filters
  • 2 market universes

Open the live product(opens in a new tab)

What I would improve next

  • Persist saved screens and watchlists per user.
  • Backtest a screen against historical fundamentals to see how it would have performed.
  • Expand coverage beyond the S&P 500 and Nifty 50.