← 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

Both scores are part of Pro. 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.