# Market breadth and how to read the passing count

**Market breadth** is how many stocks are taking part in a market's move.
QM Screener measures it the most direct way a screener can. After every close
it counts how many stocks passed each screen. We call each trading day a
**session**, and the count comes from the same run that fills the table.

The Breadth card above the table shows that count for the screen you're
looking at. Its History panel shows how the count has changed over time.

## Why the count matters

A momentum screen only passes a stock that's already doing what the
strategy wants. It's trending, it's holding above its moving averages and
it's beating the market. So the number of stocks that pass tells you how
much the market is working for that strategy right now. When the count is
high, the market is rewarding the strategy and you have setups to pick
from. When it's low, the market isn't rewarding it. Most traders stand
aside or trade smaller until that changes.

You make that call yourself. The card is a screen result. It is not advice.
There's no regime label on it, so it never says bull market, correction or
risk-off. It gives you a count and enough context to judge it.

## How to read the card

The card has two lines. The first shows today's count and how it compares
with the recent average. The second has the sparkline, the index buttons
and the History button.

- **Today's count.** How many stocks passed the current screen at the last
  recorded session. Hover over it to see the screen's name and the session
  date. If you pick a different screen at the top of the page, the count
  changes with it.
- **The 20-session average and the arrow.** The 20-session average is
  the mean count over the last 20 sessions on the same screen. The arrow
  points up when today's count is above that average and down when it's
  below. It shows `=` when they're equal. An up arrow means more stocks
  qualified today than on a typical recent day.
- **The sparkline.** A tiny chart of the count over the last
  60 sessions. It's scaled to its own high and low, so look
  at the shape, not the height.
- **The SPY, QQQ and IWM buttons.** These are three index funds. SPY tracks the
  S&P 500, QQQ tracks the Nasdaq-100 and IWM tracks the Russell 2000.
  A **simple moving average** (SMA) is the plain mean of the last few
  closes. Each button shows an up arrow when the fund's last close is at or
  above its 50-session SMA, and a down arrow when it's below. Press a
  button to open that fund's chart. The arrows use the up and down colours
  you picked in Appearance.
- **History.** Opens the panel described below.

Look at the count and the index arrows together. Say the count is rising
while SPY is below its average. Then the strategy's stocks are holding up
better than the index. If the count is falling while every index is above
its average, fewer and fewer stocks are carrying the index.

## The History panel

History opens on top of the page and covers the whole market row. To close
it, press the History button again, press Escape or click the dimmed page
around it. The dashboard doesn't remember that it was open, so after a
reload the panel is always shut.

- **Screen chips.** The chart shows one screen at a time. It opens on
  the screen in the app bar, the one the card counts. Click another chip
  to swap the bars, the average and the percentile over to that screen.
- **Bars.** There's one bar per session. Its height is that session's
  passing count on the screen you chose.
- **The dashed line.** This is the 20-session average of the bars. We
  work it out over the whole series before cutting it down to the range you
  chose, so the line is a true average even at the left edge.
- **Index chips.** Pick SPY, QQQ or IWM to draw that fund as a thin, muted line
  against the right-hand axis. The fund's ticker sits at the top of that
  axis, and the axis shows the lowest and highest close in view. **None**
  removes the line.
- **Range buttons.** Pick **3M** (63 sessions), **6M** (126 sessions), **1Y** (252 sessions) or **All** (every session in the history the dashboard loaded, up to 1,500 calendar days). Each one counts back from
  the newest session. If the screen you chose has no history as far back
  as the start of the range, a small "from" note gives the date its bars
  begin.
- **The percentile.** It's shown next to the controls and follows the
  screen chip you chose. It ranks today's count against the last
  252 sessions of that screen, which is about a year of trading
  days. A **percentile** of 90 means today's count is higher than 90
  percent of those sessions. If less than a year has been recorded, it
  ranks against the sessions there are and tells you how many.
- **The tooltip.** Hover over a session, or tap it, to see the date, the
  passing count, the 20-session average and the percentile as of that
  day. It also shows the share of measured stocks above their 50-day SMA,
  for sessions where that was recorded. A replayed session is labelled as
  replayed. When SPY, QQQ or IWM is on in the index chips, the tooltip adds that
  fund's close. The shares above the 20-day and 200-day SMA are in the
  data too. The API section below covers them.

## Replayed sessions

The nightly run only started recording counts when this feature shipped.
For the sessions before that, we worked the counts out afterwards from saved
prices. We call those sessions **replayed**.

History before the feature shipped was replayed against today's universe, so names that have since delisted are missing from those sessions.

Every place that shows the history tells you this. On the chart, replayed
sessions have a shaded background and their bars are drawn lighter. The
tooltip labels each one as replayed too. A session the nightly run recorded
is drawn at full strength, and a replay never overwrites it.

In practice, a replayed count can come out lower than the real count on that
day, because a stock that has delisted since can't show up in it. The shape
of the history is still useful. Just be careful when you compare the exact
number on a replayed session with one on a recorded session.

