How to Download FINRA Daily Short Volume Data
Fetch FINRA daily short volume data with curl, read the Reg SHO file's columns, and compute a symbol's short volume ratio with awk. Pinned date, reproducible.
To download FINRA daily short volume data, fetch one plain-text file per trading day from FINRA's public content server: no login and no API key. The file is the Regulation SHO Daily Short Sale Volume file, one pipe-delimited row per symbol carrying that day's short volume and total volume (plus the short exempt subset) for trades reported off-exchange to a FINRA facility. This guide pins one historical date, June 12, 2026, and works through a fresh Ubuntu container: install curl, pull the file, read the columns, then compute a short volume ratio for one symbol with awk. Every command runs as written, today or a year from now.
Where does FINRA publish the daily short volume file?
The consolidated file for any trading day sits at a predictable address:
https://cdn.finra.org/equity/regsho/daily/CNMSshvolYYYYMMDD.txt
Replace YYYYMMDD with the trade date. CNMS is the consolidated NMS file (National Market System, the exchange-listed universe): every listed stock, summed across all of FINRA's trade reporting facilities (TRFs). FINRA posts each day's file no later than 6:00 p.m. ET on the trade date itself, about as fast as public short-selling data gets. The trade-off is scope. The file counts only trades reported to a FINRA facility, which in practice means off-exchange executions such as wholesalers filling retail orders and dark pools. Trades matched on the exchanges themselves are not in it, so the total volume column is always smaller than the day's volume on a price chart.
Files exist only for trading days. Ask for a weekend date or an exchange holiday and the server answers 403 Forbidden rather than an empty file, and a script that walks a calendar has to skip those dates or tolerate the error.
Step 1: a fresh Ubuntu container with curl
Start from a clean container and install curl. Ubuntu's base image already ships awk (as mawk), so nothing else is needed:
docker run --rm -it ubuntu:24.04 bash
apt-get update && apt-get install -y curl
Step 2: download the FINRA daily short volume file for a pinned date
Pin the date. A command built around "today" breaks on weekends and holidays, and again every morning before FINRA posts. June 12, 2026 was a Friday with a normal session, and its file stays on the server:
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260612.txt
The flags: -f makes curl fail on an HTTP error instead of saving the error page as data, -s silences the progress meter, -S still prints a real error, -L follows a redirect, and -O saves the file under its remote name. Inspect both ends of what arrived:
head -3 CNMSshvol20260612.txt
tail -1 CNMSshvol20260612.txt
The first line is the header, Date|Symbol|ShortVolume|ShortExemptVolume|TotalVolume|Market. The last line is a trailer: a bare integer, the count of data records in the file. Any parser has to drop both. Now prove the weekend rule by asking for the next calendar day, Saturday, June 13:
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260613.txt
Curl prints an error and exits with code 22: the server returned 403 and -f refused it. The same happens for June 19, 2026, the Juneteenth holiday. A stored copy of the same series shows the calendar shape directly, one row per session and nothing in between:
| trade_date | weekday | session_label | symbols_reported | symbols_label |
|---|---|---|---|---|
| 2026-06-01 | Monday | June 1 | 15118 | 15.12 thousand |
| 2026-06-02 | Tuesday | June 2 | 14907 | 14.91 thousand |
| 2026-06-03 | Wednesday | June 3 | 14839 | 14.84 thousand |
| 2026-06-04 | Thursday | June 4 | 5136 | 5.14 thousand |
| 2026-06-05 | Friday | June 5 | 14740 | 14.74 thousand |
| 2026-06-08 | Monday | June 8 | 14815 | 14.81 thousand |
| 2026-06-09 | Tuesday | June 9 | 14751 | 14.75 thousand |
| 2026-06-10 | Wednesday | June 10 | 5694 | 5.69 thousand |
| 2026-06-11 | Thursday | June 11 | 14687 | 14.69 thousand |
| 2026-06-12 | Friday | June 12 | 14734 | 14.73 thousand |
| 2026-06-15 | Monday | June 15 | 14948 | 14.95 thousand |
| 2026-06-16 | Tuesday | June 16 | 5631 | 5.63 thousand |
| 2026-06-17 | Wednesday | June 17 | 14611 | 14.61 thousand |
| 2026-06-18 | Thursday | June 18 | 14700 | 14.70 thousand |
| 2026-06-22 | Monday | June 22 | 14922 | 14.92 thousand |
| 2026-06-23 | Tuesday | June 23 | 5767 | 5.77 thousand |
| 2026-06-24 | Wednesday | June 24 | 14743 | 14.74 thousand |
| 2026-06-25 | Thursday | June 25 | 14716 | 14.72 thousand |
| 2026-06-26 | Friday | June 26 | 15052 | 15.05 thousand |
| 2026-06-29 | Monday | June 29 | 5489 | 5.49 thousand |
The exact SQL behind every number
SELECT
toString(date) AS trade_date,
formatDateTime(date, '%W') AS weekday,
concat(monthName(date), ' ', toString(toDayOfMonth(date))) AS session_label,
count(DISTINCT ticker) AS symbols_reported,
formatReadableQuantity(count(DISTINCT ticker)) AS symbols_label
FROM global_markets.stocks_short_volume
WHERE date >= '2026-06-01'
AND date < '2026-07-01'
GROUP BY date
ORDER BY dateJune 2026 produced 21 dated files. The first, June 1, a Monday, carried 15.12 thousand symbols. Every row in the panel is a weekday, and there is no row for June 19.
What do the columns in the FINRA short volume file mean?
Each data row has six pipe-separated fields.
Dateis the trade date as YYYYMMDD.Symbolis the ticker, up to 14 characters.ShortVolumeis the number of shares sold short that day in trades reported to FINRA, including short exempt trades.ShortExemptVolumeis the subset flagged short exempt: sales marked as exempt from the Reg SHO Rule 201 price test, the circuit breaker that restricts short selling after a stock falls 10% from its prior close.TotalVolumeis every reported share for the symbol that day, short and long together.Marketis the reporting facility:Nfor the NYSE TRF,Qfor the Nasdaq TRF in Carteret,Bfor the Nasdaq TRF in Chicago,Dfor the Alternative Display Facility (ADF).
In the consolidated file the Market field lists every facility that reported the symbol, comma-separated, so a line ends in something like B,Q,N. Those commas are why the file uses pipes as its delimiter. One recent change to budget for: since February 23, 2026, the three volume fields carry fractional shares to six decimal places, and a value with six digits after the decimal point is normal. Files dated before that hold whole numbers only, and a parser that casts to an integer will silently truncate the newer ones.
How do I compute the short volume ratio with awk?
Short volume ratio is short volume divided by total volume, quoted as a percentage. One awk line computes it for a single symbol:
awk -F'|' '$2 == "AAPL" { printf "%s %s short=%s total=%s ratio=%.1f%%\n", $1, $2, $3, $5, 100 * $3 / $5 }' CNMSshvol20260612.txt
-F'|' sets the pipe as the field separator, $2 == "AAPL" keeps only the AAPL row (the header and the trailer never match), and the printf divides field 3 by field 5. Swap in any symbol. The panel below reads the same date for six household names from the stored FINRA series, rounded to millions of shares, so you can check the line you just ran against it:
| ticker | short_volume_millions | total_volume_millions | short_pct |
|---|---|---|---|
| AAPL | 6.66 | 13.16 | 50.6 |
| AMZN | 5.88 | 21.76 | 27 |
| KO | 2.06 | 3.65 | 56.3 |
| MSFT | 3.73 | 14.24 | 26.2 |
| NVDA | 15.19 | 45.34 | 33.5 |
| SPY | 7.48 | 15.48 | 48.3 |
The exact SQL behind every number
SELECT
ticker,
round(toFloat64(max(short_volume)) / 1e6, 2) AS short_volume_millions,
round(toFloat64(max(total_volume)) / 1e6, 2) AS total_volume_millions,
round(100 * toFloat64(max(short_volume)) / toFloat64(max(total_volume)), 1) AS short_pct
FROM global_markets.stocks_short_volume
WHERE ticker IN ('AAPL', 'AMZN', 'KO', 'MSFT', 'NVDA', 'SPY')
AND date = '2026-06-12'
GROUP BY ticker
HAVING max(total_volume) > 0
ORDER BY tickerFor AAPL on June 12, 2026 the file records 6.66 million shares sold short against 13.16 million reported in total, a short volume ratio of 50.6%. The other five names land in the same neighbourhood, which is the ordinary state of this file; a later section covers why a ratio near one half is not the alarm it looks like.
A single day is a snapshot, and the ratio moves session to session. Download one file per date and the month-long series is yours to build.
What is the difference between the CNMS file and the per-facility files?
CNMS is a sum. FINRA also publishes one file per reporting facility on the same schedule, with the same layout and date stamp but a different prefix: FNSQshvol for the Nasdaq TRF Carteret (Market Q), FNQCshvol for the Nasdaq TRF Chicago (B), FNYXshvol for the NYSE TRF (N) and FNRAshvol for the ADF (D). A fifth, FORFshvol, covers the OTC Reporting Facility, which handles unlisted OTC equities and is not part of CNMS. Fetch the Carteret file for the pinned date and pull the same symbol:
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/FNSQshvol20260612.txt
awk -F'|' '$2 == "AAPL"' FNSQshvol20260612.txt
Run the same two lines against FNQCshvol20260612.txt and FNYXshvol20260612.txt and the three ShortVolume fields add up to the CNMS figure to the last decimal. The ADF file for that date holds only a header and a trailer of 0, which is common. Here is the split for AAPL:
| venue | short_volume_millions | share_of_consolidated_pct |
|---|---|---|
| Consolidated (CNMS) | 6.659 | 100 |
| Nasdaq TRF Carteret (Q) | 6.412 | 96.3 |
| NYSE TRF (N) | 0.194 | 2.9 |
| Nasdaq TRF Chicago (B) | 0.053 | 0.8 |
| ADF (D) | 0 | 0 |
The exact SQL behind every number
SELECT
tupleElement(v, 1) AS venue,
round(tupleElement(v, 2) / 1e6, 3) AS short_volume_millions,
round(100 * tupleElement(v, 2) / consolidated, 1) AS share_of_consolidated_pct
FROM
(
SELECT
consolidated,
arrayJoin([
('Consolidated (CNMS)', consolidated),
('Nasdaq TRF Carteret (Q)', carteret),
('Nasdaq TRF Chicago (B)', chicago),
('NYSE TRF (N)', nyse),
('ADF (D)', adf)
]) AS v
FROM
(
SELECT
toFloat64(ifNull(max(short_volume), 0)) AS consolidated,
toFloat64(ifNull(max(nasdaq_carteret_short_volume), 0)) AS carteret,
toFloat64(ifNull(max(nasdaq_chicago_short_volume), 0)) AS chicago,
toFloat64(ifNull(max(nyse_short_volume), 0)) AS nyse,
toFloat64(ifNull(max(adf_short_volume), 0)) AS adf
FROM global_markets.stocks_short_volume
WHERE ticker = 'AAPL'
AND date = '2026-06-12'
)
)
ORDER BY tupleElement(v, 2) DESCNasdaq TRF Carteret (Q) carried 96.3% of AAPL's off-exchange short volume that day. The Nasdaq TRF in Carteret handles most off-exchange trade reporting across the market, and this split shows it. The per-facility files matter when you want to know which venue a print came through; the consolidated file is the one to use for everything else.
Why is FINRA short volume not short interest?
Short volume is a flow: shares sold short during one session, in off-exchange trades only. Short interest is a stock: the number of shares still held short on a settlement date, which FINRA collects twice a month and publishes roughly two weeks later. The two do not reconcile, and a high short volume ratio does not mean a large short position. A market maker that fills a customer's buy order from inventory it does not hold sells short and prints a short sale; if it covers an hour later, the file shows the short sale with no trace of the purchase. On ordinary days the ratio for liquid names sits near one half, as the six-name panel above shows, and that market-making mechanic is the standard explanation. Short interest vs short volume unpacks the concept and what short interest is covers the position side; this post stays on getting the file. For the position series itself, start with FINRA short interest data, then when short interest is released and why short interest is two weeks old for the publication lag.
Known quirks in the FINRA short volume file
A few traits catch first-time users. Exchanges run test symbols through production systems, Nasdaq's ZVZZT family being the best known, and rows for them can appear in the files with real-looking volume; drop any symbol you cannot match to a listed security before charting it. In rare cases FINRA re-posts a day's file with corrected figures, labelled "Updated" on its catalog page, so a number pulled on the evening of the trade date can differ from the same file fetched a week later; re-fetch before you cite. The trailer line is a bare count with no pipes, and a naive parser that assumes six fields on every line will choke on it. Volumes are fractional from February 23, 2026 onward and whole before it. Only regular-hours trades count, and only those reported off-exchange to a FINRA facility, so the total volume column never matches the consolidated tape. These are traits of the file rather than defects, and a parser that knows them returns clean numbers.
FAQ
Where can I download FINRA daily short volume data for free?
From FINRA's public content server at cdn.finra.org/equity/regsho/daily/, one file per trading day named CNMSshvolYYYYMMDD.txt for the consolidated NMS file. No account is needed; a single curl command fetches it. FINRA's website also offers an interactive view with CSV export for up to seven days at a time.
Why is there no FINRA short volume file for a weekend or holiday?
Files are produced only for trade dates. A request for a weekend date or an exchange holiday returns HTTP 403 rather than an empty file, so a script that walks the calendar needs to skip non-trading days or tolerate the error.
Is FINRA daily short volume the same as short interest?
No. Short volume counts shares sold short during one day in off-exchange trades, including market-maker shorts covered within minutes. Short interest counts shares still held short on a settlement date, collected twice a month. A short volume ratio near 50% is ordinary for a liquid stock and says nothing about the size of any open short position.
Why does the FINRA short volume file contain decimals?
Since February 23, 2026, FINRA reports fractional share quantities for NMS stocks to six decimal places in all three volume fields. Files before that date contain whole shares only, so a parser that casts to integers will truncate the newer files.
What does the Market column mean in the FINRA short volume file?
It identifies the FINRA facility that received the trade report: N for the NYSE TRF, Q for the Nasdaq TRF in Carteret, B for the Nasdaq TRF in Chicago and D for the ADF. The consolidated CNMS file lists every facility that reported the symbol, comma-separated.
Every panel above ships with its SQL underneath; expand any one to see how a number was computed. To pull a symbol's short volume history without downloading a file at all, ask for it in plain English on the Strasmore terminal.