Brad reads a company's fundamentals and momentum through roughly 20 factors drawn from decades of published finance research, distills all of it into a single score, and grades itself in the open. Every pick is tracked against the S&P 500 and published for anyone to see, for free. It scores the entire U.S. equity market (368 stocks in the latest sweep, across every scoreable sector) and re-runs every couple of weeks.
The core idea is discipline. Instead of guessing which stocks look good, Brad applies the same peer-reviewed, mechanically-weighted formula to every company and then shows the receipts: a live leaderboard, a rules-based model portfolio benchmarked against SPY, per-sweep history, hit-rate and score-band analytics, an RSS feed, and PDF export.
Live at getbradscore.com.
How it works
Brad is a three-stage pipeline, and the staging is the interesting design decision:
- Fully automated scoring. Ten components pulled entirely from a financial-data API. No human input. Every scoreable stock in the market gets a score from roughly −5 to 29.
- A capped human overlay. On the top candidates only, the weakest machine-proxy factor is swapped out for three researched, hand-graded inputs: earnings-revision breadth, management and capital-allocation quality, and moat position. This layer is deliberately capped at ~20% of the total score. The research is explicit that mechanical models beat human judgment about 94% of the time, so the human input is bounded on purpose.
- Timing tie-breakers. Three tiny adjustments, each limited to ±0.25, for real-world timing, and then the static site auto-publishes.
There's also a second, parallel engine, SBS (a Small-Cap Breakout Score), with its own nine components tuned specifically for the $100M–$2B universe (migration premium, share-issuance penalties, R&D efficiency, insider clustering). It runs privately and is never published.
The research behind it
This is the part I'm proudest of, and the part I want to be straight about. Every scoring curve in Brad is anchored to actual academic literature, not vibes. The factor design cites 50+ papers, including the foundational work: Piotroski's F-Score, Altman's Z-Score, Novy-Marx on gross profitability, Cooper/Gulen/Schill on asset growth, Sloan on accruals, Jegadeesh & Titman on momentum, Bernard & Thomas on post-earnings-announcement drift, and Fama-French throughout.
Crucially, the shape of each curve is justified by what the research actually found:
- ROIC uses a sigmoid centered at 12%, because Morgan Stanley's data showed returns are flat across four of five ROIC quintiles. The only signal that matters is crossing from value-destruction to value-creation. Rewarding "more ROIC" linearly would be wrong.
- Altman Z-Score is a penalty-only screen, not a ranking factor, because Campbell/Hilscher/Szilagyi showed bankruptcy risk isn't compensated. You can't earn returns by buying distress.
- Growth expectations use a concave curve with a hard ceiling, because La Porta showed the highest-expectation stocks actually underperform. The naive signal inverts.
- Insider activity rewards distinct opportunistic open-market buyers on a log curve, and applies zero penalty for selling, because the literature says insider selling is noise.
The honest version of the AI story: I used AI extensively as a research and statistics partner. It helped me find, read, and synthesize the papers; translate their findings into specific curve parameters; design the backtesting methodology; and run the analysis. The judgment calls, the architecture, the "does this actually make sense" filtering, and every decision about what to keep or throw away were mine, and I threw a lot out. Several factors that seemed obviously good (a cash-based operating-profitability metric, sector caps, a BUY-only filter, a mean-reversion entry signal) were tested and rejected because they had no edge on this universe or duplicated signal already present. I keep a documented graveyard of rejected experiments so I don't re-test the same dead ends.
The results, honestly framed
The published model portfolio, tracked live across 8 rebalance periods (about 4.1 months so far):
- +12.69% vs. SPY's +8.64%, roughly +4.05% of alpha
- 62.5% win rate against the benchmark
- Max drawdown of just −5.2%, with a Sharpe-like ratio around 2.5
- Roughly 14% annualized alpha if the pace holds
And the caveat, which I keep on the site rather than hiding: this is a small sample. The information coefficient's t-statistic is 1.73, below the bar for statistical significance, and I flag that directly. My own backtesting study taught me that Brad's score is a coarse filter, not a fine ranker: the top decile reliably beats the market, but within the top ~15 names the score can't reliably tell #1 from #8. So the portfolio equal-weights a basket of the top 10–15 rather than concentrating, because concentrating actually lost to the market in testing. Discovering that my own instinct (bet big on the top pick) was wrong, and acting on it, is the thing I most want a reader to take away.
What it took to ship
Getting this from a Python script to a live, self-updating product touched a lot of surfaces:
- Engine: about 20,000 lines of Python, SQLite for the historical scan store, and a dependency-light frontend (vanilla JavaScript ES modules, no framework) that reads static JSON snapshots the pipeline publishes. A Rich/Textual TUI drives sweeps locally.
- Hosting & deploy: Vercel configured from scratch, with clean URLs, custom cache-control headers (including deliberately disabling caching on the bootstrap document so version stamps can't go stale), and RSS content-type rewrites.
- Serverless backend: Vercel functions for email capture and contact,
written with zero npm dependencies (native
fetch) so the Resend API key never touches the browser. - Email: a full subscribe flow on Resend, with audience management, a themed transactional template, and server-side validation.
- DNS & domain: stood up getbradscore.com end to end, including email-sending domain verification and the Open Graph / Twitter-card metadata so it renders properly when shared.
- Testing: 200+ automated tests over the scoring math and pipeline, plus a separate offline backtesting harness (forward-return attribution, ablation studies, information-coefficient analysis) that reproduces the live track record to within a fraction of a percent. That's how I validate a change before it touches a real sweep.
- Positioning: clear, prominent disclaimers. This is an educational, informational project, explicitly not investment advice.
The short version
Brad turns hundreds of pages of finance research into one number, applies it to the whole market on autopilot, and then does the thing most stock-picking projects never do: it keeps score in public and admits what it doesn't yet know.

