量化交易

量化因子衰退的内在逻辑:从拥挤度到市场微观结构的变化

量化因子衰退,通常不是某一天突然失效,也不是回测曲线在某个拐点之后立刻断崖。更常见的情况是:因子还在赚钱,但收益开始变薄;信号还在出现,但成交以后变成滑点;模型还在选股,但你真正拿到手的收益已经被拥挤交易、拆单执行和冲击成本一层层绞杀。…

量化因子衰退的内在逻辑:从拥挤度到市场微观结构的变化

很多交易者看到因子净值回撤,第一反应是换参数、改窗口、加一个机器学习模型。这个动作看起来积极,实际上经常是在给已经堵死的水管继续加压。因子衰退的核心矛盾,不是公式写错,而是市场环境变了:跟踪同一类信号的资金更多了,执行订单的方式更隐蔽了,原本可以被日频数据识别的交易行为,已经被算法拆成了数百笔、数千笔小单。

你如果还拿几年前的“大单资金流”、收盘价动量、单一价值因子去解释今天的成交结构,等于带着旧地图进了新战场。地图上的路还在,脚下的地形已经被推平重做。

因子动物园不是宝库,先问清楚超额收益从哪里来

学术研究和量化社区里,已经出现了超过300种因子。规模、价值、动量、波动率、质量、成长、反转、流动性,再叠加各种财务指标、价格指标和资金流指标,因子很容易从工具变成收藏品。

问题是,因子数量增加,不等于可交易的超额收益增加。

大量因子在论文或历史数据库里表现漂亮,落到真实账户却迅速变形,主要有三道闸门:

1. 样本内有效,样本外失血。

参数是围绕过去的市场状态调出来的,换一个时间段、行业结构或交易制度,信号强度马上下降。

2. 忽略交易成本。

因子每天给出很多换手,回测按照收盘价或下一根开盘价成交,曲线看起来平滑。真实下单时,盘口深度、冲击成本、滑点和排队位置会直接吞掉那点微弱的优势。

3. 因子之间高度同质化。

你以为自己持有五个独立因子,实际上它们可能都在表达同一个拥挤方向。动量因子、资金流因子和短期强势因子,在某些行情里会一起买入同一批股票。行情顺风时,这叫共振;风向反转时,这就是集体踩踏。

因子能不能活下来,不能只看历史年化收益。更关键的是追问:这项收益到底补偿了什么风险?来自信息差、行为偏差、流动性折价,还是单纯来自某段时期的资金流入?

如果答案只是“过去有效”,那它离爆仓并不远。机构资金一旦集中跟踪,因子收益就会被提前交易。信号发布时,价格已经被推到更高的位置;你再按规则买入,买到的不是Alpha,而是前面资金留下的出货价。

拥挤度如何侵蚀因子收益

因子拥挤度,指的是跟踪或投资某个因子的资金过多,最终导致该因子的收益性或收益稳定性下降。它不是简单的持仓数量统计,而是资金、仓位、交易方向和退出路径同时挤在一条狭窄通道里。

拥挤交易有三个阶段。

第一阶段是收益扩张。越来越多资金发现同一信号,买盘增加,因子组合表现变好。研究者看到净值曲线向上,于是把信号写进更多模型。

第二阶段是收益前置。因子还有效,但收益已经从“信号出现后上涨”变成“信号被预期时上涨”。模型之间互相抢跑,成交价越来越差,持仓周期越来越短。

第三阶段是流动性反噬。市场出现压力时,所有策略同时减仓。原本看起来相关性不高的组合,突然在同一个交易日触发卖出。盘口买方深度不足,价格被连续击穿,止损单和被动减仓进一步放大冲击。

这就是为什么因子衰退不能只用滚动收益率判断。净值回撤是结果,拥挤度是原因之一。你需要同时观察信号强度、持仓重合、换手、成交容量、行业暴露和退出时的流动性。

因子最危险的时刻,不是没人使用,而是所有人都相信它还能继续使用。

传统资金流指标,正在被拆单算法打穿

过去做资金流分析,常见做法是按照成交金额划分大单、中单和小单,再用买卖方向估算主力资金流入流出。这套方法并非完全没有价值,但它依赖一个前提:大资金会以相对明显的大额订单进入市场。

