I built a stock scanner
that improves itself.

A builder's log — March 2026

The Problem

Stock catalysts — FDA approvals, insider buying clusters, activist filings, earnings surprises — move prices before most retail investors notice them. By the time you read about it on Reddit or see the Seeking Alpha headline, the move is half over.

I wanted a system that would surface these catalysts 30–90 days early. Not a screener with static filters, but something that could discover opportunities I wasn't even looking for. The tools that exist are either too basic (finviz screens) or too expensive (Bloomberg terminal). None of them learn from their own mistakes.

The Architecture

Bull Scouter runs two loops. The daily signal loop runs 3x per day: an assessor discovers opportunities blindly via web research, a 9-step scanner scores them against market data, and an analyst synthesizes everything into verdicts. The nightly maintenance loop is where it gets interesting: the analyst flags what the scanner got wrong, a developer agent writes code fixes, and a reviewer agent posts inline comments on the PR. I wake up to a pull request with the fix already reviewed.

There are 10 AI agents total — 5 top-level agents and 5 discovery sub-agents. They run on launchd cron jobs on a Mac Mini. No cloud infrastructure. No Kubernetes. Just Python, SQLite, and Claude Opus talking to each other through the filesystem.

The Agents

Each agent is a Claude Opus instance with a specialized system prompt, running via claude -p on the CLI. They're named after characters that fit their roles:

Rick the Assessor

Chaotic multi-dimensional explorer. Sends 5 expert sub-agents — Homer, Marge, Bart, Lisa, and Antonis — on blind discovery missions with zero scanner data. Whatever they find independently that the scanner also found? That's the highest-conviction signal.

Oracle the Analyst

Sees all possible futures. Reviews all scanner paths — daily signals, contrarian plays, watchlist dips, catalyst heatmap — and issues verdicts. Produces adjustment files that feed back into the next scan cycle.

Tony the Developer

Builds and fixes everything. Reads Oracle's assessment, identifies bugs and config issues, implements fixes on a branch, runs the full test suite, and creates a PR. Max 5 changes per run.

Linus the Reviewer

Legendary code reviewer with uncompromising standards. Four parallel review sub-agents check Tony's PR for bugs and compliance violations. Posts inline comments with committable suggestions. Auto-approves or requests changes.

There's also Darwin the Optimizer — evolves configuration parameters through natural selection. And Rick's 5 discovery experts each specialize in a domain: general catalysts, geopolitics, AI/tech, insider/flow signals, and contrarian value.

Blind Discovery

This is the part I'm most proud of. Rick's 5 experts search the web for stock opportunities with zero knowledge of what the scanner found. They don't see scores, recommendations, or even the ticker list. They start from scratch every time — scanning news, SEC filings, options flow, macro trends.

After discovery, the results merge with the scanner's picks. Tickers found by both systems independently get tagged as “overlap” — the highest conviction signal in the system. Tickers found only by the experts become “scanner blind spots” that feed back into the scanner's improvement cycle.

The Data Pipeline

The scanner pulls from 8+ sources every run: Reddit mentions (ApeWisdom), FDA calendars, space launch manifests, earnings dates, SEC filings, Seeking Alpha & Benzinga RSS, and Perplexity AI for structured event discovery. Each source contributes tickers and catalyst events that feed into the scoring engine.

On top of that, three monitors run during and around market hours. The price monitor polls every 15 minutes for dip entries and cross-path opportunities. The options flow monitor captures put/call ratios, IV skew, and unusual volume twice daily — institutional positioning that's invisible to price and news scanners. Insider buying is tracked via SEC Form 4 filings, with Telegram alerts for purchases above $500K. A market regime gauge combines 7 indicators (VIX, SPY momentum, breadth, options flow, insider activity, news sentiment, yield curve) into a single -100/+100 composite that tells the system whether we're in risk-on or risk-off — the analyst adjusts its aggressiveness accordingly.

