想象一辆车的两套系统:油门和安全气囊。
油门是连续的——你根据路况、车速、目的地随时调整踩多深。安全气囊是离散的——它平时完全不参与驾驶,只在碰撞的那一毫秒无条件弹出,而且弹出时不征求你的意见。
现在想象一个工程师说:“既然都是安全相关,我们把它们合并吧——让气囊根据风险水平持续地部分充气,同时让油门在危险时自动变软。”你会立刻意识到这是灾难设计:气囊变成了一个迟钝的油门,油门变成了一个不可靠的气囊,两个系统都失去了自己的数学性质。
量化风控里,这个灾难设计随处可见。
两种语言
一个交易系统里所有的“风险控制”,其实分属两种完全不同的语言:
Sizing(仓位控制)回答“下多大注”。 它是连续的、由 edge 驱动的、永远在线的。Kelly 准则和它的各种保守变体、波动率目标、基于信号置信度的加减仓——这些都是 sizing。它的输入是你对优势的估计,输出是一个目标敞口。它是策略的一部分,是进攻的数学。
Safety(安全控制)回答“什么时候切断我”。 它是离散的、fail-safe 的、平时不激活的。日内亏损熔断、回撤触发的 reduce-only、总杠杆硬上限、kill switch——这些都是 safety。它的输入是“系统是否已经处于不该继续的状态”,输出是一个否决。它不属于任何策略,是生存的数学。
这两种语言的区分不是分类学趣味,而是有严格的工程后果。混淆它们的典型症状是:让一个安全信号去连续地缩放仓位目标——比如“波动率指数越高,仓位越小”这种看起来很合理的设计。
问题出在哪?这等于让两个 sizing 意见做乘法平均。你的策略说“基于 edge,目标敞口是 X”;你的风险指标说“基于恐慌程度,打个七折”。0.7X 是什么?它既不是 edge 最优的仓位,也不是安全要求的仓位——它是两个都对的答案平均出来的一个都不对的答案。更糟的是,这个连续缩放器整天都在工作,持续污染你的仓位序列,让归因变得不可能:业绩差了,是信号错了还是缩放器错了?没人说得清。
正确的设计是让每种语言说自己的话:sizing 给出目标,safety 要么放行、要么否决、要么强制降级——中间没有“打折”这个选项。安全控制平时的正确状态是“完全不激活”,就像气囊平时的正确状态是完全不充气。
市场中性不等于危机中性
这条分界线之所以重要,还有一个更深的原因:你必须先想清楚系统真正的失败模式,才知道 safety 该盯什么。而直觉给出的答案通常是错的。
以市场中性策略为例。直觉说:多空对冲了,市场涨跌不影响我,所以最大的风险是市场崩盘时波动放大——盯住恐慌指数就行。
历史给出的答案完全不同。市场中性策略史上最惨烈的日子——2007 年 8 月的 quant unwind——发生在一个波动率指数几乎没动的平静市场里。杀死那些组合的不是市场方向,而是同行的平仓:拥挤在相似因子上的资金被迫去杠杆,卖出彼此的多头、回补彼此的空头,让“中性”组合的两条腿同时反向。你的对冲保护你不受市场影响,但没有任何对冲能保护你不受“和你持有相同头寸的人”影响。
这就是“市场中性 ≠ 危机中性”的含义,它对 safety 设计的推论很具体:
- 盯宏观恐慌指标的 safety,防的是流动性与融资的尾部——危机里相关性趋近于 1、对冲开始漏、杠杆的资金成本飙升。这一层有存在价值,但它是为“世界着火”准备的,不是为你的策略准备的。
- 防策略自身失败模式的 safety,必须盯策略自己的生命体征——组合层面的持续回撤、信号预测力的衰减、多空两条腿的异常背离。这些指标在宏观平静的日子里同样会报警,而那正是它们的价值所在。
一个只装了前者的市场中性系统,等于给一栋楼装了地震仪却没装烟雾报警器——它防得住新闻头条里的灾难,防不住自己最可能的死法。
顺带说一个更微妙的推论:结构性的防御优于指标性的防御。 针对拥挤平仓这种失败模式,最好的防御其实不是任何一个报警器,而是组合本身的构造——持有大量失败时间彼此错开的独立信号,让“所有信号同时流血”在结构上难以发生。这又回到了上一篇讲的弱信号工厂:多元化做到位,safety 的触发概率本身就会下降。报警器是最后一道防线,不是第一道。
否决权必须是架构属性,不是代码约定
现在到了最工程的部分。假设你完美地设计了两层控制——谁来保证 safety 真的切得断?
这里有一条我们视为不可协商的原则:安全控制的否决权必须是架构属性,而不是代码约定。 区别在于:代码约定是“策略应该尊重风控的返回值”;架构属性是“策略在物理上没有绕过风控直达券商的通路”。
前者在 99% 的日子里和后者表现一致。区别只在最坏的 1% 显现:策略代码有 bug、模型输出了极端值、某个组件在压力下行为异常——恰恰是 safety 最需要工作的时刻,也恰恰是“约定”最容易被意外绕过的时刻。安全系统的价值只在它被需要的那一刻兑现,所以它的可靠性必须不依赖被它监管的对象行为正常。
在 Dnalyaw 的架构里,这体现为独立于策略层的风险引擎:每一笔订单必经、拥有无条件否决权、运行在自己的进程和语言运行时里,连熔断后的紧急平仓都有一条不依赖上游编排层的直连通路。策略层——包括跑在那一层的任何 ML 模型——被设计成物理上无法产生一笔未经风险检查的订单。
这一点在 AI 深入交易系统的时代变得空前重要。当仓位目标来自一个学习出来的模型,你必须假设它会在某个训练分布之外的日子输出你从未见过的东西。这不是对模型悲观——恰恰因为我们持续用更强的学习器(包括在执行层探索强化学习这类会自主寻找策略空间边界的方法),才更需要一个不学习、不聪明、不灵活的 safety 层。学习系统探索,非学习系统兜底——两层的智能梯度是刻意设计的,兜底层的“笨”是一种能力。读过我《神经网络的四重境界》的读者会认出这个分工:兜底层甘于停留在最低的境界,正是因为最高境界(观测即扰动、系统自己也在被自己的动作改变分布)留给了学习系统去趟——两层各自守住自己该在的那一境,谁也别越界。
顺便回答一个常见问题:“为什么不让 safety 也智能一点,用模型预测风险来提前干预?”因为那会让它变成另一个 sizing——一个基于预测的连续控制器,带着预测固有的全部误差。safety 的定义性特征就是它不预测,只响应已经发生的事实。它宁可迟一点、笨一点,也要确定。这两种系统没有优劣,只有分工。
Sizing 的谦逊:知道自己的输入有多噪
最后回到 sizing 这一侧,讲一个反方向的纪律。
Kelly 准则告诉你,给定胜率和赔率,存在一个增长最优的下注比例。数学是对的。但它假设你知道自己的胜率和赔率——而在真实市场里,edge 的估计误差常常和 edge 本身一个量级。对着噪声做最优化,输出的是被放大的噪声:Kelly 对参数误差的惩罚是超线性的,高估一倍 edge,下场远比低估一倍惨。
所以成熟的 sizing 层有一种刻意的谦逊:当 edge 估计的置信度不足时,主动退回到一个远低于理论最优的固定保守比例,让 Kelly 类的公式引而不发。让精密机制待命而不启用,不是工程上的未完成——那个“不启用”本身就是一个经过论证的决策:错误的精确比诚实的粗糙危险得多。
什么时候升级?当 edge 估计的质量真正提高时——更长的实盘记录、更稳定的信号族、以及(这是我们研究管线里持续推进的方向)当组合层面的资本分配本身可以被当作一个学习问题来对待时。但升级的举证责任永远在“更复杂”这一侧:新机制必须在样本外证明它优于那个朴素的固定比例,而不是反过来。
进攻的数学允许你谦虚地错;生存的数学不允许你侥幸地错——sizing 可以谨慎地少赚,safety 不可以谨慎地少防。
结语
把这篇文章压缩成三句话:
- Sizing 说“下多大注”,safety 说“切断我”——一个连续、一个离散,让它们说自己的语言,永远不要让安全信号去乘你的仓位。
- Safety 必须针对策略真实的失败模式设计,而直觉给出的失败模式通常是错的——市场中性不等于危机中性。
- 否决权是架构属性:安全层的可靠性,不能依赖被它监管的系统行为正常——尤其当那个系统在学习。
风控设计的成熟度,不体现在规则的数量上,而体现在每一条规则是否清楚自己属于哪种语言。进攻的数学和生存的数学都很深,但它们不通约。尊重这条分界线的系统,才配得上在两边同时做深。
本文是 Dnalyaw 量化系列的第四篇。前篇:弱信号的数学、Dnalyaw:从零工程化一个 AI 量化交易系统。