Strasmore Research
Learn Matt ConnorBy Matt Connor

FINRA Short Volume Ratio by Ticker

Compute the FINRA short volume ratio by ticker from the daily RegSHO files using curl and awk on one pinned date, and learn what the ratio does not measure.

The FINRA short volume ratio by ticker is one division: the shares a symbol printed short off exchange during a session, divided by that symbol's total off exchange volume in the same session. FINRA publishes both numbers for every US symbol in a single pipe delimited file per trading day, so the whole calculation runs in a fresh Ubuntu container with curl and awk. This page pins one historical date, walks the commands, then spends as long on the part most short volume leaderboards skip: what the ratio does not measure.

What the FINRA short volume ratio measures

FINRA operates the trade reporting facilities where off exchange trades are printed. Off exchange means away from an exchange order book: alternative trading systems, commonly called dark pools, and the wholesale market makers that fill most retail orders. For each trading day, FINRA posts a Regulation SHO file counting how much of that off exchange volume carried a short sale marker, symbol by symbol.

Six pipe delimited fields make up a row, and the published layout names them Date|Symbol|ShortVolume|Short Exempt Volume|TotalVolume|Market. The first row of every file is that header. The last row is a trailer holding a record count, which is the line a naive parser turns into a phantom ticker. The ratio is field three over field five.

One field trips people up before they start. ShortVolume already includes short exempt prints, so Short Exempt Volume is a subset of it rather than a second bucket. Add the two and you double count. If the fetch loop is what you need first, download the FINRA short volume files covers that side; this page picks up at the arithmetic.

How to compute a FINRA short volume ratio by ticker

The daily files live under cdn.finra.org/equity/regsho/daily, named as a facility prefix, the string shvol, the trade date as YYYYMMDD, and a .txt extension. CNMS is the consolidated file covering every FINRA facility at once, and it is the one to use for a per ticker ratio. The per facility files carry the same layout under their own prefixes: FNSQ for the NASDAQ TRF in Carteret, FNQC for the NASDAQ TRF in Chicago, FNYX for the NYSE TRF, FNRA for the ADF, and FORF for the OTC Reporting Facility.

Fetch one pinned session, September 15, 2026:

curl -sO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260915.txt

Look at the header and the first records:

awk 'NR<=3' CNMSshvol20260915.txt

Then compute the ratio, apply a volume floor, and sort descending:

awk -F'|' 'NR>1 && NF==6 && $5+0 >= 2000000 { printf "%.2f %s %d\n", 100*$3/$5, $2, $5 }' CNMSshvol20260915.txt | sort -rn | awk 'NR<=20'

Three guards do the work in that one line. NF==6 drops the header and the trailer, since neither carries six pipe delimited fields. $5+0 >= 2000000 forces awk to read total volume as a number and keeps only symbols with at least two million off exchange shares. Putting the ratio first in the printf lets sort -rn order on it. Swap the date in the filename and the same command runs on any past session, which is what keeps the recipe reproducible a year from now.

The panel below runs that same arithmetic over the same pinned session.

QueryHighest off exchange short volume ratios, liquid names, September 15 2026
tickershort_volume_ratio_pctreported_volume_millions
INND1005.93
PRMMF1008
ABI99.822.15
THBD99.63.41
NBND99.3114.58
RSPD99.272.74
BGFI99.072.8
IDRV98.784.59
SRMX98.398.46
XSVN97.762.21
AXXA97.2715.48
SMTH96.26.81
The exact SQL behind every number
SELECT
    ticker,
    round(100 * toFloat64(short_vol) / toFloat64(reported_vol), 2) AS short_volume_ratio_pct,
    round(toFloat64(reported_vol) / 1e6, 2)                        AS reported_volume_millions
FROM
(
    SELECT
        ticker,
        max(short_volume) AS short_vol,
        max(total_volume) AS reported_vol
    FROM global_markets.stocks_short_volume
    WHERE date = '2026-09-15'
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
)
WHERE reported_vol >= 2000000
ORDER BY short_volume_ratio_pct DESC, ticker ASC
LIMIT 12
Run this yourself

The highest ratio among liquid names on September 15, 2026 belongs to INND at 100%, on 5.93 million reported shares. Compare the two ends of the list: the twelfth name still measures 96.2%. How tight that range is across a whole leaderboard of heavily traded symbols is the first clue about what the number really counts.

Why a volume floor belongs in the pipeline

Delete the floor from the awk line and the leaderboard fills with symbols nobody trades. A stock with 4,000 reported shares and all 4,000 of them marked short prints a ratio of 100, and it outranks every household name every single day. The panel below buckets the same session by reported volume and puts the median ratio next to the most extreme one in each bucket.

