反转换手增强因子 · 检验报告

由zhaoquant创建,最终由zhaoquant 被浏览 4 用户

因子:−(复权收盘价 ÷ 5 日前复权收盘价 × 原始换手率) | 股票池:全 A 剔除 ST、停牌、上市不足 250 个交易日 | 区间:2019-01-01 ~ 2026-10-27 | 月度调仓,信号日收盘后生成,T+1 开盘买入,持有到下一个月末信号日的次日开盘 | 落库表:reversal_turnover_enhanced

1 · 概览与总评

有效作为选股信号判为「有效」,但带明确保留:RankIC 均值 0.0859(落在「强」区间,Newey-West t = 12.5),中性化后十组下期收益呈台阶状,月度多空扣费后每年为正(8/8 个年度)。保留项:①收益的大头来自最低一组(G1)的下跌,空头在 A 股难以实现;②因子几乎由换手率驱动,「价格反转 × 换手」的叠加没有在 IC 上体现出增量;③全样本内评估,没有样本外验证。

RankIC 均值

0.0859

中性化后 · 强

IC 信息比 IR

1.02

中性化前 0.52

Newey-West t

12.5

朴素 t = 44.2(虚高 3.5 倍)

IC>0 胜率

85.5%

1,873 个交易日

G10−G1 月均

2.04%

92 个月度调仓期

多空年化(扣费)

20.8%

不扣费 26.1%

多空夏普(扣费)

1.30

不扣费 1.58

多空最大回撤(扣费)

-11.7%

全市场等权 -23.5%

单边换手 多 / 空

57% / 63%

月度调仓,单边成本 0.15%

股票池规模

4,444

日均中位数 · 2019-01-01 ~ 2026-10-27

2 · 加工说明

  1. 股票池过滤(不含截面算子的 CTE 内完成,让后续截面算子只在池内计算):全部 9,033,281 个「日期×股票」行中,进入股票池 8,176,921 行; 剔除上市不足 250 个交易日 536,489 行、ST / *ST 304,466 行、停牌 15,144 行、缺申万一级行业 261 行(按此顺序归因,一行只记一次)。
  2. 上市交易日数:cn_stock_factors_base 缺北交所老代码,用 LEFT JOIN,缺失时按 list_days×245/365 折算;池内有 126,727 行使用了折算值,没有因此丢行。
  3. 因子原值 = −(复权收盘价 ÷ 5 日前复权收盘价 × 当日原始换手率);5 日前价格在查询里用窗口算子取得,区间起点前留有回看余量。
  4. 行业中位数填充:原值缺失(如 5 日前无价格)的 8,263 行,用同日同申万一级行业的中位数补上。
  5. 缩尾 + 标准化:每日截面按 1% / 99% 缩尾,再 z-score。
  6. 中性化:每日对「申万一级行业哑变量 + ln(总市值)」做回归取残差(c_neutralize_resid,不带额外缩尾/标准化),残差再 z-score 得到最终因子。
  7. 诊断:无重复 (date, instrument)(0 条);最终因子空值 0、无穷值 0;每日均值绝对值最大 3.3e-17, 每日标准差 0.9999 ~ 0.9999;与 ln(总市值) 的日均相关系数:中性化前 0.139 → 中性化后 -2.0e-14(单日绝对值最大 6.7e-11)。
  8. 落库:表 reversal_turnover_enhanced(中文名「反转换手增强因子」),写入 8,176,921 行,回读 8,176,921 行,重复键 0, 覆盖 2019-01-02 ~ 2026-10-27。

大白话:为什么要中性化

原始因子里混着「这只股票属于哪个行业、市值多大」的信息。比如某一天小盘股普遍换手高,因子就会把整批小盘股排到一边, 这时因子好不好用,其实是在赌「小盘股这个月涨还是跌」,而不是在比较个股本身。中性化就是把行业和市值的影响先扣掉,只留下「同行业、同市值水平下」的相对高低。

本次的对比(用数据说话):

  • 中性化前因子与 ln(总市值) 的日均相关系数为 0.139,中性化后为 0(-2.0e-14),说明市值暴露确实被扣干净了。
  • RankIC 均值几乎没变(前 0.0916 → 后 0.0859),但 IC 的标准差从 0.175 降到 0.084,IR 由 0.52 升到 1.02,IC>0 胜率由 70.8% 升到 85.5%。 也就是说:平均能力没变,但每天的表现稳定得多。
  • 十组下期收益的组序相关:中性化前 0.05(乱跳,呈中间高两头低的倒 U 形),中性化后 0.94(台阶状)。
  • 猜测IC 波动变小,可能是因为扣掉了随风格轮动忽大忽小的市值 / 行业暴露;这一因果没有单独做实验验证,只验证了「暴露已被扣除」和「波动确实变小」这两个事实。

