# cn_stock_factors_hf_dw_ideal_reversal ## 文献来源 - **标题**: 《"订单簿的温度"系列研究(一):反转因子的精细结构》 - **作者**: 魏建榕、高子剑、傅开波 - **机构**: 东吴证券 - **时间**: 2018 研报用「W 式切割」把传统反转因子拆成强反转与弱动量两部分,再相减得到理想反转因子 M。切割依据是逐日的平均单笔成交金额 $D$:大单交易活跃的交易日反转性更强,不活跃的交易日反而呈弱动量,两者相减使反转信号得到加强。 本表输出切割后的两个分量 `ideal_reversal_high`(M_high)、`ideal_reversal_low`(M_low)与相减得到的 `ideal_reversal`(M)。研报以 $N=20$ 为基准,并在图 9 验证了 $N=40$ 与 $N=60$ 同样有效,因此对 $N \in \{20, 40, 60\}$ 各输出一组因子,字段以 `_20` / `_40` / `_60` 后缀区分。三组共用同一次日频表扫描。 ## 表结构 - **表名**: `cn_stock_factors_hf_dw_ideal_reversal` - **中文表名**: 东吴证券理想反转因子 - **数据描述**: 按每日平均单笔成交金额切割涨跌幅,强反转减弱动量得到理想反转因子 - **主键**: `date` + `instrument` - **记录粒度**: 每个交易日每只股票一条记录 | 字段 | 类型 | 可空 | 含义 | | ---- | ---- | ---- | ---- | | `date` | `PlDatetime` | 否 | 交易日期 | | `instrument` | `PlString` | 否 | 股票代码 | | `ideal_reversal_high_20` | `PlFloat64` | 是 | 高单笔成交金额组反转因子 M_high(N=20),过去 20 个交易日中平均单笔成交金额较高的 10 个交易日的累计收益,强反转 | | `ideal_reversal_low_20` | `PlFloat64` | 是 | 低单笔成交金额组动量因子 M_low(N=20),过去 20 个交易日中平均单笔成交金额较低的 10 个交易日的累计收益,弱动量 | | `ideal_reversal_20` | `PlFloat64` | 是 | 理想反转因子 M(N=20),等于 M_high 减 M_low,值越小反转预期越强 | | `ideal_reversal_high_40` | `PlFloat64` | 是 | 高单笔成交金额组反转因子 M_high(N=40),过去 40 个交易日中平均单笔成交金额较高的 20 个交易日的累计收益,强反转 | | `ideal_reversal_low_40` | `PlFloat64` | 是 | 低单笔成交金额组动量因子 M_low(N=40),过去 40 个交易日中平均单笔成交金额较低的 20 个交易日的累计收益,弱动量 | | `ideal_reversal_40` | `PlFloat64` | 是 | 理想反转因子 M(N=40),等于 M_high 减 M_low,值越小反转预期越强 | | `ideal_reversal_high_60` | `PlFloat64` | 是 | 高单笔成交金额组反转因子 M_high(N=60),过去 60 个交易日中平均单笔成交金额较高的 30 个交易日的累计收益,强反转 | | `ideal_reversal_low_60` | `PlFloat64` | 是 | 低单笔成交金额组动量因子 M_low(N=60),过去 60 个交易日中平均单笔成交金额较低的 30 个交易日的累计收益,弱动量 | | `ideal_reversal_60` | `PlFloat64` | 是 | 理想反转因子 M(N=60),等于 M_high 减 M_low,值越小反转预期越强 | 研报图 8 的纯净理想反转因子(`ideal_reversal_pure_20/40/60`)**尚未进入本表**:计算逻辑已在 `builder.py` 实现并通过单日验证,但 DAI 不允许修改已有 datasource 的 schema,而本表已上架到空间、删表需先下架,超出已获批的操作范围。阻塞原因与解除步骤见 `## 复现核对`。 ## 依赖数据 | 依赖表 | 频率 | 用到的字段 | 用途 | | ---- | ---- | ---- | ---- | | `cn_stock_prefactors` | 日频 | `date`、`instrument`、`amount`、`deal_number`、`change_ratio`、`total_market_cap`、`sw2021_level1`、`beta_000300SH_22`、`pb`、`pe_ttm`、`debt_to_asset_lf`、`total_operating_revenue_ttm`、`daily_return`、`turn` | `date` + `instrument` 作为输出骨架与窗口分组键;`amount` / `deal_number` 相除得到平均单笔成交金额 $D$(W 式切割的排序依据,同时用于剔除 $D$ 无定义的交易日);`change_ratio` 取 $\ln(1+R)$ 后在切割出的交易日子集上求和,还原为高 / 低 D 组的累计收益,另在 20 日窗口上累乘得到 Momentum 风格代理;`total_market_cap`、`sw2021_level1`、`beta_000300SH_22`、`pb`、`pe_ttm`、`debt_to_asset_lf`、`total_operating_revenue_ttm`、`daily_return`、`turn` 构造三个纯净因子回归用的十个风格因子与申万一级行业哑变量 | 本表只依赖 `cn_stock_prefactors` 这一张聚合日频 view,不直接读取任何分钟或逐笔表。最长窗口 $N=60$ 按「$D$ 有定义的交易日」计数,为覆盖停牌需回溯 120 个自然交易日;纯净因子的风格暴露里含 250 个交易日同比的营收增速项与 22 日贝塔,两者都是随查询窗口滚动计算的字段,单日查询返回空值,故实际回溯取两者的较大值 300 个交易日,单日增量的读取区间约为输出区间的 300 倍。 ## 因子列表 ### ideal_reversal_high **字段**: `ideal_reversal_high_20`、`ideal_reversal_high_40`、`ideal_reversal_high_60` **中文名**: 高单笔成交金额组反转因子(M_high) **描述**: 传统反转因子经「W 式切割」后保留的强反转部分。研报认为大单交易活跃(单笔成交金额高)的交易日,其涨跌幅具有更强的反转特性,因此把回溯窗口内单笔成交金额较高的那一半交易日单独取出累计收益,得到的因子反转性显著强于未切割的原始收益率因子。 **构建逻辑**: 先逐日计算平均单笔成交金额 $D$(当日成交金额 / 当日成交笔数)。在每个截面日回溯过去 $N$ 个交易日($N$ 取偶数),将这 $N$ 个交易日按 $D$ 值从大到小排序,取前 $N/2$ 个交易日为高 D 组。将高 D 组交易日的涨跌幅加总,得到 M_high;此处的「加总」按研报附注[1]实际通过累乘实现。 ```math \text{M\_high} = (1+R_1)(1+R_2)\cdots(1+R_{N/2}) - 1 ``` 其中 $R_i$ 为高 D 组第 $i$ 个交易日的涨跌幅。 **项目实现说明**: - 计算频率:研报原文为每月月底计算,本项目按项目规范改为每个交易日计算 - 累乘的实现:等价地先对 $\ln(1+R_i)$ 在窗口内求和,再取指数并减 1,以便直接使用 DAI 的窗口极值加权函数 `m_sum_greatest_k` 完成「按 $D$ 排序取前 $N/2$ 个交易日再聚合」 - 无效交易日的处理:$D$ 需要当日成交金额与成交笔数都存在且成交笔数大于 0。停牌日成交金额为 NULL,另有少量数据行成交笔数为 0 而成交金额非 0,这两类交易日的 $D$ 在数学上无定义,不参与窗口的排序与分组;回溯窗口因此取「过去 $N$ 个 $D$ 有定义的交易日」。剔除只作用于窗口样本,不作用于输出:这些交易日本身仍有输出行,因子值为 null,输出行数与 `cn_stock_prefactors` 当日行数一致,不对任何股票状态做筛选 - 排序中的空值陷阱:`m_sum_greatest_k` 把 `sort_by` 的 NULL 当作最小值处理,若保留 $D$ 无定义的行,这些行会被强制并入低 D 组;而改为把 $\ln(1+R)$ 置 NULL 又会使整个窗口返回 NULL。因此必须在进入窗口前剔除,无法靠置空规避 ### ideal_reversal_low **字段**: `ideal_reversal_low_20`、`ideal_reversal_low_40`、`ideal_reversal_low_60` **中文名**: 低单笔成交金额组动量因子(M_low) **描述**: 「W 式切割」后被剔除的弱动量部分。与高 D 组相对,大单交易不活跃(单笔成交金额低)的交易日,其涨跌幅反转特性更弱,研报实证显示这部分反而呈现弱动量效应。该因子既是理想反转因子的组成部分,也用于说明切割方案的有效性来源。 **构建逻辑**: 承 M_high 的第一步,在每个截面日回溯过去 $N$ 个交易日并按 $D$ 值从大到小排序后,取后 $N/2$ 个交易日为低 D 组。将低 D 组交易日的涨跌幅按同样的累乘方式加总,得到 M_low。 ```math \text{M\_low} = (1+R_1)(1+R_2)\cdots(1+R_{N/2}) - 1 ``` 其中 $R_i$ 为低 D 组第 $i$ 个交易日的涨跌幅。 **项目实现说明**: 同 `ideal_reversal_high`(计算频率、累乘实现、无效交易日处理) ### ideal_reversal **字段**: `ideal_reversal_20`、`ideal_reversal_40`、`ideal_reversal_60` **中文名**: 理想反转因子(M) **描述**: 研报提出的核心因子。由强反转的 M_high 减去弱动量的 M_low 得到,两个方向相反的分量相减使反转信号得到加强。研报实证显示该因子与传统反转因子相比稳定性明显改善,且与 Barra 风格因子相关性较低。 **构建逻辑**: 在同一截面日上,用高 D 组累计收益减去低 D 组累计收益。 ```math M = \text{M\_high} - \text{M\_low} ``` **项目实现说明**: - 同 `ideal_reversal_high`(计算频率、累乘实现、无效交易日处理) - 相减在收益空间进行,即先分别把两组的对数收益之和还原为累计收益再相减,不能直接对两组的对数收益之和求差(两者不等价,故不能用 `m_sum_gl_k_delta` 一步得到) ### ideal_reversal_pure **字段**: `ideal_reversal_pure_20`、`ideal_reversal_pure_40`、`ideal_reversal_pure_60`(**当前未输出**,见下方项目实现说明与 `## 复现核对`) **中文名**: 纯净理想反转因子 **描述**: 研报为剔除风格的干扰,把 M 因子在横截面上对 10 个 Barra 因子与 29 个中信一级行业指数的哑变量回归,将残差作为新的选股因子。研报披露纯净化后多空对冲的年化收益为 11.3%。研报同时给出 M 因子与 10 个 Barra 因子的相关系数矩阵(图 7),并预判 M 因子由两个涨跌幅相减得到,与传统反转因子关联较低,而与 Beta、波动率等因子的关联可能比较明显。 **构建逻辑**: 在每个截面上,把理想反转因子 M 对 10 个风格因子与一级行业哑变量做最小二乘回归,取残差。研报以 $N=20$ 为基准,本表对 $N \in \{20, 40, 60\}$ 各输出一个纯净版本。 **项目实现说明**: - 计算频率:研报原文为每月月底计算,本项目按项目规范改为每个交易日计算 - 风格因子口径:研报使用 Barra 风格因子,本项目无 Barra 因子库,用 `cn_stock_prefactors` 字段构造十个同名代理变量——Beta 取 `beta_000300SH_22`,Size 取 $\log(\text{total\_market\_cap})$,NonLinearSize 取 Size 的三次项,BooktoPrice 取 $1 / \text{pb}$,EarningsYield 取 $1 / \text{pe\_ttm}$,Growth 取营业总收入 TTM 的 250 个交易日同比,Leverage 取 `debt_to_asset_lf`,ResidualVolatility 取日收益率的 22 日标准差,Liquidity 取 $\log$(22 日平均换手率),Momentum 取 20 个交易日涨跌幅的累乘收益 - 行业口径:**研报用 29 个中信一级行业指数的哑变量,本项目用 `sw2021_level1`(申万 2021 版一级行业,31 个)**。仓库没有现成可用的中信一级行业分类,自建代价过高(见下方 `## 复现核对` 的差异说明) - 回归前对因子与自变量逐列做截面 MAD 5 倍去极值与 z-score 标准化;行业缺失的股票不参与回归,残差置空 - **当前未输出到表**:`_pure_factor()` 与所需的风格因子 SQL 都已实现,单日验证的三列覆盖度为 93.1% ~ 93.4%(与被纯净化的基础因子一致),入库前门禁 39/39 通过。但 DAI 不允许修改已有 datasource 的 schema(`ValueError: The data schema cannot be changed`),而 `overwrite=True` 对分区表不可用(`NotImplementedError: with partitioning cannot be overwritten`),`delete()` 又因本表已上架到空间而被拒(`DataSource已经上架到空间,需要先下架`)。若在 DAI 表仍为 9 列时就把字段加进 schema,该表已注册的每日增量会以同一个 schema 错误失败,故 `schema.py` 与 `builder.py` 中的纯净因子部分保持注释状态,与线上表一致 ## 复现核对 $N=20$,全市场不做任何股票过滤,前向收益用次日开盘到 21 个交易日后开盘,rankIC 按截面计算。 研报样本期上的复现结果与研报图 4 一致(研报为月末截面、月度 IC,故此处同时给出月末子样本): | 因子 | 本项目(2010-2018 月末) | 研报图 4 rankIC | 本项目(2010-2018 逐日) | | ---- | ---- | ---- | ---- | | M_high | -0.0822 | -0.082 | -0.0871 | | M_low | +0.0171 | +0.018 | +0.0243 | | M | -0.0699 | -0.070 | -0.0753 | | Ret20(对照) | -0.0622 | -0.061 | -0.0642 | 四个因子的 rankIC 与研报误差均在 0.002 以内,切割逻辑与累乘口径可认为复现无误。 $N$ 的敏感性对照研报图 9(图 9 给出的是 Pearson IC;$N$ 只改变回溯窗口,预测期一律为月度): | 因子 | 本项目 IC | 研报图 9 IC | | ---- | ---- | ---- | | M_high(N=20) | -0.0628 | -0.069 | | M_high(N=40) | -0.0590 | -0.063 | | M_high(N=60) | -0.0639 | -0.064 | | M_low(N=20) | +0.0071 | +0.011 | | M_low(N=40) | +0.0098 | +0.016 | | M_low(N=60) | +0.0123 | +0.018 | 三个 $N$ 下 M_high 的反转性与 M_low 的动量性均成立,M_low 随 $N$ 增大而更正的单调性也与研报一致。本项目的 Pearson IC 系统性略弱于研报约 0.005,而 $N=20$ 的 rankIC 与研报精确一致,差异应来自研报对因子或收益做了未披露的去极值处理(秩层面不受影响)。 近年样本(2023-11 ~ 2024-12,逐日)出现结构性变化,需在使用前注意: | 因子 | rankIC | 年化 ICIR | | ---- | ---- | ---- | | M_high | -0.0583 | -1.92 | | M_low | -0.0249 | -0.63 | | M | -0.0306 | -1.12 | | Ret20(对照) | -0.0804 | -1.71 | M_low 由研报样本期的 +0.017 转为 -0.025,弱动量特性消失。由于 M = M_high - M_low 依赖两个分量方向相反,M_low 转负会直接抵消信号,导致该样本上 M(-0.0306)明显弱于单独使用 M_high(-0.0583),且两者均弱于未切割的 Ret20(-0.0804)。本表按研报原定义完整输出三个分量,未对该现象做任何调整,下游选用时建议自行复核当期 M_low 的符号。 纯净因子 `ideal_reversal_pure_*`(研报图 8)**当前被 DAI 的 schema 限制阻塞,未入库也未核对**: | 因子 | 本项目 | 研报原文 | 出处 | | ---- | ---- | ---- | ---- | | `ideal_reversal_pure_20` 多空对冲年化收益 | 未入库,无法核对 | 11.3% | 研报 4 节正文 / 图 8 | | `ideal_reversal_pure_40` / `_60` | 未入库,无法核对 | 研报未披露,无法核对 | — | 阻塞链条(三条路都试过):DAI 不允许改已有 datasource 的 schema → `overwrite=True` 对分区表不可用 → `delete()` 被拒,因本表已上架到空间。解除步骤:**把该数据源从空间下架 → `dai.DataSource(id).delete()` → 跑 notebook 第一段按年重建(本表只依赖 `cn_stock_prefactors`,实测单年约 45 秒、全量约 10 分钟)→ 重新上架**。重建前需把 `schema.py` 的三个字段与 `builder.py` 里 `_pure_factor` 的调用取消注释。重建期间下游会短暂读不到该表。 解除阻塞、补齐核对时还须注意两处口径差异,两者都会使本项目的纯净因子绩效与研报不完全可比: 1. **行业分类不同**:研报用 29 个中信一级行业指数的哑变量,本项目用申万 2021 版一级行业(31 个)。仓库没有现成可用的中信一级行业分类,自建需要成分股与权重数据,代价远超本因子的价值 2. **风格因子为代理变量**:研报用 Barra 因子库,本项目用 `cn_stock_prefactors` 字段构造十个同名代理(见 `ideal_reversal_pure` 的项目实现说明)。研报图 7 的相关系数矩阵未给出可直接对照的数值表,故 M 与各风格因子的相关性这一项无法逐项核对 ## 示例数据 按 `date`、`instrument` 排序后的前 5 行与后 5 行,由 `update_docs()` 推送文档时自动填充。 | date | instrument | ideal_reversal_high_20 | ideal_reversal_low_20 | ideal_reversal_20 | ideal_reversal_high_40 | ideal_reversal_low_40 | ideal_reversal_40 | ideal_reversal_high_60 | ideal_reversal_low_60 | ideal_reversal_60 | |---------------------|------------|------------------------|-----------------------|-------------------|------------------------|-----------------------|-------------------|------------------------|-----------------------|-------------------| | 2026-11-02 00:00:00 | 000001.SZ | 0.057784 | -0.034549 | 0.092333 | 0.090994 | -0.072061 | 0.163055 | 0.108234 | -0.084925 | 0.193159 | | 2026-11-02 00:00:00 | 000002.SZ | -0.056604 | -0.085714 | 0.029111 | 0.151605 | -0.120655 | 0.272260 | 0.224511 | -0.217579 | 0.442090 | | 2026-11-02 00:00:00 | 000006.SZ | -0.038157 | -0.162014 | 0.123857 | -0.010278 | -0.203039 | 0.192760 | 0.147547 | -0.211441 | 0.358988 | | 2026-11-02 00:00:00 | 000007.SZ | -0.045778 | -0.123966 | 0.078188 | -0.258780 | -0.023488 | -0.235292 | 0.084807 | -0.088175 | 0.172982 | | 2026-11-02 00:00:00 | 000008.SZ | -0.004207 | -0.042782 | 0.038575 | -0.053664 | -0.060705 | 0.007041 | 0.012711 | -0.066715 | 0.079426 | | 2026-11-02 00:00:00 | 920978.BJ | null | null | null | null | null | null | null | null | null | | 2026-11-02 00:00:00 | 920981.BJ | null | null | null | null | null | null | null | null | null | | 2026-11-02 00:00:00 | 920982.BJ | null | null | null | null | null | null | null | null | null | | 2026-11-02 00:00:00 | 920985.BJ | null | null | null | null | null | null | null | null | null | | 2026-11-02 00:00:00 | 920992.BJ | null | null | null | null | null | null | null | null | null |
东吴证券理想反转因子 (cn_stock_factors_hf_dw_ideal_reversal)
数据描述: 按每日平均单笔成交金额切割涨跌幅,强反转减弱动量得到理想反转因子
文档
用例
表结构
| 字段 | 字段类型 | 字段描述 |
| ideal_reversal_high_60 | double | 高单笔成交金额组反转因子 M_high(N=60),过去 60 个交易日中平均单笔成交金额较高的 30 个交易日的累计收益,强反转。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| ideal_reversal_40 | double | 理想反转因子 M(N=40),等于 M_high 减 M_low,值越小反转预期越强。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| ideal_reversal_high_20 | double | 高单笔成交金额组反转因子 M_high(N=20),过去 20 个交易日中平均单笔成交金额较高的 10 个交易日的累计收益,强反转。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| ideal_reversal_20 | double | 理想反转因子 M(N=20),等于 M_high 减 M_low,值越小反转预期越强。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| __PARTITION__ | string | - |
| ideal_reversal_60 | double | 理想反转因子 M(N=60),等于 M_high 减 M_low,值越小反转预期越强。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| ideal_reversal_low_20 | double | 低单笔成交金额组动量因子 M_low(N=20),过去 20 个交易日中平均单笔成交金额较低的 10 个交易日的累计收益,弱动量。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| ideal_reversal_low_40 | double | 低单笔成交金额组动量因子 M_low(N=40),过去 40 个交易日中平均单笔成交金额较低的 20 个交易日的累计收益,弱动量。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| ideal_reversal_low_60 | double | 低单笔成交金额组动量因子 M_low(N=60),过去 60 个交易日中平均单笔成交金额较低的 30 个交易日的累计收益,弱动量。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| date | timestamp[ns] | 交易日期 |
| ideal_reversal_high_40 | double | 高单笔成交金额组反转因子 M_high(N=40),过去 40 个交易日中平均单笔成交金额较高的 20 个交易日的累计收益,强反转。来源:魏建榕、高子剑、傅开波. 2018. “订单簿的温度”系列研究(一):反转因子的精细结构. 东吴证券 |
| instrument | string | 股票代码 |
表名:cn_stock_factors_hf_dw_ideal_reversal
起始时间:
最近更新时间: