第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秒一次,结果服务器扛不住。后来改成“价格变动超过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 自动化系统的整体架构
这四个模块不是孤立的,它们需要协同工作。下面这张图是我常用的架构:
从架构图可以看出,数据层负责采集和清洗,策略层负责决策,执行层负责落地。每一层都有独立的监控和告警。我习惯在策略层和执行层之间加一个“人工干预开关”——万一系统抽风,可以一键切回手动模式。
总结一下:自动化不是一蹴而就的。我建议你先从报告生成开始,再逐步加上风控检查、报价生成,最后才是对冲执行。每一步都要经过充分的回测和实盘验证。别贪多,稳着来。
好了,这一章的内容就到这里。自动化做市是个系统工程,每个模块都有很多细节。如果你在实际落地中遇到问题,欢迎交流。记住:机器是工具,人才是决策者。