Portfolio Project

A stock screener that runs before you wake up

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

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+7, T+30, and T+90 calendar days 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 8 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 a pullback level, a stop-loss priced off today, 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.

📊
8-Gate Screener

Momentum, profitability, revenue growth, cash flow, sentiment, options flow, ownership, and financial health. Every stock must pass all eight.

🏆
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

Positions in the Alpaca paper account are checked every morning against four exit conditions: deteriorating fundamentals, sentiment breakdown, sentiment softening, and a flat 10% stop-loss.

📈
Forward Price Tracking

Every pick is tracked at T+1, T+7, T+30, and T+90 calendar 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.

📊
8-Gate Screener

Momentum, profitability, revenue growth, cash flow, sentiment, options flow, ownership, and financial health. Every stock must pass all eight.

🏆
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

Positions in the Alpaca paper account are checked every morning against four exit conditions: deteriorating fundamentals, sentiment breakdown, sentiment softening, and a flat 10% stop-loss.

📈
Forward Price Tracking

Every pick is tracked at T+1, T+7, T+30, and T+90 calendar 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 6 screener views (overview, valuation, ownership, performance, financial, 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
8-gate screening
Each stock is run through 8 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 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, a pullback level, and a stop-loss. Two stop levels are computed — one from the 52-week high, one from recent volatility — and any level sitting at or above the current price is discarded before the tighter of the survivors is shown, since a stop above the price would trigger the moment you bought.
5
Sell signal check
Current positions (read from the Alpaca paper account each morning) are checked for three exit conditions: deteriorating EPS or revenue growth, analyst sentiment breakdown or softening, and a flat 10% stop-loss breach off entry price.
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+7, T+30, and T+90 calendar days and writes them back, powering the performance analytics on this dashboard.

The 8 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
7OwnershipShort float below 20% — excludes only extreme short-interest tail risk
8Financial healthCurrent ratio ≥ 1.0, gross margin ≥ 0%, and debt/equity ≤ 2.0 — excludes only broken balance sheets, not "low quality"

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.

Read the full product spec →

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
  • Anthropic Claude APIoptional prose summary for the email — skipped, not failed, if no API key is configured

Platforms & services

  • GitHub Actionscron scheduler — runs 9am ET weekdays, commits paper trades to data branch
  • Finviz Elite APIprimary data source — 6 screener views merged per run
  • Polygon.ioforward price backfill — EOD closes for T+1 through T+90
  • 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