The Scoring Engine

Not all opportunities are the same, so the scanner runs multiple scoring frameworks in parallel and picks the best fit. Tier 1 targets binary catalysts in small caps — FDA decisions, contract announcements, the setups that move 50%+ overnight. Tier 2 catches fallen angels and reacceleration plays. Track B scores large-cap momentum breakouts. Fundamental quality frameworks evaluate value (8 components) and growth (7 components) separately. And the Buffett quality screen scores ~900 S&P stocks across 7 components — ROE quality, debt safety, margin strength, FCF generation, earnings consistency, moat proxy, and shareholder return — surfacing the kind of durable, high-quality businesses Warren Buffett would buy.

A stock needs more than a high score to earn a BUY. Three independent gates must pass: the composite score (≥75), a confidence score that measures signal reliability (≥50), and a hysteresis check requiring 2 consecutive qualifying scans. This prevents one-day spikes from triggering false signals. The system also decays stale evidence over time — yesterday's catalyst is worth less than today's.

Notifications

The system pushes alerts through two channels. Telegram for real-time, actionable signals during market hours. Email for the daily summary after the final scan.

Telegram alerts fire throughout the day: price dips on watchlist stocks (every 15 min), insider buys above $500K (every 30 min), unusual options flow (twice daily), and Rick's high-conviction blind discoveries. Each alert includes the current price, score, and key context so you can act without opening the dashboard.

The daily email goes out after the evening scan — a single unified report combining all paths. Top picks with full breakdowns, contrarian candidates, watchlist dip alerts, and a catalyst heatmap. It's the one place where everything the system found that day comes together.

The Schedule

Everything runs on launchd cron jobs, weekdays only. The daily signal loop runs 3 iterations timed around the US market:

All times GMT+2 (ET+7)
07:45 Rick (discovery) 08:30 Scan 09:00 Oracle (analysis)
12:00 Rick 15:30 Scan 15:55 Options Flow 16:00 Oracle
19:00 Rick 23:05 Scan 23:30 Options Flow 23:45 Oracle
16:30–23:00 Price monitor (every 15 min) + Insider monitor (every 30 min)
Nightly maintenance (Tue–Sat):
00:15 Tony (developer) 00:30 Linus (reviewer) 00:45 Backfill + Calibration

The schedule is designed so each agent's output feeds the next. Rick discovers before the scan runs. The scan finishes before Oracle reviews. Oracle's assessment is ready before Tony starts coding fixes.

The Self-Improvement Loop

Every night after the final scan, Oracle reviews the day's results and writes an assessment. Tony reads this assessment, identifies what to fix — maybe a scoring threshold is too aggressive, maybe a data source is returning stale data — and implements the change on a branch. Linus reviews the PR within 15 minutes. If it passes, I merge it in the morning. If not, Linus posts inline comments explaining why.

The scanner has made hundreds of self-improvements this way. Config tuning, bug fixes, data pipeline repairs — all without me writing a line of code. I review the PRs, but the system proposes and validates its own fixes.

The Stack

Deliberately simple. Python 3.11, SQLite (one file, no migrations — tables auto-create), yfinance for market data, Claude Opus via the claude CLI (subscription, not API — no per-call billing). Scheduled with macOS launchd plists. The website is static HTML + Tailwind + vanilla JS reading from JSON files, hosted on GitHub Pages.

The whole thing runs on a Mac Mini sitting on my desk. Total infrastructure cost: $0 beyond the Claude subscription. The scanner, all 10 agents, the database, the exports — all local.

What's Next

Right now: collecting data and letting the calibration system prove itself. The nightly backfill tracks forward returns (5d, 20d, 60d, 120d) for every signal the scanner has ever produced. As that dataset grows, the system can measure which scoring components actually predict returns and which are noise — then tune weights accordingly. The agents already propose config changes based on Oracle's assessments; calibration data will make those proposals evidence-based instead of heuristic.

