第九章:套利机会识别——曲面套利类型与自动策略
做市交易做了这么多年,我越来越觉得——套利机会识别才是期权做市的核心竞争力。说白了,你报出去的买卖价差,本质上就是在跟市场博弈。如果曲面出现扭曲,那就是白送的钱。今天我们就聊聊曲面套利的几种经典类型,以及怎么用代码把它们抓出来。
9.1 曲面套利的三大类型
我个人习惯把曲面套利分成三类:蝶式、日历、盒式。这三类覆盖了90%以上的无风险套利场景。你想想看,如果能把它们都吃透,那做市胜率至少能提两个档次。
9.1.1 蝶式套利(Butterfly)
蝶式套利,说白了就是赌波动率曲面在某个行权价附近过于凸起或凹陷。我记得刚入行时,有个老交易员跟我说:「蝶式套利是检验曲面是否合理的试金石。」后来我发现,这话一点不假。
蝶式套利的无套利条件很简单:
对于同一到期日、三个连续行权价 K1 < K2 < K3:
C(K1) - 2*C(K2) + C(K3) ≥ 0 (看涨蝶式)
P(K1) - 2*P(K2) + P(K3) ≥ 0 (看跌蝶式)
如果这个值小于0,就说明存在套利机会。我在项目中遇到过好几次,某个深度虚值期权突然被大单砸出异常价格,蝶式组合瞬间变成负值。这时候别犹豫,直接吃进去。
9.1.2 日历套利(Calendar Spread)
日历套利,也叫时间套利。它利用的是不同到期日之间隐含波动率的错配。举个例子,近月合约的IV是18%,远月合约的IV是22%。如果这个差值超出了合理范围,就可以做多近月、做空远月,或者反过来。
无套利条件是这样的:
对于同一行权价 K,近月 T1 和远月 T2:
C(T1) ≤ C(T2) (看涨期权时间价值递减)
P(T1) ≤ P(T2) (看跌期权同理)
嗯,这里要注意。日历套利不是简单的「远月一定比近月贵」。如果近月有分红、拆股等事件,这个条件可能会被打破。我曾经踩过这个坑,以为发现了套利机会,结果被分红调整打了个措手不及。
9.1.3 盒式套利(Box Spread)
盒式套利是最高级的玩法。它利用的是看涨-看跌平价关系(Put-Call Parity)。一个盒式组合由以下四腿组成:
- 买入一份看涨期权(行权价 K1)
- 卖出一份看跌期权(行权价 K1)
- 卖出一份看涨期权(行权价 K2)
- 买入一份看跌期权(行权价 K2)
这个组合的到期价值是固定的:K2 - K1。所以它的现值应该等于 (K2 - K1) * e^(-rT)。如果市场价格偏离了这个理论值,就存在无风险套利。
盒式套利条件:
C(K1) - P(K1) - C(K2) + P(K2) ≈ (K2 - K1) * e^(-rT)
如果左边 > 右边:做空盒式
如果左边 < 右边:做多盒式
说实话,盒式套利在流动性好的市场里很难抓到。但一旦出现,利润往往很可观。我记得有一次,某个指数期权在收盘前3分钟出现了盒式套利机会,我手动敲单进去,3秒就平了,赚了0.2个点。虽然不多,但胜在无风险。
9.2 无套利条件校验
光知道套利类型还不够,你得有一套校验流程。我一般按以下步骤来:
- 数据清洗:剔除过期数据、异常价格、买卖价差过大的合约
- 行权价对齐:确保所有合约的行权价、到期日、合约乘数一致
- 无风险利率校准:用国债收益率或回购利率,别用Libor
- 分红调整:如果有分红,要调整行权价或直接调整期权价格
- 阈值设定:设定一个最小套利利润阈值(比如0.5个tick),低于这个阈值不执行
下面是我常用的校验代码片段:
def check_butterfly(calls, strikes, r, T):
"""
校验蝶式套利条件
calls: 三个行权价的看涨期权价格列表 [C1, C2, C3]
strikes: 三个行权价 [K1, K2, K3]
"""
if len(calls) != 3 or len(strikes) != 3:
return False
butterfly_value = calls[0] - 2*calls[1] + calls[2]
# 考虑交易成本
threshold = 0.01 # 1个tick
if butterfly_value < -threshold:
return True # 存在套利机会
else:
return False
9.3 自动套利策略实现
做市交易里,手动抓套利机会基本不现实。你得写个自动扫描器,实时监控整个曲面。我分享一下我的策略框架:
第一步:数据流接入
用WebSocket或者FIX协议接入实时行情。别用REST API,延迟太大。我习惯用C++写底层数据接收,Python做策略逻辑。
第二步:曲面构建
实时构建波动率曲面。这里要注意,不要用全部合约,只选流动性好的。我一般只取买卖价差小于0.5%的合约。
第三步:套利扫描
对每个到期日、每个行权价组合,依次检查蝶式、日历、盒式条件。扫描频率至少每秒一次。
第四步:订单执行
发现套利机会后,立即计算最优执行路径。四腿订单要同时发出,避免滑点吃掉利润。我建议用冰山订单,别一次性暴露全部意图。
下面是一个简化的自动扫描器伪代码:
while True:
# 获取当前曲面数据
surface = get_option_surface()
# 扫描蝶式套利
for expiry in surface.expiries:
for i in range(len(surface.strikes) - 2):
K1, K2, K3 = surface.strikes[i:i+3]
C1, C2, C3 = surface.get_call_prices(expiry, [K1, K2, K3])
if check_butterfly([C1, C2, C3], [K1, K2, K3], r, T):
execute_butterfly_arb('BUY', K1, K2, K3, expiry)
# 扫描日历套利
for strike in surface.strikes:
for i in range(len(surface.expiries) - 1):
T1, T2 = surface.expiries[i:i+2]
C1 = surface.get_call_price(T1, strike)
C2 = surface.get_call_price(T2, strike)
if C1 > C2 + threshold:
execute_calendar_arb('SELL', strike, T1, T2)
# 扫描盒式套利
for expiry in surface.expiries:
for i in range(len(surface.strikes) - 1):
K1, K2 = surface.strikes[i], surface.strikes[i+1]
C1, P1 = surface.get_option_pair(expiry, K1)
C2, P2 = surface.get_option_pair(expiry, K2)
box_value = C1 - P1 - C2 + P2
theoretical = (K2 - K1) * exp(-r * T)
if abs(box_value - theoretical) > threshold:
execute_box_arb(box_value, theoretical, K1, K2, expiry)
sleep(0.1) # 100ms扫描一次
9.4 本章知识体系
下面这张图是我自己画的,把曲面套利的核心逻辑串起来了。你看一眼就能明白整个流程:
这张图的核心逻辑就是:数据进来 → 建曲面 → 三种套利同时扫描 → 校验通过后执行。我建议你把这张图打印出来贴在工位上,做交易时随时对照。
公众号:蓝海资料掘金营,微信deep3321