Learn

How Pulse works

Every number on Pulse comes from a fixed, documented calculation over market or SEC data. This page explains each term, the exact formula and thresholds Pulse uses, where the data comes from, and what it can’t tell you.

01Start Here

Pulse is a quantitative view of U.S.-listed stocks. It measures things. It does not predict them.

Market breadth

How many stocks are rising, falling, above their trend lines, or making new highs and lows, rolled into the Pulse Index.

Price & volume behavior

For each stock: how active it is versus its own recent normal (Heartbeat), how tightly it is trading (Compression), and where it closed in the day’s range.

Technical setups

A fixed set of rule-based labels (Compressing, Tight Coil, Possible Breakout, Strong Close) that the Screener sorts by.

SEC financial history

Annual figures companies report to the SEC, such as revenue, net income, cash flow and balance sheet, plus ratios Pulse calculates from them.

Historical observations

Every Pulse reading is stored by trading day, so you can see how a stock’s signals and the whole market have changed over time.

What Pulse is not

Pulse surfaces measurements and rule-based signals. It is not investment advice, and no signal predicts or guarantees a price move or its direction.

02Market Pulse

The Market Pulse page describes the whole market, not one stock. It is recalculated after every screener scan (about every 30 minutes during market hours) and stored once per trading day for history.

Breadth universe

Market data

The set of stocks every market-wide percentage is calculated over.

How Pulse builds it
Starts from every active, tradable U.S. equity Alpaca lists on NYSE, Nasdaq, NYSE Arca, NYSE American and Cboe BZX. It then removes names containing “ETF” as a word, anything priced under $1, and stocks without a valid prior close. That leaves roughly 5,800 stocks.
Limitations
Funds are excluded by name only. A fund without “ETF” in its name can still be counted.

Screener universe vs. breadth universe

Market data

The Screener and Market Pulse deliberately cover different sets of securities.

Screener
Scores every active, tradable security Alpaca lists as a U.S. equity on those exchanges, including ETFs, funds and sub-$1 shares (roughly 11,000). An ETF can therefore show up as a Tight Coil or Possible Breakout.
Market Pulse
Narrows that to the breadth universe above: ETF-named securities and anything under $1 are removed, because Market Pulse measures how broadly companies participate, not fund flows. The Setup Environment counts are the one exception, since they come straight from the Screener.

Pulse Index

Pulse signal

A 0–100 score for how broadly stocks are participating in the market right now. 50 is balanced.

Formula
Pulse Index = 0.25 × Breadth
            + 0.20 × % above 20-day SMA
            + 0.20 × % above 50-day SMA
            + 0.15 × New-High/Low balance
            + 0.20 × Strong-Move balance

Breadth             = (advancing % − declining % + 100) ÷ 2
New-High/Low bal.   = (new 20D high % − new 20D low % + 100) ÷ 2
Strong-Move bal.    = (% up > 2% − % down > 2% + 100) ÷ 2
Result is clamped to 0–100 and rounded to one decimal. A component with no data counts as a neutral 50.
How to read it
Higher means more stocks are rising, trending above their averages and making new highs. It describes participation, not whether the market will go up.

Market condition label

Pulse signal

A plain-language band for the Pulse Index. It is fixed thresholds, not a judgment.

Pulse IndexLabel
below 20Broad Weakness
20 to under 40Weak Participation
40 to under 60Mixed Market
60 to under 80Broad Participation
80 and aboveBroad Strength

Pulse has no “Bullish / Neutral / Bearish” market classification. Those words appear only as a single stock’s daily direction.

Advancing / Declining

Market data

Stocks in the breadth universe whose latest price is above (advancing) or below (declining) their previous close. Exactly unchanged stocks count as neither.

% Above 20D / 50D MA

Calculated

The share of stocks whose latest close is above their simple moving average of the last 20 (or 50) daily closes. A stock with fewer than 20 (or 50) days of history is left out of that percentage entirely, not guessed.

New 20-day highs / lows

Calculated

New high: today’s high is at or above the highest high of the last 20 sessions (today included). New low: today’s low is at or below the lowest low of those 20 sessions, and it isn’t also a new high.

Median return

Calculated

