6、做市策略引擎:报价策略框架、库存管理策略、对冲策略、最优执行算法

做市策略引擎,说白了就是整个系统的「大脑」。它决定了你什么时候报价、报什么价、手里存货多了怎么处理、风险敞口怎么对冲。我做了这么多年结构化产品做市,见过太多团队在策略引擎上栽跟头——要么报价太激进被市场「吃掉」,要么库存管理一塌糊涂导致爆仓。

今天咱们就把这块拆开揉碎了讲。我会结合自己踩过的坑,把报价策略、库存管理、对冲和最优执行这四块核心内容说清楚。

6.1 报价策略框架:怎么定出「聪明」的价格

报价策略不是简单地在中间价上加个点差。结构化产品的定价本身就复杂,再加上做市商要赚钱,报价策略得考虑好几个维度。

核心公式:

报价 = 理论价格 + 风险溢价 + 库存调整 + 竞争因子

我在项目中遇到过这样的情况:团队把理论价格算得很准,但忽略了库存调整,结果手里积压了一大堆同方向的头寸,市场一波动就亏惨了。

报价策略框架通常包含以下几个模块:

  • 基础定价层:根据模型算出产品的理论公允价值。结构化产品常用蒙特卡洛模拟或有限差分法。
  • 风险调整层:根据当前持仓的 Greeks(Delta、Gamma、Vega 等)调整报价。比如你 Delta 已经偏多了,买价就要压低一些。
  • 库存管理层:后面会详细讲,这里先提一句——库存水平直接影响报价偏移。
  • 竞争感知层:观察对手方的报价行为,动态调整自己的点差和报价深度。

我习惯用分层架构来实现报价策略,这样每一层都可以独立测试和优化。你想想看,如果所有逻辑都揉在一个函数里,改一个参数都可能引发连锁反应,调试起来会疯掉。

// 伪代码示例:报价策略引擎核心逻辑
class QuoteEngine {
    double calculateBidPrice(Product product, Portfolio portfolio) {
        double fairPrice = pricingModel.price(product);
        double riskAdjust = riskManager.calculateAdjustment(product, portfolio);
        double inventoryAdjust = inventoryManager.getBidAdjustment(product);
        double competitiveAdjust = marketData.getCompetitiveBidAdjust(product);
        
        return fairPrice + riskAdjust + inventoryAdjust + competitiveAdjust;
    }
    
    double calculateAskPrice(Product product, Portfolio portfolio) {
        // 类似逻辑,但方向相反
    }
}

我的经验:报价策略一定要做回测。别以为模型算出来就万事大吉,历史数据跑一遍,你会发现很多「纸上谈兵」的问题。我曾经有个策略,回测时年化收益 15%,实盘一跑就亏——后来发现是忽略了交易成本。

6.2 库存管理策略:别让存货「压死」你

库存管理是做市商的核心能力之一。结构化产品流动性差,手里积压了头寸,想平仓都找不到对手方。

库存管理的目标很简单:把持仓控制在目标范围内。但实现起来并不容易。

我常用的库存管理策略有几种:

  1. 均值回归策略:设定一个目标库存水平,偏离了就通过报价调整来「拉」回来。比如库存偏多,就降低买价、提高卖价,鼓励客户卖给你,抑制客户从你这里买。
  2. 库存阈值触发:设定上下限阈值,一旦突破就启动「紧急模式」。紧急模式下,报价偏移会加大,甚至暂停某些方向的报价。
  3. 时间加权策略:库存偏离的时间越长,调整力度越大。这能避免短期波动导致过度反应。

注意:库存管理不能只看数量,还要看风险敞口。比如你手里有 100 万名义本金的看涨结构产品,和 100 万名义本金的看跌结构产品,数量上是对称的,但风险敞口完全不同。我建议用 Delta 等价头寸来管理库存。

举个例子,假设你的目标库存 Delta 是 0,当前持仓 Delta 是 +5000。这意味着你偏多头。那你的报价策略就要偏向「劝退」买家、「欢迎」卖家。具体做法是:

  • 买价(Bid)降低 0.5 个基点
  • 卖价(Ask)提高 0.5 个基点
  • 点差从 2 个基点扩大到 3 个基点

这样客户更倾向于卖给你,而不是从你这里买,库存自然就降下来了。

6.3 对冲策略:把风险「转嫁」出去

对冲是做市商控制风险的核心手段。结构化产品的风险维度多,Delta、Gamma、Vega、Theta 都得管。

我习惯把对冲策略分为两类:

对冲类型 适用场景 工具 频率
静态对冲 产品发行初期,风险敞口大 OTC 期权、互换 一次性或低频
动态对冲 日常做市过程中,风险持续变化 期货、ETF、流动性好的期权 高频(分钟级甚至秒级)

