← Back to Blog

CloudWatch for a Portfolio

I run a private finance engine that grades stocks and gathers a wall of market signals every night: insider buying, short volume, options skew, crowd attention, analyst drift, and more. For a long time it had one weakness no amount of better data could fix. It never told me when to look. I had to remember to open it, and then do the reading myself.

So I gave it alarms, the way you would alarm a server with CloudWatch. The outcome is the part worth writing about: I stopped watching the market, and the market started watching me. This post is what actually changed: the shoulder-tap that replaced the dashboard, the dozen signals it now watches on my behalf, and how widening it across the whole market turned a tool that watches what I own into one that finds what I should buy.

The shoulder-tap that replaced the dashboard#

A dashboard asks something of you every single day. You have to remember it exists, open it, and then do the reading. An alarm is the inversion. It asks nothing until it has something to say.

My morning used to be a scan of numbers. Now it is a short list with two columns: what needs a decision right now, and what is approaching one. Most days the list is nearly empty, and that emptiness is itself the signal. Nothing crossed a line, so there is nothing to do. Quiet is a feature, not a gap.

The screen ranks everything on one scale: how close each signal is to firing, where the top of the bar means it just crossed. So a sentiment crack halfway to its trigger sits visibly below an insider cluster that fired this morning, on the same axis, even though one is a score and the other is a count of events. Triage that used to take a careful read now takes a glance.

What it watches#

The alarms cover about a dozen signal dimensions, each chosen because it rewards noticing early and punishes noticing late:

  • The engine's own grade, which alarms when a name's composite score breaks down sharply over a week or sinks under a floor.
  • Insider buying, which fires when a cluster of insider purchases lands inside a short window, the classic "people who know the company are buying" tell.
  • Activist filings, when a 13D shows up and someone is taking a fight position.
  • Short volume, when bearish pressure on a name spikes off its own recent baseline.
  • Crowd attention and social sentiment, when a name lights up in retail chatter or its sentiment flips negative.
  • Options skew, when the options market tilts hard enough to say traders are paying up for one direction.
  • Analyst drift, earnings proximity, prediction markets, and the macro regime, the slower context signals that change the backdrop a decision sits in.
  • My own risk lines, the position-level guards: a stop getting close, a thesis going stale, a position sized out of line with its conviction.

The one I am fondest of is a compound alarm I call the screaming buy. It stays silent unless two independent signals agree at once: the grade is jumping and insiders are buying in the same window. Either alone is noise. Together they are worth a look, and the alarm only spends my attention when both are true.

Each alert links straight through to the deep read on that name, so the tap leads to a decision rather than to more homework. The feature is not the notification. It is the shortened path from "something moved" to "here is what I am going to do about it."

From watching what I own to finding what I should#

At first the alarms only watched the names the engine actively ranks, a working set of a hundred or so, most of them already on my radar. That is useful for managing what I hold, but it misses the more valuable job. The best buy setups are usually in names I do not own yet, the ones I am not already watching precisely because I have no position to remind me. So I widened the watch to the whole large-cap field, roughly the S&P 500.

Widening did not happen all at once, and the reason turns out to be the most useful part of the build. The signals split into two kinds. The fast ones, the grade, options positioning, short volume, and crowd attention, make one quick call per name, so I could point them at the entire field right away, and they watch all of it every night now. The others, insider filings and social sentiment, are rate-limited at the source: a regulator's filing archive and a social feed each cap how fast anyone can pull from them. Trying to drag the whole market through that straw in a single nightly run blew past AWS Lambda's hard ceiling of 900 seconds per run, and no setting can lift that ceiling.

The tempting fix is fan-out, splitting the work across parallel functions, but that only helps when the wall is round-trip latency. Against a shared rate ceiling the parallel callers just share the one budget, so more machines buy nothing. The real answer is rotation: refresh a slice of the market each day and let the full set come around over a short cycle. So the fast signals already watch the whole field, and the slower insider and sentiment reads still center on the core board I rank while I roll that rotation out. That direction is what changed the question the system answers, from "is anything wrong with what I hold" to "where in the market is something worth a closer look," and each collector that finishes widening pushes the reach a little further.

The takeaway#

I replaced a dashboard I had to remember with a system that remembers for me. It watches about a dozen signal dimensions reaching across the market, not just the names I own, agrees with itself before it cries buy, and stays silent until there is an actual decision to make. The best tools do not hand you more to look at. They tell you where to look, and they only interrupt when it counts.

Keep reading

Written by Eric Caskey. I build AI tools you can actually use. Explore the Tools or see the case studies.