Skip to content
← All projects
agent production

An AI investment analyst that runs 24/7

Gates market signals through AI research and publishes an encrypted dashboard.

230+ instruments scanned every 30 minutes
  • Python
  • Claude API
  • GitHub Pages

Where this could work for other businesses

The obvious extension is other people’s portfolios — a small financial advisory running the same gate across a dozen clients instead of one. Worth saying plainly, then moving past it, because the more interesting reuse is the mechanism underneath, not the asset class.

The actual pattern here is: a cheap, broad filter watches for anything that might matter, and a second, independent AI check has to separately agree before a human gets interrupted. That two-stage gate is exactly what a reseller or dropshipper needs for price monitoring — a threshold crossing is cheap to detect at scale, but “is this actually a good buy” needs an AI read of the listing, the reviews, and the seller’s history before it’s worth anyone’s time.

Property investors have the same shape again: a numeric filter on price-per-square-foot or days-on-market catches everything, most of which is noise; an AI read of the listing description and recent comparables is what turns a long list of matches into the two or three actually worth a viewing.

B2B SaaS teams could point the same gate at churn risk — a usage-metric drop is the cheap technical trigger, and an AI read of recent support tickets and sentiment is the second, independent check before an account manager gets paged. Alert fatigue is the same failure mode in every one of these businesses, and the fix is the same: don’t notify on the trigger alone, notify on the trigger and an independent qualitative read agreeing it’s real.

The problem

Markets move while you’re in a meeting, or asleep, or just not looking at your phone. I’d notice a stock had dipped into what looked like a decent entry point roughly one day after it had already bounced back, because I’d checked my portfolio that morning and not again until the evening. Scanning thirty-odd holdings and a watchlist of a couple hundred more tickers by hand, every day, isn’t a hobby, it’s a second job I didn’t apply for.

The retail broker apps don’t help. They tell you about price moves you already know about — “your stock is down 4% today” — rather than the conditions that make a move worth acting on. A proper research desk would catch a golden cross or an oversold reading and cross-reference it against the news before bothering you. I don’t have a research desk. I have a day job.

The goal

Build something that watches the market so I don’t have to, and only interrupts me when a genuine opportunity shows up — not every time a number crosses a line.

What it does

It scans my actual holdings plus a couple hundred watchlist tickers every half hour during market hours, checking for the boring, well-known technical setups: oversold readings, moving-average crossovers, a stock sitting near its yearly low, a volume spike with the price moving up. On its own that’s just noise — a bad day for the whole market trips a dozen of these at once and tells you nothing.

So a signal only becomes a phone notification if a second, independent check agrees: an AI review of the actual news, analyst sentiment, and recent insider activity for that stock, which has to come back genuinely bullish and high-confidence. Two technical signals plus a strong AI read gets a notification with an actual reason attached. Anything weaker gets logged quietly and I never see it — though twice a day I get a plain summary regardless, so I’m not flying blind between alerts. Most scans producing nothing is the expected, correct outcome, not a gap to fill with more alerts — logging the quiet runs and summarising them periodically is what lets me trust the silence instead of wondering whether the thing is actually still running.

If something looks worth a proper look, I text a ticker back and a full research report shows up as a page I can open from my phone about a minute later — price history, valuation, a written bull case and bear case, and the key risks, laid out like something an actual analyst would hand you rather than a wall of numbers:

A deep-dive equity research report for a real public company: a verdict badge, current price and valuation stats, a twelve-month price chart, and side-by-side bull case, bear case, and key risks panels. One real deep-dive report, generated from a single text message. Everything shown here is public market data — no portfolio or account information appears anywhere in the system’s output.

There’s also a dashboard with the portfolio’s current state and recent signal history, encrypted before it ever leaves the machine, so it can sit on a public page without anyone but me being able to read it.

The build

