- Python 98.8%
- Shell 1.2%
- Drop root gitignore (duplicate of .gitignore); Git now applies rules correctly - Ignore .env files; clarify cache comment in .gitignore - Add MIT LICENSE; README links repo and points to LICENSE |
||
|---|---|---|
| .gitignore | ||
| ai_commentary.py | ||
| analysis.py | ||
| app.py | ||
| build_standalone.sh | ||
| config.py | ||
| explainer.py | ||
| LICENSE | ||
| main.py | ||
| market_data.py | ||
| README.md | ||
| requirements.txt | ||
| run.sh | ||
PENNY STALKER
Repo: github.com/ibotzhub/penny-stalker
desktop momentum scanner for sub-$5 stocks. built this because shitcoiner exists and penny stocks are basically shitcoins that have to file with the SEC.
same energy. different asset class. way more legal drama.
i built this and cannot personally afford to use it. that's not a bit.
also i am not a financial wizard. i play a pure fighter build and i genuinely cannot keep up with all the spells. you probably should not take my advice on any of this. this thing exists because i wanted to research multiclassing and needed a tool to do it, so i built one. that's the whole origin story.
what it does
scans yahoo finance for penny stocks that are actually moving right now - not yesterday, not according to some listicle, right now. scores them by a combination of relative volume, float size, day change, premarket action, and 5-day trend. the result is a ranked list of what's alive and what's dead.
the float-aware scoring is the part that actually matters. a stock with 500K float doing 5x relative volume is a completely different situation than a stock with 200M float doing the same thing. most scanners don't know the difference. this one does.
install
requirements: python 3.10+, pip, a terminal
# clone or download the repo
git clone https://github.com/ibotzhub/penny-stalker
cd penny-stalker
# install dependencies
pip install -r requirements.txt
# run it
python main.py
native window opens. no browser, no localhost, no electron, no bullshit.
if you're on mac and pip complains about system python:
pip3 install -r requirements.txt
python3 main.py
if you're on windows and something explodes, make sure you have the Visual C++ build tools installed - yfinance needs them sometimes.
build a standalone executable
don't want to deal with python every time? build a single binary:
chmod +x build_standalone.sh
./build_standalone.sh
uses PyInstaller. output goes to dist/PENNY_STALKER (mac/linux) or dist/PENNY_STALKER.exe (windows). double-click and it runs anywhere, no python required.
first build takes a few minutes. subsequent builds are faster.
using it
-
hit SCAN - fetches the most active penny stocks from yahoo's screener, enriches each one with float data, calculates scores, ranks them. runs in parallel now so it's much faster than it used to be - closer to 30 seconds than 4 minutes. progress bar shows where it's at.
-
read the table - sorted by score, highest first. ROCKET at the top means everything is firing at once. DEAD at the bottom means nothing is happening. REL VOL is the column to watch. hover over the sparkline charts to see price and date on each data point.
-
right-click any row - context menu to add to your bag, follow for live prices, or jump to yahoo finance.
-
FOLLOW mode - toggle it on in the filter bar, then right-click tickers to follow them. followed tickers get live price updates every 1.5 seconds. price cells flash teal when the price ticks up, pink when it ticks down. the LIVE column shows which tickers you're following.
-
MY BAG tab - add stocks with your entry price and share count, tracks P&L live and refreshes every 10 seconds. good for watching positions during the day.
-
ALERTS tab - set a price, score, or relative volume threshold. desktop notification fires when it hits. checks every 30 seconds.
-
AI TAKE button - reads the current scan results and gives you a plain english breakdown of what's interesting. needs an API key (see below).
ai commentary setup
settings tab - paste your API key - pick your provider - save settings
supports anthropic (claude) and openai (gpt). key is stored locally at ~/.penny_stalker/settings.json and never sent anywhere except the AI provider when you hit the button.
to get a key:
- anthropic: https://console.anthropic.com
- openai: https://platform.openai.com/api-keys
the AI explains what's moving and why the signals look interesting. it will not tell you to buy anything. that's on purpose.
signals
ROCKET - score >= 0.80. everything is going at once. relative volume high, float small, big move today. something is definitely happening.
HOT / VOLUME SPIKE - score >= 0.60. strong momentum. VOLUME SPIKE specifically means relative volume >= 10x, which is the kind of thing that precedes either a serious run or a serious dump.
WATCH / PRE-MARKET - score >= 0.40. worth keeping an eye on. PRE-MARKET means there was significant action before 9:30am ET, usually means news dropped overnight.
FADING / DUMPING - score >= 0.20. momentum is leaving. DUMPING means the stock is down 10%+ on the day with elevated volume - usually means someone is actively selling into it.
DEAD - score < 0.20. nothing here. move on.
how scoring works
five signals, weighted and combined into a 0.0-1.0 score:
| signal | weight | notes |
|---|---|---|
| relative volume | 35% | today vs 30-day average, logarithmic scale |
| day change % | 25% | negative days score low but not zero |
| float score | 20% | <1M shares = 1.0, >100M = 0.1 |
| premarket % | 12% | 15%+ premarket = 1.0 |
| week change % | 8% | 50%+ on the week = 1.0 |
float scoring is the piece most scanners skip. tiny float + high volume creates explosive price action because there aren't enough shares to absorb the buying pressure. the scorer penalizes big floats aggressively.
data cache
float data and company names are cached locally in a SQLite database at ~/.penny_stalker/cache.db. they expire after 24 hours. this means the second time you scan the same tickers, the slow float lookup is skipped and results come back much faster.
if something looks wrong or outdated, settings tab - CLEAR CACHE will wipe it and force a fresh fetch on the next scan.
the files
main.py entry point
app.py full PyQt6 desktop app - all tabs, all UI
config.py scoring weights, filters, colors, AI config
analysis.py scoring engine and signal classification
market_data.py yahoo finance screener + yfinance data layer + cache
ai_commentary.py openai / anthropic integration via urllib
explainer.py glossary term definitions
requirements.txt pip dependencies
build_standalone.sh PyInstaller build script
run.sh convenience launcher
data sources
everything comes from yahoo finance via the yfinance library. no API key required for the scanner itself.
the screener hits yahoo's own internal endpoint (the same one their website uses) to get a list of active movers. then yfinance enriches each ticker with float data, history, and premarket info. the float call is the slow one - it requires a separate API hit per ticker. the app runs these in parallel (8 threads) and caches the results, which is why scans are fast after the first run.
no paid data feeds. no subscriptions. just yahoo.
disclaimer
not financial advice. penny stocks are extremely high risk. they can lose 90% of their value in a day. many of them are actively being pumped and dumped by newsletter writers, discord groups, and people with more shares than you. this tool is a momentum scanner - it shows you what's moving and why the signals look interesting. what you do with that information is entirely your decision and i take zero responsibility for it.
the SEC has very specific opinions about penny stocks and the people who promote them. this tool detects unusual volume patterns that are consistent with promotional activity. detecting a pattern is not the same as participating in one.
you were warned. multiple times. in multiple places.
license
MIT. See LICENSE. No warranty. Do not blame the author for trading decisions.