这个前提已经被算法交易改变。

机构执行一笔大额订单,不会把完整订单直接砸进盘口。为了降低市场冲击、隐藏交易意图,常见执行方式是“大单化小”,也就是把一笔大单切成许多小订单,在不同时间、不同价位逐步成交。订单可能按照成交量、时间、盘口深度或短期价格波动动态调整。

于是,传统指标遇到了一个麻烦:它看到的是很多笔小单,却看不到背后那笔真正的大单。

表面上看,盘口里没有明显的主力扫货;实际上,某个方向的资金可能已经持续成交了几十分钟。你用日度数据汇总时,只能看到当天净流入;你用固定金额门槛识别“大单”时,又会漏掉被拆散的机构订单。

这不是简单的数据精度问题,而是观测对象发生了变化。

以前的资金流指标试图识别“订单有多大”;现在更应该识别“订单行为是否持续、是否具有方向性、是否在特定时段反复出现”。前者容易被拆单击穿,后者才接近真实的执行逻辑。

拆单如何制造虚假的平静

算法拆单最容易制造三种错觉。

第一,盘口看起来没有攻击性。

没有一笔订单明显扫穿多档价格,交易者便误以为买卖双方力量均衡。但如果同一方向的小单持续吃掉卖一、卖二附近的流动性,价格依然会被慢慢推高。

第二,单笔资金规模不突出。

固定阈值把订单划成小单之后,传统大单资金流会出现失真。大资金没有消失,只是把脚步放轻了。

第三,日度数据掩盖了交易时段差异。

同样是全天净流入,早盘集中流入和尾盘持续流入,背后的交易含义完全不同。前者可能是开盘定价和抢跑,后者可能与指数调整、收盘执行或资金被动配置有关。

如果你只看日线级别资金流,等于把一场盘中的攻防压成一句摘要。摘要能告诉你发生过什么,不能告诉你是谁在什么时候、以什么方式完成了成交。

这也是资金流因子需要从日频走向分钟频的原因。不是为了追求更快,而是为了把被日度汇总抹掉的交易结构重新捞出来。

从日频到分钟频:不要追逐噪声,要重构残差

把日度资金流切成分钟频,并不意味着把数据切得越细越好。很多人一听到高频,就开始缩短窗口、增加指标、堆叠模型,最后把盘口噪声当成信号,把一次偶然成交当成资金意图。

真正有价值的方向,是对资金流进行切割、分组和残差重构。

第一步:把全天资金流拆成可解释的时段

早盘、午盘、尾盘的交易机制和参与者结构并不相同。研究事实显示,早盘9点30分到10点的成交量占比约为25%,这意味着开盘阶段本身就承载了相当一部分价格发现过程。

但成交量集中不等于信号一定更强。

早盘的价格波动可能受到隔夜信息、集合竞价、指数开盘调整和集中止损影响。这里既有真实信息,也有大量被动成交。尾盘则常见撤单集中、被动执行和仓位调整。不同时间段的资金流,不能简单加总后当成同一种力量。

你至少应该把资金流拆成:

  • 早盘集中成交与持续成交;
  • 午盘恢复后的方向延续;
  • 尾盘成交与撤单行为;
  • 特定波动状态下的资金流;
  • 相对于同类股票、同一行业和自身历史基准的异常流入。

第二步:建立基准,再观察偏离

假设某只大市值股票每天早盘成交额都很高,那么今天早盘出现较大的资金流,并不自动代表机构正在加仓。它可能只是这只股票的正常交易节奏。

因此,真正要研究的是偏离基准的部分,也就是残差。

残差不是一个神秘术语。它回答的问题很直接:在控制了股票规模、行业、市场整体波动、正常成交时段和历史交易习惯之后,这只股票今天的资金流还剩下多少异常部分?

可以从几个方向构建基准:

  • 用股票自身过去一段时间的分钟成交模式,估计正常资金流;
  • 控制流通市值、行业和市场波动,避免把规模效应误认为资金意图;
  • 对早盘、午盘、尾盘分别建模,避免时段结构混在一起;
  • 将市场整体资金流剥离,观察个股相对市场的异常变化;
  • 对极端成交和异常价格冲击进行降权,减少单笔交易对结果的污染。

