理想反转因子分析报告

由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. 加工说明

  1. 股票池过滤:全 A,剔除停牌、ST/*ST、上市不足 250 个交易日。交易日数用 LEFT JOIN 取自 cn_stock_factors_base,缺失时用 list_days×245/365 兜底,没有因缺失而丢行。实测缺交易日数的是 920 开头的北交所代码,与任务提示的 430/83x/87x 不一致;这些代码最终也因成交笔数缺失被剔除(见风险与备注)。
  2. 算原始因子 M:每只股票取过去 20 个交易日,算每日平均单笔成交金额(成交金额 ÷ 成交笔数);单笔金额最高的 10 天涨跌幅相加得 Mhigh,最低的 10 天相加得 Mlow,M = Mhigh − Mlow。引擎里一次完成(m_sum_gl_k_delta)。
  3. 行业中位数填充:窗口里有停牌或无成交的日子,M 算不出来,用同一天、同一申万一级行业的中位数补上。
  4. 缩尾 + 标准化:每个交易日横截面上先按 1% / 99% 分位缩尾,再做 z-score。
  5. 中性化:每日横截面上,把因子对“行业哑变量 + 对数总市值”回归,只留残差(c_neutralize_resid)。
  6. 再标准化:残差再做一次 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%。 通过

自检里标注“有未解释尾部”或“部分未验证”的项目,均为如实披露,不代表通过。

{link}