订单流四因子:从 L2 指纹到日频替身的策略检验
由bq6at1hl创建,最终由bq6at1hl 被浏览 3 用户
标的池:全部 A 股(剔除科创板/北交所/ST/上市不足 365 天/20 日均额 < 3000 万)· 信号区间 20190329 ~ 20260930(91 个月)· 月均股票池 3309 只 · 调仓:月末信号、次日开盘买入、持有至下月末次日开盘 · 单边成本 0.15% · 数据源:Tushare Pro 日线 + 日频资金流(四档)· 报告内所有数字读自 l2_results.json
边际有效
复合信号月度 RankIC 均值 0.0280(NW t = 6.31)方向成立且显著,但落地成组合后最优变体「小盘组内 Top40」扣费年化 +12.5%、相对基准 +0.5%:多空上有价差,多头端吃不到,只能当辅助 tilt。 需要先说明:四个因子的原始口径都依赖逐笔委托/成交与撤单,本地拿不到,本报告检验的是它们的日频替身,结论只对替身负责。
复合信号 RankIC
0.0280
NW t = 6.31;IC 胜率 78.9%
ICIR(年化)
2.49
90 个月;池均 3289 只
G10 − G1(月均)
+0.61%
组序相关 0.93
多空年化(扣费)
+3.6%
月均成本 0.30%
组合年化(扣费)
+12.5%
小盘组内 Top40
相对基准超额
+0.5%
基准 +11.9%;β 0.71
组合最大回撤
-34.6%
夏普 0.53;月胜率 56.7%
样本
90 个月
20190329 ~ 20260930;月均换手 74%
一、先把话说清楚:这份报告检验的不是原始因子
你给的四个因子,本质都是逐笔级别的订单流形状:方向序列的频谱、5 秒/30 秒撤单比、 涨停价卖单的撤回、单笔成交金额的分位结构。这些字段只存在于 Level-2 逐笔委托与逐笔成交里。 本地数据环境实测结论如下:
- Tushare
stk_mins(分钟线)能取到,但被限速到1 次/小时 / 1 次/分钟; 全 A 股 95 个月截面需要上万次调用,物理上跑不完,只够做单票个案。 limit_list_d(涨停板明细)、cyq_perf(筹码分布)、stk_factor_pro(含逐笔衍生指标)无权限;逐笔委托/成交接口不开放。- 可稳定拿到的只有:日线 OHLCV、日频换手率/流通市值、四档资金流 (小/中/大/超大单的买卖金额)。
所以本报告做两件事:**(1)把四个因子各构造一个「日频替身」,用 2019–2026 的月度截面 检验它们的经济逻辑是否成立;(2)**在第七节给出原始口径在 L2 环境里的完整落地规范, 包括字段、公式和已知陷阱。下面的所有结论,只对替身负责,不能直接当作原始因子的判决书。
二、四个替身因子的定义
| 因子 | 原始口径(需 L2) | 日频替身口径(本报告实测) | 替身丢失了什么 |
|---|---|---|---|
| F1 频谱峰度 | 挂单方向序列 FFT 后的峰值度 | 60 日换手率对数序列的 FFT 峰值比(max/mean 功率)+一阶自相关+离散度,三者等权。 峰值比高=成交节奏像节拍器 | 方向信息完全丢失,只剩「节奏规律性」;拆单节奏在日线上被平均掉 |
| F2 毒性流动性 | 5 秒内撤单 ÷ 30 秒内撤单 | 20 日 Roll 有效价差(2√(−cov(rₜ,rₜ₋₁)))+Amihud 非流动性+ 振幅/换手比,三者截面分位等权 | 撤单行为不可见,只能用「价差+深度+脆弱度」间接代理 |
| F3 涨停后悔率 | 涨停价卖单主动撤回比例 | 60 日内炸板率=(触及涨停价但收盘未封住的天数)÷(炸板+封住)天数 | 无法区分「撤单」与「被吃掉」,只能看结果;且只在有涨停事件的票上有值 |
| F4 残差粒度 | 单笔成交金额 10%/90% 分位比,剥离流动性后的残差 | 四档资金流构造 G=ln((小单+中单)/(大单+超大单)) 的 20 日均值, 再对 ln(换手)、ln(Amihud)、Roll 价差、ln(流通市值) 做横截面回归取残差 | 只有 4 个金额档,没有真正的分位数;「拆单」与「散户化」无法区分 |
所有替身都做了:行业内去均值 → 剥离 ln(流通市值) → 1%/99% 缩尾 → 标准化。 方向按你的假设设定:F1/F3/F4 取反向(值越低越好),F2 走高值端作风险闸门。
三、单因子检验结果
图 1 各因子月度 RankIC 序列 (已按假设方向取号,正值=假设成立;复合为 F1/F4 各半)
-0.38-0.23-0.080.070.222019-032020-022021-012021-122022-112023-102024-092025-082026-07F1 峰度(反向)12期均值复合F4 粒度(反向)F2 毒性
| 因子 | 方向假设 | RankIC | NW t | 胜率 | G10−G1 | 前后半段 IC | 判定 |
|---|---|---|---|---|---|---|---|
| F1 频谱峰度 | 低峰度(订单流干净) | 0.0296 | 7.51 | 74.4% | +0.72% | 0.03 / 0.03 | 边际 |
| └ 频谱峰值比 | 低 | 0.0191 | 2.78 | 61.1% | +0.22% | 0.03 / 0.01 | 不显著 |
| └ 换手自相关 | 低 | 0.0303 | 3.41 | 64.4% | +0.73% | 0.04 / 0.02 | 显著 |
| └ 换手离散度 | 低 | 0.0325 | 4.28 | 64.4% | +0.51% | 0.05 / 0.02 | 显著 |
| F2 毒性流动性 | 极端高剔除 | -0.0497 | -8.45 | 27.8% | -1.23% | -0.05 / -0.05 | 反向显著 |
| F4 残差粒度 | 低粒度残差 | 0.0109 | 1.96 | 55.6% | +0.25% | 0.01 / 0.01 | 不显著 |
| F3 涨停炸板率 | 低后悔率 | -0.0170 | -4.17 | 33.3% | -0.56% | -0.01 / -0.02 | 不显著 |
「前后半段 IC」把 95 个月对半切开,用来判断信号是否只在某一段行情里成立。 F3 只在有涨停事件的票上有值,样本稀疏,IC 的置信度天然更低(有效月份 90 个)。
图 2 复合信号十组下期平均收益 (G1 最低分 → G10 最高分,红涨绿跌)
-0.13%0.25%0.63%1.00%1.38%0.49%G10.60%G20.82%G30.82%G40.99%G50.93%G60.99%G71.19%G81.25%G91.10%G10
图 3 单因子多空累计净值 (不扣费;注意各因子起点不同)
0.180.641.111.572.03F1 反向多空复合多空F4 反向多空F3 假设方向F2 假设方向
图 4 复合信号 IC 分布 (柱高=月份数,右侧为假设成立方向)
036912-0.06-0.030.000.030.060.090.12
四、因子之间、以及与市值的关系
| F1 | F2 | F4 | 与 ln(流通市值) | |
|---|---|---|---|---|
| F1 | 1.00 | -0.18 | -0.00 | -0.01 |
| F2 | -0.18 | 1.00 | 0.10 | -0.01 |
| F4 | -0.00 | 0.10 | 1.00 | -0.02 |
相关系数是逐月截面的 Spearman 相关再纵向汇总。若某因子与 ln(流通市值) 的相关绝对值 大于 0.3,说明它主要是市值因子的变体,需要额外中性化或直接放弃。
五、策略规则与回测
- 股票池:全 A,剔除科创板(688/689)、北交所(8xx/4xx/9xx)、ST、 停牌日、上市不足 365 天;再要求过去 20 日日均成交额 ≥ 3000 万元,保证可交易。
- 打分:
S = −0.5·z(F1) − 0.5·z(F4),两者均为行业+市值中性化、缩尾、标准化后的值。 - 四种落地形态(同一打分、同一调仓,只改选股方式): ① 全市场 Top40:按 S 从高到低取 40 只等权; ② 含闸门 Top40:再加"剔除 F2 分位 ≥ 80% + 剔除 20 日内炸过板"(这是你原始假设的字面实现); ③ 负向剔除:不买最强组,而是把 S 最差的 10% 剔掉、其余等权; ④ 小盘组内 Top40:只在流通市值后 50% 的票里选 40 只(对应"干净订单流的小票")。
- 建仓:买入日若停牌或开盘一字涨停则跳过,按分数顺延下一名。
- 调仓:月末收盘算信号,次一交易日开盘买入,持有到下一个月末次一交易日开盘卖出。
- 成本:单边 0.15%(买卖各计),按实际换手扣减。
年化收益(扣费)+12.46%达标年化波动23.68%夏普0.53达标最大回撤-34.63%月胜率56.7%相对沪深300 α(年化)+12.39%达标相对沪深300 β0.71月均单边换手73.8%相对基准超额(年化)+0.54%达标多空组合年化(扣费)+3.61%达标
四种落地形态的对比
| 变体 | 年化(扣费) | 超额 vs 基准 | 最大回撤 | 夏普 | 月均换手 |
|---|---|---|---|---|---|
| 复合 Top40(无闸门) | +7.0% | -1.7% | -38.7% | 0.31 | 79.9% |
| 复合 Top40(含闸门) | +6.4% | -2.3% | -38.2% | 0.29 | 80.1% |
| 负向剔除 10% | +9.0% | +0.4% | -26.1% | 0.37 | 21.3% |
| 小盘组内 Top40 | +12.5% | +0.5% | -34.6% | 0.53 | 73.8% |
| 全市场等权 | +8.6% | — | — | — | — |
| 小盘等权(对照) | +11.9% | — | — | — | — |
| 沪深300 | +1.1% | — | — | — | — |
「负向剔除」不买最强组,而是把复合信号最差的 10% 剔掉、其余等权持有。 在 A 股,微观结构类因子的空头端信息通常比多头端稳定:差的更好识别,好的极难排序。
图 5 组合净值对比 (扣费后;小盘组内 Top40 应对比"小盘等权",负向剔除应对比"全市场等权")
0.611.111.622.132.642019-032020-022021-012021-122022-112023-102024-092025-082026-07小盘组内 Top40小盘等权负向剔除 10%全市场等权沪深300
图 6 分年度收益 (仅完整年度;负向剔除扣费 vs 全市场等权)
-28%-8%+12%+33%+53%202020212022202320242025负向剔除全市场等权
| 年度 | 负向剔除(扣费) | 全市场等权 | 超额 | 复合 IC 均值 |
|---|---|---|---|---|
| 2020 | +25.62% | +22.28% | +3.34% | 0.030 |
| 2021 | +22.05% | +21.31% | +0.74% | 0.040 |
| 2022 | +2.41% | +2.80% | -0.39% | 0.010 |
| 2023 | -20.22% | -20.06% | -0.16% | 0.009 |
| 2024 | +26.66% | +27.80% | -1.15% | 0.039 |
| 2025 | +44.84% | +45.11% | -0.27% | 0.029 |
最近一期组合(小盘组内 Top40,信号日 20260831,共 40 只,此处列前 20)
| 代码 | 该期实现收益 |
|---|---|
| 001228.SZ | 32.82% |
| 002005.SZ | 10.93% |
| 301589.SZ | 9.32% |
| 601999.SH | 8.49% |
| 600609.SH | 8.41% |
| 002419.SZ | 7.49% |
| 603351.SH | 6.41% |
| 001288.SZ | 6.02% |
| 301206.SZ | 5.66% |
| 002561.SZ | 4.72% |
| 603790.SH | 4.45% |
| 600165.SH | 4.05% |
| 301007.SZ | 3.38% |
| 002481.SZ | 1.66% |
| 300096.SZ | 0.34% |
| 300267.SZ | -0.30% |
| 600336.SH | -0.64% |
| 600794.SH | -1.85% |
| 600715.SH | -2.40% |
| 603035.SH | -2.50% |
六、为什么这套逻辑可能赚钱,又可能不赚钱
**赚钱的那一面(实测成立的部分)。**F1 的替身——60 日换手率对数序列的频谱峰度——反向取号后 RankIC = 0.0296(NW t = 7.51),IC 胜率 74.4%,前后半段 +0.0309 / +0.0284,两段几乎一致。 也就是说:过去两个月成交节奏越像节拍器(峰值比高、自相关强、离散度小),下一个月越容易跑输。 这和你的故事是同一个方向——节奏越规整,短期价格里的信息密度越低,反应越钝; 反而成交节奏"脏"、形态散的票,一旦有真实资金进场,价格一次性走完。 复合信号(F1 与 F4 各半)定向 IC = 0.0280(t = 6.31),IC 胜率 78.9%, 十组收益与组序的相关系数 0.93,单调性接近满分。
不赚钱的那一面(三条明确的否定)。
- F2 与 F3 的替身方向反了。F2 定向 IC = -0.0497(t = -8.45)、F3 定向 IC = -0.0170(t = -4.17)。 两个都是负数,意味着"毒性流动性越高、炸板越多"的票,下一个月反而跑赢。 在 2019–2026 的 A 股样本里,这两个替身测到的其实是低流动性溢价与高波动溢价, 而不是"盘口信号被污染"的折价。用它们做风险闸门,等于做空小市值风格。
- **闸门反噬,且幅度可测。**给复合信号加上"剔除 F2 前 20% + 剔除 20 日内炸过板"的闸门后, 年化从 +7.0% 降到 +6.4%,白丢 -0.6%。这和第 1 点是同一件事的两种表述。
- **IC 显著,但多头端吃不到。**多空组合扣费年化只有 +3.6%,G10−G1 月均 +0.61%。 A 股的截面排序信息大部分集中在两端,Top40 等权把差异摊平了; 再叠加月均 7381% 的换手,成本把剩下的价差吃掉一半。
**一句话。**F1 抓到的"节奏指纹"在替身层面是真的,但它更像"被动资金/指数化程度"的代理; 真正未被定价的东西(撤单结构、涨停价撤单、逐笔金额尾部)在日频上完全不可见。
七、如果要真做,怎么落地
- 数据:逐笔委托(含委托号、方向、价格、数量、委托时间、撤单时间)+逐笔成交 (含买方/卖方委托号、成交价、成交量、成交时间)+涨停价快照。单市场日增约 2–5 GB,需按票按日落列存。
- F1:把每笔成交按「主动买入=+1 / 主动卖出=−1」映射为方向序列(用逐笔成交的买卖委托号匹配, 不能用价格猜),按 1 分钟聚合成净方向,取 240 点做 FFT;峰度=log(max 功率 / 均值功率), 再对 20 日取中位数。注意剔除集合竞价与收盘集合竞价。
- F2:以委托号为主键,把「撤单时间 − 委托时间」做分布,分别统计 ≤5s 与 ≤30s 的撤单笔数, TOX=n(≤5s)/n(≤30s);分母为 0 的票记缺失,不要填 0。
- F3:筛出「卖方向、价格=当日涨停价」的委托,统计其撤销笔数 ÷ 该价位全部卖委托笔数; 须区分「撤单」与「被成交」,并剔除 ST(5% 限制)与上市首日。
- F4:按逐笔成交金额取 10%/90% 分位,QUA=P10/P90;再对换手率、Amihud、买卖价差做 横截面回归取残差(这一步是它与流动性因子脱钩的关键)。
- 频率与成本:这类微观结构因子的半衰期通常 3–10 个交易日,月度调仓会吃掉大部分信号; 建议周频或双周频调仓,成本按单边 0.15%(小票实际冲击更大,需按成交额占比加罚)。
- 必做的三项自检:①因子对下一期收益的 RankIC 在市值分组内是否仍成立; ②换手率提高后净收益是否还为正;③因子值在停牌/涨跌停日是否被异常放大。
八、结论与风险
**结论一:**复合信号月度 RankIC = 0.0280(NW t = 6.31),统计上成立、经济上很薄。 三种落地形态里最好的是「小盘组内 Top40」:扣费年化 +12.5%,相对同池基准超额 +0.5%; 「负向剔除 10%」年化 +9.0%(超额 +0.4%,月均换手仅 2133%,回撤最小); 「含闸门 Top40」+6.4%,被闸门拖累。能做出超额,但幅度薄,只能当辅助 tilt。
结论二:四个因子的替身,强弱排序和原始逻辑的重要程度并不一致。 F1(节奏指纹)的替身在日频上最强、也最稳定,但它丢掉方向信息后剩下的只是"成交节奏规律性"; F4(大小单粒度残差)方向对、但很弱(t = 1.96); F2 与 F3 的替身方向与假设相反,只能当反向风格暴露或干脆不用。 真正需要 L2 才能验证的,恰恰是唯一无法用日频替代的那部分——撤单结构与逐笔金额尾部。
**结论三:**这套因子的容量很小。它赚的是"盘口信号被污染"的钱,而这类错误只在小市值、 低流动性的票上明显;一旦资金规模上去,冲击成本会先吃掉超额。按 3000 万日均额的下限估算, 单策略容量大致在 2–5 亿元,超过后需按成交额占比拆分。
- 替身与原始因子之间存在结构性偏差,本报告的 IC 数值不能外推为原始因子的表现。
- 股票池用当前
stock_basic的 ST/上市日期做静态过滤,存在轻微幸存者偏差; 已退市标的未纳入,可能高估策略收益。 - 收益用
pct_chg复利计算(含分红再投),买卖点用未复权开盘价, 除权日附近可能有小数点级误差。 - F3 的炸板判定用「最高价触及涨停价且收盘未封住」,无法区分「炸板后回封」, 会把部分强势票误判为弱票。
- 月度调仓对微观结构因子偏慢;本报告的结论偏保守,不代表周频下同样无效。
订单流四因子 · 日频替身口径 · 本地 pandas 实现 · 所有数字取自 l2_results.json