最后留下的残差,才有机会成为可检验的信号。

第三步:检验信号能否穿过成本

研究资料给出的结果显示,基于逐笔成交数据,将日度资金流提升到分钟频进行切割与重构后,大单分钟资金流切割残差因子的平均信息系数为0.041,信息系数信息比率为3.23,多空对冲年化收益率为15.9%。

另一种按时段重构的大单分钟资金流时段残差因子,平均信息系数为0.043,信息系数信息比率为3.41,多空对冲年化收益率达到16.8%。

还有基于不同交易情景构建的残差因子,平均信息系数为0.037,信息系数信息比率为3.88,多空对冲年化收益率为14.1%。

这些数字不能被粗暴地理解成“照抄模型就能获得同样收益”。它们代表的是特定数据、样本、构造方法和交易假设下的实证表现。切割因子、时段因子和情景因子也不是同一个东西,不能把几组结果拼成一个更漂亮的故事。

但它们揭示了一个清晰方向:资金流因子不应该停留在全天汇总和固定金额阈值上。对交易时段、成交行为和基准偏离进行重构,能够提高信号对真实执行过程的描述能力。

资金流处理方式主要观察对象容易出现的问题重构方向
日度资金流全天净流入或净流出抹平盘中时序,无法识别执行节奏拆分到分钟频和交易时段
固定金额大单单笔成交金额拆单后机构订单被识别为小单观察持续性、方向性和成交序列
行业内资金流排名同行业相对强弱容易混入行业整体行情剥离行业和市场共同成分
原始成交量异常成交是否放大无法区分信息交易与被动交易建立历史基准并计算残差
全时段统一因子全天信号平均值忽略早盘、尾盘的交易机制差异按时段、波动和情景分别重构

撤单不是盘口噪声,它会暴露流动性的裂缝

成交数据记录了已经发生的交易,委托和撤单则记录了参与者原本打算做什么,以及他们在压力下如何改变计划。

日内撤单分布呈现出早盘衰减、尾盘放量的特征,尾盘撤单相对集中。这个现象对微观结构研究非常关键,因为撤单不是单纯的无效数据。大量撤单可能意味着报价方正在重新评估风险,也可能意味着盘口流动性正在收缩。

当价格平稳时,撤单比例和股票市值之间展现出较好的分组单调性。换句话说,不同市值股票的撤单行为存在系统差异。小市值股票的盘口深度、参与者结构和报价稳定性,与大市值股票并不相同。你拿同一个撤单阈值扫过全市场,得到的不是统一尺度,而是一堆混合误差。

为什么尾盘撤单值得单独处理

尾盘是很多策略集中调整仓位的时间段。指数跟踪、组合再平衡、日终风控、隔夜风险控制和套利平仓,都可能在这个阶段增加成交与撤单。

尾盘撤单集中,至少带来三种研究价值:

1. 判断盘口深度是否真实。

挂单数量很多,不等于这些流动性愿意被成交。撤单快速增加时,盘口上的买卖量可能只是短暂展示。

2. 识别执行压力。

如果某一方向的成交持续发生,同时对手方挂单反复撤退,价格冲击会被放大。此时再用常规成交量指标判断强弱,容易误判。

3. 修正交易成本。

回测里最容易被低估的是成交难度。撤单比例上升,意味着你看到的报价更难真正成交,滑点模型必须跟着变。

撤单因子不能单独承担方向预测任务。它更适合用于调整信号可信度、估计流动性风险和动态改变下单方式。方向信号告诉你想买还是想卖,撤单行为告诉你现在能不能按理想价格买卖。

这两者混在一起,模型会变得难以解释;完全分开,又会浪费微观结构信息。实战上更稳妥的方式,是把撤单特征放进交易执行和风险控制层,而不是强行把它包装成一个万能选股因子。

你看到的是挂单,市场真正给你的,只有成交。撤单一集中,报价就可能变成一面薄墙,轻轻一撞便被击穿。

从信号生成到开平仓:因子衰退会先出现在成交层

一个因子是否衰退,不能只看它是否还能预测未来收益,还要看信号变成订单以后,是否仍然能留下利润。

