什么是盒式套利?
盒式套利是一种期权无风险套利,一旦套利成功,获得的利润不受任何市场波动和价格影响,但是相对应的获得的利润在有效市场上相对来说不高且套利机会很少。盒式套利主要承担的风险为期权对手方提前行权的风险,利润影响的主要因素是手续费。
怎么组合一个盒式套利?
盒式套利的组成需要一共四个期权,算是较为麻烦的期权套利组合,因此我们将它拆分成两种简单的期权套利模型:熊市看跌期权套利和牛市看涨期权套利组合,这样理解起来会更加的简单。
熊市看跌期权套利
熊市看跌期权套利的交易方式是买进一个执行价格较高的看跌期权,同时卖出一个到期日相同、但是执行价格较低的看跌期权。整体组合的收益情况如下图所示,我们可以看到在标的物价格低于较低执行价时候有一个稳定不变的收益,同时在标的物价格高于较高时有一个稳定的风险敞口亏损。在两个执行价之间时,收益成下降趋势。
牛市看涨期权套利
牛市看涨期权套利的交易方式是买进一个执行价格较低的看涨期权,同时卖出一个到期日相同、但是执行价格较高的看涨期权。整体组合的收益情况如下图所示,我们可以看到在标的物价格低于较低执行价时候有一个稳定的风险敞口亏损,同时在标的物价格高于较高时有一个稳定不变的收益。在两个执行价之间时,收益成上涨趋势。
盒式期权套利
盒式套利的交易方式是将一个熊市看跌期权套利和一个牛市看涨期权套利组合,同时交易四种期权合约,且两种简单期权套利组合中使用的高低两个执行价格相同。根据上面的介绍我们可以发现在标的物价格低于较低执行价的时候,熊市看跌期权组合有稳定的收益,而牛市看涨期期权组合有稳定的损益;反之在标的物价格高于较高执行价的时候,熊市看跌期权组合有稳定的损益,而牛市看涨期期权组合有稳定的收益。在两个执行价之间时,两种套利组合呈现出完全相反的趋势互相抵消。因此当两种套利组合时,如下图所示,红色的线为盒式价差期权套利组合的收益,在无套利机会的情况下,它应该等于无风险收益率。为什么会等于无风险收益率呢?因为在无套利机会的时候,风险相同的投资产品应该收益相同,而盒式套利就是一个几乎无风险的套利组合。换句话说,当盒式套利的收益高于无风险收益率时,市场便出现了套利机会,如果此时同时完成四个期权合约交易,我们便可以完成一个盒式期权无风险套利。
如何判断盒式期权套利机会是否存在?
盒式期套利组合的权损益情况
首先我们先搞清楚一个盒式期权套利组合的盈亏由来,以及最大盈亏各是多少,之后便可以测试不同的期权组合,找出有套利机会的四个期权合约,做成一个完整的盒式期权套利组合。
我们假设较低的执行价为Slow,较高的执行价为Shigh,持有到到期时的期权组合价值为FVE,最大整体收益为MP,最大整体损益为ML,权利金净支出为NPP,手续费等各项杂费为C。
FVE = Shigh – Slow
ML = NPP + C
MP = FVE – ML
从公式可以看出,我们最终目标是要得到MP最大值的期权组合,但是在这个公式中我们忽略了很重要的一点,就是当投资组合的收益率低于无风险收益率的时候便没有什么意义了,还不如去买无风险国债更实在,因此我们要计算的应该是考虑了无风险收益率后的MP。
我们重新来整理下上面的公式,由于ML都是期初支付的,我们不需要进行折现,需要折现的只有FVE,我们假设从今天开始到合约到期日的相差T个月,无风险收益率为Rf,则新的FVE为:
FVEnew = FVE/(1+Rf*(T/12))
MPnew = FVEnew – ML
在整个策略中我们需要做的目标就很明确了,用合适的公式表示出MPnew,然后当MPnew为正时候即可同时下单四个期权,整个套利策略也变得简单多了。
如何找到合适的期权进行MPnew的测试:
每个标的资产的期权很多很多,如何快速的用天勤找到合适的一组4个合约来做盈利测试呢?这里只是提供一个我的思路,并不一定是最优思路。
首先用天勤的query函数取标的物的当前合约,只取一个交易方向的即可,可以是CALL可以是PUT,示例中取的是DEC.m2105的CALL期权:
quote_put = api.query_options("DCE.m2105",option_class="CALL", expired=False) 之后我们遍历整个CALL期权列表,取其中任意两个CALL期权组合(非排列)来取执行价:
strike_price1 = int(x[12:17]) # 取第一个期权的执行价 strike_price2 = int(y[12:17]) # 取序列后一个期权的执行价 通过排序取得低执行价和高执行价两种价格,这样我们就有了任意组合的两种执行价了:
strike_high = max(strike_price1, strike_price2) # 取一组期权执行价中高的一个 strike_low = min(strike_price1, strike_price2) # 取一组期权执行价中低的一个 最后我们要做的就很简单了,组合出4个期权合约的合约名,即可完成一个盒式期权套利组合了。
symbol_lowc = "DCE.m2105-C-" + str(strike_low) # 组合出低执行价看涨期权 symbol_highc = "DCE.m2105-C-" + str(strike_high) # 组合出高执行价看涨期权 symbol_highp = "DCE.m2105-P-" + str(strike_high) # 组合出低执行价看跌期权 symbol_lowp = "DCE.m2105-P-" + str(strike_low) # 组合出低执行价看跌期权 之后的计算就按照之前介绍的方法,算出最终的MPnew,Rf一般来说取SHIBOR就可以了,根据到期权到期日的时间来取对应的SHIBOR,以DEC.m2105为例,距离今天有大约半年的时间,所以我们取得SHIBOR为6个月的SHIBOR,需要注意的查询到的SHIBOR都是为年化收益率,所以需要用T来做处理,也就是SHIBOR-6month/2,具体的可以看后面的完整代码。
策略交易逻辑
由于盒式套利的套利机会不多,且实际交易费用影响较大,所以这里只提供查询盒式套利机会的获取,并不做回测和交易,具体这部分可以自行发挥,并不复杂。
策略代码
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "Lisiheng" from tqsdk import TqApi api = TqApi(auth="信易账户,信易密码") quote_put = api.query_options("DCE.m2105",option_class="CALL", expired=False) # 取现有上市的DCE.m2105 期权合约 for i, x in enumerate(quote_put): for j, y in enumerate(quote_put[i + 1:]): strike_price1 = int(x[12:17]) # 取第一个期权的执行价 strike_price2 = int(y[12:17]) # 取序列后一个期权的执行价 strike_high = max(strike_price1, strike_price2) # 取一组期权执行价中高的一个 strike_low = min(strike_price1, strike_price2) # 取一组期权执行价中低的一个 symbol_lowc = "DCE.m2105-C-" + str(strike_low) # 组合出低执行价看涨期权 symbol_highc = "DCE.m2105-C-" + str(strike_high) # 组合出高执行价看涨期权 symbol_highp = "DCE.m2105-P-" + str(strike_high) # 组合出低执行价看跌期权 symbol_lowp = "DCE.m2105-P-" + str(strike_low) # 组合出低执行价看跌期权 buy_call = api.get_quote(symbol_lowc) # 获取要买入的看涨期权实时行情 sell_call = api.get_quote(symbol_highc) # 获取要卖出的看涨期权实时行情 sell_put = api.get_quote(symbol_lowp) # 获取要卖出的看涨期权实时行情 buy_put = api.get_quote(symbol_highp) # 获取要买入的看涨期权实时行情 while True: api.wait_update() if api.is_changing(buy_call, "ask_price1") or api.is_changing(sell_call, "bid_price1") or \ api.is_changing(buy_put, "ask_price1") or api.is_changing(sell_put, "bid_price1"): print(sell_put.bid_price1) premium_receive = (sell_call.bid_price1 + sell_put.bid_price1)*buy_call.volume_multiple # 计算应收权利金 premium_paid = (buy_call.ask_price1 + buy_put.ask_price1)*buy_call.volume_multiple # 计算应付权利金 commission = 0 # 计算交易成本 SHIBOR_6m = 0.031810 # 取得持有到期期间的SHIBOR作为无风险利率 discount_factor = 1/(1+SHIBOR_6m/2) # 计算折现率 net_premium_paid = premium_paid + commission - premium_receive # 计算净支出 max_profit = int(symbol_highc[12:17]) - int(symbol_lowc[12:17]) # 计算最大收入 profit = max_profit*discount_factor - net_premium_paid # 计算总收入 if profit > 0: # 判断是否超过无风险套利收益的可能 print("收益", profit, "买", symbol_lowc, symbol_highp, "卖", symbol_highc, symbol_lowp) # 得出交易组合