The middle daily % change across the breadth universe, so half of stocks did better and half worse. Unlike an average, a few extreme movers can’t pull it around.

Market Distribution

Calculated

The share of stocks in six daily-change buckets: below −5%, −5 to −2%, −2 to 0% (unchanged included), 0 to 2%, 2 to 5%, and above 5%. Up > 2% / Down > 2% are the two tails the Pulse Index uses.

Setup Environment

Pulse signal

How many stocks carried each screener status on each day. Counts cover the whole scanned universe, not just the breadth universe.

Then vs. Now

Calculated

Today’s Pulse Index, % above 20D/50D and setup counts, compared with the stored reading from about 30 days, 90 days and 1 year earlier.

What Stands Out

Calculated

Sentences filled in from the numbers above by fixed templates, with no AI involved. For example, the share of stocks up more than 2% reads “broad, expansive participation” at 25% or more, “moderate” at 10% or more, and “relatively narrow” below that.

AI Market Brief

AI-written

A short written summary produced by a language model from the Market Pulse numbers. It is the only AI-generated content on Pulse.

What it is given
The current Market Pulse snapshot, a few recent snapshots, setup counts, and up to about 30 stocks Pulse picks with fixed rules: Possible Breakouts, Tight Coils, Compressing stocks scoring 85 or more, Strong Close stocks at 1.5× volume or more, and the largest movers at 1.5× volume or more. It is generated at most once per scan.
Its labels
The headline, “Market Condition”, “Setup Environment”, “What Changed” and “Worth Watching” are written by the model, not calculated. Notable Setups tags use a fixed list (Stable / Lower Volatility, Momentum, Tight Setup, Emerging Setup, High Volatility, Extreme Volatility, Speculative, Mixed / Unclear, Mixed / Conflicting Setup). The model chooses which tag to apply. Only Extreme Volatility is enforced by code: it’s allowed only when the stock moved 20% or more that day.
Limitations
Model text can misread or overstate the numbers. Treat it as a summary of the deterministic figures on the page, never as a recommendation.

03Stock Setups & Signals

Each stock is scored from its own daily bars. Every score compares the stock to its own recent behavior, so a quiet stock and a volatile one can both read “normal”. Scores are computed on the screener’s window, the last 130 calendar days of bars, and need at least 51 trading days of history.

Screener status

Every stock gets exactly one status, checked in this order; the first match wins:

Tight Coil

Pulse signal

The stock is trading in an unusually narrow, overlapping range while activity stays low. It is Pulse’s strongest compression reading.

Condition
Heartbeat < 55 and Compression ≥ 80 (state “Tight”).
Why it matters
It flags consolidation. It does not say when, or in which direction, the range will resolve. A range can also simply stay tight.

Compressing

Pulse signal

Ranges, volatility and volume are contracting versus the stock’s 50-day baseline.

Condition
Heartbeat < 55 and Compression ≥ 60 (and below 80, which would be Tight Coil).
Limitations
Compression is common and can last weeks. It is a description of quiet trading, not a setup that must break out.

Possible Breakout

Pulse signal

A compressed stock just expanded sharply on heavy volume with a decisive close.

Condition (all must hold)
  • it was compressed for 3+ consecutive days and is not compressed today
  • state is Waking Up, Expanding or High Energy (Heartbeat picked up)
  • Relative Range ≥ 1.5× and Relative Volume ≥ 1.5×
  • Close Strength ≤ 35 or ≥ 65 (a close near either end of the day)
Important
“Breakout” here means a break out of compression, which can happen downward as well as upward. Check the day’s direction and Close Strength.
↑ / ↓ in the Screener
A display aid, not a separate signal or forecast. ↑ appears when the day was up (direction, above +0.15%) and the close was in the upper part of the range (Close Strength ≥ 65). ↓ appears when the day was down (below −0.15%) and the close was near the low (≤ 35). When the two disagree, for example an up day that closed near its low, no arrow is shown.

Strong Close

Pulse signal

The stock finished the day near its high.

Condition
Close Strength ≥ 80, for a stock that isn’t Tight Coil, Compressing or a Possible Breakout.
Limitations
It is a one-day fact. On a tiny-range day, a close near the high can mean very little.

Normal

Pulse signal

None of the four conditions above applies. This is most stocks on most days.

