27. 基差交易的自动化监控:实时监控面板(Grafana)、告警规则设置、异常交易检测

做基差交易,最怕什么?

怕行情突然反转,你还在睡大觉。怕价差瞬间拉大,你的止损单没触发。怕系统跑着跑着,数据源断了,你浑然不知。

我早年吃过这个亏。有一次做螺纹钢的期现套利,价差从-50一路飙到+80,我愣是没发现——因为监控面板崩了,告警短信没发出来。那笔单子亏了二十多万。嗯,从那以后,我对自动化监控这件事,再也不敢马虎。

今天我们就来聊聊,怎么搭一套靠谱的基差交易监控系统。核心就三块:Grafana实时面板、告警规则、异常检测

核心观点:监控不是让你盯着屏幕看,而是让系统替你盯着。你只需要在出事时被叫醒。

27.1 实时监控面板:用Grafana搭一个“驾驶舱”

Grafana这东西,说白了就是一个数据可视化工具。但用好了,它就是你的交易驾驶舱。

我个人习惯把面板分成三个区域:

  • 左侧区域:展示核心价差曲线。包括当前价差、历史均值、标准差通道。
  • 中间区域:展示持仓情况。包括多空头寸、保证金占用、浮动盈亏。
  • 右侧区域:展示系统健康状态。包括数据延迟、API连接状态、告警触发记录。

你想想看,一打开面板,三秒钟内就能判断“现在该不该操作”,这才是好面板。

27.1.1 数据源配置

Grafana支持多种数据源。我推荐用InfluxDBPrometheus来存储时序数据。基差数据是典型的时间序列,用关系型数据库反而麻烦。

# 示例:将基差数据写入InfluxDB
from influxdb import InfluxDBClient
import time

client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('basis_trading')

def write_basis_data(symbol, spot_price, futures_price, basis):
    json_body = [
        {
            "measurement": "basis",
            "tags": {
                "symbol": symbol
            },
            "time": int(time.time() * 1e9),
            "fields": {
                "spot_price": spot_price,
                "futures_price": futures_price,
                "basis": basis,
                "basis_ratio": basis / spot_price
            }
        }
    ]
    client.write_points(json_body)

这段代码我用了好几年。注意那个时间戳,一定要用纳秒级,不然Grafana画图时会出现时间错位。我在项目中遇到过这个问题,排查了半天才发现是时间精度不够。

27.1.2 面板设计技巧

别把面板搞得太花哨。我见过有人一个面板放二十多个图表,看着像蜘蛛网,实际一个都用不上。

我的建议是:

  • 每个面板不超过6个图表
  • 关键指标用大数字展示(比如当前价差、持仓盈亏)
  • 趋势用折线图,分布用热力图
  • 颜色编码:绿色表示正常,黄色表示预警,红色表示异常

小技巧:在Grafana里设置一个“刷新间隔”,我一般设成5秒。太频繁会加重数据库负担,太慢又错过行情。5秒是个平衡点。

27.2 告警规则设置:别让告警变成噪音

告警这东西,设置得太松,出事了没反应。设置得太紧,一天响八百次,你直接关静音。我早期就犯过这个错——把告警阈值设得太窄,结果半夜被叫醒三次,一看都是正常波动。后来干脆把告警关了,然后...嗯,你们懂的。

27.2.1 告警阈值怎么定

基差交易的告警,不能只看绝对值。你得结合统计特征。

告警类型 触发条件 示例(螺纹钢)
价差突破 当前价差 > 均值 + 2倍标准差 均值=20,标准差=15,触发线=50
价差回归 当前价差 < 均值 - 2倍标准差 触发线=-10
数据延迟 最新数据时间 > 当前时间 - 30秒 数据源断了
持仓异常 持仓数量 > 预设上限 风控线

这里有个坑:标准差是动态变化的。市场波动大的时候,2倍标准差可能很宽,导致告警不灵敏。我建议用滚动窗口来计算,比如取过去20个交易日的标准差。

27.2.2 Grafana告警配置

Grafana的告警规则,其实挺灵活的。我一般这么配:

# 告警规则示例(Grafana告警规则配置)
alert: 基差突破上轨
expr: basis > (basis_mean + 2 * basis_std)
for: 1m
labels:
  severity: critical
