Portfolio Project

A stock screener that runs before you wake up

[sage]SIGNALS screens 1,000+ US tech stocks through 6 research-backed gates every weekday at 9am and emails the top 10 — with entry zones, stop-losses, and sell signals — before the market opens.

Today's top picks — 9:04am ET
#1CRDO
#2RELY
#3FLYW
#4AMD
#5RBRK
The Builder·Why I Built This·What It Is·Features·How It Works·Built With·Say Hello

The Builder

Built by a PM learning to ship

Sage Ashique
Sage Ashique
Product Manager

I'm a PM who decided the best way to get better at building was to actually build something. [sage]SIGNALS is one of a growing set of [sage] apps— personal tools I design, build, and ship with AI assistance. The stack is real, the data is live, and the pipeline runs every morning whether I'm watching or not.

Connect on LinkedIn

Motivation

Why I built this

A friend of mine has been trading stocks for years. I wanted to get into it, but I didn't want to just follow his picks. I wanted to understand the logic, build on top of it, and see if I could make it systematic.

So we collaborated: he brought the trading knowledge, I brought the ability to build things fast with Claude Code. The result is a screener that does our morning research for us. Every weekday at 9am, before the market opens, we both get the same email. He validates the model logic. I maintain the pipeline. Neither of us has to spend 45 minutes scanning tickers before breakfast.

We're paper-trading it now — tracking every pick's return at T+1, T+5, T+10, and T+21 before we commit real capital. This dashboard is how we know whether it's actually working.

The Product

What [sage]SIGNALS is

[sage]SIGNALS is a daily pre-market email screener for US technology stocks. It runs every weekday via GitHub Actions, screens the full tech universe through 6 gates, ranks the top 10 by composite score, and sends the result as a mobile-friendly HTML email at 9am ET, before the New York Stock Exchange opens.

It's built for two investors with an aggressive risk tolerance and a days-to-weeks trading horizon. Every pick comes with an entry zone, two stop-loss levels (ATR-based and flat 12%), and a risk score from 1 to 10. Current positions are checked for sell signals every morning.

The validation dashboard on this site tracks every pick's forward performance against QQQ. Hit rate, alpha, rank validity, and per-pick return all update as Polygon.io closes resolve each day. Directional signal becomes readable at 2 to 4 weeks. Full statistical validation takes 12 to 16 weeks.

Capabilities

What it does

🔍
Universe Filtering

1,000+ US tech stocks narrowed to mid-cap and above with buy-or-better analyst consensus before a single gate runs.

📊
6-Gate Screener

Momentum, profitability, revenue growth, cash flow, sentiment, and options flow. Every stock must pass all six.

🏆
Composite Ranking

Survivors are scored, ranked, and annotated with top 3 strengths, a risk score, entry zone, and two stop-loss levels.

📧
Daily Email at 9am

Mobile-friendly HTML report lands before market open every weekday. No login required — it just shows up.

📉
Sell Signal Check

Held positions are checked against four exit conditions: deteriorating fundamentals, sentiment breakdown, and trailing stops.

📈
Forward Price Tracking

Every pick is tracked at T+1, T+5, T+10, and T+21 trading days and compared to QQQ over the same window.

🤖
AI Market Summary

A plain-English read on the day's picks — what the signals mean in context, not just raw numbers.

🧾
Paper-Trade Validation

All picks are logged in Supabase before any real capital moves. The dashboard shows whether the model is working.

🔍
Universe Filtering

1,000+ US tech stocks narrowed to mid-cap and above with buy-or-better analyst consensus before a single gate runs.

📊
6-Gate Screener

Momentum, profitability, revenue growth, cash flow, sentiment, and options flow. Every stock must pass all six.

🏆
Composite Ranking

Survivors are scored, ranked, and annotated with top 3 strengths, a risk score, entry zone, and two stop-loss levels.

📧
Daily Email at 9am

Mobile-friendly HTML report lands before market open every weekday. No login required — it just shows up.

