Qlib 提供了一站式的数据工业化处理和模型训练流程,一个 qrun 就能跑出带有收益信号的选股策略。但这里一直存在争议:信号从来就不等于策略。即便拿到了预测信号,你依然需要专门设计并适配一套策略,才能将其对接到交易端去执行。
很多人可能正是在这道坎面前感到迷茫,最终选择了放弃。从研究到策略执行之间,确实存在着一个官方文档未明确提及,大部分教程也选择跳过的“真空地带”。我最近把截面策略从信号生成、策略设计,再到回测的完整链路梳理了一遍。今天这篇,先聊聊从信号到策略这一段;执行层的事,大家如果感兴趣,我们择日再单独深聊。
近期策略层调整后,收益表现获得了明显提升:


当模型训练完毕、预测信号跑出来,甚至在 workflow 中对信号完成了回测之后,人反而容易愣住。想把这一整套逻辑接进实盘,却不知道下一步该往哪走——链路就这么断了。
而断掉的那一截,正是策略层和执行层。
Topk 信号究竟是什么
Qlib 的模型通常输出的是截面预测分数。常见的默认策略配置会利用 TopkDropoutStrategy,将这些分数转化为持仓和换仓决策。以截面模型、日频策略为例:在每个交易日截面上,对全股票池按预测得分排序,取排名靠前的 N 只股票,标记为当日的持仓候选。
这个输出有几个特征,非常值得细品。
第一,截面策略是相对排序,而非绝对预测。
得分高的票,仅仅代表它在当日选定的 Universe 截面上,相对其他票更强。它并不保证一定会上涨,也无法对涨幅做出预期。当市场泥沙俱下时,TopK 里的票或许无一幸免,只是它们跌得比别人少一些。
第二,这类信号本质上是每日刷新的截面快照。
今天的 Top 20 和昨天的 Top 20,重合度可能极高,也可能大相径庭,这完全取决于模型和市场。这种变化的剧烈程度,直接决定了策略的换手率,进而影响着实盘中不可忽视的交易成本压力。
第三,预测模型输出的 score 本身并不天然具备权重含义。
策略层必须清晰定义:如何从 score 映射到目标权重或目标股数。Qlib 提供了一些基础策略模板,但它们未必能满足真实投资组合管理的复杂需求。20只票进了 TopK,每只票该拿多少仓位?信号层不回答这个问题。等权是一种选择,按得分加权是另一种,两种方案在不同市场环境下的表现,可能会天差地别。
Qlib 自带的信号回测工具确实能验证信号的预测质量。IC、ICIR、分层收益等指标,衡量的都是信号本身是否具备 Alpha。但这里的看点是:信号有 Alpha,绝不代表策略就一定有 Alpha。 从信号质量到策略收益,中间还横亘着换手成本、权重分配、持仓逻辑和再平衡规则。
这道门槛背后,正是策略层要解决的核心问题。
三种策略方向
第一种:直接持仓映射
这是最直接,但多数情况下颇为有效的做法。完全按信号得分排序,取前 N 只持仓,定期轮换。
核心问题出在对“定期”的定义上。换仓频率、持仓数量、权重分配——每一个参数背后,都藏着对市场微观结构的判断。许多人的困惑在于,回测结果与预期大相径庭,却完全不知道问题出在哪一层。此时,不妨先从这个层面下功夫。
第二种:信号过滤 + 条件触发
在这种设计下,信号不直接决定持仓,而是作为触发条件的一部分。只有当信号强度越过某个阈值,且同时满足另外几个预设条件时,才进入下一步的交易决策。
这种设计的本质,是在量化信号之上叠加了一层经验判断的确认与加持,将其固化为可被系统执行的规则。其难点在于,你得先彻底想清楚自己的判断究竟是什么,哪些判断大概率经得起市场考验,然后才能把它写成代码里的条件语句。
第三种:组合再平衡驱动
从组合管理视角出发,信号决定的,是组合的因子暴露该朝哪个方向倾斜。
截面信号本质上是一个截面因子,它在任意时间截面上给出相对排序。将其接入组合层,就需要一套目标权重的求解机制。最简单的处理方式是等权;复杂一些,可以采用均值方差优化;更复杂的,则是加入了换手惩罚项的动态规划。
每次再平衡,本质上都是在现有持仓基础上,求解一个带约束的优化问题:让目标权重与当前权重的偏离尽可能小,同时驱动组合暴露朝信号方向移动,并控制单票权重上限、行业暴露和总换手率。
当这几个约束同时存在时,解可能不是唯一的。优化器的选择与约束的优先级排序,本身就是策略设计的关键一环。
在这个框架下,换手率、冲击成本、持仓连续性,都变成了可以被量化管理的变量。这么做的好处在于,能有效避免回测完成时才发现换手率高到实盘根本无法实现的窘境。相关的技术文档中,其实也散落着不少关于这类“避坑”思路的讨论。
策略层之外,还有什么
精心设计完策略,跑出了令人满意的回测曲线,到这里,仅仅是把逻辑验证了一遍。
真正致命的“磨损”和难点,潜伏在执行层:滑点、冲击成本、订单撮合、异常处理。策略层计算出的换手率,到了执行层会被无情地放大;回测里那些完美的成交假设,一旦接触到实盘,就会撞上涨跌停、流动性匮乏和盘中择时的高墙。这一层,对于所有利用 Qlib 进行策略与因子研究的量化爱好者来说,损耗是最重的。这也是 Research Alpha 常常难以落地为 Production Alpha 的症结所在。举个最基础的例子,Qlib 默认的 label 回答的是“从当日收盘开始持有会怎样”,但执行层却根本没法用这种方式去下单。
这一段,等以后有时间,我们再单独展开详谈。
在开源实战中,尝试翻阅优秀项目的源码实现,往往是弥合“研究”与“生产”之间鸿沟的最佳途径。云栈社区也有不少朋友在相关问答中剖析过类似落地难题,欢迎一起探讨。