3 · 图表

图 1 · 逐日 RankIC(0 轴与 60 日均线)

每个交易日因子与其后 20 个交易日(T+1 开盘买入、T+21 开盘卖出)收益的秩相关;红为正、绿为负。

图 2 · 累计 RankIC

斜率稳定向上说明各时期方向一致;中性化前后累计曲线的差别,反映稳定性而不只是均值。

图 3 · 十组下期平均收益(中性化后,G1 最小 → G10 最大)

月度调仓的各组下期(约一个月)平均收益,红涨绿跌。

图 4 · 十组下期平均收益:中性化前后对比

中性化前呈中间高两头低,中性化后才形成台阶。

图 5 · 十组累计净值

G1(最小) G10(最大)等权基准(虚线)

从 G1 绿渐变到 G10 红;悬停时按当时净值从高到低排序。线尾标注 G1、G10 与基准的终值。不扣费。

图 6 · 多空累计净值(多 G10 空 G1)

单边成本 0.15%;基准为全市场等权(不扣费)。

图 7 · RankIC 直方图

虚线为 0 轴;分布整体偏右。

图 8 · 分年度 RankIC 均值(中性化后)

8 个年度中 8 个为正;2026 年为部分年度。

图 9 · 分年度收益

多空扣费、只多 G10 与全市场等权的年度收益对比。

4 · 指标表

课程口径:|IC|≥0.03「可用」,≥0.05「强」,>0.1「可疑(警惕未来函数)」;分组单调性:台阶状=规律,乱跳=巧合。

RankIC

指标 中性化后 中性化前 说明
RankIC 均值 0.0859 0.0916 强(按中性化后)
RankIC 标准差 0.0840 0.1755 越小越稳
IR(均值/标准差) 1.022 0.522 逐日 IC 口径
朴素 t 值 44.2 22.6 忽略了 20 日收益窗口重叠,虚高
Newey-West t(滞后 20) 12.53 6.48 朴素 t 约为校正后的 3.5 倍
IC>0 胜率 85.5% 70.8% 1,873 个交易日
月度信号日 RankIC 均值 0.0770 0.0794 92 个不重叠样本,强
月度 IC 的 t 值(滞后 1) 9.01 4.75 样本不重叠,不会因窗口重叠虚高

十组分组

分组 G1 G2 G3 G4 G5 G6 G7 G8 G9 G10
中性化后 下期均值 -0.18% +1.43% +1.40% +1.38% +1.44% +1.55% +1.67% +1.66% +1.76% +1.87%
中性化前 下期均值 -0.16% +1.43% +1.62% +1.74% +1.68% +1.68% +1.69% +1.54% +1.49% +1.25%
指标 中性化后 中性化前 判读
G10−G1 月均收益 +2.04% +1.41% 全市场等权月均 +1.40%
组序相关(G1~G10 vs 收益) 0.939 0.055 台阶状(规律) / 前:乱跳(巧合)
相邻组上升比例 6 / 9 — G2~G5 之间基本持平,主要落差在 G1→G2(占多空价差的 78%)
每组股票数(中位数) 442 — 每月截面十等分

多空与多头组合(月度,92 期)

组合 累计 年化 年化波动 夏普 最大回撤 月胜率
多 G10 空 G1(不扣费) +491.4% +26.1% 15.5% 1.58 -10.1% 73%
多 G10 空 G1(扣费) +326.9% +20.8% 15.5% 1.30 -11.7% 66%
只多 G10(不扣费) +323.7% +20.7% 27.4% 0.82 -26.2% 60%
只多 G10(扣费) +262.5% +18.3% 27.4% 0.74 -27.4% 59%
只空 G1(做空收益,不扣费) -43.7% -7.2% 33.0% -0.06 -67.9% 48%
全市场等权基准 +182.9% +14.5% 26.0% 0.65 -23.5% 55%
G10 相对基准的超额(不扣费) +52.1% +5.6% 6.3% 0.90 -9.3% 58%

成本假设:单边 0.15%(含佣金、印花税、冲击的粗略合计),按每期权重变化量 Σ|Δw| 计提,多空两腿分别计;单边换手:多头 57.2%、空头 63.1%,平均每期多空合计成本 0.36%;建仓期未计,持有期权重漂移忽略。夏普按月度收益年化(√12),无风险利率取 0。

分年度收益

