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.
| ticker | short_volume_ratio_pct | reported_volume_millions |
|---|---|---|
| INND | 100 | 5.93 |
| PRMMF | 100 | 8 |
| ABI | 99.82 | 2.15 |
| THBD | 99.6 | 3.41 |
| NBND | 99.31 | 14.58 |
| RSPD | 99.27 | 2.74 |
| BGFI | 99.07 | 2.8 |
| IDRV | 98.78 | 4.59 |
| SRMX | 98.39 | 8.46 |
| XSVN | 97.76 | 2.21 |
| AXXA | 97.27 | 15.48 |
| SMTH | 96.2 | 6.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 12The 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.
| volume_bucket | names_in_bucket | median_short_volume_ratio_pct | highest_ratio_pct |
|---|---|---|---|
| 1. under 100k shares | 9799 | 45.49 | 100 |
| 2. 100k to 1M | 4108 | 51.41 | 100 |
| 3. 1M to 10M | 1282 | 50.08 | 100 |
| 4. above 10M | 143 | 48.43 | 99.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_bucketThe 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.
| ticker | finra_offexchange_millions | consolidated_tape_millions | offexchange_share_of_tape_pct |
|---|---|---|---|
| SPY | 17.9 | 46.2 | 38.8 |
| NVDA | 32.5 | 88.1 | 36.9 |
| AAPL | 11.6 | 31.7 | 36.5 |
| MSFT | 6.3 | 17.8 | 35.4 |
| JNJ | 1.8 | 5.3 | 33.5 |
| KO | 4.1 | 13.2 | 31.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 DESCOff 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.
| date | short_volume_ratio_pct |
|---|---|
| 2026-06-01 | 39.47 |
| 2026-06-02 | 46.7 |
| 2026-06-03 | 45.03 |
| 2026-06-05 | 48.51 |
| 2026-06-08 | 46.49 |
| 2026-06-09 | 34.72 |
| 2026-06-10 | 43.42 |
| 2026-06-11 | 52.41 |
| 2026-06-12 | 50.61 |
| 2026-06-15 | 40.99 |
| 2026-06-17 | 54.37 |
| 2026-06-18 | 43.26 |
| 2026-06-22 | 48.36 |
| 2026-06-24 | 41.65 |
| 2026-06-25 | 36.98 |
| 2026-06-26 | 38.92 |
| 2026-06-30 | 44.19 |
| 2026-07-01 | 38.13 |
| 2026-07-02 | 46.48 |
| 2026-07-06 | 45.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 dateAcross 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.
| settle_date | settle_label | short_interest_millions | avg_daily_volume_millions | days_to_cover_ratio |
|---|---|---|---|---|
| 2026-03-13 | Mar 13 | 124.19 | 38.12 | 3.26 |
| 2026-03-31 | Mar 31 | 126.77 | 42.87 | 2.96 |
| 2026-04-15 | Apr 15 | 134.42 | 39.67 | 3.39 |
| 2026-04-30 | Apr 30 | 134.68 | 45.94 | 2.93 |
| 2026-05-15 | May 15 | 138.78 | 50.57 | 2.74 |
| 2026-05-29 | May 29 | 155.89 | 46.06 | 3.38 |
| 2026-06-15 | Jun 15 | 144.25 | 52.34 | 2.76 |
| 2026-06-30 | Jun 30 | 140.53 | 81.12 | 1.73 |
| 2026-07-15 | Jul 15 | 146.55 | 47.95 | 3.06 |
| 2026-07-31 | Jul 31 | 141.61 | 58.4 | 2.42 |
| 2026-08-14 | Aug 14 | 116.33 | 46.07 | 2.53 |
| 2026-08-31 | Aug 31 | 139.75 | 39.54 | 3.53 |
| 2026-09-15 | Sep 15 | 128.75 | 45.14 | 2.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_dateOver 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==6drops it. Inspect it withawk '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.