The architecture scales to N agents. The constraint isn't compute — it's designing the right prompts and feedback loops so the agents actually make each other better instead of just adding noise.

How to Read the Data click to expand

Signal Types

85
BUY — Score ≥ 75, confidence ≥ 50, and confirmed across 2 consecutive market days. The highest-conviction signal. These stocks passed all quality gates.
68
WATCHLIST — Score 60–74 or missing one BUY requirement (low confidence, first day seen, etc.). Worth monitoring—many BUY signals start here.
45
MOMENTUM — Score < 60. Early-stage signals still building evidence. Shown in the compact table at the bottom.

Profiles (Investment Thesis)

Each stock is scored against multiple frameworks. The best-fitting profile wins:

Recovery

Tier 1 — Small/mid-cap stocks with upcoming binary catalysts (FDA approvals, launches, key data readouts). High risk/reward.

Tier 2 — Fallen angels: quality companies beaten down >30% that are re-accelerating revenue. Contrarian plays.

Acceleration

Tier 3 — Large-cap momentum breakouts. Strong price trend, expanding volume, positive revenue momentum. Riding the wave.

Growth

Tier 4 — Revenue-quality companies with catalysts. Fills the gap between Tier 1 (pure catalyst) and Tier 2 (pure recovery). Must have real revenue growth + margins.

Value / Growth Q

Tier 5/6 — Fundamental quality from the financial screener. Value: profitable + strong FCF + beaten down. Growth Quality: 30%+ revenue growth + 60%+ gross margins + Rule of 40.

Buffett

Tier 7 — Buffett-style quality screen. 7 components (ROE, debt, margins, FCF, earnings consistency, moat, shareholder return) across ~900 S&P stocks. Shows up as Warren's Picks.

Score Breakdown Chips

Each colored chip shows a scoring component and its point contribution:

Catalyst +25 Social +12 News +8 AI +5 Risk -8 Decay -3

Green chips (+) add points: Catalyst, Social buzz, Growth/Margin quality, News boost, AI enhancement, Momentum bonus, Breakout pattern match.

Red chips (-) subtract points: Fundamental Risk (overvaluation, weak margins), Thesis Decay (stale evidence), Controversy penalty, Pre-revenue discount.

Fundamental Safety Gates

After all scoring, these hard caps prevent obviously flawed stocks from getting high scores:

Overvalued Cap -26 — PE > 40x with margins < 10%. Score capped at 70. The company isn't earning enough to justify its valuation.
Bankruptcy Risk -46 — AI thesis mentions bankruptcy/insolvency, OR stock is >80% down from highs with margins <10% or negative FCF. Capped at 60.
Low Upside -10 — Analyst consensus target implies <15% upside (-10pts) or <25% upside (-5pts). Limited room to run.
Insider Selling -5 — Officers/directors are net sellers (Value and Growth Quality profiles only). They know something you don't.

Confidence Score (0–100)

Measures signal reliability—how trustworthy the evidence is, independent of the score itself. A stock can score 90 but have low confidence (single stale source). Confidence ≥ 50 is required for BUY.

Source Quality (0–35): How many independent sources discovered this stock (Reddit + FDA + Perplexity + earnings + congress).

Cross-Source Agreement (0–25): Do multiple sources point to the same catalyst/thesis?

Freshness (0–25): How recent is the evidence? Decays as data ages.

Data Completeness (0–15): Does yfinance have full fundamentals, insider data, analyst targets?

70+ Strong 50–69 Moderate <50 Weak

Quality Checklist

Stocks scored by the fundamental quality framework show a 6-point checklist:

Value (5/6): ✅ Profitable ✅ FCF ✅ 52w Low ⚠️ Panic ✅ PE ✅ No Dilution

Value checklist: Profitable, Strong FCF, Near 52w Lows, Sector Panic (fundamentals intact while price crashed), Low PE, No Dilution.

