Qlib 中配置好了各种可以一键 qrun 的机器学习模型和数据工业化处理,一个工作流即可跑出收益信号的选股策略。

但一直以来受大家诟病的也在这一点:信号不是策略。即便有了信号,也需要写一个专门适配的策略接到交易端去执行。很多人的质疑就来了,更有很多不求甚解的人在这一道坎面前就选择放弃了。

在研究到策略执行这两件事之间确实有一个 gap,官方文档未明确提及,大多数教程也跳过去了。我最近把截面策略从信号到策略设计,再到策略回测完整跑通了一遍,今天就来把我近期量化研究的大体思路跟大家分享一下。这篇先写信号到策略这一段,执行层大家感兴趣的话后面单独再写。

当我们把模型训练完,跑出来预测信号,同时在 workflow 对信号做出了回测结果之后,会有点无所适从。想把这套东西接进实盘,发现不知道下一步往哪走,就断在这里了。

断掉的那一截,叫策略层。

TopK 信号是什么

Qlib 的模型通常输出截面预测分数;常见的默认策略配置会用 TopkDropoutStrategy 将分数转成持仓和换仓决策。

这里以截面模型、日频策略为例,在每个交易日的截面上,对全票池按预测得分排序,取排名靠前的 N 只票,标记为当日持仓候选。

这个输出有几个特征值得注意。

第一,截面策略是相对排序,不是绝对预测。得分高的票只代表在当日截面上相对其他票更强,不代表一定会涨,也不代表涨幅可以预期。市场整体下行的时候,TopK 里的票可能全部下跌,只是跌得比其他票少。

第二,这里的信号类似每日刷新的截面快照。今天的 Top20 和昨天的 Top20 重叠度可能很高,也可能变化很大,取决于模型和市场。这个变化速度直接决定了策略的换手率,也决定了实盘的交易成本压力。

第三,预测模型输出的 score 本身没有自然权重含义;策略层必须定义如何从 score 映射到目标权重或目标股数。Qlib 提供了一些基础策略模板,但这些模板未必满足真实投资组合管理需求。

20 只票进了 TopK,每只票应该拿多少仓位,信号层不回答这个问题。等权是一种选择,按得分加权是另一种选择,两种选择在不同市场环境下表现差异显著。

Qlib 自带的信号回测可以验证这列信号的预测质量,包括 IC、ICIR、分层收益。这些指标衡量的是信号本身有没有 alpha。

这里看点来了:信号有 alpha,策略不一定有 alpha。从信号质量到策略收益,中间还隔着换手成本、权重分配、持仓逻辑、再平衡规则。

这道门槛背后,就是策略层要解决的事。

三种策略方向

第一种:直接持仓映射

最直接但多数情况下有效的做法。按信号得分排序,取前 N 只持仓,定期换仓。

核心出在对“定期”的定义问题上。换仓频率、持仓数量、权重分配,每一个参数背后都是对市场微观结构的判断。大多数人的问题出自这里,回测结果和预期差很远但不知道问题出在哪一层的话,可以先在这里下功夫。

第二种:信号过滤 + 条件触发

信号不直接决定持仓,但却是作为触发条件的一部分。当信号强度越过某个阈值时,如果同时又可以满足另外几个条件,那么下一步才进入交易决策。

这种设计的本质是在量化信号上面加一层经验判断的加持和确认,变成可以被系统执行的规则。难点在于得先想清楚自己的判断到底是什么,哪些判断大概率经得起市场的考验,才能把它写进条件里。

第三种:组合再平衡驱动

从组合角度思考,信号决定的是组合的因子暴露往哪个方向倾斜。

截面信号本质是截面因子在任意时间截面上给出相对排序。把它接进组合层,需要一套目标权重的求解机制。这其中最简单的处理方式是等权,复杂一点是均值方差优化,再复杂是加入换手惩罚项的动态规划。

每次再平衡是在现有持仓基础上求解一个带约束的优化问题:目标权重和当前权重的偏离尽量小,同时让组合暴露朝信号方向移动,同时控制单票权重上限、行业暴露、总换手率。

这几个约束同时存在,解可能不是唯一的。优化器的选择和约束的优先级排序本身就是策略设计的一部分。

换手率、冲击成本、持仓连续性,在这个框架下充当可以被量化管理的变量,这样就避免回测完了才发现换手率高到实盘难以实现。

策略层之外还有什么

设计完策略并跑出满意的回测,到这里只是把逻辑验证了一遍。

真正的损耗和难点在执行层:滑点、冲击成本、订单撮合、异常处理。

策略层算出来的换手率,到执行层会放大;回测里的成交假设,到实盘会遇到涨跌停、流动性不足、盘中时机的问题。

这一层对使用 Qlib 做策略和因子研究的量化爱好者们损耗更大,也是 research alpha 往往不能落地为 production alpha 的症结所在。最基础的比如说,Qlib 默认 label 回答的是从当日收盘开始持有会怎样,但是执行层是没办法这么实现的。

这一段后面有时间单独展开写。