如何下载FINRA每日卖空成交量数据
使用 curl 获取 FINRA 每日卖空成交量文件,读取 Reg SHO 各列,并用 awk 计算代码的卖空成交量比率。固定日期,结果可复现。
要下载 FINRA 的每日卖空成交量数据,可从 FINRA 公共内容服务器按每个交易日获取一个纯文本文件:无需登录,也无需 API 密钥。该文件是 Regulation SHO 每日卖空成交量文件。文件按竖线分隔,每个代码对应一行,记录当天卖空成交量、总成交量,以及卖空豁免成交量子集。数据涵盖向 FINRA 交易报告设施申报的场外交易。
本指南固定使用一个历史日期:2026 年 6 月 12 日。我们将在全新的 Ubuntu 容器中完成以下步骤:安装 curl、下载文件、读取各列,然后使用 awk 计算一个代码的卖空成交量比率。所有命令均可直接运行,无论是今天还是一年后。
FINRA在哪里发布每日卖空成交量文件?
任何交易日的汇总文件都位于一个可预测的地址:
https://cdn.finra.org/equity/regsho/daily/CNMSshvolYYYYMMDD.txt
将 YYYYMMDD 替换为交易日期。CNMS 是NMS汇总文件(NMS即全国市场系统,涵盖交易所挂牌证券):其中包括所有挂牌股票,并汇总FINRA各交易报告设施(TRF)报告的成交数据。FINRA最迟会在交易日当天美国东部时间下午6点发布当日文件,速度基本已达到公开卖空数据的最快水平。
但这也意味着覆盖范围有限。该文件只统计报告给FINRA设施的交易。实际来看,这主要是交易所外成交,例如批发商执行零售订单的成交以及暗池成交。交易所内撮合的成交不在其中。因此,文件中的总成交量列始终小于价格图表显示的当日成交量。
文件只在交易日提供。如果请求周末日期或交易所休市日,服务器会返回403 Forbidden,而不是空文件。按日历遍历日期的脚本必须跳过这些日期,或能够处理该错误。
步骤一:使用安装了 curl 的全新 Ubuntu 容器
从一个干净的容器开始,并安装 curl。Ubuntu 基础镜像已自带 awk(实现为 mawk),因此无需安装其他组件:
docker run --rm -it ubuntu:24.04 bash
apt-get update && apt-get install -y curl
步骤 2:下载指定日期的 FINRA 每日卖空成交量文件
固定日期。围绕“今天”构建的命令在周末和节假日会失效,也会在每天早晨 FINRA 发布文件前失效。2026 年 6 月 12 日是正常交易的周五,该文件仍保存在服务器上:
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260612.txt
这些参数的作用如下:-f让 curl 在 HTTP 出错时失败,而不是将错误页面保存为数据;-s关闭进度显示;-S仍会输出真实错误;-L跟随重定向;-O按远程文件名保存文件。检查下载内容的首尾:
head -3 CNMSshvol20260612.txt
tail -1 CNMSshvol20260612.txt
第一行是表头,Date|Symbol|ShortVolume|ShortExemptVolume|TotalVolume|Market。最后一行是尾记录:一个单独的整数,表示文件中的数据记录数。任何解析器都必须删除这两行。现在请求下一个日历日,即 6 月 13 日星期六,以验证周末规则:
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/CNMSshvol20260613.txt
Curl 输出错误并以代码 22 退出:服务器返回 403,且 -f 拒绝了该请求。2026 年 6 月 19 日,即六月节假日,也会出现同样结果。同一系列的存档副本直接显示了日期分布:每个交易日一行,其他日期没有记录:
| 交易日期 | 星期 | 交易时段标签 | 报告股票数 | 股票标签 |
|---|---|---|---|---|
| 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 |
每个数字背后的完整 SQL
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 date2026 年 6 月生成了 21 个日期文件。第一个文件是 June 1,属于 Monday,包含 15.12 thousand 个代码。面板中的每一行都对应一个工作日,6 月 19 日没有记录。
FINRA卖空成交量文件中的各列代表什么?
每条数据记录包含六个由竖线分隔的字段。
Date是交易日期,格式为YYYYMMDD。Symbol是ticker,最多14个字符。ShortVolume是当日向FINRA报告的交易中卖空的股数,包括卖空豁免交易。ShortExemptVolume是其中被标记为卖空豁免的部分,即标记为豁免Reg SHO规则201价格测试的交易。该测试是一项熔断机制。当股票较前一交易日收盘价下跌10%后,规则会限制卖空。TotalVolume是该标的当日报告的全部成交股数,包括卖空和买入成交。Market是报告设施:N代表NYSE TRF,Q代表位于Carteret的Nasdaq TRF,B代表位于芝加哥的Nasdaq TRF,D代表Alternative Display Facility(ADF)。
在合并文件中,Market字段会以逗号分隔的形式列出报告该标的的所有设施,因此一行可能以类似B,Q,N的内容结尾。这些逗号正是文件使用竖线作为分隔符的原因。还需注意一项近期变化:自2026年2月23日起,三个成交量字段会保留六位小数,出现小数点后六位的数值属于正常情况。该日期之前的文件只包含整数。若解析器将数值转换为整数,新文件中的小数部分会被静默截断。
如何用 awk 计算卖空成交量占比?
卖空成交量占比等于卖空成交量除以总成交量,以百分比表示。下面这一行 awk 命令可计算单个股票代码的占比:
awk -F'|' '$2 == "AAPL" { printf "%s %s short=%s total=%s ratio=%.1f\n", $1, $2, $3, $5, 100 * $3 / $5 }' CNMSshvol20260612.txt
-F'|'将竖线设为字段分隔符,$2 == "AAPL"只保留 AAPL 所在行(表头和文件尾行都不会匹配),而 printf 用第 3 个字段除以第 5 个字段。替换股票代码即可计算其他标的。下方表格从已存储的 FINRA 系列中读取六只知名股票同一日期的数据,并将数值四舍五入到百万股,便于你将刚才运行的命令与表格结果进行核对:
| ticker | 卖空量(百万) | 总成交量(百万) | 卖空占比(%) |
|---|---|---|---|
| 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 |
每个数字背后的完整 SQL
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 ticker6月12日,2026年,文件记录的 AAPL 卖空成交量为 6.66 百万股,总成交量为 13.16 百万股,卖空成交量占比为 50.6%。其他五只股票也处于相近水平,这正是该文件的通常状态;后文将解释,为何接近二分之一的占比并不像表面上看起来那样值得警惕。
单日数据只是一个截面,占比会随交易日变化。每天下载一份文件,即可自行构建整个月的时间序列。
CNMS文件与各报告设施文件有什么区别?
CNMS是汇总文件。FINRA也会按相同时间表发布每个报告设施的单独文件。文件布局和日期标记相同,但前缀不同:FNSQshvol代表Nasdaq TRF Carteret(Market Q),FNQCshvol代表Nasdaq TRF Chicago(B),FNYXshvol代表NYSE TRF(N),FNRAshvol代表ADF(D)。第五个文件FORFshvol对应OTC Reporting Facility,负责处理未上市场外股票,不属于CNMS。下载指定日期的Carteret文件,并提取同一股票代码:
curl -fsSLO https://cdn.finra.org/equity/regsho/daily/FNSQshvol20260612.txt
awk -F'|' '$2 == "AAPL"' FNSQshvol20260612.txt
对FNQCshvol20260612.txt和FNYXshvol20260612.txt执行相同的两行命令后,三个ShortVolume字段相加,结果与CNMS数据精确到最后一位小数。该日期的ADF文件只有文件头和数值为0的文件尾,这种情况很常见。以下是AAPL的拆分数据:
| 交易场所 | 卖空量(百万) | 占合并市场比例(%) |
|---|---|---|
| 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 |
每个数字背后的完整 SQL
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) DESC当天,Nasdaq TRF Carteret (Q)占AAPL场外卖空成交量的96.3%。Nasdaq TRF Carteret负责市场上大部分场外交易报告,这一拆分数据体现了这一点。若要了解某笔成交来自哪个交易场所,应使用各设施文件;其他情况下则应使用汇总文件。
为什么FINRA卖空成交量不是卖空持仓量?
卖空成交量是流量指标:它表示单个交易时段内卖空的股票数量,且仅涵盖场外交易。卖空持仓量是存量指标:它表示在结算日仍处于卖空状态的股票数量。FINRA每月收集两次该数据,并在约两周后发布。两者无法相互核对。卖空成交量比率较高,也不代表卖空持仓规模较大。
如果做市商没有持有客户想买入的股票,却用卖空方式执行该买单,就会形成一笔卖空成交记录。如果做市商一小时后回补,文件中只会显示这笔卖空交易,不会留下对应买入的记录。普通交易日中,流动性较高股票的卖空成交量比率通常接近一半,上方的六只股票面板也体现了这一点。这种做市机制是最常见的解释。卖空持仓量与卖空成交量的区别将进一步解释这一概念,什么是卖空持仓量则介绍持仓数据的一面;本文只讨论如何获取该文件。
如需查看持仓数据序列,可先从FINRA卖空持仓量数据开始,然后阅读卖空持仓量何时发布和为什么卖空持仓量会滞后两周,了解数据发布的时间滞后。
FINRA卖空成交量文件的已知特征
首次使用者需要注意几个特征。交易所会通过生产系统运行测试代码,Nasdaq 的 ZVZZT 系列最为知名。文件中可能出现这些代码对应的行,并带有看似真实的成交量。在绘图前,应剔除所有无法与上市证券匹配的代码。
在少数情况下,FINRA 会重新发布某个交易日的文件并更正数据。其目录页会标注“Updated”。因此,在交易日当晚提取的数字,可能与一周后再次下载的同一文件不同。引用数据前应重新下载。
文件末尾一行只是一个不含竖线的计数值。如果解析器默认每行都有六个字段,就会在这里报错。
2026 年 2 月 23 日起,成交量可以是小数;此前为整数。文件只统计正常交易时段内、向 FINRA 设施报告的场外交易,因此总成交量列不会与综合行情带一致。
这些都是文件本身的特征,而非缺陷。了解这些规则的解析器可以返回干净、可靠的数据。
常见问题
哪里可以免费下载 FINRA 每日卖空成交量数据?
可从 FINRA 公共内容服务器 cdn.finra.org/equity/regsho/daily/ 下载。每个交易日对应一个文件。合并后的 NMS 文件命名为 CNMSshvolYYYYMMDD.txt。无需注册账户,使用一条 curl 命令即可获取。FINRA 网站还提供交互式查询页面,并支持导出 CSV;每次最多可查询七天。
为什么周末或节假日没有 FINRA 卖空成交量文件?
文件只会针对交易日期生成。请求周末或交易所假日的日期时,服务器会返回 HTTP 403,而不是空文件。因此,按日历遍历日期的脚本需要跳过非交易日,或能够处理该错误。
FINRA 每日卖空成交量是否等同于卖空持仓量?
不是。卖空成交量统计的是场外交易中某一天卖空的股票数量,其中包括几分钟内就回补的做市商卖空交易。卖空持仓量统计的是在结算日仍未回补的空头持仓,每月汇总两次。对于流动性较高的股票,卖空成交量比率接近 50% 很常见,不能据此判断未平仓空头头寸的规模。
为什么 FINRA 卖空成交量文件中包含小数?
自 2026 年 2 月 23 日起,FINRA 将 NMS 股票的零股数量报告至小数点后六位,涵盖三个成交量字段。此前的文件只包含整数股数。因此,将字段转换为整数的解析程序会截断新文件中的数据。
FINRA 卖空成交量文件中的 Market 列是什么意思?
该列标识接收交易报告的 FINRA 设施:N 代表 NYSE TRF,Q 代表位于 Carteret 的 Nasdaq TRF,B 代表位于芝加哥的 Nasdaq TRF,D 代表 ADF。合并后的 CNMS 文件会列出报告该股票代码的所有设施,并以逗号分隔。
上方每个面板下方都附有对应的 SQL。展开任意面板,即可查看相关数字的计算方式。若不想下载文件,也可以用自然语言在 Strasmore terminal 中查询某个股票代码的卖空成交量历史。