下面用一个抽象的交易流程说明问题。假设分钟频资金流残差因子在某只股票上出现正向异常,模型给出买入信号。传统做法可能是下一分钟直接按固定比例下单,持仓到收盘或下一个调仓时点。

这套流程至少有四个可能的失血点。

信号出现时,价格已经被提前推升

如果模型使用的是收盘后才能完整计算的数据,那么下一交易日开盘执行,价格可能已经完成部分调整。回测使用理想成交价时,信号收益会被高估。

解决方法不是简单提前计算,而是明确数据可用时间。分钟数据必须区分成交发生时间、数据接收时间、因子计算时间和订单发出时间。只要其中一环被写错,回测就会发生隐形未来函数。

方向正确,但成交价格不对

资金流因子对价格方向判断正确,不代表你的订单能在理想价位成交。盘口深度不足时,市价单会连续吃掉多档报价;限价单则可能排队失败,最后根本没有成交。

因此,收益归因不能只写成:

收益=信号方向×价格变化。

更接近真实交易的表达是:

收益=信号方向带来的价格收益-手续费-滑点-冲击成本-未成交机会成本。

最后一项经常被忽略。订单没有成交,不代表没有损失。如果信号有效而你因为限价过严没有买到,机会成本同样会侵蚀策略表现。

加仓过程可能改变信号本身

当模型持续收到同方向资金流信号时,策略可能分批加仓。但你的成交会改变市场短期供需,尤其是在小市值和低流动性股票中,策略规模越大,越容易把自身冲击误认为信号延续。

这是量化交易里很难受的一种反馈:模型发现上涨,买单推动上涨,回测于是认为信号更强;真实交易规模扩大以后,买单把价格推高,随后又因为缺乏新的承接而回落。模型不是被市场打败,而是被自己的订单暴露出来。

平仓触发时,所有人都在同一扇门前

因子衰退期间,持仓结构通常更拥挤,平仓相关性也更高。一旦因子组合反转,大家会同时减仓。你设置的止损价可能只是理论上的防线,实际成交会在更差的位置完成。

这就是扫损和滑点叠加的地方。止损不是保险,它只是把风险从“是否离场”变成“以什么价格离场”。如果模型没有估计极端时段的成交冲击,止损触发越坚决,账户损失越快。

怎样判断一个因子正在衰退

判断因子衰退,不能拿单一指标下结论。因子收益下滑可能来自市场风格切换,也可能来自拥挤、成本上升、数据失真或信号前置。实战中,我会把检查拆成五个层面。

一,看预测能力是否持续变弱

信息系数下降,说明因子对未来收益的排序能力减弱。但不要只看单月或单周。分钟频因子本身噪声更大,短期波动不能直接等同于永久失效。

需要观察:

  • 信息系数的滚动均值是否持续下移;
  • 信息系数信息比率是否恶化;
  • 多空组合的收益是否从单边变成频繁反转;
  • 因子在不同市值、行业和流动性分组中的表现是否同步衰退;
  • 因子收益是否只集中在少数极端交易日。

如果只有总体收益下降,而分组排序能力仍在,问题可能出在交易成本和组合构造。如果信息系数本身也持续坍塌,才需要进一步怀疑信号逻辑。

二,看收益是否被交易成本吃掉

因子衰退经常不是预测能力完全消失,而是毛收益还在,净收益先死。

把策略拆成不同换手水平后,观察收益对换手和成交额的敏感度。若低换手版本还能维持,实际高换手版本迅速失血,说明信号存在,但交易方式已经不适配当前市场。

特别要注意:

  • 平均滑点是否逐月上升;
  • 开盘和收盘成交是否贡献了大部分亏损;
  • 小市值组是否出现更明显的收益折损;
  • 限价单未成交比例是否上升;
  • 订单冲击是否随着持仓规模扩大而非线性增加。

三,看持仓是否越来越拥挤

拥挤度没有一个适用于所有市场的单一公式,但可以从持仓和交易结果中建立代理指标:

  • 不同策略之间的持仓重合度;
  • 因子组合与行业指数、风格指数的相关性;
  • 因子收益集中在少数股票的程度;
  • 极端行情下的共同平仓幅度;
  • 多空两端的流动性差异;
  • 同类信号出现后的价格跳跃和收益前置。

