实盘策略的监控与告警
策略上线之后,监控就是正事。盯实盘 Sharpe、IC 衰减、容量、成交率、回撤。要在出事之前告警,不是之后。
策略上线了。然后呢?然后你就得盯着它。大部分团队做得很烂——每天看一眼 PnL,出现回撤就慌。正确的做法是持续监控,把告警阈值调到能在衰减杀掉你之前把它抓住。
实盘交易到第二周左右会有一个时刻:新鲜感消退,运营现实浮现。alpha 要么是真的,要么不是。成交大部分都回来了。这周 PnL 是正的。但总有一层挥之不去的焦虑:这玩意儿真的在工作吗?它是在按我以为的方式工作吗?它要是停了,我怎么能知道?
这种焦虑就是监控存在的意义。不是 PnL 监控——那个只在钱赚完或亏完之后告诉你答案。是结构性监控:盯着策略的行为,告诉你底层过程还在产生 alpha,还是 alpha 已经在衰减、而 PnL 只是那座更慢的冰山露出水面的尖。
大部分量化团队把监控当季度评审,有的当成每日 PnL check,少数人把它当成它实际上是的那份全职工作。这篇文章写给第三种人:想在第 2 周而不是第 12 周抓到衰减的人,想在券商打电话来之前就知道成交率在掉的人,想在实盘 Sharpe 翻身之前就从数据里看到因子半衰期在压缩的人。
四样东西会各自坏掉
一个实盘策略有四样东西可以独立出问题,失败模式不同,响应也不同,所以要分开建监控。下面按”从最直观到最容易被跳过”的顺序讲。
表现:赚钱的速度对不对
最基本的问题是策略赚钱的速度是不是跟预期一致。但你不能光盯总 PnL,因为 PnL 是路径依赖的:一个月的坏成交可以盖住一个还在工作的策略,一个月的好成交也可以盖住一个正在死的策略。要盯的是分布级的量——实盘 Sharpe、实盘信息系数(IC)、实盘胜率——每一个都跟回测基线对比。它们回答的问题是底层信号还有没有预测力,而不是这个月运气如何。如果回测预测 Sharpe 1.8,三个月下来实盘 1.5,在噪声范围内;如果是 0.8,那就是结构性的事。
实现上,在滚动窗口上算这些指标(60 个交易日是标准,慢策略有时用 90 天),跟回测分布对比。实盘 60 日 Sharpe 落到回测 Sharpe 分布的 25 分位数以下,该警觉;落到 5 分位数以下,该拉警报。
风险:现在离每条限额多远
实盘风险监控跟 pre-trade 风控不是一回事。pre-trade 风控拦的是”新单不许突破限额”;风险监控答的是”我当前在每条限额上的位置”。要实时盯的量围绕几类敞口展开:距历史高点的回撤(百分比和绝对金额都要);总杠杆(多空总敞口除以 NAV)和净杠杆(多头减空头除以 NAV);仓位集中度——最大单一持仓和前 5 大持仓占 NAV 的比例;行业敞口,集中度超限要标记;对 value、momentum、quality、size、volatility 这些公共因子的敞口;还有对市场的滚动 beta——多空策略和市场中性策略尤其要看这一条,因为它漂移的时候你的”中性”就名存实亡了。
风险监控仪表盘不是一张图,是一张表:每条限额一个红/黄/绿状态,外加每个状态最后一次更新的时间戳。缺时间戳的绿灯不算绿灯——它可能只是三天没刷新。
运维:alpha 有没有机会兑现
你的策略可以 alpha 完美,运营层崩了照样亏钱。这一维的指标跟 alpha 本身没关系,跟 alpha 能不能发挥出来全有关系。成交率——实际成交订单占提交订单的比例——低于 85% 是黄色,低于 70% 是红色。数据新鲜度:最新行情数据点多老了?日终策略里比上一收盘还旧就不行,日内策略里超过 1 分钟就要警惕。券商 API 延迟看订单提交的中位和 p99 round-trip 时间,延迟爬升经常先于完全宕机出现。订单拒单率飙起来,说明配置变了或者账户加了新限制。最后是对账 diff:内部仓位状态和券商状态不一致的频率——任何非零 diff 是黄色,持续的 diff 是红色。
衰减:市场是不是开始把它搞明白了
这是大部分团队跳过的维度,也是对策略长期存活最要命的维度。衰减监控回答的问题是:底层因子还有预测力,还是市场开始把它套利掉了?
核心量是不同窗口下的滚动 IC。把当前 60 日 IC 跟历史 IC 分布对比:落在历史 25 分位数以下,因子可能进入衰减期;落在 10 分位数以下,因子大概率在死。注意这和上面表现监控用的是同一把尺子,但问的问题不同——表现监控问”这个策略最近怎么样”,衰减监控问”这个因子的预测力趋势朝哪儿走”。
还有一个更微妙的衰减信号:因子半衰期。可以从滚动 IC 自相关或者滚动 Sharpe 的衰减速度估出来——这是应用层的推断,不是 AFML 里现成的公式;López de Prado 在 Advances in Financial Machine Learning(Wiley, 2018, ISBN 978-1-119-48208-6)第 17 章讲结构性断裂时覆盖了相关工具。简短版:每个因子都有自己的半衰期,有的几个月,有的几年。知道你手里这个属于哪一类,才能判断一段 3 个月的回撤到底是噪声还是信号。
从指标到动作:告警分级
四个维度产出一堆数字,数字本身不会救你——把数字变成动作的机制才会。告警不是平等的,要建分级。
黄色(警告)是”有点不对劲,请看一下”:比如实盘 Sharpe 连续 2 周低于预期的 70%。邮件加仪表盘,不做自动动作。橙色(关注)是”我们该做点什么了”:实盘 Sharpe 连续 1 个月低于 50%。邮件、Slack、排个会;策略还在跑,但新加资金暂停。红色(行动)是”现在就介入”:回撤超过 15%,或 Sharpe 连续 1 个月低于 30%。自动减仓、停止新建仓、上报高级风控官,走 PagerDuty 级别的通知。
分级叫什么名字随便你,纪律才是关键:定义每级触发什么、每级怎么响应,并且让红色档的响应是自动的——这样人类的响应时间不会成为你 PnL 的决定变量。一条有用的判据:如果你的监控系统周五没人盯就不行,那你有的不是监控,是看孩子。
衰减仪表盘
对一个活跃的量化策略,最有用的监控视图是衰减仪表盘——把所有能告诉你 alpha 还活着没有的东西聚在一张屏上。滚动 60 日 IC 的图,横向画上历史 25、50、75 分位线;滚动 Sharpe 的图,同样的分位参考线;容量利用率——用了理论容量的多少,到 80% 时增长就要开始伤表现(下面细说);实际每笔滑点对比回测里的滑点假设——如果实际是预期的 2 倍,你的净 Sharpe 是你以为的一半;再加一条回撤曲线,在 5%、10%、20% 阈值处做标记。
这张仪表盘应该是 live 的,开盘期间至少每 15 分钟刷一次,并且能从任何设备看——包括手机,因为你真正需要它的时刻,多半正好不在桌前。底层的查询要设计得足够便宜:仪表盘开盘期间每隔几秒就会打一次这些接口,告警系统每分钟打一次。滚动窗口的数学、分位数查询、分级评估、通知路由,都应该封装在平台层,而不是散在每个策略的脚本里各写一份。
一个诚实的坑
回撤会发生,单月超过 20% 的回撤也会发生。问题不是你有没有回撤,是你的监控能不能快到让你来得及行动。
有过这样的实例:策略 3 周亏掉 25% NAV,只因为团队一周才看一次 PnL,没注意到滚动 Sharpe 在第 6 天就已经跨进红色区。等他们发现的时候,恢复路径比第 7 天就拔线要长得多、难得多。
反向的失败模式一样要命:团队看到 6% 回撤就慌了,停了策略,然后看着下个月 alpha 又回来了,而策略在现金里躺着。所以监控系统必须能区分”这是回撤,策略没事”和”这是衰减,策略在死”。简单的 PnL 阈值分不出来;滚动 IC、滚动 Sharpe、回撤、容量这套组合能分出来。
纪律是:在你冷静、策略还在赚钱的时候,提前把告警分级定义好——什么触发暂停、什么触发停止、什么触发调查,写下来。然后回撤真来的时候,你按流程走,而不是当场临时编。
运维节奏
分级和仪表盘管的是”出事时”,checklist 管的是”平时”。这是实践里跑得通的节奏,属于真正需要逐条核对的清单,所以保留清单形态。
每日(每个交易日,15 分钟):
- 查成交率 vs 7 日均值
- 查每条活跃 feed 的数据新鲜度
- 查当前回撤 vs 限额
- 浏览前 5 大持仓,确认跟策略意图一致
- 回顾前一天的告警
每周(周一早上,1 小时):
- 回顾滚动 60 日 Sharpe vs 预期
- 回顾滚动 60 日 IC vs 预期
- 查容量利用率 vs 计划
- 回顾滑点 vs 预期滑点
- 确认所有风控限额还合适(有时候策略漂移,原来 2 倍安全余量的限额变成了 1.1 倍)
每月(第一个周一,半天):
- 用滚动 IC 自相关重估因子半衰期
- 对比实际因子半衰期跟预期半衰期
- 如果实际半衰期在缩短,讨论是否要收紧重训节奏
- 复查所有持仓有没有过期订单
- 跑一个迷你验证:把最后一个月拿出模型,重放,看实盘表现是不是对得上样本外回测
每季(每 3 个月,2 天):
- 用实盘数据重跑完整验证套件
- 检查因子有没有结构性断裂(López de Prado 的 CUSUM 检验,Advances in Financial Machine Learning 第 17 章)
- 根据实际波动率重新校准风控限额
- 容量压力测试:策略在 1.5 倍当前资金下表现如何?
这张 checklist 不是愿景,是底线。Chan 的 Quantitative Trading(Wiley, 2009, ISBN 978-0-470-28488-9)第 6 章讨论的资金与风险管理 routine 跟上面每周每月的节奏有重叠。他那里的关键洞察是:routine 防的是”我本想检查但有事打断”这种失败模式——它在 18 个月的时间窗里悄悄杀死策略。
容量:最慢的那种衰减
checklist 里反复出现的容量值得单独说,因为它是唯一一种”你越成功它来得越快”的失败。容量是策略在不衰减 alpha 的前提下扩规模的能力。大部分策略有容量天花板:过了天花板,你自己的单子开始把价格往不利方向推,或者你成交在比回测假设更差的价格上。
容量公式最简单的形式——成交量按日度、换手按年化——是:
这里 是年化交易名义额占 AUM 的比例;换手率如果已经按每日表达,就把 252 拿掉。这是一个把组合按”平均一只票”聚合的简化口径。代入数字:平均每只票日成交量 5000 万、你愿意占成交量的 5%、,得到
这是市场冲击开始伤到你之前能投的名义规模。超过它,滑点上升,净 Sharpe 被压缩。所以要盯的就是几条比值:当前 AUM 除以估计容量(利用率);你的成交量占每只票总市场成交量的参与率;按参与率分段的实际滑点对预期滑点;以及不同参与率下的成交率——如果你占到成交量的 10% 还想保持 95% 的成交率,多半保持不了,那说明你的单子对这个规模来说太激进了。利用率跨过 70%,开始规划增长;跨过 90%,停止增长,评估扩容手段——更多票、更低换手、更长持有期。
告警要到得了人
到不了人的告警就是浪费的告警,所以路由栈本身也要设计。信息级的东西——常规指标更新、批处理完成、正常状态变迁——只进仪表盘和日志,不打扰人。黄色警告走邮件加仪表盘,比如实盘 Sharpe 低于 70%、成交率低于 85%、数据新鲜度警告,响应预期是当个交易日之内。橙色关注加上 Slack:Sharpe 连续 1 个月低于 50%、回撤超过 10%、对账出 diff,响应预期 1 小时之内。红色行动是 PagerDuty 级通知加自动动作(减仓、停牌):回撤超过 15%、kill switch 触发、券商 API 挂超过 5 分钟——响应预期分钟级,而且自动动作在人看到之前就已经执行了。
原则只有一条:每个告警都要有明确的收件人、明确的响应时间、明确的响应动作。三样里有一样填不出来,这个告警就不该存在。要躲开的失败模式是告警疲劳:一天发 50 封邮件,没人会读任何一封。触发条件要够狠——能当仪表盘更新的就别做成告警。
告警响了之后
告警响了,然后呢?有纪律的响应是一条固定流程:先显式确认——系统应该要求确认,否则你不知道有没有人看到;在响应时间窗内调查——指标是多少,是真的还是数据 artifact,是持久的还是瞬时的;然后判断落在哪一档——容忍范围内回到正常,黄色加密监控,橙色降敞口,红色停止并调查;接着按分级协议行动,把决策和动作记下来;最后,橙色或红色告警要在 48 小时内做 post-mortem——什么原因、我们做了什么、该改什么。
错误的响应是告警响了你忽略,一周后回撤翻倍才慌。正确的响应是按流程走,在情况恶化之前动手。
监控不是副业,它是决定你的策略能不能活到第 3 年的那份全职工作。四个维度建起来,分级提前定好,checklist 按节奏跑,衰减仪表盘当主视图,告警接进真正能到达人的路由。PnL 是结果;监控是让结果可持续的那个动作。
参考文献
- López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Chapter 17 (Structural Breaks). ISBN: 978-1-119-48208-6.
- Chan, E. (2009). Quantitative Trading: How to Build Your Own Algorithmic Trading Business. Wiley. Chapter 6 (Money and Risk Management). ISBN: 978-0-470-28488-9.
- Harris, L. (2003). Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press. ISBN: 978-0-19-514470-3.