📉
Sell Signal Check

Held positions are checked against four exit conditions: deteriorating fundamentals, sentiment breakdown, and trailing stops.

📈
Forward Price Tracking

Every pick is tracked at T+1, T+5, T+10, and T+21 trading days and compared to QQQ over the same window.

🤖
AI Market Summary

A plain-English read on the day's picks — what the signals mean in context, not just raw numbers.

🧾
Paper-Trade Validation

All picks are logged in Supabase before any real capital moves. The dashboard shows whether the model is working.

The Pipeline

How it works

The screener runs as a fully automated pipeline triggered by GitHub Actions every weekday morning. Here's each step in order.

1
Universe fetch
Finviz Elite API is queried across 4 screener views (overview, valuation, performance, technical) and merged by ticker. The universe starts pre-filtered to US tech stocks, mid-cap and above, with buy-or-better analyst consensus.
2
6-gate screening
Each stock is run through 6 sequential gates. A stock must pass all of them to move forward.
3
Valuation exclusions
Stocks that pass all gates but have a PEG ratio above 2.0, or are priced above their analyst target with 5+ analysts covering, are dropped from ranking.
4
Composite scoring & ranking
Survivors are scored across gate strength signals and ranked. The top 10 are selected. Each pick is annotated with its top 3 strengths, a risk score from 1 to 10, entry zone, and two stop-loss levels — the tighter one flagged.
5
Sell signal check
Current holdings (from holdings.yaml) are checked for four exit conditions: deteriorating EPS or revenue growth, analyst sentiment breakdown, ATR-based trailing stop breach, and flat 12% trailing stop breach.
6
Email render & send
Results are rendered as a mobile-friendly HTML email with inline styles (for Gmail compatibility) and sent via Gmail SMTP to both recipients at 9am ET. An optional AI-generated market summary is prepended if the API key is present.
7
Paper trade log
Every pick is written to Supabase with its rank, composite score, and entry price. A separate backfill job at 4:30pm ET fetches closing prices from Polygon.io at T+1, T+5, T+10, and T+21 trading days and writes them back, powering the performance analytics on this dashboard.

The 6 screening gates

#GateWhat it checks
1MomentumPrice above 50-day and 200-day SMA; 1-month and 3-month performance both positive
2ProfitabilityP/E ratio positive (proxy for positive trailing EPS); EPS growth year-over-year positive
3Revenue growth5-year sales CAGR ≥ 20% QoQ decel N/A — data gap
4Cash flowFCF or OCF positive N/A — data gap
5Analyst sentimentBuy-or-better consensus — enforced at the fetch stage via Finviz URL parameter
6Options flowCall/put ratio ≥ 1.0 N/A — data gap

Gates 4 and 6 are structural placeholders. Finviz does not provide cash flow or options flow data, so they always pass as N/A. Both will activate when an appropriate data source is integrated in a future phase.

Stack

Built with

Libraries & frameworks

  • Python 3.12screener pipeline, data fetch, email rendering
  • Next.js 16 + React 19validation dashboard (signals.sageashique.com)
  • Supabase JSdatabase client for live dashboard data
  • LLM clientmarket summary prose with structured tool-use schemas — output is always machine-readable. Vendor-neutral by design.

Platforms & services

  • GitHub Actionscron scheduler — runs 9am ET weekdays, commits paper trades to data branch
  • Finviz Elite APIprimary data source — 4 screener views merged per run
  • Polygon.ioforward price backfill — EOD closes for T+1 through T+21
  • Supabase (PostgreSQL)stores run history, picks, forward prices, QQQ benchmark, quality log
  • Verceldashboard hosting with automatic deploys on push to main
  • Gmail SMTPemail delivery via app password — no third-party mail service

Get in touch

Say hello

I'm open to conversations about PM roles — ideally somewhere the product surface is genuinely complex and the team ships with intention.

If that describes where you're hiring, I'd like to connect.

Sage Ashique
Sage Ashique
Product Manager
Connect on LinkedIn