Built with Claude Code, with one rule that shaped everything else: the system is not allowed to trade. That wasn’t a disclaimer bolted on after the fact — it was an architectural decision made before a line of the research pipeline existed. There are no broker credentials anywhere in the code, no trade-execution function, no automatic order path of any kind. The most the system can ever do is surface a reasoned notification and prepare a report for me to read. It researches, it gates, it notifies — a human decides what happens next, every time. The moment an “assistant” starts acting on your behalf with real money, you’ve built something you can’t fully trust, and I don’t trust anything with my portfolio that I can’t fully trust.

The AI layer is used as a filter, not a source of ideas — it isn’t asked “what should I buy,” it’s asked “here’s a specific signal that just fired, does the news actually support it.” That’s a narrower, more reliable question to hand to a model. Responses come back in a strict structured format, and a cheaper, faster model handles the constant routine checks, with a more capable one reserved for the on-demand deep dives, where the extra depth is worth paying for.

The gate itself is really two independent tests that both have to pass, not one combined score. The technical layer runs first and is cheap enough to check the whole watchlist every half hour without a second thought — it doesn’t know or care about news. The AI layer runs only on whatever survives that first pass, and is deliberately kept blind to whether the technical side was confident or borderline, so it can’t just rubber-stamp a signal that’s already been flagged. Keeping the two checks independent, rather than feeding one’s confidence into the other, is what stops a noisy technical trigger from talking a lenient AI check into agreeing with it. The on-demand deep-dive report reuses the same “give it the full picture, ask a narrower question” idea, just assembled from a wider pull of data — price history, valuation, analyst notes, insider activity — into one structured research narrative instead of a yes/no gate.

Problems & solutions

Symptom: the very first version fired on six stocks at once during a broad market sell-off. Diagnosis: a raw technical scanner can’t tell “this specific stock looks interesting” from “the entire market is having a bad day.” Fix: require an independent AI read of the news and fundamentals to agree before anything reaches the phone — a shared macro dip stops passing the gate almost immediately.

Symptom: the first AI-assisted version still recommended things that had already recovered. Diagnosis: it was only shown a headline, with no price, no earnings calendar, no analyst context — reasoning in a vacuum. Fix: hand it the full picture every time — the technical signal, the price, upcoming earnings, analyst consensus, recent insider activity — and ask a narrower question.

Symptom: the model’s structured output was inconsistent — a confidence score would occasionally come back as a decimal instead of the expected word, or wrapped in formatting it had been explicitly told not to use. Diagnosis: language model output is probabilistic even when you ask nicely. Fix: validate everything against a strict schema and normalise the common deviations in code, rather than assuming the model will always comply.

Symptom: a free-tier data API would occasionally hang indefinitely rather than timing out. Diagnosis: third-party APIs on a free tier don’t always fail cleanly. Fix: run anything external on a background thread with a hard timeout — if it doesn’t answer in time, move on without it rather than let one flaky call stall the whole scan.

The stack

ComponentWhy
PythonThe whole pipeline — market data, technical indicators, and the Anthropic SDK are all mature here
Claude APIThe judgement layer — reads news and fundamentals, returns a structured verdict, writes the deep-dive research narrative
GitHub PagesFree static hosting for the encrypted dashboard and on-demand research reports

Results

The main change is that market hours stopped requiring active attention. The system runs through the day and only surfaces the handful of situations actually worth a look, instead of me manually reviewing dozens of positions and a long watchlist every time I get a spare five minutes. Alert quality improved enormously once the dual check went in — the early version’s “everything crossed the line at once” problem essentially disappeared, because a shared market-wide dip doesn’t produce a confident, stock-specific bullish read from the AI layer. The on-demand deep-dive report changed how I do pre-trade research entirely — what used to mean five browser tabs and twenty minutes now takes about a minute and reads like something a research desk would hand you.

What’s next

The portfolio is currently updated by hand after each trade, which is fine but adds lag and the odd typo — live sync with the broker is the highest-value next step precisely because everything downstream depends on that data being accurate. The dashboard also tracks how past signals actually performed but doesn’t display it yet; surfacing that would turn the system into something that grades its own gate settings over time instead of me just trusting they’re calibrated correctly.