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.
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.
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.
| 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 |
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.
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.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.