年度 期数 G10 G1 多空(不扣费) 多空(扣费) 全市场等权 G10 − 基准
2019 12 +33.9% +5.6% +23.9% +19.0% +18.8% +15.2%
2020 12 +20.9% -6.3% +25.5% +20.2% +21.2% -0.3%
2021 12 +32.4% +1.6% +27.0% +21.6% +25.5% +6.8%
2022 12 -3.3% -25.4% +27.0% +21.6% +6.2% -9.5%
2023 12 -8.1% -29.0% +27.9% +22.6% -17.9% +9.7%
2024 12 +44.8% +5.3% +34.8% +29.5% +28.7% +16.1%
2025 12 +63.1% +32.4% +22.3% +17.1% +48.6% +14.5%
2026(部分) 8 -5.8% -24.1% +11.8% +8.6% -6.1% +0.3%

年度收益 = 该年内各调仓期收益复利,调仓期按信号日所在年份归属;末年只有部分月份。

分年度 IC 与分组

年度 交易日 RankIC 均值(后) 判读 IR IC>0 胜率 NW t RankIC 均值(前) G10−G1 月均 组序相关
2019 244 0.0967 强 1.41 92% 6.2 0.0817 +1.84% 0.47
2020 243 0.0739 强 0.80 78% 3.6 0.1020 +2.01% -0.01
2021 243 0.0917 强 1.15 84% 4.6 0.0913 +2.18% 0.83
2022 242 0.0754 强 1.18 87% 5.7 0.1147 +2.05% 0.38
2023 242 0.0979 强 1.42 95% 6.3 0.0804 +2.15% 0.95
2024 242 0.0672 强 0.70 77% 2.8 0.0898 +2.62% 0.81
2025 243 0.1082 可疑(警惕未来函数) 1.88 97% 9.8 0.0716 +1.73% 0.94
2026 174 0.0721 强 0.55 71% 2.3 0.1055 +1.80% -0.28

5 · 结论(大白话)

**IC 是否显著为正?**是。逐日 RankIC 均值 0.0859,用 Newey-West 校正后 t = 12.5(朴素 t 为 44.2,是虚高的);月度不重叠样本的均值是 0.0770,t = 9.0。 8/8 个年度的 IC 均值为正;2025 年为 0.1082,机械地落入「可疑」区间(>0.1),但额外滞后和随机对照都没发现异常,按规则如实标注。

**分组是否单调?**中性化后整体呈台阶状(组序相关 0.94),但中间几组基本持平,真正拉开差距的是最低的 G1(月均 -0.18%)。 分年度看,组序相关≥0.5 的年份只有 4/8 个,G10 好于 G1 的年份是 8/8 个;2026 年组序相关为 -0.28(部分年度)。

**多空是否稳定?**扣费后年化 20.8%、夏普 1.30、最大回撤 -11.7%,8/8 个年度为正。 但多头一侧才是可实现的:只多 G10 扣费后年化 18.3%,比全市场等权的 14.5% 高,最大回撤 -27.4%,和基准同量级。

**要不要继续研究?**建议继续,但不要直接上线。方向:①把换手率和价格变化拆开单独检验,确认到底靠哪一项(见机制观察);②只做多头的版本,评估相对基准的超额而不是多空; ③用换手率的标准化值做对照,验证「用原始值」这个设计的必要性;④留出样本外区间,或做滚动检验。

机制观察:收益主要来自换手率,而不是「价格反转 × 换手」的叠加

  • 已验证:单独用「负换手率」做因子,RankIC 均值 0.0991(NW t 7.2,IR 0.58);单独用「−5 日收益」(纯反转)只有 0.0337(NW t 6.4); 本因子中性化前为 0.0916(IR 0.52)。这些参照都没做中性化,只能和「中性化前」比:加上价格项没有让 IC 变高,反而略低。
  • 已验证:因子里两个分量的截面离散度悬殊,ln(换手率) 的截面标准差是 ln(价格比) 的 17.7 倍(中位数),所以因子的排序基本由换手率决定。
  • 猜测「低换手的股票未来收益更高」可能是流动性 / 关注度溢价,也可能是别的原因;这里没有做任何检验,原表达式里「高换手更易反转」的说法在本样本中没有得到支持,也没有被证伪。