annotations:
  summary: "{{ $labels.symbol }} 基差突破上轨"
  description: "当前基差 {{ $value }},阈值 {{ $labels.threshold }}"

注意那个 for: 1m。意思是价差突破后,持续1分钟才触发告警。为什么要这样?因为有时候行情会瞬间脉冲,然后又回来。如果一突破就告警,你会被假信号烦死。等一分钟,确认趋势成立,再通知你。

警告:告警通道一定要有冗余。我同时用邮件、短信、企业微信三个通道。万一某个通道挂了,还有备用的。别问我为什么知道要这样做...都是泪。

27.3 异常交易检测:把“鬼”揪出来

异常交易检测,说白了就是找“不正常的交易行为”。比如:

  • 同一品种在短时间内频繁开平仓
  • 价差在非交易时段出现大幅波动
  • 成交价格偏离市场均价太多

这些异常,可能是程序bug,可能是数据源错误,也可能是市场操纵。不管哪种,都得第一时间发现。

27.3.1 基于统计的异常检测

我常用的方法是Z-ScoreIQR。简单说,就是看当前值偏离正常范围多远。

import numpy as np

def detect_anomaly_zscore(values, threshold=3):
    """
    基于Z-Score的异常检测
    values: 最近N个价差数据
    threshold: 阈值,默认3倍标准差
    """
    mean = np.mean(values)
    std = np.std(values)
    z_scores = [(x - mean) / std for x in values]
    
    anomalies = []
    for i, z in enumerate(z_scores):
        if abs(z) > threshold:
            anomalies.append({
                'index': i,
                'value': values[i],
                'z_score': z,
                'timestamp': timestamps[i]  # 假设有对应的时间戳
            })
    return anomalies

# 使用示例
recent_basis = [15, 18, 22, 19, 45, 21, 17]  # 第5个值45明显异常
anomalies = detect_anomaly_zscore(recent_basis)
print(f"发现 {len(anomalies)} 个异常点")

这段代码看起来简单,但实际用的时候要注意:窗口大小很关键。窗口太小,正常波动也被当成异常。窗口太大,异常被平滑掉。我一般取50-100个数据点,具体看品种的波动特性。

27.3.2 基于规则的异常检测

除了统计方法,我还用一些硬规则。比如:

  • 价差跳变检测:相邻两个价差变化超过5%,触发告警
  • 数据缺失检测:连续3个时间点没有新数据,触发告警
  • 成交异常检测:单笔成交价偏离市场中间价超过0.5%

这些规则,我建议写在交易系统的风控模块里,而不是Grafana里。因为Grafana的告警有延迟,而风控模块可以做到毫秒级响应。

经验之谈:异常检测最怕的是“漏报”。宁可错杀一千,不可放过一个。因为一次漏报,可能让你亏掉一个月的利润。我现在的系统里,异常检测的灵敏度设得比较高,虽然偶尔会有误报,但至少不会错过真正的风险。

27.4 整体架构:一张图看懂

说了这么多,我们来画一张架构图。这张图展示了我现在用的监控系统全貌。

基差交易自动化监控系统架构 数据源层 交易所行情API 数据库(InfluxDB) 历史数据文件 处理层 价差计算引擎 异常检测模块 风控规则引擎 (Python + Pandas + NumPy) 展示与告警层 Grafana实时面板 告警规则(邮件/短信/微信) 日志记录(ELK) (Grafana + Alertmanager + Elasticsearch) 反馈层:自动止损 / 手动干预 / 策略暂停

这张图分四层:数据源层、处理层、展示与告警层、反馈层。数据从交易所进来,经过处理,展示在Grafana上,同时触发告警。最后,告警会驱动反馈动作——要么自动止损,要么通知你手动干预。

我建议你按这个架构来搭。别想着一步到位,先跑通数据源到Grafana的链路,再加告警,最后加异常检测。一步一步来,稳一点。

最后说一句:监控系统不是搭完就完事了。你得定期检查告警规则是否还适用。市场变了,波动率变了,你的阈值也得跟着调。我每个月都会复盘一次告警记录,看看哪些是误报,哪些是漏报,然后调整参数。

好了,关于基差交易的自动化监控,就聊这么多。这套系统我用了三年,帮我躲过好几次大坑。希望对你也有用。

公众号:蓝海资料掘金营,微信deep3321