Strasmore Research
学习 Matt Connor作者: Matt Connor · 更新于 2026-10-03

如何下载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年6月每日做空成交量文件中的证券代码
21 rows (showing 20)
交易日期星期交易时段标签报告股票数股票标签
2026-06-01MondayJune 11511815.12 thousand
2026-06-02TuesdayJune 21490714.91 thousand
2026-06-03WednesdayJune 31483914.84 thousand
2026-06-04ThursdayJune 451365.14 thousand
2026-06-05FridayJune 51474014.74 thousand
2026-06-08MondayJune 81481514.81 thousand
2026-06-09TuesdayJune 91475114.75 thousand
2026-06-10WednesdayJune 1056945.69 thousand
2026-06-11ThursdayJune 111468714.69 thousand
2026-06-12FridayJune 121473414.73 thousand
2026-06-15MondayJune 151494814.95 thousand
2026-06-16TuesdayJune 1656315.63 thousand
2026-06-17WednesdayJune 171461114.61 thousand
2026-06-18ThursdayJune 181470014.70 thousand
2026-06-22MondayJune 221492214.92 thousand
2026-06-23TuesdayJune 2357675.77 thousand
2026-06-24WednesdayJune 241474314.74 thousand
2026-06-25ThursdayJune 251471614.72 thousand
2026-06-26FridayJune 261505215.05 thousand
2026-06-29MondayJune 2954895.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 date
自己运行这个查询

2026 年 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 系列中读取六只知名股票同一日期的数据,并将数值四舍五入到百万股,便于你将刚才运行的命令与表格结果进行核对:

查询2026年6月12日六大知名公司的做空成交量比率
ticker卖空量(百万)总成交量(百万)卖空占比(%)
AAPL6.6613.1650.6
AMZN5.8821.7627
KO2.063.6556.3
MSFT3.7314.2426.2
NVDA15.1945.3433.5
SPY7.4815.4848.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 ticker
自己运行这个查询

6月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的拆分数据:

查询2026年6月12日AAPL场外做空成交量的报告来源
交易场所卖空量(百万)占合并市场比例(%)
Consolidated (CNMS)6.659100
Nasdaq TRF Carteret (Q)6.41296.3
NYSE TRF (N)0.1942.9
Nasdaq TRF Chicago (B)0.0530.8
ADF (D)00
每个数字背后的完整 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 中查询某个股票代码的卖空成交量历史。