Stock Screener for an African Exchange

148 stocks. Daily technical indicators. 33 signal pages. Zero dollars in data costs. Built in three weeks.

148Stocks Tracked
3Weeks to Ship
$0Data Cost
<$40Monthly Infra

The problem

A client found me on Fiverr. He wanted a stock screener for an African stock exchange where investors could filter by price, volume, dividends, and technical indicators. The catch: no budget for paid data feeds. No Bloomberg. No paid API subscriptions. The exchange itself had no official public API, no developer portal, and no documentation.

Finding data that "did not exist"

I watched the exchange website's network requests in browser dev tools and found a hidden REST endpoint returning daily OHLCV data for all 148 stocks in one request. Historical prices came from an undocumented chart widget endpoint, keyed by internal ISIN codes that I had to scrape from 148 company profile pages. Fundamentals like P/E and dividend yield did not exist on the exchange at all, so I pulled them from a third-party site where the data was buried inside a JavaScript bundle. Four sources, four formats, four parsers.

The build

  • Seven independent Python scripts, each doing one job: prices, history backfill, ISIN mapping, indicators, company profiles, fundamentals, and news matching.
  • RSI, MACD, and five moving averages written from scratch in about 80 lines of plain Python, avoiding TA-Lib's C compilation headaches on serverless.
  • A 0-100 opportunity score per stock, built on trend, momentum, volume, price action, and relative strength.
  • 33 SEO signal pages (Top Gainers, RSI Oversold, Golden Cross, and more) generated from one Django view and one config dictionary.
  • A screener with 15+ combinable filters, null-safe sorting, and clean URLs.

Infrastructure

Django on Google Cloud Run, data scripts as Cloud Functions on Cloud Scheduler, and PostgreSQL on Supabase. Scripts run hourly during market hours in the exchange's timezone. Total running cost: under $40 per month for a platform updating 148 stocks every hour.

Honest lessons

Not everything went smoothly, and I would rather tell you than hide it. The MACD math had an EMA alignment bug that took two hours to find. The scraper broke once because the source site A/B tests its layout. And if I started over, I would backfill historical data on day one, because indicators like the 200-day moving average sat empty for the first month. These are exactly the lessons you are paying for when you hire a specialist.

Want the full technical breakdown? Read the complete write-up on Medium.