如果一个因子长期只靠少数热门股票贡献收益,风险已经不在因子本身,而在退出路径。只要这些股票的盘口被打薄,策略就会被迫用更差价格平仓。

四,看信号是否从日频转移到盘中

传统日度因子在收益下降时,不能直接宣布失效。先检查它的收益是否被盘中交易提前消耗。

例如,过去因子在次日开盘到收盘之间赚钱,现在可能变成开盘跳空后不再延续。这个变化说明市场参与者已经把信息提前定价。信号仍然存在,但可交易窗口缩短了。

这时,策略需要重新回答:你要赚的是隔夜收益、开盘后的延续,还是盘中回撤后的再进入?不同答案对应不同数据和执行模型。

五,看市场状态是否已经切换

因子可能在趋势行情、震荡行情、流动性宽松和流动性收缩阶段表现不同。不能因为某段时期失效,就断言经典因子永久完全失效。

但也不能拿“市场风格轮动”四个字替所有亏损背锅。真正的状态识别,应该落到可观测变量上,比如波动率、成交集中度、行业扩散度、盘口深度、撤单比例和资金流方向一致性。

模型必须知道自己在哪种环境里交易。否则所谓动态策略,只是给静态因子套了一层漂亮包装。

策略迭代,不是继续堆因子

因子衰退后,最常见的错误是增加更多因子。原来五个因子不赚钱,就再加十个;模型不稳定,就换更复杂的机器学习算法;回撤太大,就把止损和过滤条件继续叠加。

这样做很容易把问题掩盖,而不是解决。

策略迭代首先要区分三个层面:

1. 信号层:因子还能不能解释未来收益;

2. 组合层:多个信号组合后是否发生拥挤和暴露重叠;

3. 执行层:订单能不能以可接受成本完成。

信号层的问题,不能靠执行优化解决。执行层的问题,也不能靠添加财务因子解决。三者混在一起调参,最后只会得到一个对历史样本极其敏感的黑箱。

先做因子残差,再谈模型升级

残差重构的意义,在于剥离已被市场广泛定价的部分。

以资金流为例,原始资金流可能同时包含市场整体风险偏好、行业轮动、股票规模效应和个股异常交易。把这些共同成分剥离后,剩下的残差更接近个体层面的异常行为。

同样的方法也可以用于其他因子:

  • 对动量因子剥离市场和行业趋势;
  • 对波动率因子剥离股票规模和流动性差异;
  • 对价值因子剥离行业估值中枢;
  • 对成交量因子剥离股票自身的日内季节性;
  • 对短期反转因子剥离极端行情和涨跌停约束。

残差不是天然有效,但它能让研究者知道:收益到底来自共同风险,还是来自相对偏离。

再用交易情景切割信号

同一个因子,在不同情景下的含义不同。资金流出现在低波动盘整、快速下跌、尾盘跳水或行业整体上涨时,不能用同一个权重处理。

情景切割至少可以围绕以下变量展开:

  • 市场整体上涨还是下跌;
  • 行业是否同步走强;
  • 个股是否处于放量突破或缩量反弹;
  • 资金流发生在早盘、午盘还是尾盘;
  • 撤单比例是否同步升高;
  • 盘口深度是否足以承接策略订单。

资料中的情景残差因子,平均信息系数为0.037,信息系数信息比率为3.88,多空对冲年化收益率为14.1%。它的表现并非简单高于其他重构方法,而是说明情景划分可以改变信号的稳定性和风险结构。研究时不要只盯年化收益率,信息系数信息比率、回撤来源、换手和容量同样要放在桌面上。

最后才是动态权重和机器学习

机器学习可以处理非线性关系,但它不会自动识别数据污染,更不会替你支付滑点。输入的是被拆单扭曲的资金流,输出再复杂,也只是更精细地拟合错误。

模型升级之前,至少要完成三件事:

  • 确认分钟数据的时间戳和可用时点没有未来函数;
  • 确认训练集、验证集和测试集之间没有股票池和标签泄漏;
  • 确认回测成交规则能反映真实盘口,而不是默认每一笔都能按中间价成交。

动态权重可以根据因子近期信息系数、拥挤度、流动性和市场状态进行调整,但必须限制调整速度。否则模型会在噪声出现时频繁换挡,换手上升,滑点扩大,最终把信号收益交给券商和市场。

