Methodology
Can a structured group of AI agents rank large-cap stocks better than the plain factors they're given, and does an adversarial debate improve the final call? Every decision is made before the outcome is known and graded after.
The question
Asking one model whether a stock is a buy invites anchoring and overconfidence. Quorum splits the job like an investment committee: specialists score independently, a portfolio manager trusts each by its track record, two advocates argue opposite sides blind, and a judge prices the result as a probability. Each layer is graded on its own, so the record shows where any edge comes from.
Daily pipeline
Fill and protect
Yesterday's orders fill at today's open. Stops are checked against today's low.
Grade
Scores whose 5- or 21-session horizon has closed are matched to the realized return over SPY.
Score
Five analysts each score all 50 names from −100 to +100 using only their own evidence.
Weigh
The portfolio manager combines them by trailing IC and queues exits for names the committee has turned against.
Debate
The top 8 names not already held, and not debated in the last 5 sessions, go to a bull, a bear and a judge. Conviction above 65 queues a buy.
Earnings
Up to 4 names that reported since the last close, largest day-one moves first, get the same debate on a five-session horizon.
Publish
The database is committed and this site is rebuilt from it.
Committee
Each analyst sees a table of every name, limited to its discipline, with each field's percentile in that day's universe. Separate evidence keeps the five opinions independent.
- Value: earnings and free-cash-flow yield, EV/EBITDA, price to book, dividend yield, plus the 12-month trend as a value-trap check.
- Momentum: 12-month return excluding the last month, 3- and 1-month returns, distance from the 50- and 200-day averages, strength against the sector.
- Quality: returns on equity and assets, margins, leverage, liquidity, revenue and earnings growth.
- Macro: rates, VIX, oil, the dollar and market trend, plus each stock's sector strength and its betas to rates, oil and the market.
- Risk: volatility, downside volatility, drawdown, beta, ATR as a share of price, and the 200-day trend.
Every analyst is shadowed by a plain factor: the same evidence ranked by simple percentiles with no model. If an analyst's IC doesn't beat its factor's, the model adds cost and no information.
Portfolio manager
The composite is a weighted average of the five scores. Weights start equal and move toward each analyst's share of positive trailing IC (last 63 graded days), reaching full trust after 40. No analyst goes below 5% or above 40%, so one lucky stretch can't hand the committee to a single voice.
Debate and judge
The bull and the bear get the same dossier: the five scores and rationales, the full evidence, the macro dashboard and the week's headlines. They run in parallel, so neither can anchor on the other. Each returns a thesis, three arguments with evidence, catalysts, and what would change its mind.
The judge reads both in random order, to guard against position bias, and returns conviction: its probability that the stock beats the S&P 500 over the next 21 sessions. Because it's a probability, it can be tested: calls at 70 should beat the market about 70% of the time.
Earnings desk
A report before 9:30 ET trades that session; later reports trade the next. After the reaction day's close, the desk debates the next 5 sessions from the EPS surprise, the gap, the day-one move over SPY, volume and headlines. It has its own 3 slots, so a full core book never crowds it out.
Portfolio rules
| Starting capital | $1,000,000 |
| Universe | 50 large caps, 11 sectors |
| Entry | Conviction > 65, long only |
| Fills | Next open, 5 bps each way |
| Risk per trade, core / earnings | 0.75% / 0.50% of equity |
| Initial / trailing stop | 2.5 ATR below entry / 3.0 ATR below the high |
| Slots, core / earnings | 8 / 3 |
| Position cap, core / earnings | 10% / 6% of equity |
| Core exits | Stop, 21 sessions, or composite in the bottom 35% |
| Earnings exits | Stop or 5 sessions |
shares = equity × risk / (2.5 × ATR), so volatile names get smaller positions and every result reads in units of risk.
Grading
- Analysts: daily rank IC against 5- and 21-session excess returns; t-statistics use non-overlapping dates only.
- Judge: conviction buckets against the realized beat rate, plus the Brier score.
- Portfolio: return, Sharpe, drawdown and beta against SPY; win rate, profit factor and average R on closed trades.
Pre-registration
With enough metrics, something always looks significant. To rule that out, the tests that count were written down on Oct 7, 2026, before the first live run, each with a pass mark and a minimum sample. They're in the repository's history, so any later change would be visible.
No look-ahead
- Runs use prices through the close and fill at the next open. Today's bar only counts after 4:15 pm New York time.
- Outcomes are written only once their horizon closes, and weights read only outcomes dated before the decision.
- Headlines are limited to the week before the decision; anything stamped later is dropped.
- There is no backfilled AI history. Past fundamentals and headlines can't be recovered as of their date, and a model may have read about the period in training, so the record is built forward, live.
Record integrity
- Hash chain: after each run, that day's signals, debates, orders, exits and equity mark are hashed (SHA-256) and chained to the previous day. Editing any past record breaks every link after it. The chain is re-verified on every build, and the result is on the audit trail.
- Timestamps: the database is committed to the repository after every run, so Git history independently dates each day's record.
- Data checks: before any new position, the run confirms price coverage, the benchmark close, enough history, and no suspect prints. A failure halts new entries for the day and is logged.
- Versioning: each run records its model, a fingerprint of every prompt, and the code commit, so a change in behavior can be traced to a change in the system.
Limitations
- Fifty names and a short record make every statistic noisy. Read t-statistics, not single days.
- Today's large caps carry survivorship bias over long horizons.
- Open-price fills and exact stop fills are idealized; real execution adds slippage.
- Model outputs vary between runs. Each run's model and cost are logged.
Stack and cost
Python, pandas and SQLite. Agents run on Claude () with JSON-schema structured outputs. Prices and fundamentals from Yahoo Finance, headlines from Google News. GitHub Actions runs the pipeline each weekday and publishes this site to GitHub Pages. A typical day is 5 analyst calls and up to 24 debate calls, plus 3 per earnings report. The run is unattended, so its requests go through the Message Batches API at half price; prompts are compact JSON; and a daily cap of $6 stops spending outright.
Glossary
- Hash chain
- Each day's records are hashed together with the previous day's hash, so changing any past day breaks every link after it.
- IC
- Information coefficient: the rank correlation between an agent's scores and the returns that followed, across all 50 names on one date. 0 is no skill; 0.05 held steadily is useful.
- t-stat
- How many standard errors the mean IC sits from zero, using non-overlapping dates. Above 2 is unlikely to be luck.
- Value added
- The analyst's IC minus the IC of the plain factor built from the same evidence. Positive means the model added information.
- Conviction
- The judge's probability, in percent, that the stock beats the S&P 500 over the horizon. 50 means no edge.
- Brier score
- Mean squared error of the judge's probabilities. Lower is better; always saying 50 scores 0.25.
- Excess return
- Return minus the S&P 500's return over the same period.
- ATR
- Average true range: the stock's typical daily price range over 14 days, used to size positions and set stops.
- R multiple
- A trade's profit or loss as a multiple of the amount it risked at entry. -1R is a full stop-out.
- Profit factor
- Gross profit on winning trades divided by gross loss on losing trades. Above 1 makes money.
- Sharpe ratio
- Annualized return divided by annualized volatility, a measure of return per unit of risk.