第六章:做市报价生成——基于曲面的理论价格计算与买卖价差动态调整
做市报价生成,说白了就是两件事:算准理论价和定好买卖价差。前者靠曲面,后者靠风控。我在这个领域摸爬滚打了七八年,见过太多人把精力全砸在曲面拟合上,结果报价一上线就被市场打得鼻青脸肿。为什么?因为理论价算得再准,价差定不好,照样亏钱。
6.1 基于曲面的理论价格计算
我们手上有波动率曲面,怎么用它算期权理论价?流程其实很清晰:
- 输入参数:标的当前价格、剩余期限、行权价、无风险利率、股息率
- 从曲面插值:根据期限和行权价,从波动率曲面上插出对应的隐含波动率
- 代入定价模型:用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 核心逻辑框架图
下面这张图,把整个报价生成的核心逻辑串起来了。我建议你多看几遍,理解每个模块之间的依赖关系。
这张图里,理论价格计算和买卖价差动态调整是两个并行模块,最终汇合到报价生成。风控检查是最后一道防线,千万别省。
6.5 一些实战心得
最后分享几个我在实战中踩过的坑:
- 曲面更新频率:我建议至少每100ms更新一次曲面。如果更新太慢,报价会滞后于市场。我曾经用500ms的更新频率,结果在快市里报价总是慢半拍,被高频交易者反复收割。
- 价差对称性:买卖价差不一定要对称。如果持仓偏向某一侧,可以适当偏移报价。比如你手里有很多看涨期权多头,可以把卖价报低一点,吸引对手盘来买,帮你减仓。
- 最小报价单位:不同交易所的最小tick不一样。报价必须对齐到tick的整数倍,否则会被拒。这个细节很容易被忽略。
总结一句话:理论价是骨架,价差是血肉。骨架歪了,报价就废了;血肉少了,利润就没了。两者缺一不可。