Strasmore Research
Learn Matt ConnorBy Matt Connor · Updated 2026-07-26

Stock Float vs. Shares Outstanding Explained

A stock's float is the shares free to trade, shares outstanding minus locked-up insider stock. See what counts as a low float and how thin floats trade.

A stock's float is the number of shares actually available to trade publicly: the shares outstanding minus insider stakes, restricted stock, and other closely held blocks that cannot change hands freely. Shares outstanding is the total a company has issued; the float is the tradable subset, always the same size or smaller. Most definitions stop there; this page keeps going, into where each count comes from, how thin a "low float" is, and how thin-float names trade.

One detail up front: float is an estimate, not a reported figure. Companies report shares outstanding in SEC filings every quarter; no filing line item reports "the float." Vendors and index providers each compute one by deciding which holdings count as locked away, and their answers differ. Our warehouse carries share counts straight from filings and listing records, and no float column at all.

Shares outstanding vs. float: what is the difference?

Three counts sit in a ladder, each a subset of the one above.

  1. Authorized shares, the maximum the charter permits, a ceiling raised only by shareholder vote.
  2. Shares outstanding, every share issued and held by investors, insiders included. This is the count reported in SEC filings, and the one behind market capitalization and earnings per share.
  3. Float, the outstanding shares free to trade publicly, the rest in hands that cannot, or realistically will not, sell on a given day.

The difference in one line: outstanding is what exists; float is what trades. Outstanding is audited, filed, identical at every data source; float is computed, unreported, different at every vendor. Market cap uses outstanding; index weights and low-float screens use float.

The non-float sits in familiar places: founder and executive stakes, early investors inside a post-IPO lock-up (customarily 180 days), parent-company blocks, unvested employee shares. Shares a company buys back leave the outstanding count entirely. A forward split scales outstanding and float together; a reverse stock split shrinks both by the same multiple. What moves float relative to outstanding is different traffic: lock-up expirations and insider sales add tradable shares, follow-on offerings mint new ones, buybacks pull shares out.

Where do share counts come from? SEC filings

Shares outstanding is a reported fact with a paper trail. Every 10-K and 10-Q carries share counts, a dated cover-page snapshot, plus the basic and diluted counts inside the income statement that per-share earnings use. "Diluted" adds the shares that would exist if options, warrants, and convertibles turned into stock. Three megacaps, from their latest quarterly filings:

QueryShare counts from the latest quarterly income statements on record: three megacaps
The exact SQL behind every number
SELECT tk AS ticker,
       concat(formatDateTime(argMax(period_end, (filing_date, period_end)), '%b'), ' ', toString(toDayOfMonth(argMax(period_end, (filing_date, period_end)))), ', ', toString(toYear(argMax(period_end, (filing_date, period_end))))) AS period_ended,
       concat(formatDateTime(argMax(filing_date, (filing_date, period_end)), '%b'), ' ', toString(toDayOfMonth(argMax(filing_date, (filing_date, period_end)))), ', ', toString(toYear(argMax(filing_date, (filing_date, period_end))))) AS filed_on,
       round(argMax(basic_shares_outstanding, (filing_date, period_end)) / 1e9, 2) AS basic_shares_b,
       round(argMax(diluted_shares_outstanding, (filing_date, period_end)) / 1e9, 2) AS diluted_shares_b
FROM global_markets.stocks_income_statements
ARRAY JOIN tickers AS tk
WHERE tk IN ('AAPL', 'MSFT', 'NVDA')
  AND timeframe = 'quarterly'
  AND filing_date <= '2026-07-10'
  AND basic_shares_outstanding > 0
  AND diluted_shares_outstanding > 0
GROUP BY tk
ORDER BY diluted_shares_b DESC
Run this yourself

Read the top row: NVDA's filing for the quarter ended Apr 26, 2026, filed May 20, 2026, reports 24.29 billion basic shares and 24.39 billion diluted. AAPL reports 14.75 billion basic, MSFT 7.43 billion. Every figure traces to a named filing on a dated row; the most common SEC filings walks through those documents. No float appears in them. At a mature megacap nearly everything outstanding trades freely, so float estimates sit close to the outstanding count; at a fresh listing the two sit far apart.

What counts as a low float stock?

"Low float" has no official cutoff, which makes the phrase easy to throw around and hard to pin down. The distribution of shares outstanding gives it a floor, every US-listed company with a recent quarterly filing, by its latest basic share count:

