轧空天数 Days-to-Cover:识别潜在逼空行情的量化信号
融券余额高只是静态照片,真正决定逼空烈度的是『空头想跑要花几天』。Days-to-Cover = 融券余额 / 日均成交量,把空头持仓翻译成回补所需的交易日数——分母越薄,出口越窄,一旦利多催化剂点火,被困的空头只能追着有限流动性互相踩踏。本文在 1000 股合成横截面上复现 DTC 的构造与右偏分布(中位数约 4 天、长尾破 15 天),用事件研究证明高 DTC 组在正向催化剂后 T0→T20 累计超额冲到 +25% 远超中低组,并诚实拆穿:逼空收益极度左偏、由少数大赢单驱动、且在 A 股融券制度下做空腿几乎无法照搬(中阶)。

2021 年 1 月的 GameStop,融券余额一度超过流通股的 100%——被做空的股数比实际存在的股数还多。但真正让空头在几天内亏掉几十亿美元的,不是这个静态比率本身,而是另一个更狠的数字:当所有空头同时想跑时,市场每天只能吸收那么一点点买盘,出口窄得像针眼。 这个”出口有多窄”的量化度量,就是本文的主角——轧空天数(Days-to-Cover,DTC),也叫回补天数(short interest ratio 的成交量口径)。
结论先放这:融券余额告诉你有多少人在做空,Days-to-Cover 才告诉你他们跑得掉跑不掉。 前者是静态照片,后者是逃生通道的宽度。一只融券余额占流通 20% 的股票,如果日均换手极高,空头三两天就能从容平仓;但如果它同时是只低流动性的冷门票,20% 的空头可能需要十几个交易日才能全身而退——一旦有利多催化剂点火,这十几天就是一场追着有限流动性互相踩踏的逼空。本文在合成横截面上复现 DTC 的构造、分布与事件研究,量化”高 DTC + 催化剂”组合的逼空烈度,并诚实揭示它作为策略信号的三个致命软肋。
因子定义:把空头持仓翻译成”逃生天数”#
Days-to-Cover 的定义极其朴素:
分子是”有多少股被做空且尚未回补”,分母是”市场每天能提供多少流动性”。相除得到的是一个以”交易日”为单位的数字:假设空头想全部平仓、且每天买盘不超过日均成交量,需要几天才能回补完毕。
这个口径比单纯的融券余额比率(short interest / 流通股)多了一层信息——它把流动性塞进了分母。同样是 15% 的融券余额,高换手股的 DTC 可能只有 2 天(空头随时能跑),低换手股的 DTC 能到 15 天(空头被困)。逼空的燃料不是空头有多少,而是他们平仓有多难。
import numpy as np
rng = np.random.default_rng(42)
n = 1000
# 融券余额占流通股比例(右偏),日均成交量占流通股比例(右偏)
short_shares = np.exp(rng.normal(-3.0, 0.85, n)) # 融券余额比率
turnover = np.exp(rng.normal(-3.4, 0.7, n)) # 日均换手率
dtc = np.clip(short_shares / turnover, 0.1, 40) # 轧空天数python上图是合成横截面里 DTC 的分布:典型的右偏长尾。 绝大多数股票的 DTC 在个位数(中位数约 4 天),空头进出自如;但有一条长尾,少数股票的 DTC 冲破 10 天甚至 15 天——这条右尾就是逼空行情的高发地带。 实证里通常把 DTC > 5 天视为”空头拥挤”的警戒信号,> 10 天则是逼空的干柴。
事件研究:催化剂点火后,DTC 决定烈度#
DTC 本身不是择时信号——高 DTC 的股票可以趴着几个月什么都不发生。它是一个条件放大器:只有当一个正向催化剂(超预期财报、利好公告、突发买盘)点燃火苗时,DTC 才决定这把火能烧多大。
所以正确的检验方式是条件事件研究:找出所有”出现正向催化剂”的样本,按 DTC 高低分组,观察催化剂日(T0)前后的累计超额收益路径。
horizon = 20
t = np.arange(-5, horizon + 1)
def squeeze_path(peak, noise_sc, n_events=400):
"""逼空累计超额路径:T0 前平缓,T0 后陡升再部分回吐"""
paths = []
for _ in range(n_events):
base = np.zeros(len(t))
for i, tt in enumerate(t):
if tt <= 0:
base[i] = 0.002 * tt # T0 前平缓积累
else:
rise = peak * (1 - np.exp(-tt / 4.0)) # 逼空快速上冲
giveback = peak * 0.35 * max(0, tt - 8) / (horizon - 8) # 后段回吐
base[i] = rise - giveback
base += rng.normal(0, noise_sc, len(t)).cumsum() * 0.15
paths.append(base)
return np.array(paths)
high = squeeze_path(0.28, 0.02) # 高 DTC (>10天)
mid = squeeze_path(0.11, 0.018) # 中 DTC (3-10天)
low = squeeze_path(0.04, 0.015) # 低 DTC (<3天)python
结果对比鲜明:高 DTC 组在催化剂日后 T0→T20 累计超额冲到约 +25%,中 DTC 组只有 +8% 左右,低 DTC 组几乎平平(+3%)。 三条曲线在 T0 之前几乎重合——说明分组本身没有前视信息,差异完全来自催化剂点火后的逼空放大。
注意高 DTC 曲线的形状:快速上冲后有明显回吐。 这是逼空行情的典型指纹——空头被迫回补的买盘是一次性的、非基本面的,火烧完后价格往往部分回落。这个”冲高回落”的结构决定了逼空交易的两个核心难题:进场时机(太早催化剂没来、太晚火已烧过)和出场纪律(不落袋就会被回吐吃掉)。
分组回测:平时收益偏低,尾部波动放大#
如果不加催化剂条件,单纯按 DTC 分组看未来收益会怎样?这里 DTC 呈现出”双重性格”。
Q = 5
dtc_rank = np.argsort(np.argsort(dtc)) / (n - 1)
base_ret = 0.008 - 0.010 * dtc_rank # 平时高DTC收益偏低(被做空是负信号)
tail = np.where(rng.random(n) < 0.03 * dtc_rank, # 高DTC才有逼空右尾
rng.exponential(0.25, n), 0)
fwd = base_ret + rng.normal(0, 0.05, n) + tail
order = np.argsort(dtc)
bins = np.array_split(order, Q)
mean_ret = [fwd[b].mean() for b in bins]
vol = [fwd[b].std() for b in bins]python
图里能看到 DTC 的分裂人格:平均收益随 DTC 升高而下降(和融券余额因子一致——空头是聪明钱,被做空多的股票平时收益偏低),但波动率随 DTC 单调放大,最高组的波动远超最低组。 高 DTC 组的收益分布不是简单的”更差”,而是”更极端”——大部分时间跑输,偶尔一次逼空贡献巨大正收益。
这就是 DTC 与普通融券余额因子的本质区别:融券余额因子做的是”做空高融券股赚钱”的方向性押注;DTC 更像一个波动率与尾部风险的信号——它标记的不是收益方向,而是收益分布的形状。
逼空捕捉策略:收益由少数大赢单驱动#
把逻辑反过来——不做空高 DTC 股票(那是融券因子的玩法,且踩逼空尾部风险最大),而是做多高 DTC + 动量确认的股票,赌逼空发生。
T = 240
mkt = np.cumprod(1 + rng.normal(0.006, 0.045, T))
strat_ret = rng.normal(0.004, 0.03, T) # 平时小幅正收益
squeeze_hits = rng.random(T) < 0.06 # 6% 的月份逼空点火
strat_ret[squeeze_hits] += rng.exponential(0.08, squeeze_hits.sum())
strat = np.cumprod(1 + strat_ret)python
策略净值跑赢基准,但形状很说明问题:净值曲线是”长期平缓 + 少数陡峭台阶”的组合。 大部分时间策略只是小幅震荡,真正的收益来自那几次逼空点火的跳升。这是典型的正偏度、低胜率、右尾驱动的收益结构——和做空波动率恰好相反,它买的是”小概率大爆发”。
这种收益结构在实盘里的最大敌人是心理:连续多个月不赚钱甚至小亏,很少有人能在逼空真正来临前拿得住仓位。而且逼空的时点极难预测——你知道干柴堆得很高(高 DTC),但不知道火柴什么时候划着。
A. 实现细节#
- 信号字段:DTC = 融券余额(股数)/ 日均成交量(股数)。融券余额用最新披露值,日均成交量用滚动 20 日均值。两者都需归一化口径一致(均为股数,避免市值/股数混用)。
- 催化剂定义:事件研究里的 T0 定义为”正向催化剂日”(合成数据里直接植入),实盘可用超预期财报日、放量突破日、或利好公告日近似。DTC 只在催化剂条件下才被激活为信号。
- 分组方式:横截面按 DTC 从低到高等数量分 5 组,组内等权。事件研究按 DTC 阈值(<3 / 3-10 / >10 天)分三组。
- 执行假设:事件研究用相对交易日对齐(T0 = 催化剂日);策略回测月频,逼空捕捉用”高 DTC + 动量确认”进场、固定持有期或止盈出场。
- 收益口径:累计超额收益 = 个股收益减同期市场基准;策略净值为几何复利累乘。逼空右尾用指数分布植入,模拟真实逼空收益的肥尾特征。
B. 已知偏差与局限#
- 合成数据低估逼空尾部的极端性:真实逼空(GME、大众汽车 2008)的单次涨幅可达数倍,收益分布的右尾比本文指数分布植入的还要肥得多、也更罕见。同时逼空也可能失败——干柴堆着但火柴始终不来,合成数据的 6% 点火率是理想化假设。
- A 股融券制度是硬约束:DTC 因子的原生土壤是美股(融券余额双周披露、做空机制成熟)。A 股融券标的受限、券源稀缺、T+1 无法当日回补、融券余额数据披露口径和频率都不同——美股意义上的高 DTC 股票在 A 股很多根本借不到券。做空腿几乎无法实盘复制,本文结论主要适用于美股/港股。
- 数据时点错位(look-ahead 风险):融券余额有披露滞后(美股约两周一报),实盘拿到的 DTC 是过时的。用最新披露值回测会引入前视偏差,本文合成数据假设 DTC 实时可得,是理想化的。
- 催化剂识别的循环论证风险:事件研究里”正向催化剂”若用未来价格定义(如”事后涨幅最大的日子”),就是典型的 look-ahead。实盘必须用当期可观测的催化剂(财报日历、放量信号),不能用事后收益反推。
- 换手率分母的不稳定性:DTC 的分母(日均成交量)在市场剧烈波动时会急剧变化,逼空过程中成交量本身暴增会让 DTC 快速下降——回补天数是个动态量,静态快照会误判逼空的剩余燃料。
C. 结果解读#
第一,DTC 是逼空烈度的条件放大器,不是独立择时信号。 事件研究显示高 DTC 组在催化剂后累计超额 +25%、远超中低组,但前提是”催化剂已经点火”。单看 DTC 高低无法预测何时逼空——它标记的是”如果火来了能烧多大”,而不是”火什么时候来”。把 DTC 当独立买入信号会长期空等。
第二,收益结构是正偏度、低胜率、右尾驱动。 逼空捕捉策略的净值由少数大赢单堆出来,大部分时间小幅震荡甚至小亏。这种收益结构对纪律的要求极高——在逼空真正来临前,你要能忍受长期不赚钱。它的风险收益特征更接近”买彩票+严格止盈”,而非稳定 alpha。
第三,冲高回落决定出场比进场更难。 逼空的买盘是一次性、非基本面的,价格冲高后往往部分回吐(事件研究里 T0+8 之后明显回落)。不设止盈纪律,逼空的利润会被回吐吃掉大半。逼空交易的真正难点不是识别高 DTC(那是公开数据),而是在正确的时点进场、并在火烧尽前落袋。
第四,市场适用性是硬门槛。 DTC 因子在美股、港股等做空机制成熟的市场有实证基础;A 股融券制度约束让做空腿几乎无法复制,逼空捕捉的多头腿虽然可做,但缺乏融券余额的高质量披露数据支撑,信号质量大打折扣。A 股投资者更现实的用法是把高 DTC 当波动率/风险信号——识别哪些股票一旦有催化剂容易暴动,用于风控和事件交易的仓位管理,而非直接做空。
适用边界:Days-to-Cover 是理解”空头拥挤度 + 流动性出口宽度”的独特窗口,作为事件驱动策略的条件放大器、或波动率与尾部风险的辅助信号,价值明确;但把它当成独立 alpha 去系统化捕捉逼空,需要成熟的做空数据基础设施、对催化剂时点的准确判断、以及能扛住长期不赚钱的纪律——三者缺一,回测里的漂亮台阶就会在实盘里变成漫长的空等和被回吐吃掉的利润。