Scores

Heartbeat (0–100)

Pulse signal

How active the stock is today compared with its own recent normal. It is not bullish or bearish.

Formula
Heartbeat = 100 × ( 0.35 × RelRange′ + 0.30 × RelVolume′
                  + 0.20 × |Change %|′ + 0.15 × (1 − today’s overlap) )

RelRange′, RelVolume′ : 0.5× → 0,  3.0× → 1  (linear, clamped)
|Change %|′           : 0%   → 0,  6%   → 1
today’s overlap       : see Range Overlap
Bands
< 30 Low activity · 30–54 Moderate · 55–74 Elevated · ≥ 75 High.
How to read it
Higher isn’t better or worse. It just means more is happening than usual.

Compression (0–100)

Pulse signal

How much the stock’s recent trading has contracted versus its 50-day baseline.

Formula
Compression = 100 × ( 0.30 × ATR contraction
                    + 0.20 × range contraction
                    + 0.25 × Range Overlap (5D)
                    + 0.15 × volume reduction
                    + 0.10 × persistence )

contraction of a ratio r (ATR14÷ATR50, avg range 14D÷50D,
avg volume 14D÷50D):  r ≤ 0.6 → 1,  r ≥ 1.3 → 0
persistence = consecutive days (max 10) with ATR14 ÷ ATR50 < 1, ÷ 10
Bands
< 40 Low · 40–69 Moderate Compression · 70–84 Tightening · ≥ 85 Strong Compression.

Close Strength (0–100%)

Calculated

Where the stock closed within the day’s high–low range.

Formula
Close Strength = (Close − Low) ÷ (High − Low) × 100
0 = closed at the day’s low, 100 = at the high. Shown as N/A when High = Low.
Bands
≥ 80 Strong Close · 60–79 Above Midpoint · 40–59 Neutral · 20–39 Weak · < 20 Very Weak Close.

State

Pulse signal

The pill next to a company name, from Heartbeat (HB), Compression and yesterday’s Heartbeat: Tight HB < 55 & Comp ≥ 80 · Compressing HB < 55 & Comp ≥ 60 · High Energy HB ≥ 75 · Cooling HB 55–74 and down ≥ 8 from yesterday · Expanding HB 55–74 · Waking Up HB 30–54 and up ≥ 8 · Resting otherwise.

Direction (Bullish / Bearish / Neutral)

Calculated

Only the day’s price change: above +0.15% is Bullish, below −0.15% is Bearish, anything in between is Neutral. It is independent of Heartbeat and is not a forecast.

Compression Duration

Pulse signal

Consecutive trading days (today included) the stock has been in the Compressing or Tight state. 0 means it isn’t compressed today.

Pulse events (price chart)

Pulse signal

Markers on the company price chart: Possible Breakout days, the first day of a Tight Coil, a Compression run, or a High Energy run, days with Relative Volume ≥ 1.5×, and Strong Close days. The table shows the median close-to-close return 5 and 20 trading days later. These are small samples, and past outcomes don’t predict future ones.

04Technical Indicators

All windows count trading days (sessions), and each window includes today unless noted.

Relative Volume (RVOL)

Calculated

Today’s volume compared with the stock’s recent average.

Formula
Relative Volume = Today’s volume ÷ average volume of the last 14 sessions
1.0× is normal, 2.0× is double, 0.5× is half.
In the Screener
Values of 1.5× or more are shown in bold and 3.0× or more are boxed. These are thresholds Pulse already uses: 1.5× is the Possible Breakout volume condition, and 3.0× is where Heartbeat’s volume component maxes out. The emphasis marks unusual volume, not good or bad news.
Limitations
Heavy volume can come from good news, bad news, index rebalances or options expiry. During market hours today’s volume is still incomplete, so intraday RVOL starts low and rises through the day.

Relative Range

Calculated

How big today’s high–low spread is compared with the stock’s recent days.

Formula
Range %        = (High − Low) ÷ previous close × 100
Relative Range = today’s Range % ÷ average Range % of the last 14 sessions

ATR (14): Average True Range

Calculated

The typical size of a daily move in dollars, gaps included.