QueryShares outstanding across every company with a recent quarterly filing: percentiles, in millions of shares
The exact SQL behind every number
WITH latest AS (
    SELECT tk AS ticker,
           argMax(basic_shares_outstanding, (filing_date, period_end)) AS shares
    FROM global_markets.stocks_income_statements
    ARRAY JOIN tickers AS tk
    WHERE timeframe = 'quarterly'
      AND filing_date >= '2025-10-01'
      AND filing_date <= '2026-07-10'
      AND basic_shares_outstanding > 0
    GROUP BY tk
)
SELECT count() AS companies,
       round(quantileDeterministic(0.10)(shares, cityHash64(ticker)) / 1e6, 1) AS p10_shares_m,
       round(quantileDeterministic(0.25)(shares, cityHash64(ticker)) / 1e6, 1) AS p25_shares_m,
       round(quantileDeterministic(0.50)(shares, cityHash64(ticker)) / 1e6, 1) AS median_shares_m,
       round(quantileDeterministic(0.75)(shares, cityHash64(ticker)) / 1e6, 1) AS p75_shares_m,
       round(quantileDeterministic(0.90)(shares, cityHash64(ticker)) / 1e6, 1) AS p90_shares_m
FROM latest
Run this yourself

Across 6111 companies, the median carries 50.1 million shares outstanding. The bottom decile sits at 3.9 million or fewer, the bottom quartile at 15.6 million or fewer; the top decile starts at 452.6 million. That is the answer the phrase usually dodges: a company under about 15.6 million shares outstanding sits in the thinnest quarter of the market before one insider block is subtracted, and its float is smaller still. Screens vary by provider; the strict ones draw their line inside this table's bottom quarter, below the 15.6 million mark.

Do low float stocks really move more?

This is the claim every low-float screen rests on, and it is testable. Bucket every company by its latest reported share count, then measure how it traded over the 20 sessions through July 10, 2026: each session's high-low range as a percentage of the low, plus the dollar volume traded. Share count is a proxy for float, not the float itself, but a measured one:

QueryDaily high-low range and dollar volume by shares-outstanding tier: US common stocks, regular-hours sessions, June 11 to July 10, 2026
The exact SQL behind every number
WITH latest AS (
    SELECT tk AS ticker,
           argMax(basic_shares_outstanding, (filing_date, period_end)) AS shares
    FROM global_markets.stocks_income_statements
    ARRAY JOIN tickers AS tk
    WHERE timeframe = 'quarterly'
      AND filing_date >= '2025-10-01'
      AND filing_date <= '2026-07-10'
      AND basic_shares_outstanding > 0
    GROUP BY tk
),
daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           toFloat64(max(high)) AS hi,
           toFloat64(min(low)) AS lo,
           toFloat64(argMax(close, window_start)) AS last_price,
           sum(toFloat64(volume) * toFloat64(close)) AS dollar_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= toDateTime('2026-06-11 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
      AND toHour(toTimeZone(window_start, 'America/New_York')) >= 9
      AND toHour(toTimeZone(window_start, 'America/New_York')) < 16
      AND NOT (toHour(toTimeZone(window_start, 'America/New_York')) = 9
               AND toMinute(toTimeZone(window_start, 'America/New_York')) < 30)
    GROUP BY ticker, session
    HAVING lo > 0 AND last_price >= 1
)
SELECT multiIf(l.shares < 20e6, 'under 20M shares',
               l.shares < 50e6, '20-50M shares',
               l.shares < 200e6, '50-200M shares',
               l.shares < 1000e6, '200M-1B shares',
               'over 1B shares') AS share_count_tier,
       uniqExact(d.ticker) AS companies,
       round(quantileDeterministic(0.5)(100 * (hi - lo) / lo, cityHash64(d.ticker, d.session)), 2) AS median_daily_range_pct,
       round(quantileDeterministic(0.9)(100 * (hi - lo) / lo, cityHash64(d.ticker, d.session)), 2) AS p90_daily_range_pct,
       round(quantileDeterministic(0.5)(dollar_volume, cityHash64(d.ticker, d.session)) / 1e6, 2) AS median_daily_dollar_volume_m
FROM daily AS d
INNER JOIN latest AS l ON d.ticker = l.ticker
GROUP BY share_count_tier
ORDER BY min(l.shares)
Run this yourself

The ladder is monotone, and it runs in the direction the folklore claims. The 1093 companies with under 20M shares outstanding posted a median daily high-low range of 4.82%, against 1.68% for the 221 names with over 1B shares. Every step up the ladder narrows the typical day: 3.94%, 3.64%, 2.72%. The tails stretch further: a 90th-percentile day in the thinnest tier ran 13.28%, roughly triple the 4.65% of the largest tier.

The liquidity column shows the mechanism. The thinnest tier's median session turned over 0.49 million dollars of stock; the largest tier's, 99.47 million. When a day's demand meets a fraction of that depth, the price travels further to find the next seller. One caveat: small share counts cluster with small companies and low prices, so these tiers differ in more ways than one. Days when a stock trades far above its volume norm, what relative volume measures, are the days a thin float gets tested, and the sharpness runs both ways.

