Built a premarket momentum scanner in 72 hours with no coding background — here’s how the scoring works and what I’ve learned from trade 1
u/1_sugarfree ·
Reddit — r/algotrading
· June 01, 2026 at 19:33
· ⬆ 16 pts
· 💬 11 comments
| View on Reddit ↗
AI Summary
Summary
The author built a premarket momentum scanner in 72 hours without coding experience, scoring 340+ US stocks on gap percentage, relative volume, breakout, volatility, and trend.
They share one live trade (SPCE) that hit a 10% target but failed to fill due to OTC limit order issues; the trade yielded only a small profit.
The thesis is that large premarket gaps (5%+) combined with high RVOL (3+) tend to hold momentum through the open, especially in small caps with high volatility.
Quality assessment: This is a personal build log with one anecdotal trade – more speculation than well-researched DD; lacks statistical validation.
Score16
Comments11
Upvote %77%
▶ Full Post Text
Background: I work in performance marketing, not development. I’d never written Python before this. A colleague challenged me on a Friday afternoon and 72 hours later I had something running in production. Posting this because the community seems to appreciate honest build posts and I’m genuinely interested in feedback on the scoring approach.
What it does
Every weekday at 12:00 BST the system fetches data on 340+ US stocks (at the moment) and scores each one across five signals, then publishes the results to a Streamlit dashboard and emails me if anything looks worth trading. The pipeline is: yfinance data fetch → scoring → GitHub Actions → CSV committed to repo → Streamlit Cloud reads it.
Three runs daily: 12:00 BST (morning scan), 13:00 BST (mid-morning check), 14:00 BST (final check before the 14:30 open). Each run only alerts if candidates are still above threshold, so silence means the momentum has faded.
The scoring formula
score = (3 × gap\_pct) + (2 × rvol) + (2 × breakout\_score) + (1 × volatility\_score) + (0.5 × trend\_5d)
Where:
• gap\_pct = (premarket price - yesterday close) / yesterday close
• rvol = yesterday volume / 10-day average volume
• breakout\_score = (yesterday close - 10d low) / (10d high - 10d low)
• volatility\_score = ATR(10) / yesterday close
• trend\_5d = count of up days in last 5
Alert threshold: score > 12 AND gap\_pct > 0
What I’ve learned so far
The premarket gap is by far the strongest signal, but to be fair I already new this from normal trading, a stock gapping 5%+ with RVOL above 3 tends to hold momentum through the open. Small caps with high volatility scores respond much better than large caps for this strategy, which makes sense given that a large cap is unlikely to move 10% in 15 minutes regardless of its score.
One bug I found and fixed: the initial version used fast\_info to fetch premarket price, but fast\_info in the current yfinance version has no premarket price attributes at all. It was silently returning None and falling back to yesterday’s close, making gap\_pct = 0 for everything. Switched to .info dict which contains preMarketPrice correctly.
Trade 1
SPCE (Virgin Galactic), 01/06/2026. Scanner flagged it at 12:00 BST with a score of 12.75. Bought premarket at $7.52 at 13:10. Hit the 10% target at 13:45. Limit order didn’t fill because premarket OTC doesn’t guarantee execution even when price is touched. Sold at hard exit time (14:45) at $7.61. Result: +£0.60 on £50 capital instead of the target £5.
Lesson: sell manually when target is hit. Don’t rely on limit orders in OTC premarket conditions.
Links
GitHub (open source, MIT): https://github.com/GarySto/market-universe-generator
Live dashboard: https://market-universe-generator-7jrhjfbttwfzlappdxaaysq.streamlit.app
Happy to go deeper on any part of the methodology. Specifically interested in whether the scoring weights look reasonable to people with more experience in this space.