Formula
True Range = max( High − Low, |High − prev close|, |Low − prev close| )
ATR(14)    = Wilder smoothing of True Range:
             seed = mean of first 14 TRs,
             then ATRₜ = (ATRₜ₋₁ × 13 + TRₜ) ÷ 14
Note
Because it is smoothed from the start of the 130-day window, ATR can differ slightly from charting tools that use a longer history.

ATR vs 50-Day Baseline

Calculated

Recent volatility compared with longer-term volatility.

Formula
ATR vs 50 = ATR(14) ÷ ATR(50)
Below 1× is quieter than its baseline (shown as “Volatility Below Baseline” in Quick Check); above 1× is more active. This ratio also drives Compression.

Range Overlap (5D)

Calculated

How much each day’s range sits inside the previous day’s range, averaged over 5 days.

Formula
today’s overlap  = length of (today’s [Low, High] ∩ yesterday’s [Low, High])
                   ÷ today’s (High − Low)          → 0 to 1
Range Overlap 5D = average of today’s overlap over the last 5 sessions
It is divided by today’s range on purpose. An “inside day” (fully within yesterday’s range) scores 100%, and a day that engulfs yesterday scores low.
How to read it
Higher means tighter, more overlapping price action, a sign of compression.

SMA: Simple Moving Average

Calculated

SMA(N) = average of the last N daily closes. Market Pulse uses 20 and 50. The company page adds 200 when at least 200 bars exist. “Above 20D” means the latest close is above SMA(20).

Rolling highs / lows

Calculated

The highest intraday high and lowest intraday low over the last 20, 50 or 252 sessions. 252 sessions is the 52-week high/low. “From 52W High” = Close ÷ 52W High − 1.

Volume averages

Calculated

Plain averages of daily volume over the last 14 and 50 sessions. The 14-day average is the denominator of Relative Volume.

Returns

Calculated

Close-to-close: 20D Return = Close ÷ Close 20 sessions ago − 1, and likewise for 50D and 1Y (252 sessions). The price chart’s “Period Return” runs from the first to the last close shown.

Realized volatility

Calculated

standard deviation of daily log returns × √252 over the selected chart range, shown as an annualized %. It needs at least 10 returns.

Daily change

Market data

(Latest price − previous close) ÷ previous close. During market hours the latest price is the current, partial day’s bar.

05Understanding the Company Analysis page

Pulse Score, Signal & Risk (Pulse Model v1.0)

Pulse signal

A deterministic 0–100 summary of the measurements on this page, calculated in Python with no AI. It describes the current setup; it is not a buy, sell or hold recommendation.

Formula
Pulse Score = 0.25 × Technical Setup    + 0.20 × Momentum / Trend
            + 0.10 × Volume             + 0.20 × Financial Quality
            + 0.10 × Balance Sheet      + 0.10 × Financial Trend
            + 0.05 × Market Environment
Each component is 0–100. Technical: screener status (an up-breakout scores high, a down-breakout low), Compression, Close Strength and position in the 20-day range. Momentum: price vs 20/50-day SMA, 20- and 50-day returns, new 20-day highs or lows, and the share of up days. Volume: relative volume confirmed by price action, liquidity, and the 20-day vs 50-day volume trend. Financial Quality: margins, positive cash flow and earnings, and return on assets. Balance Sheet: equity, leverage (on a separate scale for banks and insurers) and cash. Financial Trend: up to 4 consecutive fiscal years. Market: the Pulse Index and % above 20/50-day SMA.
Signal bands
85–100 Favorable Setup · 70–84 Watch · 45–69 Neutral · 30–44 Caution · 0–29 Unfavorable Setup.
Risk (separate)
A 0–100 risk score from 60-day volatility, 1-year drawdown, ATR as a % of price, liquidity, leverage, negative cash flow and earnings instability: under 35 Low, 35–59 Moderate, 60+ High. It never changes the Pulse Score, and no stock is labeled “safe”.
Missing data
Never counted as zero. Missing inputs are dropped from their component. A component with no data at all (for example, no SEC financials) counts as a neutral 50. A financial trend built from only two fiscal years is pulled halfway toward neutral.
Freshness
The company page calculates the score when it loads. Screener scores are recalculated for every stock after each close.

Header & Pulse tiles