QueryShort volume ratio by liquidity bucket, same session
volume_bucketnames_in_bucketmedian_short_volume_ratio_pcthighest_ratio_pct
1. under 100k shares979945.49100
2. 100k to 1M410851.41100
3. 1M to 10M128250.08100
4. above 10M14348.4399.31
The exact SQL behind every number
SELECT
    volume_bucket,
    count()                                                             AS names_in_bucket,
    round(quantileDeterministic(0.5)(ratio_pct, cityHash64(ticker)), 2) AS median_short_volume_ratio_pct,
    round(max(ratio_pct), 2)                                            AS highest_ratio_pct
FROM
(
    SELECT
        ticker,
        multiIf(reported_vol <   100000, '1. under 100k shares',
                reported_vol <  1000000, '2. 100k to 1M',
                reported_vol < 10000000, '3. 1M to 10M',
                                         '4. above 10M')      AS volume_bucket,
        100 * toFloat64(short_vol) / toFloat64(reported_vol)   AS ratio_pct
    FROM
    (
        SELECT
            ticker,
            max(short_volume) AS short_vol,
            max(total_volume) AS reported_vol
        FROM global_markets.stocks_short_volume
        WHERE date = '2026-09-15'
          AND ticker NOT IN ('SPCX')
        GROUP BY ticker
        HAVING reported_vol > 0
    )
)
GROUP BY volume_bucket
ORDER BY volume_bucket
Run this yourself

The thinnest bucket holds 9799 symbols with a median ratio of 45.49% and a maximum of 100%. The busiest bucket, symbols above ten million reported shares, sits at a median of 48.43%. The medians stay close to one another while the extremes appear only where volume is thin, which is what small denominators look like in any ratio. A floor of one to two million reported shares clears most of it out. Our most shorted stocks screen applies the same kind of liquidity filter before ranking anything.

What the short volume ratio is not

Start with coverage. The TotalVolume field counts off exchange prints only, so the denominator is a slice of the session rather than the whole of it. The panel puts the FINRA reported total next to consolidated tape volume for six household symbols on the pinned date.

QueryFINRA reported off exchange volume against consolidated tape volume
tickerfinra_offexchange_millionsconsolidated_tape_millionsoffexchange_share_of_tape_pct
SPY17.946.238.8
NVDA32.588.136.9
AAPL11.631.736.5
MSFT6.317.835.4
JNJ1.85.333.5
KO4.113.231.5
The exact SQL behind every number
SELECT
    f.ticker                                                          AS ticker,
    round(toFloat64(f.reported_vol) / 1e6, 1)                         AS finra_offexchange_millions,
    round(toFloat64(t.tape_vol) / 1e6, 1)                             AS consolidated_tape_millions,
    round(100 * toFloat64(f.reported_vol) / toFloat64(t.tape_vol), 1) AS offexchange_share_of_tape_pct
FROM
(
    SELECT ticker, max(total_volume) AS reported_vol
    FROM global_markets.stocks_short_volume
    WHERE date = '2026-09-15'
      AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
    GROUP BY ticker
) AS f
INNER JOIN
(
    SELECT ticker, max(volume) AS tape_vol
    FROM global_markets.stocks_daily_aggs
    WHERE date = '2026-09-15'
      AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
    GROUP BY ticker
) AS t ON t.ticker = f.ticker
ORDER BY offexchange_share_of_tape_pct DESC
Run this yourself

Off exchange prints made up 38.8% of tape volume in SPY that day, and 31.5% in KO, the lowest of the six. Exchange executed short sales never enter the file, so the ratio describes one slice of the session.

Next, the marker itself. A trade is stamped short at execution when the seller is not delivering from a long position. A wholesaler filling a retail buy order without inventory sells short into that order and buys it back later in the day, and the print lands in the short volume column with no view attached. Options market makers hedging deltas land there too. The field records a mechanical property of executions.

Finally the arithmetic. A 60% short volume ratio does not mean 60% of a company's shares are sold short. The ratio is a flow measure over one session of off exchange trades. Short interest is a stock measure: shares sold short and still open at a settlement date, published twice a month. short interest versus short volume works through the distinction in full.

Short volume and short interest side by side

AAPL makes the contrast easy to see, since both series are dense for it. The first panel is the daily ratio across three and a half months up to the pinned date.

QueryAAPL daily short volume ratio, June 1 to September 15 2026
58 rows (showing 20)
dateshort_volume_ratio_pct
2026-06-0139.47
2026-06-0246.7
2026-06-0345.03
2026-06-0548.51
2026-06-0846.49
2026-06-0934.72
2026-06-1043.42
2026-06-1152.41
2026-06-1250.61
2026-06-1540.99
2026-06-1754.37
2026-06-1843.26
2026-06-2248.36
2026-06-2441.65
2026-06-2536.98
2026-06-2638.92
2026-06-3044.19
2026-07-0138.13
2026-07-0246.48
2026-07-0645.73
The exact SQL behind every number
SELECT
    toString(date)                                                 AS date,
    round(100 * toFloat64(short_vol) / toFloat64(reported_vol), 2) AS short_volume_ratio_pct