The series goes back as far as we could replay it from saved prices, and it
grows by one session after every close. The card stays hidden until at
least one screen has history.

## Getting the numbers in code

Breadth is public. You don't need a key or an account, and everyone gets the
same numbers.

- **HTTP.** Call `GET https://qmscreener.com/api/v1/breadth?days=N`. `N` is how many calendar days of
  history you want, from 1 to 1500.
  Leave it out and you get 365. `/api/breadth` is the
  same endpoint without the version number. Each response comes with a weak
  `ETag`. Send it back and you'll get a `304` until the next run.
- **MCP.** The `market_breadth` tool on `https://qmscreener.com/mcp` returns the same
  document. You can pass an optional `screen` to get just one screen back.
  That's the screen's identifier, which `list_screens` gives you. It also
  takes the same optional `days`. It's one of the public tools, so an AI
  assistant doesn't need a token to use it.

Below is a response cut down to one screen, one session and one index. The
numbers are made up. The field names are real.

```json
{
  "as_of": "2026-09-23",
  "days": 365,
  "note": "History before the feature shipped was replayed against today's universe, so names that have since delisted are missing from those sessions.",
  "screens": {
    "vcp": {
      "label": "VCP",
      "series": [
        {
          "date": "2026-09-23",
          "passing": 41,
          "near_miss": 17,
          "value_n": 9,
          "screened": 3120,
          "universe_n": 5480,
          "pct_above_sma20": 58.4,
          "pct_above_sma50": 61.2,
          "pct_above_sma200": 64.9,
          "backfilled": false,
          "recorded_at": "2026-09-23T20:31:07Z"
        }
      ]
    }
  },
  "indexes": {
    "SPY": [{"date": "2026-09-23", "close": 571.3}]
  }
}
```

`screens` lists every registered screen. Each one has its display `label`
and a `series`, oldest first. A screen with nothing recorded has an empty
`series`. The key is never missing.

`passing`, `near_miss` and `value_n` are the sizes of the three lists
(Passing, Near misses and Value). `screened` is how many stocks the screen's
rules were applied to. `universe_n` is how many tickers the run started
with. The three `pct_above_sma*` fields are the share of measured stocks
above their 20-, 50- and 200-day SMA. The 200-day one is `null` on screens
that download less than 200 sessions of history.

`backfilled` is `true` on a replayed session. `indexes` holds the SPY, QQQ and IWM
closes over the same window. `note` is the replay caveat from above. If you
show these rows anywhere, show the caveat with them.

## Where to find the card

The top of the dashboard has three rows. The **app bar** has the screen
picker (which is also the page title), the time the data was last updated,
the theme toggle and the `...` menu. Under it, the **market row** shows two
cards side by side. Breadth comes first, then the sector strength strip. On
a narrow screen they stack. Next come the list tabs (Passing, Near misses,
Value) and then the **list bar**. The list bar has **Filters**, which opens
the filter panel, **Watchlist**, the **Table** and **Chart** view switch,
and **Export**.

## Frequently asked questions

### Is a high passing count a signal to buy?

No. The count is a screen result. It is not advice. There's no regime label on the card, so nothing on it says bull, bear, risk-on or risk-off. It tells you how many stocks cleared one screen's rules at the last close. What you do with that is up to you.

### Why are some sessions in the History chart drawn lighter?

Those sessions were replayed. The nightly run hadn't started recording yet, so we worked out their counts later from saved prices. History before the feature shipped was replayed against today's universe, so names that have since delisted are missing from those sessions. The lighter bars and the shaded background mark exactly those sessions, and the tooltip labels each one as replayed.

### Why is there no Breadth card on my dashboard?

The card stays hidden until there's recorded history to show. It appears as soon as any screen has some. If the screen you're on has none yet, the card tells you so instead of showing a number.

### Can I compare the count on one screen with another?

Compare a screen with itself. Each screen has its own rules. One that tests eight trend conditions usually passes fewer stocks than one that tests two. So the useful question is how today's count compares with the same screen's recent history. That's what the average and the percentile measure.

### Do I need a subscription to read breadth?

No. The counts are public. Every account sees the card on its dashboard, free accounts included, and you can get the history over HTTP or MCP without a key. A subscription gets you the stocks behind each count.

## Read next

- [How to screen for momentum stocks](https://qmscreener.com/how-to-screen-for-momentum-stocks) covers the
  measurements every screen is built from.
- [Momentum setup tags](https://qmscreener.com/momentum-setup-tags) explains what BASE,
  TIGHT, TREND, EXT and PARA mean on a row.
- [Momentum screens over MCP](https://qmscreener.com/mcp-stock-screener) shows how to connect
  an AI assistant, including the `market_breadth` tool.
- [Docs](https://qmscreener.com/docs) has the HTTP API and the error format.
- [All guides](https://qmscreener.com/guides) lists everything we've published.

---

This page is for education. It is not financial advice. QM Screener lists
stocks that passed published filters and counts them. It doesn't recommend
trades, size positions or know anything about your situation. It covers US
stocks, uses end-of-day data and refreshes once per trading day after the
close.
