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.
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.
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 Index | Label |
| below 20 | Broad Weakness |
| 20 to under 40 | Weak Participation |
| 40 to under 60 | Mixed Market |
| 60 to under 80 | Broad Participation |
| 80 and above | Broad 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.
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.
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:
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.
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.
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.
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.
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.
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.
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.
(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.
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.
| Field | Accepted SEC (us-gaap) tags, in order |
| Revenue | Revenues → RevenueFromContractWithCustomerExcludingAssessedTax → SalesRevenueNet |
| Net income | NetIncomeLoss → ProfitLoss − NetIncomeLossAttributableToNoncontrollingInterest → NetIncomeLossAvailableToCommonStockholdersBasic |
| Operating income | OperatingIncomeLoss |
| Total assets | Assets |
| Total liabilities | Liabilities |
| Stockholders’ equity | StockholdersEquity → StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest |
| Cash & equivalents | CashAndCashEquivalentsAtCarryingValue → CashCashEquivalentsRestrictedCash… → CashAndDueFromBanks |
| Operating cash flow | NetCashProvidedByUsedInOperatingActivities → …ContinuingOperations |
| Capital expenditures | PaymentsToAcquirePropertyPlantAndEquipment → 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.
- 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.
| Metric | Formula | Shown 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 − 1 | FY−3 missing, or either value ≤ 0 |
| Operating / Net / Operating-cash-flow / FCF margin | value ÷ Revenue | revenue missing or ≤ 0 |
| Return on Assets | Net income ÷ year-end total assets | assets ≤ 0 |
| Return on Equity | Net income ÷ year-end equity | equity ≤ 0 (common after large buybacks) |
| Liabilities / Assets, Equity / Assets, Cash / Assets | value ÷ total assets | assets ≤ 0 |
| Liabilities / Equity | total liabilities ÷ equity | equity ≤ 0 |
| FCF YoY | (FCF − prior FCF) ÷ prior FCF | prior 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.
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.