收益率分布因子 (Return Distribution Factors)

大白话:把一天里 239 个分钟收益率当成一个样本,不问「哪一分钟涨了」,只问「这一堆数整体长什么形状」——平均多高、抖得多厉害、往哪边歪、尾巴多厚、涨的那半和跌的那半是否对称。形状本身就是选股信号。

本页对应兴业金工《高频研究系列二》第 2–3 章与附录;同一篇报告第 4–5 章的收益率噪音偏离因子另见 收益率噪声偏离因子 (nos)。

什么叫「用了分布信息」

研报给了一个可以动手检验的判据。设 \boldsymbol r 是当日分钟收益率按时间排成的向量,g 是由方法 f 算出的指标。如果把分钟顺序任意打乱、指标不变:

g = f\big(\mathrm{Reorder}(\boldsymbol r)\big) = f(\boldsymbol r)

就说 g 只用到了分布信息,没有用到时序信息。

具体例子:偏度、峰度、方差、90% 分位数,打乱分钟顺序都不变,属于分布信息;而「相邻两分钟收益率的相关系数」打乱后一定变,属于时序信息(系列六用的正是这个判据的反面,见 时序自相关性与非同步交易因子)。

数据与两个绕不开的麻烦

数据是上交所、深交所的 Level-2 行情。按发布频率从低到高:分钟 K 线(60 秒)、快照(3 秒)、逐笔(0.01 秒)。本篇只用分钟 K 线,每个交易日 239 个样本点。

麻烦一:稀疏。 流动性差的股票很多分钟根本没有撮合,缺失的成交价用上一笔成交价填补,价格长时间落在正负一个基点内(研报图 3:某只低流动性股票的分时线是一条台阶)。这样的样本自相关更强,直接套参数估计会失真(Hasbrouck, 1991)。

麻烦二:不是独立同分布。 239 个点并不来自同一个分布。Barndorff-Nielsen 和 Shephard (2010) 把已实现方差按收益率的正负拆成上行波动率 RV^+ 与下行波动率 RV^-,两者分布明显不同(研报图 4:RV^+ 的右尾比 RV^- 厚得多)。既然正收益和负收益来自不同分布,硬算一个总体矩就不合适。

应对办法是两步:先把原始收益率「异构」成不稀疏的数据,再用不依赖分布假设的非参统计量去描述它。7 个因子各用不同的收益率定义,本质就是 7 种异构方式。

因子值怎么处理

日内算出指标后,还要做四件事才变成可回测的因子。

(1)正态化。 先做 Box-Cox 变换,如果仍不无偏,再退到排序变换:

F_i^* = \mathrm{Rank}(F_i), \qquad F_i^* = \begin{cases}\dfrac{(F_i-\min F+1)^\lambda-1}{\lambda}, & \lambda \ne 0\\[4pt] \ln(F_i-\min F+1), & \lambda = 0\end{cases}

\lambda 由极大似然法估计。原文明确说 Box-Cox 对严重左偏或右偏的数据处理不成无偏,所以排序变换是兜底手段。

(2)中性化。 所有因子值对对数市值与行业回归,取残差。

(3)多空权重。 按中位数把截面切成两侧,各自归一化:

F_i^{+} = \frac{F_i^{*}-\mathrm{median}(F^{*})}{\sum F_i^{+}}, \qquad F_i^{-} = \frac{-\left(F_i^{*}-\mathrm{median}(F^{*})\right)}{\sum F_i^{-}}

原文分母写成 \sum F_i^{\pm},是自指写法;实际含义是「除以该侧权重之和」,使每侧权重合计为 1。

(4)时序化。 日频取 15 日等权平均(n_s=15);周频取周内等权;月频取时间加权,越靠近调仓日权重越大:

F_{Di}=\sum_{j=1}^{n_s}F_j\frac{1}{n_s}, \qquad F_{Wi}=\sum_{j=1}^{n}F_j\frac{1}{n}, \qquad F_{Mi}=\frac{1}{\sum_{j=1}^{n} j/n}\sum_{j=1}^{n}F_j\frac{j}{n}

回测区间 2014-08-31 至 2021-08-31,日频调仓,统一剔除涨跌停个股。换手率按单边算:

tor = \frac{1}{T}\sum_{t}\sum_{i}\lvert w_t - w_{t-1}\rvert / 2

表 2 的 7 个因子

因子名 构造方法
rtn5_mean 5 分钟收益率的均值
real_var 已实现方差
rtn_skew 收益率偏度
rtn_kurt 收益率峰度
rv_up 上行收益率已实现方差
rv_down 下行收益率已实现方差
rv_umd 上下行已实现方差之差除以已实现方差

两点说明。第一,除 rtn5_mean 外都用 1 分钟收益率;rtn5_mean 改用 5 分钟,是因为均值对「大量零收益分钟」的稀疏性特别敏感——一只半天不成交的股票,1 分钟均值会被一堆 0 稀释。第二,rv_umd =(RV^{+}-RV^{-})/RV 是符号跳跃变差 (signed jump variation),它由前三列组合而来,不是独立的新统计量。

原文正文与部分二手材料说「6 个常见因子」,表 2 实际列了 7 行;按独立统计量数(均值、方差、偏度、峰度、上行、下行)是 6 个,第 7 个 rv_umd 是组合量。

绩效(日度调仓,n_s=15)

