← Back to Blog
Product · September 2026 · 7 min read

The Number Behind the Label: macro_score and sector_score

M
Michael · Builder & owner of Stocklake
macro_score
Cautious
sector_score
Technology · Strong
Same labels as always — RISK_OFF..AGGRESSIVE, LAGGING..LEADING — now with the real 0-100 number underneath them, visible for the first time

Ask Stocklake how the market feels and you get one of four words back: RISK_OFF, CAUTIOUS, NEUTRAL, or AGGRESSIVE. Ask about a sector and you get one of five: LEADING, STRONG, NEUTRAL, WEAK, LAGGING. Those words have always been the whole story — behind the scenes, a real number decided which bucket you landed in, and then we threw the number away and kept only the label. macro_score and sector_score are that number, kept instead of discarded. Same read, same pipeline, just no longer flattened into a word before it reaches you.

A couple of terms, before diving in
regime / signal
The bucketed labels — regime for the market overall (RISK_OFF..AGGRESSIVE), signal for one sector (LAGGING..LEADING). Still returned exactly as before.
macro_score / sector_score
The real, continuous 0-100 number each label above is bucketed from. Higher macro_score = more risk-on; higher sector_score = more leadership/relative strength.
regime_strength / strength_score
The AI's own 1-10 read of conviction behind the call — one of two ingredients blended into the score above it.
Arithmetic half
The other ingredient — real, computed market data (VIX, breadth, RSI percentiles, and more) with no AI judgment involved.

A label is a photo with the exposure data thrown away

Two different days can both come back CAUTIOUS. One of them might be a market that just barely tipped out of NEUTRAL — a whisper of concern, nothing structural. The other might be one bad VIX print away from RISK_OFF. Both say the identical word. That's not a bug in the label — four categories were never going to capture a spectrum without collapsing most of it — but it does mean the label alone can't tell you which of those two very different days you're looking at. The same problem shows up one level down: a sector reading STRONG could be comfortably mid-pack among the leaders, or right on the edge of tipping into LEADING. You couldn't previously tell which, from the label alone.

4 regime buckets, 5 sector buckets — a lot of real variation getting rounded down to one word each
The number behind each label already existed on every assessment — it just wasn't returned anywhere until now

Two ingredients, same recipe as signal_score

Both scores are built the same way: half real arithmetic, half the AI's own judgment, blended together. Nothing here is a brand-new model call either — both halves ride the exact same pipeline run that already produces regime and signal, just asked to also commit to a number, not only a word.

macro_score — the arithmetic half reads VIX level, how lopsided oversold-vs-overbought breadth is across the market, a divergence between the SKEW index and VIX, and a TD-exhaustion ratio. The AI half is regime_strength, a fresh 1-10 conviction read on the same regime call it's already making. 0 sits at RISK_OFF (capital preservation), 100 at AGGRESSIVE (risk-on).

sector_score — the arithmetic half reads that sector's RSI and 1-month-performance percentile versus the other 10 sectors, how concentrated its gains are in just the top 5 names (a topping warning when it's too concentrated), and what fraction of its stocks sit above their 200-day average. The AI half is strength_score, the same 1-10 conviction shape as regime_strength. 0 sits at LAGGING, 100 at LEADING — and every sector sits on this same absolute scale, so a Technology 68 and an Energy 68 mean the same thing.

Before
One word: RISK_OFF / CAUTIOUS / NEUTRAL / AGGRESSIVE (or LAGGING..LEADING for a sector)
The real number behind it was computed, then discarded before it ever left the pipeline
Now
The same word, plus the 0-100 number it was bucketed from
A 33 and a 48 both round to CAUTIOUS — now you can tell which one you're looking at
The label didn't change or go away — it just isn't the only thing you get back any more
  Macro read Sector read
Label (unchanged)regime: RISK_OFF..AGGRESSIVEsignal: LAGGING..LEADING
New scoremacro_score, 0-100sector_score, 0-100
Arithmetic halfVIX, breadth skew, SKEW-vs-VIX, TD-exhaustionRSI/perf percentiles, top-5 concentration, SMA200 breadth
AI halfregime_strength, 1-10strength_score, 1-10
Comparable across?One market, over timeAll 11 sectors, on one absolute scale

Where you'll actually see it

On the dashboard, the Market Outlook card now shows macro_score in a small ring at the top — the same visual language we already use for a stock's AI score — with a 90-day trend line underneath it, right next to the Risk Posture history that already bucketed the same read into four colors. Sector Intelligence got the same treatment: a Score column with a sparkline next to every sector's row, and a Sector Score Trend chart tracking all 11 lines over the same 90 days. Through the API, get_market_assessment now returns macro_score and regime_strength alongside the fields you already had, and get_sector_intelligence returns sector_score and strength_score the same way — same tools, same call shape, two more fields on the response.

This lands in the same family as signal_score and ai_score — a real, continuous 0-100 number standing behind a word an AI hands you. Different pipeline, same underlying idea: don't make you choose between a plain-English label and the real number it came from. Two scores, not one, because they answer genuinely different questions — macro_score reads the market as a whole, sector_score reads one sector against the other ten. Neither one tells you what a single stock is doing; for that, ai_score and signal_score are still the right tools.

The honest caveat

These two are genuinely new. The arithmetic and AI halves have only been blending into a real score for a few weeks, and we're deliberately not treating that history as long enough to trust yet — especially on the macro side, where the market simply hasn't visited every part of the 0-100 range in that short a window. We're letting real data accrue before leaning on this for anything beyond "here's a clearer read than the label alone gave you." Treat it exactly the way you'd treat regime and signal today: a real, informed read on current conditions — not a trade signal, and not yet backed by enough history to know how well it predicts anything.