第六章:做市报价生成——基于曲面的理论价格计算与买卖价差动态调整

做市报价生成,说白了就是两件事:算准理论价定好买卖价差。前者靠曲面,后者靠风控。我在这个领域摸爬滚打了七八年,见过太多人把精力全砸在曲面拟合上,结果报价一上线就被市场打得鼻青脸肿。为什么?因为理论价算得再准,价差定不好,照样亏钱。

6.1 基于曲面的理论价格计算

我们手上有波动率曲面,怎么用它算期权理论价?流程其实很清晰:

  1. 输入参数:标的当前价格、剩余期限、行权价、无风险利率、股息率
  2. 从曲面插值:根据期限和行权价,从波动率曲面上插出对应的隐含波动率
  3. 代入定价模型:用Black-Scholes或二叉树模型,算出期权理论价格

嗯,这里要注意一个坑。曲面上的波动率是隐含波动率,不是历史波动率。我刚开始做做市时,有次把历史波动率当成曲面数据往里塞,结果理论价和市场价格差了十万八千里。还好是模拟盘,不然亏大了。

核心原则:曲面上的波动率必须与定价模型一致。BS模型用对数正态波动率,如果曲面给的是正态波动率,必须先转换。

具体到代码实现,我习惯这样写:

def calc_theo_price(spot, strike, expiry, surface):
    # 从曲面插值波动率
    vol = surface.interpolate(expiry, strike)
    # 计算期权理论价
    d1 = (log(spot/strike) + (r - q + 0.5*vol**2)*T) / (vol*sqrt(T))
    d2 = d1 - vol*sqrt(T)
    call_price = spot*exp(-q*T)*N(d1) - strike*exp(-r*T)*N(d2)
    return call_price

这段代码看起来简单,但实际生产环境里,插值方法的选择才是关键。我个人偏好用三次样条插值,因为它平滑性好,不会出现突兀的波动率跳跃。不过样条插值有个毛病——边界处容易震荡。我曾经在远月合约上吃过这个亏,后来加了边界约束才稳住。

6.2 买卖价差动态调整

理论价算出来了,接下来就是定买卖价。做市商的利润来源,说白了就是买卖价差。但价差不是拍脑袋定的,得动态调整。

影响价差的因素有哪些?我列个表:

因素 影响方向 说明
流动性 流动性越差,价差越大 深度虚值、远月合约,价差通常要放大
波动率水平 波动率越高,价差越大 高波环境下,价格跳动快,风险大
持仓风险 风险敞口越大,价差越大 希腊值暴露过高时,需要加价保护
市场情绪 恐慌时价差扩大 VIX飙升时,所有合约价差都会拉宽

实战技巧:我一般用「基准价差 + 动态调整因子」的模式。基准价差根据合约类型和期限设定,动态因子则实时计算。比如平值近月合约,基准价差设0.5个tick,然后根据当前波动率水平乘以一个系数。

动态调整因子的计算,我常用这个公式:

spread = base_spread * (1 + alpha * vol_rank + beta * gamma_exposure + gamma * inventory_ratio)

其中:

  • vol_rank:当前波动率在历史分布中的百分位
  • gamma_exposure:持仓的Gamma敞口,越大价差越宽
  • inventory_ratio:库存比例,仓位越重价差越宽
  • alpha, beta, gamma:可调参数,需要回测优化

为什么会这样设计?你想想看,波动率处于历史高位时,价格波动剧烈,你报出去的价很可能瞬间被吃掉。这时候不把价差拉宽,就是给市场送钱。我曾经在2020年3月那波行情里,就是因为价差没及时调宽,一晚上亏了六位数。从那以后,我把波动率百分位这个因子加进了模型。

6.3 报价生成的整体流程

把上面两块拼起来,完整的报价生成流程是这样的:

1. 获取市场数据(标的价格、利率、股息率)
2. 从波动率曲面插值得到每个合约的隐含波动率
3. 计算每个合约的理论价格
4. 根据当前市场状态计算动态价差
5. 生成买卖报价:买价 = 理论价 - 价差/2,卖价 = 理论价 + 价差/2
6. 检查报价是否在合理范围内(防止极端报价)
7. 发送报价到交易所

这个流程看起来简单,但每一步都有坑。比如第6步,检查报价合理性。我见过有人忘了加这个检查,结果曲面插值出bug,报了个负价格出去。嗯,交易所直接给拒了,还好没成交,不然得赔死。

避坑指南:我曾经因为曲面数据更新延迟,导致理论价和实际市场价严重偏离。后来我加了一个「价格偏离度检查」——如果理论价和最新成交价偏离超过一定比例,就暂时不报价,等数据同步后再恢复。

6.4 核心逻辑框架图

下面这张图,把整个报价生成的核心逻辑串起来了。我建议你多看几遍,理解每个模块之间的依赖关系。

做市报价生成核心逻辑 市场数据输入 标的价格、利率、股息率 波动率曲面 期限结构 + 倾斜结构 理论价格计算 BS模型 / 二叉树模型 买卖价差动态调整 流动性 + 波动率 + 风险敞口 报价生成 买价 = 理论价 - 价差/2 | 卖价 = 理论价 + 价差/2 风控检查 价格偏离度检查 | 极端报价过滤 发送报价到交易所

这张图里,理论价格计算买卖价差动态调整是两个并行模块,最终汇合到报价生成。风控检查是最后一道防线,千万别省。

6.5 一些实战心得

最后分享几个我在实战中踩过的坑:

  • 曲面更新频率:我建议至少每100ms更新一次曲面。如果更新太慢,报价会滞后于市场。我曾经用500ms的更新频率,结果在快市里报价总是慢半拍,被高频交易者反复收割。
  • 价差对称性:买卖价差不一定要对称。如果持仓偏向某一侧,可以适当偏移报价。比如你手里有很多看涨期权多头,可以把卖价报低一点,吸引对手盘来买,帮你减仓。
  • 最小报价单位:不同交易所的最小tick不一样。报价必须对齐到tick的整数倍,否则会被拒。这个细节很容易被忽略。

总结一句话:理论价是骨架,价差是血肉。骨架歪了,报价就废了;血肉少了,利润就没了。两者缺一不可。


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