第19章 做市策略自动化:自动化对冲执行、自动化报价生成、自动化风控检查、自动化报告生成

做市策略做到一定规模,你就会发现——人根本盯不过来。

我当年刚带团队的时候,每天手动调参数、手动下单对冲、手动检查风险敞口。结果呢?有一次隔夜波动,我凌晨三点爬起来补保证金。那滋味,真不好受。

所以自动化不是锦上添花,是生存刚需。这一章,我把四个核心自动化模块拆开讲:对冲执行、报价生成、风控检查、报告生成。每个模块我都踩过坑,咱们一个一个说。

19.1 自动化对冲执行

对冲执行,说白了就是让机器替你干活。你只需要定好规则,剩下的交给代码。

我个人习惯把对冲策略分成两类:

  • 被动对冲:当标的资产价格触发某个阈值,自动执行对冲操作。比如Delta超过0.5,就自动买入或卖出标的。
  • 主动对冲:基于预测模型,提前调整对冲头寸。比如预测到波动率要飙升,提前加仓对冲。

我在项目中遇到过一个问题:被动对冲太死板,容易在震荡市里来回打脸。后来我加了一个“死区”机制——Delta在0.45到0.55之间不动,超出才触发。效果立竿见影。

核心逻辑:对冲执行的核心是“快”和“准”。快靠低延迟系统,准靠精确的希腊字母计算。

下面是一个简单的对冲执行伪代码:

def auto_hedge(portfolio, market_data):
    delta = calc_delta(portfolio, market_data)
    if abs(delta) > 0.5:
        hedge_qty = -delta * portfolio.notional
        execute_order(hedge_qty, market_data.price)
        log_hedge(delta, hedge_qty)

嗯,这里要注意:实际生产中,你还要考虑交易成本、滑点、流动性。我曾经因为没算滑点,一次对冲亏了2个基点。教训深刻。

19.2 自动化报价生成

报价生成,是结构化产品做市的脸面。你报的价好不好,直接决定你能不能吃到单子。

我一般把报价生成分成三步:

  1. 理论定价:用模型算出产品的公允价值。比如雪球产品,用蒙特卡洛模拟算票息。
  2. 加点调整:在理论价上加买卖价差。价差大小取决于市场波动、库存风险、对手方信用。
  3. 动态更新:市场变了,报价要跟着变。我习惯用事件驱动架构,市场数据一更新,报价立刻重算。

避坑指南:我曾经把报价更新频率设成1秒一次,结果服务器扛不住。后来改成“价格变动超过0.1%才更新”,既省资源又够用。

报价生成的伪代码示例:

def generate_quote(product, market_data):
    fair_price = theoretical_price(product, market_data)
    spread = calc_spread(product.risk, market_data.volatility)
    bid = fair_price - spread / 2
    ask = fair_price + spread / 2
    return {'bid': bid, 'ask': ask, 'timestamp': now()}

你想想看,如果每次报价都重新跑蒙特卡洛,那延迟得多高?所以我一般用插值法或者神经网络近似,把计算时间从秒级降到毫秒级。

19.3 自动化风控检查

风控检查,是自动化的最后一道防线。没有它,你赚再多钱也可能一夜归零。

我设计的自动化风控系统,通常包含以下几个检查项:

检查项 触发条件 处理动作
Delta超限 |Delta| > 1.0 暂停做市,强制对冲
Gamma超限 Gamma > 0.1 降低报价规模
Vega超限 Vega > 5000 买入波动率期货对冲
敞口集中度 单一标的占比 > 20% 分散投资,限制新开仓

警告:自动化风控不能完全替代人工。我见过一个案例,系统因为数据源故障,连续报错半小时都没发现。所以一定要加“心跳检测”——如果系统超过5分钟没发出风控信号,自动报警。

风控检查的代码逻辑:

def risk_check(portfolio):
    alerts = []
    if abs(portfolio.delta) > 1.0:
        alerts.append('Delta超限')
    if portfolio.gamma > 0.1:
        alerts.append('Gamma超限')
    if portfolio.vega > 5000:
        alerts.append('Vega超限')
    if alerts:
        send_alert(alerts)
        pause_market_making()
    return alerts

19.4 自动化报告生成

报告生成,很多人觉得是小事。其实不然——报告是给老板、风控、监管看的。写不好,你连解释的机会都没有。

我习惯把报告分成三类:

  • 日报:P&L、风险敞口、交易量、最大回撤。每天收盘后自动生成,发邮件给团队。
  • 周报:策略表现归因、市场环境分析、参数调整建议。每周一早上生成。
  • 月报:全面复盘,包括压力测试、VaR回测、对手方风险评估。给管理层看。

报告生成的自动化流程:

def generate_daily_report(portfolio, trades):
    report = {
        'date': today(),
        'pnl': calc_pnl(portfolio, trades),
        'delta': portfolio.delta,
        'gamma': portfolio.gamma,
        'vega': portfolio.vega,
        'max_drawdown': calc_max_drawdown(portfolio),
        'trade_count': len(trades)
    }
    save_to_db(report)
    send_email(report, recipients=['team@example.com'])
    return report

我个人习惯用模板引擎(比如Jinja2)生成HTML报告,再转成PDF。这样格式统一,还能嵌入图表。有一次监管来检查,我直接把过去一年的日报打包发过去,对方说“你们这数据真干净”。

19.5 自动化系统的整体架构

这四个模块不是孤立的,它们需要协同工作。下面这张图是我常用的架构:

做市策略自动化系统架构 数据层 市场行情 | 订单流 | 持仓数据 | 风险因子 策略层 定价模型 | 对冲策略 | 报价算法 | 风控规则 参数配置 | 策略切换 | 回测引擎 执行层 自动化对冲执行 | 自动化报价生成 自动化风控检查 | 自动化报告生成 输出:成交记录 | 风险报告 | 对账单 | 监管报表

从架构图可以看出,数据层负责采集和清洗,策略层负责决策,执行层负责落地。每一层都有独立的监控和告警。我习惯在策略层和执行层之间加一个“人工干预开关”——万一系统抽风,可以一键切回手动模式。

总结一下:自动化不是一蹴而就的。我建议你先从报告生成开始,再逐步加上风控检查、报价生成,最后才是对冲执行。每一步都要经过充分的回测和实盘验证。别贪多,稳着来。

好了,这一章的内容就到这里。自动化做市是个系统工程,每个模块都有很多细节。如果你在实际落地中遇到问题,欢迎交流。记住:机器是工具,人才是决策者。

无相订单流研究社 微信Lucian808555