4、曲面套利检测:蝶式套利、日历套利、盒式套利的曲面识别
好了,咱们进入第四章。这一章我特别想跟你聊聊——曲面套利检测。
说实话,我在刚入行做期权做市的时候,最头疼的就是这个。盘口上看着价格都挺合理,但一算曲面,哎哟,到处都是漏洞。那时候我师父跟我说了一句话,我一直记着:「曲面不是用来欣赏的,是用来找茬的。」
今天我们就来当一回「找茬专家」。看看蝶式、日历、盒式这三种经典套利,怎么在曲面上把它们揪出来。
4.1 蝶式套利:曲面的「微笑」有没有裂开?
蝶式套利,说白了就是赌波动率曲面的「微笑」是否平滑。如果中间凸起太高或者凹陷太深,机会就来了。
核心逻辑:买入一份低行权价call,买入一份高行权价call,卖出两份中间行权价call。组合的theta和vega都接近中性,赚的是「曲面畸形」的钱。
曲面识别方法:
- 在同一个到期日上,取三个相邻的行权价K1 < K2 < K3
- 计算蝶式价差 = C(K1) - 2*C(K2) + C(K3)
- 如果这个值 < 0,说明中间价格被高估,存在套利空间
嗯,这里要注意:理论上是不能为负的。为什么?因为蝶式组合本质上是一个「凸性组合」,它的 payoff 永远非负。如果价格算出来是负的,那就是白送钱。
我曾经在2019年遇到过一回,某商品期权在快收盘时,中间行权价的call突然被砸下去两个tick。我一看蝶式价差变成-1.5了,立马撸了一组。三分钟后价格回归,净赚3个点。这种机会不常有,但来了就得抓住。
4.2 日历套利:不同月份之间的「时间扭曲」
日历套利,也叫时间套利。它看的是不同到期日之间,隐含波动率的相对关系。
核心逻辑:卖出近月期权,买入远月期权。赚的是「时间衰减速度差」和「波动率期限结构」的回归。
在曲面上怎么识别?我个人的习惯是这么做的:
- 固定同一个行权价(比如平值附近)
- 看近月和远月的隐含波动率差值
- 如果远月IV - 近月IV 超过历史均值两个标准差,就值得关注
避坑指南:我曾经在2020年3月市场暴跌时,看到远月波动率比近月高出15个点,以为是个大机会。结果进去之后,近月波动率继续飙升,远月反而没动。后来我才意识到——极端行情下,近月波动率会「追赶」远月,而不是远月回归。所以日历套利在尾部风险事件中要格外小心。
你想想看,日历套利最怕什么?最怕「事件驱动」。比如财报、利率决议这些,近月波动率会突然跳升,把你的套利空间直接打穿。
4.3 盒式套利:最「干净」的无风险套利
盒式套利,我个人认为是三种套利里最「硬核」的。因为它不依赖任何模型假设,纯粹是看涨看跌平价关系的偏离。
核心逻辑:用call和put合成一个「无风险组合」,然后跟理论上的无风险利率做对比。
具体操作是这样的:
- 买入一份call(K1),卖出一份put(K1) —— 合成多头期货
- 卖出一份call(K2),买入一份put(K2) —— 合成空头期货
- 两个合成期货组合在一起,就是一个「盒式价差」
理论上,这个组合的价值应该等于 K2 - K1 的现值。如果市场报价偏离了这个值,就存在套利机会。
重要提醒:盒式套利虽然理论上是无风险的,但实际操作中要考虑:
- 保证金占用(尤其是卖期权那部分)
- 流动性风险(你进去容易,出来难)
- 交易成本(滑点可能吃掉利润)
我见过有人算出来年化20%的盒式套利机会,结果一算滑点和保证金,实际收益不到3%。
4.4 曲面检测的自动化流程
手工盯曲面找套利,那是石器时代的做法。现在我们都用程序扫。
下面是我自己常用的一个检测框架,你可以参考:
# 伪代码:曲面套利检测引擎
def detect_arbitrage(surface):
results = []
# 1. 蝶式套利检测
for expiry in surface.expiries:
for i in range(1, len(expiry.strikes)-1):
butterfly = surface.call(expiry, strikes[i-1])
- 2*surface.call(expiry, strikes[i])
+ surface.call(expiry, strikes[i+1])
if butterfly < -threshold:
results.append(('butterfly', expiry, strikes[i], butterfly))
# 2. 日历套利检测
for strike in surface.common_strikes:
for i in range(len(surface.expiries)-1):
calendar = surface.iv(surface.expiries[i+1], strike)
- surface.iv(surface.expiries[i], strike)
if abs(calendar) > 2 * historical_std:
results.append(('calendar', strike, surface.expiries[i], calendar))
# 3. 盒式套利检测
for expiry in surface.expiries:
for k1, k2 in pairwise(expiry.strikes):
box = (surface.call(expiry, k1) - surface.put(expiry, k1))
- (surface.call(expiry, k2) - surface.put(expiry, k2))
theoretical = (k2 - k1) * exp(-r * T)
if abs(box - theoretical) > box_threshold:
results.append(('box', expiry, k1, k2, box - theoretical))
return results
这段代码虽然简单,但核心逻辑都在了。实际生产环境中,你还需要加入:
- 实时行情推送(WebSocket)
- 多合约联动检测(比如跨交易所套利)
- 风险限额控制(防止一次撸太多)
4.5 知识体系总览
为了让你更直观地理解这三种套利在曲面上的位置和关系,我画了一张图:
这张图把三种套利的关系理清楚了。你看,蝶式看的是「同一时间、不同价格」的凸性;日历看的是「同一价格、不同时间」的斜率;盒式看的是「同一时间、同一价格」的call-put平衡。三者互不重叠,共同构成了曲面套利检测的完整拼图。
4.6 实战中的几点体会
最后,分享几个我在实战中踩过的坑,希望能帮你少走弯路:
关于蝶式套利:别只看call,put也要看。有时候call的曲面看起来平滑,但put那边已经歪了。我习惯把call和put的蝶式价差放在一起对比,如果两者方向不一致,说明市场深度不够,别硬上。
关于日历套利:注意分红和拆股。这些事件会导致不同到期日的期权定价逻辑发生变化,不是套利,是「假信号」。我吃过这个亏,后来在代码里加了个日历事件过滤器。
关于盒式套利:这是最容易被高频交易者抢跑的。如果你不是做市商或者有低延迟通道,建议把阈值设高一点。我曾经设了0.5个tick的阈值,结果一个月下来一单都没成交——全被机器抢了。
好了,这一章的内容就到这里。曲面套利检测,说白了就是「找不同」。把理论上的无套利条件当成模板,跟市场报价一一比对,找到偏差就是找到机会。但记住,机会背后永远有风险,尤其是流动性风险——你看到的套利空间,可能只是别人挂的「钓鱼单」。
公众号:蓝海资料掘金营,微信deep3321