收益率分布因子 (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_up0.876、与rv_down0.787、rv_up与rv_down0.760 —— 已实现方差族几乎是同一个东西。rtn_skew与rv_umd0.784 —— 偏度与符号跳跃变差测的是同一件事(日内涨跌不对称)。rtn5_mean与rv_umd0.630、与rv_up0.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
- summaries/202201-xingye-return-distribution-factors/202201-xingye-return-distribution-factors — 兴业金工《高频研究系列二—收益率分布因子构建》,2022-01-23