Zach Christensen
← projects
Brad
July 2026personal

Brad

A quantitative stock-scoring engine that turns decades of finance research into a single number, scores the whole U.S. 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.

PythonSQLiteVanilla JSVercelVisit ↗

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:

  1. 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.
  2. 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.
  3. 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:

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):

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:

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.