22、监控与告警系统:系统运行监控、策略异常告警、网络延迟监控、交易对账系统

做量化交易,最怕什么?

不是策略亏钱,而是系统挂了你还不知道。

我见过太多团队,策略逻辑写得漂漂亮亮,结果半夜网络断了,或者交易所接口超时,一觉醒来发现账户亏了几十万。嗯,我自己也踩过这个坑。所以今天咱们聊聊监控与告警系统——说白了,就是给你的交易系统装个“心跳检测仪”。

系统运行监控:你得知道机器在干嘛

系统运行监控,核心就三件事:CPU、内存、磁盘。

你想想看,如果服务器CPU飙到100%,你的策略还能正常跑吗?肯定不能。所以我们要实时采集这些指标。

核心监控指标清单:

  • CPU使用率:超过80%就要预警,超过95%立刻停机检查
  • 内存占用:物理内存剩余不足20%时触发告警
  • 磁盘IO:读写延迟超过100ms就要排查
  • 网络带宽:入站/出站流量接近上限时预警
  • 进程存活:核心交易进程意外退出必须秒级告警

我个人习惯用Prometheus + Grafana这套组合。Prometheus负责采集数据,Grafana负责可视化。为什么选它们?因为生态好,社区活跃,而且支持自定义告警规则。

举个例子,我曾经遇到过一次磁盘写满导致日志无法写入,策略直接崩溃。后来我加了一条规则:磁盘使用率超过85%就发邮件+短信,超过95%直接自动清理旧日志。从那以后,再没出过类似问题。

策略异常告警:别让策略“带病运行”

策略异常告警,比系统监控更微妙。因为策略出问题,往往不是“挂了”,而是“跑偏了”。

什么叫跑偏?比如你的策略本来每天交易10次,突然一天交易了100次。或者你的策略本来只做多,突然开始做空了。这些都属于异常行为。

我建议设置以下几类告警:

  • 交易频率异常:单位时间内开仓次数超过历史均值的3倍
  • 持仓偏离度:当前持仓与策略预期持仓偏差超过阈值
  • 盈亏异常:单笔亏损超过账户净值的2%
  • 信号缺失:连续N个周期没有产生交易信号
  • 参数突变:策略参数被意外修改(比如有人手滑改了配置)

小技巧:告警阈值不要设得太死。我一般用“动态阈值”——根据过去7天的数据自动计算上下限。比如交易频率,如果市场波动大,交易次数自然多,这时候用固定阈值就容易误报。

网络延迟监控:毫秒级的生死线

做高频交易的朋友都知道,网络延迟就是钱。延迟每增加1毫秒,你的订单可能就排到别人后面去了。

网络延迟监控,主要盯三个地方:

  1. 交易所到服务器的延迟:用ping或者WebSocket心跳包测量
  2. 服务器内部处理延迟:从收到行情到发出订单的时间差
  3. 订单到交易所的确认延迟:发出订单到收到成交回报的时间

我记得有一次,某个交易所的API网关出了问题,导致订单确认延迟从2ms飙升到200ms。我们的监控系统第一时间发现了,自动切换到了备用交易所。如果没这个监控,那天的交易基本就废了。

下面是我常用的网络延迟监控代码片段:

import time
import asyncio
import aiohttp

async def measure_latency(exchange_url):
    """测量到交易所的网络延迟"""
    start = time.time()
    async with aiohttp.ClientSession() as session:
        async with session.get(exchange_url + '/ping') as resp:
            await resp.text()
            end = time.time()
    return (end - start) * 1000  # 返回毫秒

# 每5秒测一次
async def monitor_loop():
    while True:
        latency = await measure_latency('https://api.binance.com')
        if latency > 50:  # 超过50ms告警
            print(f'[WARN] 网络延迟异常: {latency:.2f}ms')
        await asyncio.sleep(5)

交易对账系统:钱不能算错

交易对账,说白了就是“算账”。你的策略说赚了10万,交易所说赚了9.8万,那2000块去哪了?

对账系统要解决的核心问题:

  • 订单对账:本地记录的订单与交易所的订单一一比对
  • 持仓对账:本地计算的持仓与交易所的持仓核对
  • 资金对账:账户余额变动与交易记录匹配
  • 手续费对账:每笔交易的手续费是否正确扣除

注意:对账不是一次性的,要定时跑。我建议每5分钟做一次增量对账,每天收盘后做一次全量对账。如果发现差异超过0.01%,立刻冻结交易并人工介入。

我曾经遇到过一个问题:某个交易所的返佣规则改了,但我们的系统没更新,导致手续费对不上。虽然金额不大,但如果不及时发现,日积月累也是一笔不小的损失。从那以后,我把手续费对账的阈值调到了0.001%,宁可误报也不能漏报。

整体架构图

下面这张图展示了监控与告警系统的整体架构。你可以看到数据从采集到告警的完整链路:

监控与告警系统架构图 数据采集层 系统指标采集 策略日志采集 网络延迟采集 交易对账 数据处理与规则引擎 数据清洗 规则匹配 阈值计算 告警与通知层 邮件告警 短信告警 企业微信 电话告警 存储与可视化 时序数据库 Grafana看板

从架构图可以看出,数据从底层采集上来,经过规则引擎判断,触发告警后通过多种渠道通知到人,同时数据落地到数据库方便事后复盘。这个链路看起来简单,但每个环节都有坑。

我的建议:告警不要太多,否则容易“狼来了”。我一般把告警分三级:

  • INFO:记录日志,不通知
  • WARN:发邮件,白天处理
  • CRITICAL:短信+电话,7x24小时响应

这样既不会漏掉重要问题,也不会被垃圾告警烦死。

好了,监控与告警系统就聊这么多。记住一句话:没有监控的系统,就像闭着眼睛开车。你永远不知道下一秒会发生什么。

交易系统化学习资料 微信Strategy888888