一套更接近实战的因子衰退排查顺序

如果你的量化策略已经出现连续回撤,不要一上来重写全部代码。先按顺序拆解,找出是哪一层在漏水。

先冻结原始版本

保留原始因子、原始组合和原始执行规则,不要边改边覆盖。否则你会失去对照组,最后无法判断收益变化来自市场,还是来自自己的修改。

再拆分毛收益和净收益

把手续费、滑点、冲击成本、未成交损失分别列出。很多策略的毛收益并没有明显恶化,真正被击穿的是净收益。

再按时段拆分

分别观察早盘、午盘和尾盘的信号收益。早盘收益消失,可能是信号前置;尾盘收益消失,可能是拥挤平仓和撤单增加;只有分时段后,问题才会露出轮廓。

再按流动性和市值分组

不要只看全市场平均值。将股票按市值、成交额、盘口深度和撤单比例分组,观察因子在哪些组中最先失效。

如果收益只剩在低流动性股票里,策略可能不是找到了Alpha,而是在承担无法退出的流动性风险。如果收益只剩在大市值股票里,则需要重新估计容量和成交成本。

再检查信号拥挤

比较自己的持仓与历史热门组合、行业暴露和风格暴露。没有外部持仓数据时,也可以通过因子组合的相关性、共同持仓集中度和压力日共同下跌幅度建立内部代理。

最后再改模型

确认问题来自信号、组合还是执行以后,才决定是重构因子、降低换手、改变持仓周期,还是调整订单算法。顺序颠倒,调参只会变成一场漫长的自我安慰。

因子衰退不是终点,但它会淘汰懒惰的模型

因子衰退的本质,是市场参与方式发生了变化。更多资金追踪相似信号,算法交易把机构订单拆散,日度资金流无法再完整描述盘中行为,撤单和盘口深度又让表面流动性变得不可靠。

所以,因子研究不能停在“这个指标过去有没有用”。真正的问题是:

  • 收益来自什么风险补偿;
  • 哪些资金正在交易同一信号;
  • 信号出现后,收益还剩多少时间窗口;
  • 你的订单会不会改变价格;
  • 在所有人同时平仓时,你能不能活着出去。

超过300种因子构成了庞大的因子动物园,但能穿过交易成本、拥挤度和执行冲击的信号,始终是少数。分钟频资金流切割、时段残差、情景重构和撤单行为分析,提供了有价值的研究方向,却不是一张稳赚通行证。

别把一组漂亮的回测数字当成护身符。因子能否继续工作,要看它在真实盘口里还能不能成交;策略能否继续活着,要看拥挤反转时账户能不能扛住那一下击穿。

市场不会因为你的模型写得复杂,就给你更好的出场价格。你不重构因子,因子就会重构你的账户——先扫损,再滑点,最后爆仓。

Related reading: 2007年量化地震:拥挤交易如何让多因子模型集体失效 and 强化学习在量化交易中为什么屡屡失效?从模拟盘到实盘的四大鸿沟.

常见问题

为什么量化因子会衰退?
因子衰退通常与市场环境变化有关,包括跟踪同类信号的资金增多、交易拥挤、收益前置、交易成本上升,以及算法拆单导致传统数据指标失真。
算法拆单为什么会影响传统资金流指标?
机构会把大额订单拆成许多小订单,在不同时间和价位逐步成交,以降低冲击并隐藏交易意图。传统指标看到的是大量小单,可能无法识别背后的持续性和方向性大额交易。
为什么要把日度资金流拆分到分钟频?
日度汇总会抹平早盘、午盘和尾盘的交易节奏,也难以识别订单执行过程。分钟频切割和时段重构可以保留更多盘中交易结构,但仍需避免把噪声当成信号。
撤单行为能说明什么?
撤单可能反映报价方正在重新评估风险,也可能说明盘口流动性正在收缩。撤单比例上升时,表面挂单更难真正成交,滑点和交易成本模型也需要相应调整。
如何判断一个因子是否正在衰退?
可以从预测能力、交易成本、持仓拥挤度、收益是否转移到盘中以及市场状态变化五个层面检查。还应区分总体收益下降是由信号能力减弱造成,还是由换手、滑点和成交冲击上升造成。