# The Number Behind the Label: macro_score and sector_score

*Published 2026-09-03 | tags: Product*

> Our regime and sector labels always hid a number. macro_score and sector_score are the 0-100 reads underneath, now visible to your AI agent.

Canonical: https://www.stocklake.dev/blog/macro-score-and-sector-score

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..AGGRESSIVE | `signal`: LAGGING..LEADING |
| New score | `macro_score`, 0-100 | `sector_score`, 0-100 |
| Arithmetic half | VIX, breadth skew, SKEW-vs-VIX, TD-exhaustion | RSI/perf percentiles, top-5 concentration, SMA200 breadth |
| AI half | `regime_strength`, 1-10 | `strength_score`, 1-10 |
| Comparable across? | One market, over time | All 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](https://www.stocklake.dev/blog/the-signal-score) and [ai_score](https://www.stocklake.dev/blog/ai-score-and-signal-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.