Price, daily change, state, direction, and the four headline readings: Heartbeat, Compression, Close Strength and Relative Volume. They are identical to the Screener’s values for the same session.

Quick Check

A factual snapshot with no combined score: price vs 20/50/200-day SMA, the Pulse readings, 20D/50D returns, and distance from the 52-week high and low. Each chip is marked as price or pulse.

Price chart

Daily closes with 20/50/200-day SMAs, volume bars, and optional Pulse event markers. On long ranges each point can combine several sessions (last close, average daily volume). The statistics above the chart always use every day.

Pulse Analysis & Historical Pulse

The supporting measurements (Relative Range, ATR, ATR vs 50, Range Overlap, Compression Duration), the Heartbeat history chart, and a table comparing today with the low, high and median of the last 30 and 90 sessions.

Market Data

Raw OHLCV for the latest session and statistics computed directly from it: averages, rolling highs/lows, SMAs and returns.

Tickers to Check

Five stocks, each the top name in a different category (movers, Pulse setups, company size). Only liquid operating companies qualify: price ≥ $5, ≥ $25M average daily dollar volume, ETF venues excluded. Categories rotate daily. This is not a recommendation list.

06Financials

Company financials are annual figures reported to the SEC in 10-K filings, in U.S. dollars. Pulse shows every stored fiscal year (up to 10) and never fills a gap. A missing value shows as —, never as zero.

Reported fields

SEC reported

Taken directly from each company’s XBRL-tagged 10-K data. Companies tag the same idea differently, so Pulse accepts a short, ordered list of tags per field. The first one reported for that year is used, and the tag is shown under the value.

FieldAccepted SEC (us-gaap) tags, in order
RevenueRevenues → RevenueFromContractWithCustomerExcludingAssessedTax → SalesRevenueNet
Net incomeNetIncomeLoss → ProfitLoss − NetIncomeLossAttributableToNoncontrollingInterest → NetIncomeLossAvailableToCommonStockholdersBasic
Operating incomeOperatingIncomeLoss
Total assetsAssets
Total liabilitiesLiabilities
Stockholders’ equityStockholdersEquity → StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest
Cash & equivalentsCashAndCashEquivalentsAtCarryingValue → CashCashEquivalentsRestrictedCash… → CashAndDueFromBanks
Operating cash flowNetCashProvidedByUsedInOperatingActivities → …ContinuingOperations
Capital expendituresPaymentsToAcquirePropertyPlantAndEquipment → PaymentsToAcquireProductiveAssets → …AndIntangibleAssets → PaymentsForCapitalImprovements

Banks and insurers usually report no single “revenue” or “operating income” line, so those fields are correctly blank for them.

Fiscal-year labels

SEC reported

“FY2025” means the annual period that ended in 2025.

Rules
Only full-year periods (350–380 days) count. A year that ends in the first week of January belongs to the prior year: a year ended Jan 1, 2023 is FY2022. If a company later restated a year, the most recent filing’s figure is used, and the filing form and date shown are that filing’s. Years with no full-year figure, such as a year split by a merger or IPO, are left out rather than stitched together.

Free Cash Flow

Calculated
Formula
Free Cash Flow = Operating Cash Flow − Capital Expenditures
CapEx is stored as the positive cash paid. FCF is shown only when both values exist for that year. It isn’t computed if CapEx has an unexpected negative sign.

Financial Analytics

Calculated

Ratios and growth rates Pulse derives from the reported values. Each row shows its inputs, its formula, and a factual reading.

MetricFormulaShown as “n/m” or “—” when
Revenue / Net Income / Operating Income / Asset / Equity YoY(This FY − prior FY) ÷ |prior FY|the exact prior year isn’t stored, or the prior value is zero or negative
Revenue 3Y CAGR(Revenue FY ÷ Revenue FY−3)1/3 − 1FY−3 missing, or either value ≤ 0
Operating / Net / Operating-cash-flow / FCF marginvalue ÷ Revenuerevenue missing or ≤ 0
Return on AssetsNet income ÷ year-end total assetsassets ≤ 0
Return on EquityNet income ÷ year-end equityequity ≤ 0 (common after large buybacks)
Liabilities / Assets, Equity / Assets, Cash / Assetsvalue ÷ total assetsassets ≤ 0
Liabilities / Equitytotal liabilities ÷ equityequity ≤ 0
FCF YoY(FCF − prior FCF) ÷ prior FCFprior FCF ≤ 0

