订单流四因子:从 L2 指纹到日频替身的策略检验

由bq6at1hl创建,最终由bq6at1hl 被浏览 8 用户

标的池:全部 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,说明它主要是市值因子的变体,需要额外中性化或直接放弃。

五、策略规则与回测

  1. 股票池:全 A,剔除科创板(688/689)、北交所(8xx/4xx/9xx)、ST、 停牌日、上市不足 365 天;再要求过去 20 日日均成交额 ≥ 3000 万元,保证可交易。
  2. 打分:S = −0.5·z(F1) − 0.5·z(F4),两者均为行业+市值中性化、缩尾、标准化后的值。
  3. 四种落地形态(同一打分、同一调仓,只改选股方式):  ① 全市场 Top40:按 S 从高到低取 40 只等权;  ② 含闸门 Top40:再加"剔除 F2 分位 ≥ 80% + 剔除 20 日内炸过板"(这是你原始假设的字面实现);  ③ 负向剔除:不买最强组,而是把 S 最差的 10% 剔掉、其余等权;  ④ 小盘组内 Top40:只在流通市值后 50% 的票里选 40 只(对应"干净订单流的小票")。
  4. 建仓:买入日若停牌或开盘一字涨停则跳过,按分数顺延下一名。
  5. 调仓:月末收盘算信号,次一交易日开盘买入,持有到下一个月末次一交易日开盘卖出。
  6. 成本:单边 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,单调性接近满分。

不赚钱的那一面(三条明确的否定)。

  1. F2 与 F3 的替身方向反了。F2 定向 IC = -0.0497(t = -8.45)、F3 定向 IC = -0.0170(t = -4.17)。 两个都是负数,意味着"毒性流动性越高、炸板越多"的票,下一个月反而跑赢。 在 2019–2026 的 A 股样本里,这两个替身测到的其实是低流动性溢价与高波动溢价, 而不是"盘口信号被污染"的折价。用它们做风险闸门,等于做空小市值风格。
  2. **闸门反噬,且幅度可测。**给复合信号加上"剔除 F2 前 20% + 剔除 20 日内炸过板"的闸门后, 年化从 +7.0% 降到 +6.4%,白丢 -0.6%。这和第 1 点是同一件事的两种表述。
  3. **IC 显著,但多头端吃不到。**多空组合扣费年化只有 +3.6%,G10−G1 月均 +0.61%。 A 股的截面排序信息大部分集中在两端,Top40 等权把差异摊平了; 再叠加月均 7381% 的换手,成本把剩下的价差吃掉一半。

**一句话。**F1 抓到的"节奏指纹"在替身层面是真的,但它更像"被动资金/指数化程度"的代理; 真正未被定价的东西(撤单结构、涨停价撤单、逐笔金额尾部)在日频上完全不可见。

七、如果要真做,怎么落地

  1. 数据:逐笔委托(含委托号、方向、价格、数量、委托时间、撤单时间)+逐笔成交 (含买方/卖方委托号、成交价、成交量、成交时间)+涨停价快照。单市场日增约 2–5 GB,需按票按日落列存。
  2. F1:把每笔成交按「主动买入=+1 / 主动卖出=−1」映射为方向序列(用逐笔成交的买卖委托号匹配, 不能用价格猜),按 1 分钟聚合成净方向,取 240 点做 FFT;峰度=log(max 功率 / 均值功率), 再对 20 日取中位数。注意剔除集合竞价与收盘集合竞价。
  3. F2:以委托号为主键,把「撤单时间 − 委托时间」做分布,分别统计 ≤5s 与 ≤30s 的撤单笔数, TOX=n(≤5s)/n(≤30s);分母为 0 的票记缺失,不要填 0。
  4. F3:筛出「卖方向、价格=当日涨停价」的委托,统计其撤销笔数 ÷ 该价位全部卖委托笔数; 须区分「撤单」与「被成交」,并剔除 ST(5% 限制)与上市首日。
  5. F4:按逐笔成交金额取 10%/90% 分位,QUA=P10/P90;再对换手率、Amihud、买卖价差做 横截面回归取残差(这一步是它与流动性因子脱钩的关键)。
  6. 频率与成本:这类微观结构因子的半衰期通常 3–10 个交易日,月度调仓会吃掉大部分信号; 建议周频或双周频调仓,成本按单边 0.15%(小票实际冲击更大,需按成交额占比加罚)。
  7. 必做的三项自检:①因子对下一期收益的 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

{link}