因子 多空年化 多头 空头 夏普 最大回撤 胜率 ICIR IC 日换手
rtn5_mean 70.21% 12.89% 44.04% 7.79 −9.24% 67.64% 0.5801 5.86% 36.45%
real_var 54.96% 12.96% 31.04% 7.15 −8.08% 68.11% 0.5471 5.03% 9.84%
rtn_skew 47.22% 12.98% 24.18% 10.64 −4.21% 75.26% 0.8782 4.45% 27.95%
rtn_kurt 46.46% 11.09% 25.86% 8.70 −4.95% 71.40% 0.6100 3.65% 18.77%
rv_up 91.46% 13.80% 60.96% 9.81 −7.17% 71.57% 0.6388 5.43% 14.34%
rv_down 46.83% 7.48% 30.41% 6.15 −10.08% 64.13% 0.4212 3.14% 11.64%
rv_umd 52.17% 5.89% 37.42% 9.53 −11.00% 72.92% 0.8689 4.75% 29.66%

三件事值得注意。

一是 IC 都显著,rtn5_mean 最高 5.86%,rv_down 最低也有 3.14%。

二是多空收益绝大部分来自空头端。 以 rtn5_mean 为例:多头端 12.89%,空头端 44.04%;rv_up 更极端,13.80% 对 60.96%。也就是说这批因子更擅长「躲开烂股票」,而不是「挑出好股票」。注意多头加空头并不等于多空(12.89+44.04=56.93,而多空是 70.21),两侧是分别统计的口径,原文没有解释差异来源。

三是收益最高的 rv_up 不是夏普最高的。 rv_up 多空 91.46%,夏普 9.81;rtn_skew 多空只有 47.22%,夏普却到 10.64,最大回撤只有 −4.21%。偏度的收益更「平」。

因子之间:一半是同一个波动率风险

研报表 4 的时序相关矩阵里有三组高相关:

  • real_var 与 rv_up 0.876、与 rv_down 0.787、rv_up 与 rv_down 0.760 —— 已实现方差族几乎是同一个东西。
  • rtn_skew 与 rv_umd 0.784 —— 偏度与符号跳跃变差测的是同一件事(日内涨跌不对称)。
  • rtn5_mean 与 rv_umd 0.630、与 rv_up 0.620 —— 均值也与波动率沾边。

最低的一格是 rv_down 与 rv_umd 的 0.347。整体看,真正独立的信息在「形状」统计量(偏度、峰度)上,而「幅度」统计量(方差、上下行方差)彼此高度重复。这也解释了为什么系列三要在偏度上继续做拆解,见 极端收益因子与投资者心理承受能力。

附录的实用结论:涨跌停会把因子效果放大

研报附录用累计收益率偏度因子 cpr_sw 做了一个对照实验。累计收益率定义为当前价相对开盘价的涨跌:

R_t^{cum}=\sum_{i=0}^{t}R_i

不剔除涨跌停时,cpr_sw 多空年化 45.28%、多头 26.51%、空头 5.50%、夏普 6.21;剔除涨跌停后,多空掉到 13.04%、多头变成 −0.31%、夏普 2.57。研报的原话是「2018 年以来该因子基本失效」。

这个对照的意义超出本因子本身:很多高频因子看起来有效,可能只是系统性买到了涨停板。凡是日频调仓的高频因子,都应该报一遍剔除涨跌停后的数字。

与本 wiki 的接口

  • 本页是系列三的前身与基准。 系列三的三个概念页——极端收益因子、混合高斯分布与跳价期因子、日内弹性因子——在检验特异性时,用的对照因子正是本页这批:nos_gs、rtn_mean、real_kurt、real_skew、real_var、rv_up、rv_down、rv_umd。系列三做的是把这里的偏度「拆开」(极值)和换分布族(混合高斯)。
  • 系列四沿用同一套施工流程。 成交量分布因子 的框架 g=f(\mathrm{Reorder}(\cdot))=f(\cdot)、Box-Cox 正态化、15 日平滑、按中位数分两侧加权,与本页逐条对应,只是把数据从「价」换成「量」。
  • 系列六用的是同一判据的反面。 本页要求 g 对时间顺序不敏感,系列六专门找对时间顺序敏感的指标,两者合起来才把「分布信息」与「时序信息」分开。
  • 系列十把「分布」推进到「条件分布」。 条件分位数回归与异常成交 不再看整体形状,而是看每分钟成交量相对自身条件基准的分位残差。
  • 研报摘要见 兴业金工《高频研究系列二》,研报 entity 见 entities/Xingye 2022 Return Distribution Factors。

Open Questions

  • 「6 个」还是「7 个」:正文说 7 个,表 2 列 7 行,但 rv_umd 是组合量;二手材料多写「6 个常见因子 + 2 个 nos」。本页按 7 行呈现并注明来源。
  • 因子方向没有交代。正文只说「多空收益主要来自空头效应」,没有逐条说明因子值大该做多还是做空。从「高波动、高偏度高估」的常识可以反推,但原文未写。
  • 多头 + 空头 ≠ 多空。7 个因子全部存在这个差额(最大的是 rv_up:13.80+60.96=74.76 对 91.46),是复利口径还是分组口径,原文未解释。
  • 为什么只有 rtn5_mean 换成 5 分钟收益率。原文只说「某些高频指标对稀疏性敏感」,没有给出筛选标准,也没有做 1 分钟与 5 分钟的对照。
  • Box-Cox 的 \lambda 是截面统一估计还是逐股估计,原文未说明;两种做法对因子横截面排序的影响不同。
  • 涨跌停的处理只在附录做了一个因子,其余 7 个因子在正文里直接用了「剔除涨跌停」的版本,没有给不剔除的对照,无法判断它们各自被放大多少。

Sources