本周美股逼空候选股:回补天数与卖空持仓
本页按回补天数、卖空股数和股价是否已经上涨来筛选逼空候选股,每一道筛选门槛都写得明明白白,并附上历史统计的实际概率。
逼空候选股的筛选依据两种机制:相对于股票自身成交量而言过大的卖空持仓,以及已经在上涨的股价。本页基于交易所披露的最新一期卖空持仓数据文件(结算日 Jun 30, 2026)运行这套筛选,价格这一项则统计截至 Jul 20, 2026 的最近五个交易日。这些只是与历史逼空行情相似的机制特征,本页的任何内容都不构成预测,绝大多数被大量卖空的股票从未发生过逼空。
在看具体股票名字之前,请先看清楚日期。本页卖空持仓部分的数据之所以有几周的滞后,是监管规则决定的,而不是数据源本身出了问题:券商每个月按规定的两个结算日向 FINRA 报送卖空持仓,汇总后的文件大约在结算日之后八个工作日才对外公开。目前任何人能拿到的最新一期数据,结算日为 Jun 30, 2026,距今已经 22 天,而价格这一项统计到 Jul 20, 2026。这段时间差里空头到底做了什么,任何筛选器都看不到,本页也不例外。为什么卖空持仓数据总是滞后两周一文逐步梳理了整个报送周期。
每个数字背后的完整 SQL
WITH prints AS (
SELECT DISTINCT settlement_date AS d
FROM global_markets.stocks_short_interest
ORDER BY d DESC
LIMIT 2
),
loaded AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= now() - INTERVAL 20 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY session
HAVING count() >= 380
),
legs AS (
SELECT arrayJoin([
('Short interest, previous settlement', (SELECT min(d) FROM prints)),
('Short interest, latest settlement', (SELECT max(d) FROM prints)),
('Price tape, last fully loaded session', (SELECT max(session) FROM loaded))]) AS row
)
SELECT formatDateTime(row.2, '%b %e, %Y') AS as_of_date,
row.1 AS leg,
dateDiff('day', row.2, today()) AS age_days
FROM legs两期结算数据分别滞后 37 天和 22 天,这是每月两次的统计周期加上汇总耗时共同造成的。价格数据滞后 2 天,这一项则是数据仓库的入库延迟,与监管无关。这两类滞后天数都设有合理区间:一旦数据源停滞,本页会暂停更新,而不会顶着新的发布日期重复发布一份旧数据。
逼空候选股名单:当前筛选结果
下表中的每一只股票都在同一份数据文件上通过了同样的筛选条件:日均成交量至少 500 万股,回补天数达到 5 天或以上,并且在截至 Jul 20, 2026 的最近五个交易日内股价上涨。共有 36 只股票通过了全部条件,本页展示的是其中卖空最拥挤的 12 只。回补天数等于卖空股数除以日均成交量:即空头如果要把持仓全部买回,需要用掉这只股票全部成交量的多少个完整交易日。
每个数字背后的完整 SQL
WITH latest AS (
SELECT max(settlement_date) AS d FROM global_markets.stocks_short_interest
),
sessions AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= now() - INTERVAL 20 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY session
HAVING count() >= 380
ORDER BY session DESC
LIMIT 6
),
crowded AS (
SELECT ticker, days_to_cover, short_interest
FROM global_markets.stocks_short_interest
WHERE settlement_date = (SELECT d FROM latest)
AND avg_daily_volume >= 5000000
AND days_to_cover >= 5
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN today() - 60 AND today())
),
tape AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(close, window_start) AS rth_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN (SELECT ticker FROM crowded)
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT session FROM sessions)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker, session
),
moves AS (
SELECT ticker,
round((argMax(rth_close, session) / argMin(rth_close, session) - 1) * 100, 1) AS return_5d_pct
FROM tape
GROUP BY ticker
HAVING count() = 6 AND return_5d_pct > 0
)
SELECT c.ticker AS ticker,
round(c.days_to_cover, 1) AS days_to_cover,
round(c.short_interest / 1e6, 1) AS shares_short_m,
m.return_5d_pct AS return_5d_pct
FROM crowded c
INNER JOIN moves m ON m.ticker = c.ticker
ORDER BY c.days_to_cover DESC, c.ticker
LIMIT 12卖空最拥挤的是 MPT,卖空股数 138.1 百万股,回补天数达到 16.9 天,在截至 Jul 20, 2026 的这五个交易日里上涨了 5.8%。表格最后一行的回补天数为 6.5 天,这只是展示范围的截断点,而不是筛选门槛本身。排名依据是拥挤程度而不是持仓规模,因此一只在清淡成交上的中等仓位,排名可能高于一只在活跃成交上规模大得多的仓位。想看按规模排名的榜单,当前卖空最多的股票一文把两种榜单并列展示。
股价上涨这道门槛,有其机制上的原因。逼空的本质是空头平仓引发的被迫买入,而平仓意味着买回股票,只有当价格已经对持仓不利时,这个过程才会开始。逼空行情是如何发生的一文通过 GameStop 2021 年的真实记录,用数字还原了这一整个过程。
筛选规则,以及每一条规则剔除了什么
一个筛选器本质上是一种附带数字的观点,因此这里详细展示样本在每一步筛选中的变化。
每个数字背后的完整 SQL
WITH latest AS (
SELECT max(settlement_date) AS d FROM global_markets.stocks_short_interest
),
sessions AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= now() - INTERVAL 20 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY session
HAVING count() >= 380
ORDER BY session DESC
LIMIT 6
),
reported AS (
SELECT ticker, days_to_cover, avg_daily_volume
FROM global_markets.stocks_short_interest
WHERE settlement_date = (SELECT d FROM latest)
),
liquid AS (
SELECT ticker, days_to_cover
FROM reported
WHERE avg_daily_volume >= 5000000
AND days_to_cover IS NOT NULL
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN today() - 60 AND today())
),
crowded AS (
SELECT ticker FROM liquid WHERE days_to_cover >= 5
),
tape AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(close, window_start) AS rth_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN (SELECT ticker FROM crowded)
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT session FROM sessions)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker, session
),
rising AS (
SELECT ticker,
round((argMax(rth_close, session) / argMin(rth_close, session) - 1) * 100, 1) AS return_5d_pct
FROM tape
GROUP BY ticker
HAVING count() = 6 AND return_5d_pct > 0
),
tally AS (
SELECT (SELECT count() FROM reported) AS all_names,
(SELECT count() FROM liquid) AS liquid_names,
(SELECT count() FROM crowded) AS crowded_names,
(SELECT count() FROM rising) AS rising_names
)
SELECT step.1 AS label, step.2 AS names
FROM (
SELECT arrayJoin([
('Every name in the settlement file', all_names),
('Liquid: five million shares a day, no leveraged funds', liquid_names),
('Crowded: five or more days to cover', crowded_names),
('Rising: a positive move over the price window', rising_names)]) AS step
FROM tally
)Jun 30, 2026 这一期数据文件包含 22207 只证券。流动性门槛和剔除名单筛掉一部分后,剩下 885 只;拥挤度门槛把这个数字进一步压缩到 96 只;股价上涨这道门槛最终留下 36 只。每一道门槛都是一次选择,换一种选择就会得到不同的名单,这也是本页把规则直接写在正文里、而不是藏在脚注里的原因。
每家公司被卖空的比例有多高
多数人搜索时想找的数字,是“卖空持仓占流通股本的百分比”,而这份数据里并没有这个数字。交易所文件只披露卖空股数和日均成交量,不包含任何股数口径的股本数据。能够推算出来的,是卖空持仓相对于总股本的比例——用每家公司的市值除以股价得到总股本。
在这项统计中排名最高的是 KSS,卖空持仓占总股本的 26.3%:卖空 29.9 百万股,而该公司总股本为 113 百万股。这里展示的 10 行,是筛选样本中带有已公开股本数据的股票里比例最高的一批,最后一行的比例仍有 15.5%。请把这一列数字当作下限,而不是流通股本比例本身。流通股本只计算真正在市场上流通交易的股份,会剔除内部人持股和其他被锁定的股份。流通股本这个分母更小,因此卖空持仓占流通股本的真实比例,一定高于本页展示的每一个数字,具体高多少取决于每家公司的股权结构,而这正是本数据仓库没有收录的信息。
卖空拥挤度是在上升还是在消退?
单独一期数据只是一张静止的快照。同一份数据文件回溯了好几年,因此这个市场层面的问题是有数据可查的。
每个数字背后的完整 SQL
WITH dates AS (
SELECT DISTINCT settlement_date AS d
FROM global_markets.stocks_short_interest
ORDER BY d DESC
LIMIT 12
)
SELECT toString(settlement_date) AS settlement_date,
countIf(days_to_cover >= 5) AS names_5plus_dtc,
countIf(days_to_cover >= 10) AS names_10plus_dtc,
round(quantileExact(0.5)(days_to_cover), 2) AS median_dtc_liquid
FROM global_markets.stocks_short_interest
WHERE settlement_date IN (SELECT d FROM dates)
AND avg_daily_volume >= 5000000
AND days_to_cover IS NOT NULL
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
GROUP BY settlement_date
ORDER BY settlement_date在图中展示的 12 期结算数据中,回补天数达到 5 天或以上的流动性股票数量,从 58 只变化到了 96 只。分布中更罕见的一端,数量则始终稀薄得多:最新一期数据中,回补天数达到 10 天或以上的只有 5 只。流动性股票回补天数的中位数为 1.87 天,这正是把“5天”定为门槛有实际意义、而不是随意拍板的原因。回补天数最高的股票一文单独追踪这个极端尾部。
过去通常会发生什么
这类筛选器很容易搭建,也很容易被过度解读,因此这里把同一套筛选逻辑倒推回过去,采用与本页相同的时间间隔重新运行一遍。对过去一年里的每一期结算数据,找出当时通过了拥挤度门槛、并且在结算日之后20个日历日(也就是本页此刻所处的时间点)截止的六个交易日内股价上涨的股票,然后测量每一只股票在随后30个日历日里的表现。
每个数字背后的完整 SQL
WITH screened AS (
SELECT settlement_date, ticker
FROM global_markets.stocks_short_interest
WHERE settlement_date >= today() - 400
AND settlement_date <= today() - 55
AND avg_daily_volume >= 5000000
AND days_to_cover >= 5
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
),
split_hits AS (
SELECT s.settlement_date AS sd, s.ticker AS tkr
FROM screened s
INNER JOIN global_markets.stocks_splits sp ON sp.ticker = s.ticker
WHERE sp.execution_date > s.settlement_date + 11
AND sp.execution_date <= s.settlement_date + 50
),
daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(close, window_start) AS rth_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN (SELECT DISTINCT ticker FROM screened)
AND window_start >= now() - INTERVAL 400 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker, session
),
paired AS (
SELECT s.settlement_date AS sd,
s.ticker AS tkr,
(argMaxIf(d.rth_close, d.session, d.session <= s.settlement_date + 20)
/ argMinIf(d.rth_close, d.session, d.session <= s.settlement_date + 20) - 1) * 100 AS prior_pct,
(argMaxIf(d.rth_close, d.session, d.session >= s.settlement_date + 20)
/ argMinIf(d.rth_close, d.session, d.session >= s.settlement_date + 20) - 1) * 100 AS next_pct
FROM screened s
INNER JOIN daily d ON d.ticker = s.ticker
WHERE d.session > s.settlement_date + 11
AND d.session <= s.settlement_date + 50
GROUP BY sd, tkr
HAVING countIf(d.session <= s.settlement_date + 20) >= 4
AND countIf(d.session >= s.settlement_date + 20) >= 15
),
outcomes AS (
SELECT multiIf(next_pct < -20, 1,
next_pct < -10, 2,
next_pct < 0, 3,
next_pct < 10, 4,
next_pct < 20, 5, 6) AS bucket,
multiIf(next_pct < -20, 'Fell more than 20%',
next_pct < -10, 'Fell 10% to 20%',
next_pct < 0, 'Fell 0% to 10%',
next_pct < 10, 'Rose 0% to 10%',
next_pct < 20, 'Rose 10% to 20%', 'Rose more than 20%') AS move_over_30_days
FROM paired
WHERE prior_pct > 0
AND (sd, tkr) NOT IN (SELECT sd, tkr FROM split_hits)
),
tallied AS (
SELECT bucket, move_over_30_days, count() AS name_count
FROM outcomes
GROUP BY bucket, move_over_30_days
)
SELECT move_over_30_days,
name_count,
round(100.0 * sum(name_count) OVER (ORDER BY bucket) / sum(name_count) OVER (), 1) AS cumulative_share_pct
FROM tallied
ORDER BY bucket这些“股票+结算期”观测样本中,有 51.5% 在30天后股价更低。这个比例接近抛硬币,也是本页最诚实的结论:空头往往是对的,“拥挤且上涨”描述的只是一种设置条件,而不是一种优势。逼空真正会出现的地方是分布的两端尾部,而这两端都很稀薄:有 59 个观测样本下跌超过五分之一;有 70 个观测样本上涨超过五分之一——这正是真正的逼空行情会落入的区间。样本中有 87.3% 从未到达过那个区间。
请把这个面板当作一种分布,而不是一份交易结果。它没有计入交易成本、融券费用和仓位大小,而且对每一个被标记的股票给予同等权重。两个时间锚点都设定在每期结算日之后20个日历日,与本页当前使用的时间间隔完全一致,因此每一个被标记的股票,所对应的价格都是读者在当时真实能够看到的。一年的结算期数据,样本量并不算大。
统计方法说明
以上数字背后的每一条规则和剔除标准。
- 卖空持仓数据由交易所披露,每月两次。 本页使用的这一期数据结算日为 Jun 30, 2026,距今 22 天。美国没有按日披露的卖空持仓数字,只有数据商基于证券借贷数据建模估算出的估计值。
- 流动性门槛:日均成交量至少 500 万股,数据同样来自这份披露文件。如果没有这道门槛,榜单会被大量小盘股占满,它们极高的回补天数读数,只是成交量近乎为零造成的数字假象。
- 拥挤度门槛:回补天数达到 5 天或以上,明显高于上文展示的流动性股票中位数。
- 价格动能:最近六个已完整加载的常规交易日收盘价之间的变化,即五个交易日的涨跌幅。 只有当基准成交记录已经载入某一交易日完整一天的分钟K线后,该交易日才会被纳入窗口。仍在陆续加载中的交易日会被暂缓计入,而不是按不完整的数据去测量,因此即便某个交易日已经收盘,窗口末端也可能比日历上的当天晚一个交易日。所用价格均为常规交易时段的收盘价。
- 两类日期都设有合理区间。 顶部面板以天数记录每一项数据的滞后程度,这些天数都设有合理的取值范围。如果某一期结算数据的滞后超过一个月,或者价格数据的滞后超出正常的入库延迟,本页就会暂停发布以待人工核查,而不会顶着新的发布日期继续展示一份过时的数据。
- 剔除规则。 杠杆和反向交易所交易基金会从每一个面板中剔除(它们的卖空持仓主要是对冲操作留下的数字痕迹),另外还剔除了一个被数据供应商在两家不同公司之间重复使用过的代码。凡是涉及价格变动测量的面板,也会剔除那些在该面板自身测量窗口内发生过拆股的股票,因为拆股会伪造出一次大幅波动。在历史回测中,这项检验按每一期结算数据单独进行,因此某个月发生的一次拆股,不会连带剔除该股票在其他月份的观测样本。
- 基金和运营公司同时出现在这份数据文件里。 一只债券或指数 ETF 完全可能带有很大的卖空持仓,但这往往来自申购赎回机制本身的运作,而不是有人在押注它下跌。
- 这份数据文件不包含流通股本或任何股数口径的数据,本数据仓库中的任何地方也都没有期权未平仓合约数。上文的总股本一列,来自另一张单独的基本面数据表,因此没有公开市值数据的股票,不会出现在那个面板里。
- 本页的任何内容都不是预测或建议。 它只是描述可测量的条件,并附上了历史结果面板。
FAQ
如何寻找逼空候选股?
在交易所披露的卖空持仓数据中,筛选出相对于股票自身日成交量而言持仓过大的股票,再只保留流动性足以正常交易的名字,最后检查股价是否已经在上涨。本页对 Jun 30, 2026 这一期卖空持仓数据采用的具体标准是:回补天数达到 5 天或以上、日均成交量至少 500 万股、最近五个交易日股价上涨,最终筛选出 36 只股票。
卖空持仓比例达到多少会引发逼空?
不存在这样一个神奇的数字,任何给出具体数字的人都是在猜测。历史上的逼空行情,起点的卖空比例分布在很宽的区间里,而更常见的情况是什么都没有发生:回顾过去一年的历史结算数据,本筛选器当时标记出的股票中,有 51.5% 在30天后股价反而更低。高企的卖空持仓只是一个必要条件,从来都不是触发条件。
卖空持仓数据滞后多久?
本页收录的最新一期结算数据日期为 Jun 30, 2026,距今 22 天,价格数据则统计到 Jul 20, 2026。这段时间差是报送周期本身造成的,而不是数据源过时:卖空持仓每月统计两次,并在每个结算日之后大约八个工作日公布,因此不论在哪里看到的卖空持仓数字,公布时都已经有几周的滞后。
目前卖空最多的股票是哪些?
未经额外筛选的完整榜单——一份按回补天数排名,一份按卖空股数排名——见卖空最多的股票一文。本页回答的是一个更窄的问题:在 Jun 30, 2026 这一期数据中股价同时也在上涨的股票里,卖空最拥挤的是 MPT,回补天数 16.9 天——这是本筛选器给出的榜首,而不是整个市场卖空最多的股票。
每个面板都是基于交易所披露文件构建的已存储、带版本的查询。展开任意表格下方的 SQL,或者在 Strasmore 终端上换成自己的筛选门槛重新运行。