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