成交量分布因子 (Volume Distribution Factors)

大白话:不看你买不买、卖不卖,只看这一天里成交量是怎么分布的——是均匀铺在 240 分钟上,还是集中在某一小段时间里。同一份分钟成交量数据,换一个视角(对数、变化率、累计)再配一个统计量(偏度、峰度、厚尾、均值),就能得到 7 个彼此相关性不高的因子。

这页覆盖研报第 2 章的7 个常见成交量分布因子。第 3 章的两个异构族(分桶熵、极大值分布)见 成交量分桶熵与极大值分布因子,第 4 章的三个同价成交量因子见 同价成交量分布因子。

为什么不能直接用分钟成交量

分钟级成交量有两个绕不开的问题,研报第 2.1 节讲得很清楚:

一是稀疏。 流动性差的股票很多分钟根本没有撮合,样本缺失且自相关更强,参数估计会失真(Hasbrouck, 1991)。

二是日内 U 型周期。 开盘和收盘附近的成交量显著高于其他时段(Wood, McInish & Ord, 1985 最早记录;Admati & Pfleiderer, 1988 给出解释:非知情交易者喜欢扎堆交易,减少遇到知情交易者时的逆向选择成本)。这意味着分钟成交量不是独立同分布的,直接算均值方差没有意义。

所以办法是两步:先把原始成交量「异构」成不稀疏的数据,再用不依赖分布假设的非参统计量去描述它。

通用构造框架

设 \text{vol}_{New} 是异构后的分钟成交量时间序列向量,g 是基于方法 f 从它算出的指标。研报写为:

g = f\big(\mathrm{Reorder}(\boldsymbol{vol}_{New})\big) = f(\boldsymbol{vol}_{New})

等号右边成立的前提是:g 对 \text{vol}_{New} 的时间位置不敏感——先把分钟重新排序再算,结果必须一样。这正是「用分布统计量而不是用时序统计量」的原因:偏度、峰度、分位数占比都与分钟先后无关,U 型周期的影响因此被削掉。

时序上再做一个操作:对高频指标 F 取近 n_s 日的均值与标准差(研报里 n_s = 20):

F\_Mean_{Di} = \frac{1}{n_s}\sum_{j=1}^{n_s} F_j

F\_STD_{Di} = \frac{1}{n_s}\sum_{j=1}^{n_s}\left(F_j - \frac{1}{n_s}\sum_{j=1}^{n_s} F_j\right)^2

日频调仓,用 F\_Mean 或 F\_STD 做因子。

三个族、七个因子

族一:对数成交量(3 个)

成交量近似服从对数正态分布,所以直接取对数:

\text{vol}_{New} = \text{logvol} = \log(\text{volume})

因子名 构造方法
logvol_skew 对数成交量偏度
logvol_90tail 对数成交量厚尾:90% 分位数以上占比
logvol_10tail 对数成交量厚尾:10% 分位数以下占比

厚尾占比是最直观的「量是否集中在少数几分钟」:如果全天成交量有 10% 以上集中在 90 分位线以上,说明这只股票全天只有少数几分钟在放量,典型的消息驱动形态。

族二:成交量变化率(2 个)

稀疏股票的分钟序列没法直接算变化率(上一分钟是 0 或缺失)。研报的做法是把分钟重新切片——改成 15 分钟一根——来修正稀疏问题,再算变化率。

因子名 构造方法
volroc_skew 15 分钟成交量变化率偏度
volroc_kurt 15 分钟成交量变化率峰度

偏度看激增(单侧长尾 = 有几次暴量),峰度看稳定(双侧尖峰厚尾 = 变化率忽大忽小)。

族三:累计成交量(2 个)

U 型周期是最难剔除的:既不能简单按时间分区做比值(那样每个因子的横截面差异几乎全是市场共性),也必须保留日内变化趋势。累计化正好两头兼顾——累加之后序列单调递增,U 型被拉平,但形状信息还在。

因子名 构造方法
cumsumvol_mean 累计成交量均值
cumsumvol_std 累计成交量标准差

表现

日度 IC 测试(表 5):

因子 IC 均值 IC 标准差 ICIR T 统计量
logvol_skew 3.03% 6.68% 0.45 19.80
logvol_90tail 2.90% 5.01% 0.58 25.26
logvol_10tail 2.20% 5.73% 0.38 16.74
volroc_skew 2.06% 4.73% 0.44 18.99
volroc_kurt 1.98% 4.50% 0.44 19.19
cumsumvol_mean 3.04% 8.20% 0.37 16.18
cumsumvol_std 2.25% 8.04% 0.28 12.21

