Python · Free download

stock-alerts

A screening toolkit that finds the levels a chart reader would mark by hand — and then does it for seven hundred tickers while you sleep.

It doesn't predict anything and it doesn't tell you what to buy. It reads structure out of raw price data — the shelves price kept coming back to, the swing lows that held, the gaps nobody filled, where a rising 200-day average will be in three months — and hands you ranked candidates. You decide.

Python 3.10+ · Runs on free data · No account needed

The three tools

A package of analysis code, plus command-line tools that each do one job well.

📐

suggest_levels

Point it at a ticker and it hunts four kinds of structure: consolidation shelves found by time spent at price, confirmed pivot lows, unfilled gaps, and projections of where a rising 50- or 200-day average lands one to six months out.

Levels that several methods agree on score as confluence and rank to the top. Nothing is invented — every number traces back to something on the chart.

python suggest_levels.py HPE
python suggest_levels.py HPE ORCL CRM
python suggest_levels.py HPE --all
🪜

fill_levels

Bulk-builds four-rung entry ladders for every ticker you haven't rated yet. Rungs are spaced to that stock's own volatility, so a quiet utility and a biotech don't get the same 5% steps.

It never touches a ticker you've already rated, and everything it writes is tagged auto so your hand-set levels stay yours.

python fill_levels.py --dry AAPL MSFT
python fill_levels.py --limit 50
python fill_levels.py

rate_stocks

The interactive pass. Walk your list, set your own price points, quit whenever — progress saves after every stock, so you pick up exactly where you stopped.

Mute a rung you've decided against, snooze a ticker for a fortnight to let a move settle, or re-rate only what's gone stale.

python rate_stocks.py buy
python rate_stocks.py --refresh 30
python rate_stocks.py --mute AVGO 2
python rate_stocks.py --show AAPL

And the reports

Run the scanner and it writes plain-text reports you can actually read — no dashboard, no login, just a file.

================================================================
  SECTOR ROTATION REPORT
================================================================

  Market:  SPY = BULLISH, QQQ = BULLISH

  SECTOR RANKINGS (vs SPY — 1d / 10d / 30d / composite)
----------------------------------------------------------------

    #1   Energy                -0.3%   +9.3%  +13.7%  comp:+10.1  LEADING
    #2   Healthcare            +3.3%   +6.8%   +6.0%  comp: +7.1  LEADING
    #3   Financial Services    -0.7%   -0.5%   +1.3%  comp: +1.2  LEADING
    #4   Consumer Defensive    +0.9%   +1.6%   +1.7%  comp: +1.1
    #5   Basic Materials       +1.1%   +0.5%   -0.5%  comp: -0.0

Alongside it: per-ticker ratings runs, market-regime detection, and retrospective scoring that goes back and grades how earlier picks actually played out.

Running it

1. Install

unzip stock-alerts.zip
cd stock-alerts
pip install -r requirements.txt

2. Pick your tickers

Open config.json and put whatever you follow in the tickers list. It ships with around 700 US names grouped by sector — trim it to taste.

3. Run

python -m stock_checker              # full scan and ratings report
python suggest_levels.py NVDA        # levels for one ticker
python fill_levels.py --dry          # preview auto-built ladders
Data comes from Yahoo Finance through yfinance, which is free and needs no key. If you have an Alpaca account you can add your keys to a .env file for live quotes — everything works without it.

Requires Python 3.10 or newer. Dependencies: yfinance, pandas, lxml.

One thing to be clear about

This is a tool I built for my own use and it is not financial advice. It surfaces structure in historical price data. It has no opinion on whether you should buy anything, and neither do I. Markets can and do go down.

Questions, or want a walkthrough?

Happy to explain any part of how it works, or send the latest build directly.

Sent — I'll get back to you.
That didn't send — try the contact form instead.