6 · 风险与备注

  • 样本区间:2019-01-01 ~ 2026-10-27;调仓期共 92 期(2019-01-31 ~ 2026-08-31 的信号日),最后一个信号日因持有期未满不计入。全部结果是同一段样本内的评估,没有样本外验证。
  • 过拟合提示:因子表达式、持有期、分组数都是事先给定,没有做参数搜索;但「只在全样本里看」本身不能排除风格偶然性,2026 年的组序相关为负,需要继续观察。
  • 空头不可实现:多空收益里 G1 一侧贡献很大(G1→G2 的落差占价差的 78%),A 股个股融券标的少、成本高,且不能无限制做空;退市前下跌的股票也集中在 G1。实际可执行的是只多 G10。
  • 交易细节未建模:涨跌停无法成交、停牌无法买卖、冲击成本、融券费用、资金容量、T+1 开盘成交的滑点都没有建模;成本只是单边 0.15% 的粗略假设;离场日停牌的 4 个观测被丢弃而不是持有到复牌。
  • 基准:全市场等权 = 每期月度面板内所有有效股票的等权平均,不是指数,也没有扣费。
  • 数据缺失记录:6 只标的因缺申万一级行业被跳过(明细见 skipped_instruments.csv);29,482 个「开盘价为空」和 95 个「开盘价为 0」的行情行,均要求开盘价>0 才参与收益计算。
  • 处理过程中发现并修正的两处问题:①因子窗口算子的行级过滤放进了 WHERE,导致区间前 5 天没有历史、因子为空,已改为 QUALIFY;②月度面板里同样的写法让最后两个调仓期整期丢失,且离场开盘价为 0 的行被误算成 −100%,已改为 QUALIFY 并要求开盘价>0。 修正前后月度多空年化的差别很大,说明这类问题不会报错,只能靠对账发现。上面的数字都是修正后的结果。
  • 自检结论:额外滞后、随机对照、SQL 与 numpy 对账通过;退市标的在样本内;财报滞后检查不适用;有一处未解释的尾部:退市标的集中在 G1(20%),它对空头腿有利,贡献大小没有单独量化。

自检明细

自检项 结果 状态
财报更新日 vs 公告日滞后 本因子只用复权价格、换手率,中性化只用行业与总市值,不含任何财报字段,没有公告日对齐问题;滞后分布与异常笔数不适用。 不适用
因子额外滞后后的 IC 滞后 1 日 IC 0.0810、滞后 5 日 0.0692、滞后 20 日 0.0559,随滞后逐步衰减,没有出现「一滞后就崩」的断崖(有未来函数的因子通常会这样)。 通过
随机因子对照 20 个随机种子:随机因子 IC 均值的绝对值最大 0.0007,NW |t| 平均 0.75、最大 2.18;其中 2 个种子 |t|≥2(20 次里约有 1 次属偶然水平)。本因子 NW t = 12.5,远高于随机。 通过
与过去收益 / 换手的关系 因子与过去 5 / 20 / 60 日收益的日均秩相关为 -0.17 / -0.22 / -0.24(跌得多的排前面,符合「反转」方向);与当日换手率为 -0.68,即因子主要由换手率决定。 已记录
退市标的是否在样本内 2019 年以来退市 243 只,216 只进入月度样本;它们最后一期收益均值 -21.5%(全部样本月均 +1.37%)。27 只没有进入月度样本,原因没有逐只核查。 在样本内
退市标的的分组分布 退市标的最后一期落在 G1 的占 20%(全样本 G1 占 10%),落在 G10 的占 7%。因此 G1 的收益里含有退市前下跌的尾部,对空头腿有利。 有未解释尾部
SQL 与 numpy 对账 逐日 RankIC:1873 个交易日全部匹配,最大差 5.6e-15;月度下期收益:395,311 行用行情矩阵独立重算,不一致 0 行。 通过

额外滞后的 IC

设定 RankIC 均值 NW t IR
不加滞后 0.0859 12.5 1.02
因子额外滞后 1 个交易日 0.0810 11.9 0.97
因子额外滞后 5 个交易日 0.0692 10.3 0.83
因子额外滞后 10 个交易日 0.0624 9.5 0.77
因子额外滞后 20 个交易日 0.0559 9.2 0.73

c_ntile / c_rank 小样本对账

抽查信号日 股票数 RankIC(SQL) RankIC(scipy) c_ntile 与 numpy 分位不一致比例
2019-01-31 3,368 -0.149134 -0.149134 0.12%
2022-11-30 4,446 0.091722 0.091722 0.18%
2026-08-31 5,178 0.147676 0.147676 0.08%

SQL 的 c_ntile 与按秩切分的 numpy 分位在组边界处有极少数股票归属不同(比例见表),对组收益的影响可以忽略;RankIC 两种算法一致到 1e-14。

本报告所有数字均由 results.json / diag1.json / diag2.json 自动读入生成。标注「猜测」的是未经验证的解释。

{link}