7 个因子的 IC 均值都在 2% 上下,ICIR 最高的是 logvol_90tail(0.58)。

日度组合回测(表 6,回测区间 2014-09-01 — 2022-07-01,剔除不在市、涨跌停与特殊处理股票,多空为两组按因子值加权):

因子 多空年化 多头年化 空头年化 年化波动率 夏普比率 最大回撤 胜率 换手率
logvol_skew 41.92% 20.49% −15.62% 6.77% 6.19 −5.67% 63.81% 18.89%
logvol_90tail 34.63% 22.28% −9.55% 5.39% 6.42 −4.86% 66.70% 24.86%
logvol_10tail 19.69% 17.06% −3.07% 5.60% 3.51 −6.94% 58.67% 29.83%
volroc_skew 22.40% 14.70% −6.24% 4.48% 5.00 −5.50% 63.71% 31.59%
volroc_kurt 21.79% 14.44% −6.04% 4.28% 5.09 −5.41% 64.71% 28.48%
cumsumvol_mean 35.56% 15.60% −16.12% 8.92% 3.98 −12.41% 59.72% 26.28%
cumsumvol_std 19.70% 13.06% −6.83% 7.86% 2.51 −16.33% 55.41% 21.91%

7 个因子的多空净值长期上升,近几年无明显回撤。多头年化最高的是 logvol_90tail(22.28%),夏普最高也是它(6.42);logvol_skew 多空 41.92%、夏普 6.19。

因子之间的相关性:同一个数据,不同视角

表 7 给出 7 个因子的时序相关性矩阵,几个值得注意的地方:

  • 组内相关性低:logvol_10tail 对 volroc_skew 是 −0.10,logvol_skew 对 volroc_kurt 是 −0.10。也就是说对数族和变化率族几乎不重复。
  • 同族内部高相关:volroc_skew 对 volroc_kurt 是 0.95,cumsumvol_mean 对 cumsumvol_std 是 0.95——每个族里的两个因子测的基本是同一件事。
  • 跨族中等相关:logvol_10tail 对 cumsumvol_mean 是 0.66、对 cumsumvol_std 是 0.70。

研报第 2.3 节的结论:除累计成交量因子外,各因子的组内相关性都低。即使用的是同一份成交量数据,经过不同的异构方式、不同的分布函数,得到的也是不同的信息。

与前序 14 个收益率分布因子的相关性(表 6 之后的箱型图):各成交量因子的相关性上四分位数均小于 0.6,均值与中位数均小于 0.4,最大值基本在 0.7 以下。其中 logvol_skew 相关性均值约 0.37、中位数约 0.34、最大 0.62(与已实现方差因子 real_var)。换一份数据(量而不是价)确实带来额外 Alpha。

与本 wiki 其他页面的接口

  • 订单不平衡分布 — 同样是「分布本身有信息」的思路,但那边是订单簿方向上的不平衡,这边是成交量在时间上的分布形态
  • Value Area and Volume Nodes — Market Profile 体系也用「成交量在价格上的分布」,但那边关注价格维度的接受/拒绝,这边关注时间维度
  • 市场深度与冲击反比 — 稀有的成交量放大往往伴随价格冲击,与本页「量分布不均 = 有信息到来」的解读方向一致

Open Questions

  • cumsumvol 的异构细节没写清。研报只说「从时间维度出发对成交量进行异构,同时其异构的方式需要保留成交量的日内变化趋势,并尽量避免周期效应」,然后给出「累计成交量均值 / 标准差」两个名字。是先算日内累计曲线再取该曲线的均值/标准差,还是别的算法,无法从文本确定
  • 分位数取等宽还是等频未说明。对数成交量的 90% 分位占比这个统计量对分桶方式敏感
  • 厚尾因子的方向没有交代。logvol_90tail 因子值大表示成交量更集中于少数几分钟,研报没说这该看多还是看空,只给绩效数字
  • F\_STD 用了 20 日、vol_max 用了 15 日,窗口不同但没有解释为什么,也未做敏感性检验
  • 与已实现方差因子相关性最高(logvol_skew 0.62、vsa_high2min 0.69、vsa_ratio 0.68),说明这批因子有一部分信息其实是波动率信息的影子

Sources