Why I built it

Most market tools are either a terminal you dig through or a rating that never tells you whether it worked. I wanted an agent that does the research every week and keeps score on itself.

It pulls data on about 90 indices and works out how expensive each one is and how fast the companies inside it are growing. Then it ranks every market against its peers: countries against countries, sectors against sectors. The dashboard puts the few calls worth a minute of your time at the top. Every call is saved with its date, so later runs can grade it against what the market did.

The model never touches the numbers

Fetching prices, scoring, ranking and grading are all plain Python. That code costs nothing to run and gives the same answer every time, so anyone can check it. Language models only get the jobs where judgement helps, like finding new data sources or reviewing data quality.

Switch the models off and the agent still runs end to end. That’s most of why it costs almost nothing.

Other calls I’d find hard to undo

I’ve written 41 decision records so far, one for every call that would be painful to undo. If you read only a few, read these.

  • Growth means the companies are growing. The growth score uses revenue and earnings growth for each index’s largest companies, plus forward estimates. A market whose price has gone up hasn’t necessarily grown.
  • No single model provider. Each task has a ranked list of models from different providers. If one is rate-limited or fails, the next takes over, and the last fallback is plain text written by code. Every call is logged, so the router can learn which model to trust with which task.
  • Data is stored as it was known on each date, restatements included. The agent’s memory works the same way, so a backtest only sees what was knowable at the time.
  • I only republish public-domain data. Company figures come from SEC EDGAR filings, and every new source gets a licence check before I use it.
  • My approvals are enforced in code. When I approve a change the agent proposes, my conditions are saved as structured fields and checked by code. The first version passed my note to a model as plain text, and the model ignored it.

Does it work? Partly.

The first walk-forward backtests ran in July 2026. They tested stock-level picks from October 2024 to July 2025, rebalanced weekly. On the combined opportunity score, the top quarter of picks beat the bottom quarter in every six-month window.

The weekly windows overlap, which makes the statistics look stronger than they are. The agent’s output says so every time.

The growth score did worse. Its correlation looked statistically significant, yet its top picks lost to its bottom picks in every 6- and 12-month window. Something in how I built it is wrong, so it’s on the list to rebuild. I don’t count it as a result.

The month the dashboard went stale

For three weeks in August, the weekly refresh failed while the daily pipeline stayed green. Everything looked fine, and the dashboard went stale.

The cause was one missing price. In Python, a missing number (NaN) counts as true, and that one value broke a whole batch of grades.

Since then, grading old calls can never block publishing. The dashboard is what people use, and grading only reports on it. A call that can’t be graded is now stored as unknown instead of as a miss, so the track record doesn’t fill up with failures that never happened.

What I take from it

Keep the model away from the numbers. That one choice is why the agent costs almost nothing to run, and why I can check every figure it publishes.

For research and education only. It isn't investment advice, and its rankings are experimental.