“Essentially flat” in a reading means a change smaller than ±1%. Returns use year-end balances, not averages.

07Data Sources

Alpaca Market Data

Market data

Daily open/high/low/close/volume bars for every stock, from Alpaca’s SIP feed, the consolidated tape across all U.S. exchanges. On Pulse’s data plan, recent data is delayed by about 15 minutes. The stock universe (symbol, name, exchange, tradability) also comes from Alpaca.

About IEX

Market data

IEX is a single exchange, not the consolidated market, so its volumes and prices can differ from the full tape. Pulse does not use IEX data for any price, volume or signal. It is mentioned here because the separate State Ledger project stores IEX bars, and Pulse deliberately doesn’t read them.

SEC EDGAR · XBRL Company Facts

SEC reported

The SEC’s public database of company filings. Company profiles (name, industry code, headquarters) and annual financial facts come from its submissions and Company Facts APIs.

State Ledger integration

SEC reported

Pulse doesn’t download SEC data itself. A companion project, State Ledger, collects and cleans it; Pulse reads it read-only, matches tickers to companies through the SEC’s own ticker list, and caches results for an hour. If that source is unavailable, the rest of the page still works.

Pulse database

Pulse signal

Pulse’s own store of daily price bars, the latest screener reading per stock, intraday Market Pulse snapshots, and the daily history of every stock’s Pulse readings and of the market-wide index.

AI Market Brief model

AI-written

The AI Market Brief is written by an OpenAI language model from Pulse’s computed numbers. Nothing else on Pulse is AI-generated.

08Historical Data

Raw price history

Daily OHLCV bars: at least about 5 years for the stock universe, and up to about 20 years for stocks that have been looked up individually. This drives the price chart, moving averages and 52-week figures.

Historical Pulse observations

Each stock’s Pulse reading per trading day (Heartbeat, Compression, Close Strength, status, Relative Volume, ATR ratios and more), recomputed with the same screener method on the bars available that day, with no look-ahead. Stored from early 2022, and a new session is added each trading day after the close (about 4:30 pm ET).

Market Pulse history

One end-of-day Market Pulse reading per trading day (charts: 30D to ALL), plus intraday snapshots taken after each screener scan (about every 30 minutes during market hours).

Observations vs. prices

A price bar is what happened. A Pulse observation is Pulse’s measurement of that day. Readings are tagged with a methodology version so results from different formulas are never mixed.

Why some companies have less

Recent IPOs and spin-offs have fewer bars. A Pulse reading needs 51 trading days, the 200-day SMA needs 200, and 52-week figures need 252. SEC history depends on how many annual 10-K filings the company has.

Update frequency

Screener and Market Pulse: about every 30 minutes during market hours. Daily history: once after each close. SEC financials: when State Ledger re-imports filings (annual data changes a few times a year).

09Methodology & Limitations

  • Descriptive, not predictive. Every signal describes what already happened. None is a forecast or a recommendation.
  • Compression has no direction. A compressed or tight stock can break down as easily as up, or simply stay quiet.
  • “Possible Breakout” includes downside breaks. It flags expansion out of compression; direction and Close Strength tell you which way.
  • High volume isn’t good news. Relative volume spikes on positive, negative and purely mechanical events alike.
  • Intraday readings are partial. During market hours, today’s bar, volume and all signals are still forming, and data is about 15 minutes delayed.
  • History doesn’t repeat on schedule. Pulse event outcomes and historical ranges are small, descriptive samples.
  • SEC data varies by company. Companies tag concepts differently; some fields are missing or legitimately don’t apply (banks have no “revenue” line). Filers can also restate prior years.
  • Coverage is incomplete. Newly public companies have short histories. Foreign and fund-type listings often have no SEC financials in Pulse, and funds are excluded from breadth by name only.
  • Scores are relative to the stock itself. A Heartbeat of 80 on a sleepy utility and on a volatile biotech describe very different absolute moves.

Pulse is an analytics tool, not investment advice. Nothing on Pulse is a recommendation to buy or sell any security.