How does an IPO create the float?

On listing day the float starts near one knowable number: the shares actually sold in the offering. Everything not offered, founder stock, employee grants, venture stakes, is outstanding but not yet tradable, most of it locked up. That makes the IPO record a rare thing: a real float measurement, taken when the tradable count is sharpest. Listing records store shares offered alongside shares outstanding; the ratio is the fraction of the company floated. Across US common-stock IPOs of $100 million or more in the first half of 2026 (the half's IPO ledger):

QueryFloat at listing: shares offered as a share of recorded shares outstanding, H1 2026 US IPOs of $100M+
The exact SQL behind every number
SELECT count() AS ipos,
       round(quantileDeterministic(0.5)(max_shares_offered / shares_outstanding, cityHash64(issuer_name)) * 100, 1) AS median_pct_offered,
       round(quantileDeterministic(0.25)(max_shares_offered / shares_outstanding, cityHash64(issuer_name)) * 100, 1) AS p25_pct,
       round(quantileDeterministic(0.75)(max_shares_offered / shares_outstanding, cityHash64(issuer_name)) * 100, 1) AS p75_pct,
       countIf(max_shares_offered / shares_outstanding <= 0.30) AS floated_30pct_or_less
FROM global_markets.stocks_ipos
WHERE listing_date >= '2026-01-01'
  AND listing_date <= '2026-06-30'
  AND ipo_status = 'history'
  AND currency_code = 'USD'
  AND security_type = 'CS'
  AND total_offer_size >= 100000000
  AND shares_outstanding > 0
  AND max_shares_offered > 0
  AND max_shares_offered < shares_outstanding
Run this yourself

Across 39 measured listings, the median deal offered shares equal to 30.2% of its recorded total, the float opened as a minority slice of the company. The middle half floated between 17.3% and 47.7%, and 19 of the 39 floated 30% or less. A new listing's market cap can run several times the value of the shares that actually trade, that gap is the float-versus-outstanding distinction, priced. Deal by deal, the half's eight largest measured offerings:

QueryEight of H1 2026's biggest measured US IPOs: shares offered vs. shares outstanding at listing
The exact SQL behind every number
SELECT issuer_name AS company,
       toString(listing_date) AS listed,
       round(max_shares_offered / 1e6, 1) AS shares_offered_m,
       round(shares_outstanding / 1e6, 1) AS shares_outstanding_m,
       round(100 * max_shares_offered / shares_outstanding, 1) AS pct_of_shares_offered
FROM global_markets.stocks_ipos
WHERE listing_date >= '2026-01-01'
  AND listing_date <= '2026-06-30'
  AND ipo_status = 'history'
  AND currency_code = 'USD'
  AND security_type = 'CS'
  AND total_offer_size >= 100000000
  AND shares_outstanding > 0
  AND max_shares_offered > 0
  AND max_shares_offered < shares_outstanding
ORDER BY total_offer_size DESC
LIMIT 8
Run this yourself

The largest measured deal, Innio N.V., offered 90 million of its 750 million recorded shares, 12% floated at listing. Two caveats per row: the offered figure is the top of each deal's range, and the outstanding count covers only the listed share class, so a multi-class company reads high. For a brand-new float meeting the open market, see SpaceX's June 2026 listing.

How the IPO float measurement was built

The full accounting:

QueryFrom every H1 2026 US-dollar listing down to the measured set
The exact SQL behind every number
SELECT count() AS ipos_h1_2026,
       countIf(security_type = 'CS' AND total_offer_size >= 100000000) AS large_common_stock_ipos,
       countIf(security_type = 'CS' AND total_offer_size >= 100000000
               AND shares_outstanding > 0 AND max_shares_offered > 0) AS with_both_share_counts,
       countIf(security_type = 'CS' AND total_offer_size >= 100000000
               AND shares_outstanding > 0 AND max_shares_offered > 0
               AND max_shares_offered >= shares_outstanding) AS dropped_placeholder_rows,
       countIf(security_type = 'CS' AND total_offer_size >= 100000000
               AND shares_outstanding > 0 AND max_shares_offered > 0
               AND max_shares_offered < shares_outstanding) AS measured_ipos
FROM global_markets.stocks_ipos
WHERE listing_date >= '2026-01-01'
  AND listing_date <= '2026-06-30'
  AND ipo_status = 'history'
  AND currency_code = 'USD'
Run this yourself

184 US-dollar listings hit the tape in the half; 60 were common-stock deals of $100 million or more, and 40 carried both share counts. Rows recording the offered count at or above the outstanding total were set aside as placeholders (1 here), leaving 39 measured listings. Missing counts are excluded, never guessed.

What happens to the float when a lock-up expires?

A lock-up expiration is the largest scheduled change to a young company's float: insiders and pre-IPO investors become free to sell, and outstanding-but-locked shares join the tradable pool. The customary term is 180 days. The honest limit of the data: no lock-up expiration date is recorded in any market-data feed, it lives in the prospectus, is often staggered, sometimes released early. What can be measured is the tape around that mark. Medline, a December 2025 listing whose 180th day fell June 15, 2026, is the test case:

QueryMedline (MDLN): the 20 sessions before its 180-day mark vs. every session from it, regular-hours volume and daily range
The exact SQL behind every number
WITH ipo AS (
    SELECT concat(formatDateTime(listing_date, '%b'), ' ', toString(toDayOfMonth(listing_date)), ', ', toString(toYear(listing_date))) AS listed_on,
           round(max_shares_offered / 1e6, 1) AS shares_offered_m
    FROM global_markets.stocks_ipos
    WHERE ticker = 'MDLN'
      AND ipo_status = 'history'
      AND listing_date >= '2025-12-01'
      AND listing_date <= '2025-12-31'
    LIMIT 1
),
daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           toFloat64(max(high)) AS hi,
           toFloat64(min(low)) AS lo,
           sum(toFloat64(volume)) AS shares_traded
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'MDLN'
      AND window_start >= toDateTime('2026-05-15 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
      AND toHour(toTimeZone(window_start, 'America/New_York')) >= 9
      AND toHour(toTimeZone(window_start, 'America/New_York')) < 16
      AND NOT (toHour(toTimeZone(window_start, 'America/New_York')) = 9
               AND toMinute(toTimeZone(window_start, 'America/New_York')) < 30)
    GROUP BY session
    HAVING lo > 0
)
SELECT if(session < toDate('2026-06-15'), '1. 20 sessions before', '2. from the 180-day mark') AS window,
       any(listed_on) AS listed_on,
       any(shares_offered_m) AS shares_offered_m,
       count() AS sessions,
       concat(formatDateTime(min(session), '%b'), ' ', toString(toDayOfMonth(min(session)))) AS first_session,
       concat(formatDateTime(max(session), '%b'), ' ', toString(toDayOfMonth(max(session)))) AS last_session,
       round(quantileDeterministic(0.5)(shares_traded, cityHash64(session)) / 1e6, 2) AS median_daily_volume_m,
       round(quantileDeterministic(0.5)(100 * (hi - lo) / lo, cityHash64(session)), 2) AS median_daily_range_pct
FROM daily
CROSS JOIN ipo
GROUP BY window
ORDER BY window
Run this yourself

Medline listed on Dec 17, 2025 with 248.4 million shares offered. Over the 20 sessions from May 15 through Jun 12, its median day traded 8.61 million shares in a 4.53% high-low range. Over the 18 sessions from the mark through Jul 10: 6.42 million shares, a 4.14% range, quieter on both counts.

That is worth sitting with, since the popular story runs the other way. A calendar-derived date is not an event: the real expiration may be staggered, may have passed earlier, and insiders may simply not sell. Float changes are disclosed in documents, not price feeds, read the prospectus, not a countdown.

Why does float matter for index weights?

The major US index families weight constituents by float-adjusted market capitalization, counting only shares available to public investors. Two companies with identical market caps can carry very different index weights when one floats a small fraction of itself. Each provider publishes its float-adjustment rules, the closest thing to an official float a stock gets.

Stock float FAQ

What is the difference between float and shares outstanding?

Shares outstanding is every share a company has issued that investors hold, reported in SEC filings each quarter. The float is the subset free to trade publicly, outstanding minus insider, restricted, and other closely held stock. Outstanding is what exists and is audited; float is what trades, is estimated, and is always the same size or smaller.

What is a low float stock?

A low float stock has few freely tradable shares, commonly a recent IPO inside its lock-up, a company with heavy insider ownership, or a small company. There is no official cutoff, but the distribution gives a reference point: the median US-listed company with a recent quarterly filing reports 50.1 million shares outstanding, the bottom quartile 15.6 million or fewer.

Do low float stocks move more than large-float stocks?

Measured over the 20 sessions through July 10, 2026, yes. Companies with under 20 million shares outstanding posted a median daily high-low range of 4.82%, against 1.68% for those with over 1 billion shares, narrowing at every step between. The thinnest tier traded a median 0.49 million dollars a day; the largest, 99.47 million.

What happens to a stock when its lock-up expires?

Shares held by insiders and pre-IPO investors become eligible to sell, enlarging the float. Whether it shows in the tape is another question: for Medline, the 18 sessions from its 180-day mark traded a median 6.42 million shares a day, below the 8.61 million of the 20 sessions before. Real expiration dates live in the prospectus.


Every table above is a stored query, expand the SQL under any panel, or pull the same counts for any ticker on the Strasmore terminal.