动态对冲里最常用的是 Delta 对冲。原理很简单:你持有一个结构化产品,Delta 是 0.6,意味着标的资产涨 1 块,产品涨 0.6 块。为了对冲,你就得卖出 0.6 份标的资产。

但实际操作中没这么简单。为什么呢?因为 Delta 会变。Gamma 的存在让 Delta 本身也在波动。你想想看,如果市场剧烈波动,Delta 可能从 0.6 变成 0.8,你之前对冲的头寸就不够了。

我曾经踩过的坑:有一次做 Delta 对冲,我用了固定频率(每小时对冲一次)。结果市场在 15 分钟内暴跌,Delta 变化巨大,我的对冲头寸完全跟不上。那次亏了不少钱。后来我改成了基于阈值触发的对冲——Delta 偏离超过某个阈值就触发对冲,而不是固定时间。

Vega 对冲也很重要,尤其是对于期限较长的结构化产品。隐含波动率一变,你的持仓价值可能大幅波动。我通常用方差互换或期权组合来管理 Vega 风险。

6.4 最优执行算法:怎么「花最少的钱」完成交易

最优执行算法(Optimal Execution)解决的是一个问题:你要买卖一大笔头寸,怎么操作才能让市场冲击成本最小?

做市商自己也需要执行大额交易——比如对冲、库存调整、产品到期平仓。这时候不能像散户一样一把梭,得讲究策略。

常用的最优执行算法有:

  • TWAP(时间加权平均价格):把大单拆成小单,按时间均匀分布。适合流动性好、波动不大的市场。
  • VWAP(成交量加权平均价格):根据历史成交量分布来分配订单。流动性高的时段多交易,流动性低的时段少交易。
  • Implementation Shortfall:追求「实际成交价」和「决策价」之间的差距最小化。这个算法更复杂,会考虑市场冲击、延迟成本、机会成本。
  • 自适应算法:根据实时市场情况动态调整交易节奏。比如市场突然出现大单,算法会加速或减速。

我个人的习惯是:大额交易用 Implementation Shortfall,小额交易用 VWAP。为什么?大额交易对市场冲击大,需要精细控制;小额交易用 VWAP 简单高效,不会引入太多复杂逻辑。

// 最优执行算法示例:VWAP 切片逻辑
class VWAPExecutor {
    void execute(Order order, MarketData marketData) {
        double totalVolume = order.quantity;
        List<Slice> slices = calculateSlices(totalVolume, marketData.historicalVolumeProfile);
        
        for (Slice slice : slices) {
            double price = marketData.getCurrentPrice();
            double quantity = slice.quantity;
            
            // 发送子订单
            broker.sendOrder(new Order(price, quantity, order.side));
            
            // 等待一段时间再发下一笔
            Thread.sleep(slice.interval);
        }
    }
    
    List<Slice> calculateSlices(double totalVolume, VolumeProfile profile) {
        // 根据历史成交量分布计算每个时间片的交易量
    }
}

小技巧:最优执行算法一定要考虑「信号成本」。如果你要卖出,而市场正在下跌,你的算法应该加速卖出还是减速?这取决于你对市场走势的判断。我通常会在算法里嵌入一个短期预测模型,虽然不完美,但能显著改善执行效果。

6.5 策略引擎的整体架构

说了这么多,咱们来看看策略引擎的整体架构。下面这张图是我在实际项目中用过的架构,经过多次迭代,算是比较成熟了。

做市策略引擎架构图 市场数据输入层 行情数据 | 订单簿 | 历史数据 | 新闻事件 策略引擎核心 报价策略 定价 + 调整 库存管理 阈值 + 调整 对冲策略 Delta/Vega 最优执行 TWAP/VWAP 风险管理模块(Greeks 计算、VaR 监控、压力测试) 执行层 订单路由 | 交易所接口 | 成交反馈 | 延迟监控

这个架构的核心思想是分层解耦。市场数据输入层负责采集和清洗数据,策略引擎核心做决策,执行层负责把决策变成订单发出去。每一层都可以独立升级和优化。

特别提醒:策略引擎的延迟非常关键。从市场数据到达,到策略计算出报价,再到订单发出,整个链路延迟要控制在微秒级。我见过有些团队用 Python 写策略引擎,延迟动不动就几十毫秒,这在做市领域基本没法玩。建议核心路径用 C++ 或 Java 实现,Python 只做策略研究和回测。

好了,关于做市策略引擎的核心内容就讲到这里。报价策略、库存管理、对冲、最优执行,这四个模块环环相扣,任何一个环节出问题,整个做市业务都会受影响。我在实际项目中花了很多时间在策略引擎的稳定性和鲁棒性上——毕竟,一个能稳定运行 99.99% 时间的策略引擎,比一个理论上收益更高但经常出 bug 的引擎要值钱得多。

无相订单流研究社 微信Lucian808555