理想反转因子分析报告
由bq4w5co8创建,最终由bq4w5co8 被浏览 1 用户
因子:理想反转因子 M = Mhigh − Mlow(20 日窗口) | 区间:2019-01-02 ~ 2026-10-27 | 检验:月度调仓,信号日收盘后生成,T+1 开盘买入,持有到下一个月末信号日的次日开盘 | 生成时间:2026-10-27 23:25
1. 概览与总评
**有效(方向为负)**日频 RankIC 均值 -0.0577,Newey-West t 值 -12.47,8 个年份里有 8 个为负,说明因子值越大、未来收益越低。按任务写的“多 G10 空 G1”年化 -16.6%(不扣费),方向是反的,要反过来用(多 G1 空 G10:扣费年化 +11.3%)。
-0.0577
RankIC 均值(日频,中性化后)
-12.47
Newey-West t 值
-43.0
朴素 t 值(虚高,仅作对照)
13.3%
IC > 0 的天数占比(胜率)
-0.99
IR(IC 均值 / 标准差,未年化)
-1.45%
G10 − G1 月均收益
-21.6%
多 G10 空 G1 年化(扣费)
+11.3%
反向多空年化(扣费)
1.01
反向多空夏普(扣费)
83.8%
平均单边换手
表中颜色:红涨绿跌,红色表示正值,绿色表示负值。IC 与收益的正负都按“因子值越大 → 未来收益越高”为正方向来记。
2. 加工说明
- 股票池过滤:全 A,剔除停牌、ST/*ST、上市不足 250 个交易日。交易日数用 LEFT JOIN 取自
cn_stock_factors_base,缺失时用list_days×245/365兜底,没有因缺失而丢行。实测缺交易日数的是 920 开头的北交所代码,与任务提示的 430/83x/87x 不一致;这些代码最终也因成交笔数缺失被剔除(见风险与备注)。 - 算原始因子 M:每只股票取过去 20 个交易日,算每日平均单笔成交金额(成交金额 ÷ 成交笔数);单笔金额最高的 10 天涨跌幅相加得 Mhigh,最低的 10 天相加得 Mlow,M = Mhigh − Mlow。引擎里一次完成(
m_sum_gl_k_delta)。 - 行业中位数填充:窗口里有停牌或无成交的日子,M 算不出来,用同一天、同一申万一级行业的中位数补上。
- 缩尾 + 标准化:每个交易日横截面上先按 1% / 99% 分位缩尾,再做 z-score。
- 中性化:每日横截面上,把因子对“行业哑变量 + 对数总市值”回归,只留残差(
c_neutralize_resid)。 - 再标准化:残差再做一次 z-score,得到最终因子,落库到
W_return。
任务里提到的 EP、ROE 两项等权合成,针对的是价值类因子的模板;理想反转因子只有一个原始变量,所以这一步不适用,已省略,缩尾 / 标准化 / 中性化的顺序保持不变。
各步剔除条数(2019-01-02 ~ 2026-10-27,全部来自行情表)
| 步骤(按顺序,命中第一条即剔除) | 股票日数 | 涉及标的数 |
|---|---|---|
| 停牌 | 29,645 | 1,799 |
| ST/*ST | 289,965 | 726 |
| 无成交笔数(数据缺失) | 263,974 | 355 |
| 上市不足250交易日 | 471,680 | 2,008 |
| 缺行业或市值 | 261 | 6 |
| 进入股票池 | 7,977,756 | 5,366 |
| 合计(= 行情表总行数) | 9,033,281 | — |
加工诊断
| 诊断项 | 结果 | 判定 |
|---|---|---|
| (date, instrument) 重复 | 0 条 | 通过 |
| 因子空值 / 无穷值 | 0 / 0 | 通过 |
| 每日均值绝对值最大 | 4.2e-17 | 通过(≈0) |
| 每日标准差(样本,n−1)与 1 的最大偏差 | 4.3e-15 | 通过(=1) |
| 每日标准差(总体,n)范围 | 0.99985 ~ 0.99990 | 口径说明 |
| 与对数市值的相关(中性化前,逐日均值 / 最大绝对值) | +0.066 / 0.479 | 有暴露 |
| 与对数市值的相关(中性化后,逐日均值 / 最大绝对值) | 1.3e-14 / 1.2e-11 | 通过(≈0) |
| 缺成交笔数导致 M 缺失、用同日同行业中位数填充 | 44,267 条(0.55%) | 已记录 |
| 股票池日均规模(最小 / 平均 / 最大) | 3,349 / 4,212 / 4,936 | 信息 |
为什么要中性化(大白话)
原始因子常常夹带“顺风车”:某些行业整体偏涨或偏跌,或者大市值股票和小市值股票天生表现不同。如果不处理,因子看起来有效,可能只是在押注“某个行业”或“大小盘风格”,换个行情就失灵。 中性化就是把每天的因子里“能被行业和市值解释的那部分”扣掉,只保留股票在同行业、同市值水平下的相对强弱,检验的才是因子本身。
本次的佐证:中性化前,因子与对数市值的逐日相关均值是 +0.066,个别交易日最高到 0.479,确实带着市值暴露;处理后降到 1e-14 量级。 RankIC 均值从 -0.0673 变成 -0.0577,绝对值变小,但标准差从 0.0920 降到 0.0581,IR 绝对值从 0.73 升到 0.99,IC 为负的天数占比从 79.3% 升到 86.7%。 也就是说,中性化后信号的平均强度略有下降,但稳定性明显提高。这两处变化是读数;至于“被扣掉的那部分主要来自哪个行业或哪种风格”,本次没有拆开分析。
中性化前后对比
| 中性化前 | 中性化后 | 变化 | |
|---|---|---|---|
| RankIC 均值 | -0.0673 | -0.0577 | 绝对值 0.0673 → 0.0577(-14%) |
| RankIC 标准差 | 0.0920 | 0.0581 | -37% |
| IR(均值/标准差) | -0.732 | -0.993 | 绝对值 0.73 → 0.99 |
| Newey-West t 值 | -9.14 | -12.47 | 绝对值 9.1 → 12.5 |
| IC > 0 的天数占比 | 20.7% | 13.3% | — |
| 多 G10 空 G1 不扣费年化波动 | 16.2% | 11.3% | -31% |
| 多 G10 空 G1 不扣费夏普 | -1.15 | -1.54 | — |
3. 图表
图 1 · RankIC 时间序列(日频,0 轴 + 60 日均线)
红线为 IC>0,绿线为 IC<0,黑线为 60 日均线。下期收益为未来 20 个交易日(T+1 开盘 → T+21 开盘)。
图 2 · 累计 RankIC(中性化后 / 前)
累计值一路向下,说明因子方向长期为负;斜率越稳,表示越稳定。
图 3 · 十组下期平均收益(G1 因子最小 → G10 最大)
每个月末按因子分十组,等权持有一个月的平均收益;柱子颜色表示组序(绿→红),不表示涨跌。
图 4 · 十组累计净值(G1 绿 → G10 红)
线尾直接标注 G1、G10 与等权基准;鼠标悬停时提示框按当时净值从高到低排序。
图 5 · 多空累计净值(多 G10 空 G1,扣费 / 不扣费,对照等权基准)
按任务指定方向:做多因子最大的一组、做空最小的一组。成本假设:单边 0.15%(买、卖各收一次),多头腿与空头腿的买卖金额都计费;平均单边换手 83.8%(多头腿 79.5%,空头腿 88.1%),平均每期成本约 0.50%。
图 6 · RankIC 直方图(日频)
横轴为 IC 取值区间中点,纵轴为天数。分布整体落在 0 轴左侧。
图 7 · 分年度 RankIC(深色:中性化后;浅色:中性化前)
8 个年份里有 8 个年份均值为负。
图 8(补充)· 事后反向使用:多 G1 空 G10
这条线是看到多 G10 空 G1 亏损后才补充的。因子名为“反转”,负向与名称一致,但本次没有核对原研报的方向,且用的是同一段样本,不能当作独立验证。
4. 指标表
判读口径(课程口径,看 |IC|):≥ 0.03 可用,≥ 0.05 强,> 0.1 可疑(警惕未来函数)。本因子日频 IC 均值 -0.0577,属于 强。 单调性口径:台阶状 = 有规律,乱跳 = 可能是巧合。本因子属于 台阶状 = 有规律。
RankIC
| 口径 | RankIC 均值 | 标准差 | IR | 朴素 t(虚高) | Newey-West t | IC>0 胜率 | 按课程口径 |
|---|---|---|---|---|---|---|---|
| 日频,中性化后(下期=20日) | -0.0577 | 0.0581 | -0.99 | -43.0 | -12.47(滞后20) | 13.3% | 强 |
| 日频,中性化前 | -0.0673 | 0.0920 | -0.73 | -31.7 | -9.14(滞后20) | 20.7% | 强 |
| 仅月末信号日,中性化后(无重叠) | -0.0530 | 0.0592 | -0.90 | -8.6 | -8.74(滞后2) | 14.1% | 强 |
| 仅月末信号日,中性化前 | -0.0641 | 0.0927 | -0.69 | -6.6 | -6.96(滞后2) | 21.7% | 强 |
| 月度调仓实际持有期(T+1开→下月末次日开) | -0.0541 | 0.0634 | -0.85 | -8.2 | -8.17(滞后2) | 14.1% | 强 |
朴素 t 值把相邻交易日的 IC 当作互相独立,但每个下期收益覆盖 20 个交易日、相邻日重叠,所以朴素 t 虚高;以 Newey-West(滞后 20 阶)为准。月末信号日口径下没有重叠,两种 t 值接近,可以互相印证。
十分组
| 分组(G1 因子最小 → G10 最大) | 下期平均收益(月度持有) | 相对等权基准 | 中性化前同组 |
|---|---|---|---|
| G1 | +1.75% | +0.37% | +1.75% |
| G2 | +1.64% | +0.26% | +1.71% |
| G3 | +1.63% | +0.25% | +1.68% |
| G4 | +1.57% | +0.19% | +1.61% |
| G5 | +1.64% | +0.26% | +1.58% |
| G6 | +1.47% | +0.09% | +1.38% |
| G7 | +1.35% | -0.03% | +1.53% |
| G8 | +1.37% | -0.01% | +1.33% |
| G9 | +1.08% | -0.30% | +1.02% |
| G10 | +0.30% | -1.08% | +0.19% |
十组月均收益从 G1 的 +1.75% 降到 G10 的 +0.30%,组序相关 -0.952,9 个相邻台阶里 7 个向下、2 个向上。但 G1~G5 的月均收益只在 1.57%~1.75% 之间,差距很小;真正拉开的是 G9(1.08%)和 G10(0.30%)。所以更准确的说法是“大体向下,区分力集中在最高两组”,不是干净的十级台阶。逐期看,每期的组序相关均值只有 -0.213(标准差 0.48),单个月份里排序经常乱。 G10 − G1 的月均差为 -1.45%,Newey-West t = -4.59(滞后 2)。
多空组合
| 组合(月度调仓,92 期) | 累计收益 | 年化 | 年化波动 | 夏普 | 最大回撤 | 月胜率 |
|---|---|---|---|---|---|---|
| 多 G10 空 G1 · 不扣费(任务指定方向) | -75.2% | -16.6% | 11.3% | -1.54 | -76.6% | 26.1% |
| 多 G10 空 G1 · 扣费 单边0.15% | -84.5% | -21.6% | 11.3% | -2.07 | -85.2% | 21.7% |
| 【补充·事后反向】多 G1 空 G10 · 不扣费 | +259.5% | +18.2% | 11.3% | +1.54 | -10.1% | 73.9% |
| 【补充·事后反向】多 G1 空 G10 · 扣费 | +128.0% | +11.3% | 11.2% | +1.01 | -13.6% | 67.4% |
| G1 单独(纯多头) | +279.2% | +19.0% | 27.3% | +0.77 | -30.5% | 55.4% |
| G10 单独(纯多头) | -7.6% | -1.0% | 30.9% | +0.11 | -56.2% | 50.0% |
| 全市场等权基准(股票池内) | +179.3% | +14.3% | 25.7% | +0.64 | -24.6% | 55.4% |
成本假设:单边 0.15%(买、卖各收一次),多头腿与空头腿的买卖金额都计费;平均单边换手 83.8%(多头腿 79.5%,空头腿 88.1%),平均每期成本约 0.50%。
分年度收益
| 年份(按离场日归集) | 期数 | 多G10空G1 不扣费 | 多G10空G1 扣费 | 【补充】多G1空G10 扣费 | G1 | G10 | 等权基准 |
|---|---|---|---|---|---|---|---|
| 2019 | 10 | -16.9% | -20.9% | +13.4% | +28.8% | +5.7% | +20.3% |
| 2020 | 12 | -21.6% | -26.2% | +19.0% | +43.8% | +12.8% | +32.9% |
| 2021 | 12 | -14.2% | -19.3% | +8.1% | +25.7% | +7.7% | +18.6% |
| 2022 | 12 | -19.9% | -24.8% | +16.5% | -0.2% | -20.5% | -1.3% |
| 2023 | 12 | -12.1% | -17.4% | +6.6% | +3.4% | -8.8% | +4.9% |
| 2024 | 12 | -11.7% | -17.1% | +5.5% | +3.1% | -8.7% | +5.9% |
| 2025 | 12 | -13.5% | -18.6% | +8.2% | +32.4% | +14.7% | +29.1% |
| 2026 | 10 | -17.6% | -21.7% | +10.2% | +15.7% | -5.3% | +4.1% |
分年度 RankIC
| 年份 | 交易日数 | RankIC(中性化后) | RankIC(中性化前) | IR | IC>0 胜率 | 按课程口径 |
|---|---|---|---|---|---|---|
| 2019 | 244 | -0.0791 | -0.0803 | -1.28 | 7.4% | 强 |
| 2020 | 243 | -0.0587 | -0.0535 | -1.16 | 11.9% | 强 |
| 2021 | 243 | -0.0613 | -0.0811 | -1.10 | 12.8% | 强 |
| 2022 | 242 | -0.0611 | -0.0837 | -1.60 | 7.0% | 强 |
| 2023 | 242 | -0.0537 | -0.0753 | -1.05 | 14.9% | 强 |
| 2024 | 242 | -0.0295 | -0.0199 | -0.45 | 24.8% | 弱(不足 0.03) |
| 2025 | 243 | -0.0598 | -0.0711 | -1.30 | 9.5% | 强 |
| 2026 | 174 | -0.0585 | -0.0756 | -0.72 | 20.1% | 强 |
5. 结论(大白话)
**IC 显著吗?**显著,但方向是负的。日频 RankIC 均值 -0.0577,Newey-West t 值 -12.47;用月末信号日算(不重叠)也是 -0.0530、t = -8.74。8 个年份全部为负,IC 为正的天数只有 13.3%。
**分组单调吗?**大体向下,但不是干净的台阶:区分度几乎全部来自最高的一两组,前五组差得很小。
**多空稳定吗?**按指定方向(多最大组、空最小组)每年都亏,不扣费年化 -16.6%,最大回撤 -76.6%。把方向反过来,扣费后年化 +11.3%、夏普 1.01、最大回撤 -13.6%,8 个年份全部为正;但需要空头才能做到,而空头在 A 股并不容易实现。
**要不要继续研究?**建议继续,但先做三件事:(1)把它当作“因子值越大越要回避”的剔除型信号,或者只做多低组,不依赖融券;(2)检验相对传统反转因子的增量信息,因为传统反转自己的 IC 绝对值更大;(3)用样本外区间固定方向后再验证,避免事后选方向的偏差。
6. 风险与备注
- 样本区间:信号日 2019-01-02 ~ 2026-10-27;逐日 IC 因需要未来 21 个交易日行情,只算到 2026-09-18;月度组合共 92 期(2019-02-01 ~ 2026-10-08),最后一个月末信号日的离场日尚未到来,不计入。
- 过拟合 / 事后选方向:反向多空是看到指定方向亏损后才补充的,与因子名“反转”的含义一致,但没有核对原研报,且与检验用的是同一段样本,反向收益不是独立样本外结果。单因子单一参数(20 日、10 对 10)没有做参数扫描,但“只测了这一组参数”本身不能证明它没有被挑选过。
- 空头不可实现:A 股融券标的少、成本高,且有限制;多空组合里的空头腿在实盘中基本做不到,该腿的收益只能当作信号强弱的度量。
- 交易细节未建模:涨跌停无法成交、停牌、冲击成本、容量、融券费率、分红再投资细节、T+1 之外的成交约束均未建模;成本只按单边 0.15% 的比例计。期内个股离场日无开盘价时沿用最后一个开盘价(771 个个股-期)。
- 北交所被整体排除:北交所标的的成交笔数在行情表里恒为 0(355 只,263,974 个股票日),算不出单笔成交金额,已全部跳过,所以本检验实际是沪深两市。
- 被跳过 / 被填充的数据(已记录到 skipped_log.csv):
- 20日窗口含停牌/无成交日,M缺失,用同日同行业中位数填充:1,614 只标的,44,267 个股票日
- 成交笔数缺失(为0),无法计算单笔成交金额,跳过:355 只标的,264,627 个股票日
- 缺申万一级行业或总市值,无法中性化,当日跳过:32 只标的,740 个股票日
- t 值口径:20 阶 Newey-West 在随机因子对照里仍有 4/30 次 |t|>2,略偏乐观,显著性应当打折看待。
- 已知的复算差异:第一步里“单日 numpy 复算”与 SQL 最大相差 4.0e-04,原因是 SQL 的
c_zscore用样本标准差(n−1),我的复算用了总体标准差(n);用 n−1 口径,每日标准差与 1 的最大偏差只有 4e-15,已排除为错误。
自检结果
| 自检项 | 结果 | 判定 |
|---|---|---|
| 财报更新日是否紧跟公告日(滞后分布、异常笔数) | 本因子只用行情(涨跌幅、成交金额、成交笔数),加工里的行业和总市值也不是财报字段,没有财报更新日可统计。仅核对了中性化输入:行业空值 301 行、市值空值 439 行、行业变动 461 次(涉及 411 只);这些输入是否严格按当时可得口径记录,本次没有验证。 | 不适用 / 部分未验证 |
| 因子额外滞后后的 IC | 滞后0日 -0.0577(NW t -12.5);滞后1日 -0.0542(NW t -11.8);滞后2日 -0.0515(NW t -11.2);滞后5日 -0.0453(NW t -10.0);滞后10日 -0.0401(NW t -9.2)。随滞后逐步衰减但仍显著;据此推断它不是只靠信号日当天信息成立,属于「猜测」,未进一步验证。 | 通过 |
| 随机因子对照(30 次随机打分) | 随机因子 IC 均值最大绝对值 0.0010,NW t 最大绝对值 2.80,其中 4/30 次 |t|>2;真实因子 NW t = -12.47。真实值远超随机上限,但随机组 |t|>2 的比例(13%)高于 5% 的名义水平,说明 20 阶 Newey-West 仍略偏乐观(成因为「猜测」:有限样本下 Bartlett 核对 20 日重叠的校正不足,本次未验证)。 | 通过(t 值略偏乐观) |
| 与过去收益的关系 | 因子与过去 1/5/20/60 日收益的截面秩相关均值依次为 +0.009 / +0.093 / +0.347 / +0.223。传统反转(过去 20 日收益取负)自身的 RankIC 均值为 +0.0680,绝对值比本因子的 0.0577 还大。本因子相对传统反转有没有增量信息,本次没有检验(需要对过去 20 日收益再做一次中性化后看 IC)。 | 有未解释尾部 |
| 退市 / 终止交易标的是否在样本内 | 最后一根行情早于数据末日的标的共 242 只,其中 236 只出现在因子样本里(165,021 行);这些标的最后一个因子日与最后交易日的中位间隔为 0 天,没有被提前截断。持有期内离场日无开盘价、沿用最后一个开盘价的“个股-期”共 771 个(占 0.20%)。 | 通过 |
| 未来函数探针(把因子提前 1 日) | 故意把 t+1 日的因子配给 t 日的收益,IC 均值 -0.0467,没有比真实的 -0.0577 更强。未显示因子随“更晚的信息”变强。这只能排除这一种形式的泄漏。 | 通过 |
| SQL 与独立复算对账 | 落库原始 M 值与 numpy 独立复算(118 只标的、168,744 行,含曾 ST、曾停牌的标的)最大绝对差 6.7e-16;逐日 RankIC 的 SQL(c_rank + m_lead)与 numpy 在 1873 个交易日上最大绝对差 4.6e-15;月末十分组 SQL c_ntile 与 numpy 同口径分组一致率 100.0000%。 | 通过 |
自检里标注“有未解释尾部”或“部分未验证”的项目,均为如实披露,不代表通过。