FROM
(
    SELECT
        date,
        max(short_volume) AS short_vol,
        max(total_volume) AS reported_vol
    FROM global_markets.stocks_short_volume
    WHERE ticker = 'AAPL'
      AND date >= '2026-06-01'
      AND date <= '2026-09-15'
    GROUP BY date
    HAVING reported_vol > 0
)
ORDER BY date
Run this yourself

Across 58 sessions from June 1 to September 15, 2026, the AAPL ratio opens the window at 39.47% and closes it at 40.1%, wandering inside a band from session to session. A ratio that oscillates in a band day after day is the pattern continuous two sided market making produces.

Now the other series, on its own clock.

QueryAAPL reported short interest prints, March to September 2026
settle_datesettle_labelshort_interest_millionsavg_daily_volume_millionsdays_to_cover_ratio
2026-03-13Mar 13124.1938.123.26
2026-03-31Mar 31126.7742.872.96
2026-04-15Apr 15134.4239.673.39
2026-04-30Apr 30134.6845.942.93
2026-05-15May 15138.7850.572.74
2026-05-29May 29155.8946.063.38
2026-06-15Jun 15144.2552.342.76
2026-06-30Jun 30140.5381.121.73
2026-07-15Jul 15146.5547.953.06
2026-07-31Jul 31141.6158.42.42
2026-08-14Aug 14116.3346.072.53
2026-08-31Aug 31139.7539.543.53
2026-09-15Sep 15128.7545.142.85
The exact SQL behind every number
SELECT
    toString(settlement_date)                        AS settle_date,
    formatDateTime(toDate(settlement_date), '%b %e') AS settle_label,
    round(toFloat64(max(short_interest)) / 1e6, 2)   AS short_interest_millions,
    round(toFloat64(max(avg_daily_volume)) / 1e6, 2) AS avg_daily_volume_millions,
    round(toFloat64(max(days_to_cover)), 2)          AS days_to_cover_ratio
FROM global_markets.stocks_short_interest
WHERE ticker = 'AAPL'
  AND settlement_date >= '2026-03-01'
  AND settlement_date <= '2026-09-15'
GROUP BY settlement_date
ORDER BY settlement_date
Run this yourself

Over 13 settlement prints, reported short interest went from 124.19 million shares to 128.75 million at Sep 15, against average daily volume of 45.14 million and days to cover of 2.85. Two prints a month, with a coverage figure quoted in days rather than in percent of a session. The daily file and the twice monthly print disagree by construction: they count different things on different clocks, and a stock can hold a high daily ratio for weeks while its short interest barely moves. FINRA short interest data documents the settlement calendar behind the second series.

Field notes and pitfalls
  • The last line of every RegSHO daily file is a trailer with a record count, not a symbol. NF==6 drops it. Inspect it with awk 'END{print}' CNMSshvol20260915.txt.
  • Short exempt volume is a subset of short volume in the same row. Adding the two double counts.
  • No file is published for weekends or market holidays, so a loop over a calendar month has to tolerate missing dates.
  • Symbols run up to 14 characters and follow the reporting facility's symbology, so a multi class ticker may not match the form your broker displays.
  • The consolidated CNMS file already aggregates the per facility files. Mixing CNMS with FNSQ, FNQC, FNYX, FNRA or FORF in one total double counts.
  • Panels on this page group by ticker or date and take max(), since a daily row can arrive more than once.

FAQ

What does a high FINRA short volume ratio mean?

It means a large share of that symbol's off exchange prints in the session carried a short sale marker. Market making and hedging flow is marked the same way as directional selling, so a high daily ratio on its own does not establish that traders are positioned against the stock.

Is short volume the same as short interest?

No. Short volume counts shares traded with a short marker during one session, off exchange only. Short interest counts short positions still open at a settlement date and is published twice a month. The two series routinely move in different directions.

Where are the FINRA daily short sale volume files?

They sit at cdn.finra.org/equity/regsho/daily, one file per facility per trading day, named as the facility prefix plus shvol, the trade date in YYYYMMDD form, and .txt. CNMS is the consolidated file across all FINRA facilities.

Why do thinly traded tickers show a 100% short volume ratio?

Small denominators. A symbol with a few thousand reported shares can have all of them marked short by a single wholesaler print, which produces a ratio of 100 without saying anything about the company. A volume floor keeps those names off the leaderboard.

Can I compute the ratio without Python?

Yes. curl fetches the file and awk handles the division and the formatting, and both are present in a bare Ubuntu image. No API key is involved, since the files are public and unauthenticated.


Every panel above ships with the SQL that produced it, one expander away. To run the same ratio on a symbol and a session you pick, ask for it in plain English on the Strasmore terminal.

#finra#short-volume#regsho#short-interest#data-pipeline