Growth Quality checklist: Revenue Growth (30%+), Gross Margins (60%+), NRR proxy, TAM proxy, Rule of 40, Low SBC.

✅ = pass, ⚠️ = partial, ❌ = fail. A 5/6 typically maps to ~80+ points.

Badges

Congress BUY (3 buyers) Insider STRONG (5B/0S) Analyst ↑3 Squeeze Convergence: Social + Financial

Congress: Members of congress recently bought this stock. "Bipartisan" = both parties buying.

Insider: Corporate insider activity. STRONG = heavy buying, NEGATIVE = net selling. Format: Buys/Sells in last 90 days.

Analyst: Recent upgrades (↑) vs downgrades (↓) from Wall Street analysts.

Squeeze: High short interest + catalyst = potential short squeeze setup.

Convergence: Stock discovered by BOTH social/catalyst sources AND the financial screener independently. Highest conviction—fundamentals + timing aligned.

Catalyst Events & Countdown

FDA 2026-04-15 Earnings 2026-03-01 Lockup 2026-05-20

Event pills show upcoming catalysts with dates. Green border = bullish catalyst, red border = bearish (lockup expirations, etc.).

The countdown badge shows days until the nearest catalyst: 7d (imminent), 25d (approaching), 45d (distant).

Trend & History

↑ improving — Score has been increasing over recent scans. Building momentum.

↓ declining — Score dropping. Thesis may be weakening.

→ stable — Consistent score. Steady signal.

✨ new — First time this stock appeared. Fresh discovery.

The sparkline in the bottom-right of each card shows score history over the last 14 scans.

The aggregate row shows: average score, peak score, % of scans as BUY, and price change since first detection.

Fundamentals Row

P/E: 18 | Rev: +25% | Margin: 15% | Target: $180 (+32%)

P/E: Price-to-earnings ratio. <25 (green), 25–50 (amber), >50 (red).

Rev: Year-over-year revenue growth.

Margin: Net profit margin.

Target: Analyst consensus price target and % upside from current price.

AI Thesis

Click the expandable ▸ AI Thesis section on any card to read a Claude-generated investment thesis. This summarizes the bull case, key catalysts, and risk factors in 2–3 sentences. Generated only for BUY-quality signals.

Satellite Fit Value (SFV)

Satellite: 73/100 (1.23x)

SFV re-ranks stocks for small tactical positions (satellite bets). The SFV multiplier (0.5–1.5x) is converted to a 0–100 satellite score: 0.5x→0, 1.0x→50, 1.5x→100. A small-cap ($5B) with SFV 1.2x gets satellite 70, while a mega-cap ($300B) with SFV 0.55x gets satellite 5—making satellite quality easy to compare at a glance.

Market Cap (5 buckets): Micro (<$2B, 1.15x), Small ($2–10B, 1.10x), Mid ($10–50B, 0.90x), Large ($50–200B, 0.70x), Mega (>$200B, 0.50x).

52w Range Width: Wide range (>50%) means the stock has demonstrated large moves (1.15x). Narrow range = sleepy stock (0.85x).

Acceleration: Earnings growing faster than revenue signals operating leverage (1.10x). Decelerating revenue = headwind (0.85x).

Core Overlap: If you already own this in your core portfolio (top S&P 500 names), it's penalized (0.70x). You don't need a satellite bet on AAPL.

Short Interest Fuel: 5–15% SI is the sweet spot (1.05x)—enough to fuel a squeeze but not so much it signals fundamental problems.

≥50 Good satellite 25–49 Neutral <25 Poor satellite fit

Hysteresis (Streak Requirement)

A stock must qualify as BUY for 2 consecutive market days before it's promoted. This prevents one-day spikes from triggering premature signals. If you see "Streak 1/2: needs 1 more qualifying scan", the stock scored high enough today but needs to confirm tomorrow.