期权套利策略 赵玉超 2017年06月
Put-Call Parity Put-call parity : C + Ke^(-rT) = P + S 构造两个投资组合。 组合 1:看涨期权C,行权价K,距离到期时间T。现金账户Ke^(-rT),利率r,期权到期时恰好变成行权价K。 组合2:看跌期权P,行权价K,距离到期时间T。标的物股票,现价S。 到期时这两个投资组合的情况。 到期情形1:股价St > K:投资组合1,行使看涨期权C,花掉现金账户K,买入标的物股票,股价为St。投资组合2,放弃行使看跌期权,持有股票,股价为St。 到期情形2:股价St < K:投资组合1,放弃行使看涨期权,持有现金K。投资组合2,行使看跌期权,卖出标的物股票,得到现金K 到期情形3:股价St = K:两个期权都不行权,投资组合1现金K,投资组合2股票价格等于K 从上面的讨论我们可以看到,无论股价如何变化,到期时两个投资组合的价值一定相等,所以他们的现值也一定相等。根据无套利原则,两个价值相等的投资组合价格一定相等。所以我们可以得到 C+Ke^(-rT)=P+S。 注:平价公式只对欧式期权成立,对美式期权 S-K <=C -P <= S-Ke^(-rT)
Conversion And Reversal Synthetic = C + Ke^(-rT) – P Conversion : 当S < Synthetic,可以买入标的,卖出合成头寸 Reversal :当S > Synthetic,可以买入合成头寸,卖出标的
Box Spread 盒式套利组合的构成: Long Synthetic : 1份执行价格为K1的Call多头,1份执行价格为K1的Put空头 Short Synthetic : 1份执行价格为K2的Call空头,1份执行价格为K2的Put多头 注:四个期权的到期时间相同 举例:1份9月份90 call 多头, 1份9月份90 put空头 1份9月份100 call 空头,1份9月份100 put多头 牛市价差 熊市价差 盒式套利策略下单条件: 若Long Synthetic + fee < Short Synthetic , 则可以通过买入执行价格为K1的合成头寸,卖出执行价格为K2的合成头寸盈利。 由于期权合成头寸与标的合约之间存在属性特征上的差异,转换与反转套利可能会面临结算方式不太的风险以及标的可能会发放股利的风险。而盒式套利是使用期权分别合成了标的的多头头寸与空头头寸,这样可以消除因为期权与标的属性差异造成的风险到期时,不论标的合约的价格是多少,盒式套利交易者都会同时以一个执行价买入标的合约,以另一个执行价卖出标的合约,因此,到期时盒式套利的价值正好等于执行价格之差,把到期时盒式套利的价值折现到今天,即是盒式套利组合今天的价值。盒式套利组合的卖方相当于以筹措资金的借款方,借款的期限是期权的有效期限,借款的利率是市场无风险利率。假设例子中的期权还有3个月到期,利率为8%,到期时盒式套利组合的价值为100-90=10,减去持有成本10*0.25*8%=0.2 盒式套利的价值为9.8
Box Spread PnL 盒式套利组合Greeks情况 Delta 中性 Gamma 中性 Theta 中性 Vega 中性 只对利率变化敏感 我们可以看到盒式套利策略的盈亏演化过程,最终合成出一条位于横轴上方形的水平直线,直线与横轴的距离就是我们开仓时刻即能锁定的无风险套利利润。
Roll Spread 卷筒式套利组合的构成: Long Synthetic : 1份到期时间为T1的Call多头,1份到期时间为T1的Put空头 Short Synthetic : 1份到期时间为T2的Call空头,1份到期时间为T2的Put多头 注:四个期权的执行价格相同 举例:1份9月份100 call 多头, 1份9月份100 put空头 1份12月份100 call 空头,1份12月份100 put多头 日历价差空头 日历价差多头 卷筒式套利下单条件: 若Long Synthetic + fee< Short Synthetic , 则可以通过买入到期时间为T1的合成头寸,卖出到期时间为T2的合成头寸盈利。 卷筒式套利者将在9月份以100的价格买入标的,在12月份以100的价格卖出标的,卷筒式套利的价值就等于从9月到12月三个月期间的标的的持有成本,如果利率为8%则持有成本为100*0.25*8%=2,因此卷筒式套利的价值为2。如果标的为股票,且在交易者持有标的期间发放了0.75元的股利,股利可以抵减交易者的持有成本,卷筒式套利组合的价值变为2-0.75=1.25。由于卷筒式套利涉及在特定的时间期限内持有标的头寸,因此面临与转化套利反转套利类似的风险,如果这段期间利率上升或者股利降低,卷筒式套利价值增加,反之价值下降。
Time Box Spread 时间盒式套利组合的构成: Long Synthetic : 1份到期时间为T1、执行价格为K1的Call多头,1份到期时间为T1、执行价格为K1的Put空头 Short Synthetic : 1份到期时间为T2、执行价格为K2的Call空头,1份到期时间为T2、执行价格为K2的Put多头 举例:1份9月份90 call 多头, 1份9月份90 put空头 1份12月份100 call 空头,1份12月份100 put多头 时间盒式套利下单条件: 若Long Synthetic + fee< Short Synthetic , 则可以通过买入执行价格为K1、到期时间为T1的合成头寸,卖出执行价格为K2、到期时间为T2的合成头寸盈利。 这一头寸的价值是9月份执行价格为90/100的盒式套利多头与9月、12月执行价格为100的卷筒式套利空头的价值之和。前文中盒式套利的价值为9.8,卷筒式套利的价值为1.25,时间盒式的价值为8.55
套利风险 利率风险 执行风险 大头针风险 结算风险 股利风险 期权交易新手可能会认为套利策略是无风险的,但是我们需要认识到无风险的策略是不存在的,不同策略的风险只是大小不同而已。 今天所讲的几个套利策略,面临的主要是利率风险,利率的改变会使得我们计算出的合成头寸的价值发生改变,从而可能减少策略的盈利甚至造成亏损。到期时间越长的期权组合,面临的利率风险越大。由于标的价格总是会大于期权价格,而转换与反转套利因为涉及到标的的交易,面临的利率风险比只涉及期权的套利策略更大。 执行风险是指,交易者很难使得套利策略的几条腿同时成交,如果这时期权合约的价格发生不利变动,可能会造成亏损。 当到期时,标的价格恰好等于执行价格时,交易者会面临大头针风险。这时我们无法保证我们的空头期权合约是否会被行权,从而也无法相应地做出是否应该执行多头期权合约的决定。如果我们把空头期权的指派履行情况错误,会使得我们持有不想要持有的标的合约。从而会造成比较大的风险敞口。由于套利策略的风险比较低,交易者创建的规模通常会比较大,这时误判的风险更加严重,一旦交易者判断错误,他会发现由于误判产生的裸空头、裸多头不是一两份,而是几百份的标的合约。如果在接近到期时标的的价格接近执行价格,聪明的投资者应该在到期前将期权合约平仓。 当套利策略涉及到期货的交易会面临结算风险。因为期货是每日结算的,而期权不是。比如交易者在建立转换套利头寸不久,期货合约价格下降,合成标的价格上升,即交易者在期货端的损失是每日结算的,立即发生现金流出,而合成端的盈利是账面的,并未发生实际的现金流入,在极端的情况下,交易者不能获得维持期货头寸所需资金的话,就只能被迫平仓。 如果期权的标的是股票,股利的改变会改变合成头寸的价值的计算,有可能会减少策略的盈利
策略逻辑 1、初始化 2、MD触发指标计算 建立SubstituteMap, 用于保存计算所用的变量 启动对应的algo策略,algo策略进入待命状态 1、初始化 SubstituteMap 中需要保存哪些内容 如何将持仓信息加载到 SubstituteMap 中 根据当前MD信息更新SubstituteMap中的行情信息 根据con1 确定配对合约筛选方式, 包括三种roll、 box或者timebox。 在SubstituteMap所有合约中, 筛选出和开仓平仓相关的四个指标: minLong, maxShort, maxLong_close, minShort_close 2、MD触发指标计算 SubstituteMap中更新的内容包括什么? 计算方式? con1和筛选配对合约的方法是什么? 配对指标中四个指标的计算方法?
策略逻辑 3、MD触发平仓 con3判断条件的定义 发给algo的orderList中价格、 量、 方向、 开平的确定方式。 如果需要平仓, 则发出OrderList给algo。 在algo返回交易成功信息之后, 将平仓信息更新到SubstituteMap 3、MD触发平仓 con3判断条件的定义 发给algo的orderList中价格、 量、 方向、 开平的确定方式。 如果在本MD中已经触发了平仓, 则不再触发开仓。 根据con2确定是否开仓。 如果需要开仓, 则发出OrderList给algo。 在algo返回交易成功信息之后, 将开仓信息更新到SubstituteMap 4、MD触发开仓 con2判断条件的定义 发给algo的orderList中价格、 量、 方向、 开平的确定方式。
策略逻辑 全部撤单 停止algo 关闭程序 Finish
策略逻辑细节 SubstituteMap 中保存的内容 SubstituteMap 中保存两个合约的信息,持仓信息和这两个合约的计算指标。(由相同到期日、 相同执行价的call和put期权组成。) keyName:由合约名称、 到期日、 执行价形成的唯一标识 LongSubstituteValue 套利做多替代物 ShortSubstituteValue 套利做空替代物 callMD, putMD hold_long, hold_short 如何将持仓信息加载到 SubstituteMap 中 首先,从柜台中调取持仓列表 其次,扫描持仓列表,如果发现一个call合约仓位,则寻找和call仓位,执行价相同,到期时间相同的put合约的仓位。 套利组 合仓位 = min(call仓位,put仓位) 第三,在SubstituteMap 中新建key,保存改持仓信息。
策略逻辑细节 SubstituteMap中更新的内容包括什么? callMD, putMD, LongSubstituteValue , ShortSubstituteValue SubstituteMap中更新的所有内容的计算方式 LongSubstituteValue = CALL的op_ask - PUT的op_bid + strike*e^(-rT) ShortSubstituteValue = PUT的op_ask - CALL的op_bid – strike*e^(-rT) callMD, putMD 直接保存 con1和筛选配对合约的方法是什么? 通过参数选择配对合约。 参数为roll,则只筛选出执行价相同到期日不同的 SubstituteMap 中 key 作为配对合约 参数为box,则只筛选出到期日相同执行价不同的 SubstituteMap 中 key 作为配对合约 参数为timebox,则不进行筛选
策略逻辑细节 配对指标中四个指标的计算方式如何定义? scan 整个 SubstituteMap :获得以下几个值 minLong:所有配对合约中LongSubstituteValue 数值中的最小值。 maxShort:所有配对合约中ShortSubstituteValue 数值中的最大值。 在scan SubstituteMap 时候,如果发现有long或short的持仓,则同时计算平仓的指标: 在 hold_long>=1 的群体中筛选出 minShort_close ; 在 hold_short>=1 的群体中筛选出 maxLong_close;
策略逻辑细节 con3判断条件的定义 if minShort_close - maxLong_close < closeProfitLong 相应的合约对符合套利平仓条件。 平仓时,发给algo的orderList中价格、 量、 方向、 开平的确定方式? 价格由选择的algo策略决定、开平方向为都是平仓、方向由符合平仓条件的合约对决定,其中,LongSubstituteValue 的合约买入call卖出put;ShortSubstituteValue 的合约卖出call买入put。 交易量的决定算法是:根据市场计算出的委托量 按照合约对价上浮scanDepthThreshold个价位,取在此范围内挂单量的合计值作为深度挂单量。 取四个合约深度挂弹量最小值乘以volPercent(百分比)取floor作为参考委托量。 如果参考挂单量大于1则此参考挂单量作为套利头寸的市场委托量。 根据持仓计算出的委托量:以LongSubstituteValue 和ShortSubstituteValue 的最小持仓量作为持仓委托量。orderList中的委托量 = min(根据市场计算出的委托量,根据持仓计算出的委托量)
策略逻辑细节 con2判断条件的定义 if maxShort - minLong > openProfit 符合开仓条件 开仓时,发给algo的orderList中价格、 量、 方向、 开平的确定方式? 价格由选择的algo策略决定 开平方向由优先平仓模块确定 方向由符合平仓条件的合约对决定,其中,LongSubstituteValue 的合约买入call卖出put;ShortSubstituteValue 的合约卖 出call买入put。 委托量的决定算法是:按照合约对价上浮scanDepthThreshold个价位,取在此范围内挂单量的合计值作为深度挂单量。 取 四个合约深度挂单量最小值乘以volPercent(百分比)取floor作为参考委托量。 如果参考挂单量大于1则此参考挂单量作为套利头寸的市场委托量。
参数定义
定义存储行情及合成头寸信息的map
processMD函数,每来一条行情触发一次,每来一条行情,通过getContractMD_theOtherLeg函数找到同一执行价格不同期权类型的合约的价格,从而可以计算出合成的L头寸的多头价值与空头价值,并通过updateContext函数将最新的行情信息更新到substituteMap中。通过scan函数,扫描substituteMap找出可以交易的套利组合。
substituteMap的键由标的-执行价格-到期时间构成。scan函数用于找出可交易的套利机会,遍历substituteMap,根据用户在策略参数中选择的套利策略类型,选择出套利交易对。用户可以选择进行盒式套利、卷筒式套利或时间盒式套利。
如果用户选择的是进行盒式套利,则会选择出同一到期时间,不同执行价格的合成头寸对。如果用户选择的是进行卷筒式套利,则会选择出同一执行价格,不同到期时间的合成头寸对。 遍历substituteMap,分别找到合成头寸多头价格最高的期权组合、合成头寸多头价格最低的期权组合、合成头寸空头价格最高的期权组合、合成头寸空头价格最高的期权组合,并将对应期权组合的key分别记为 contextPair_LongMax contextPair_LongMin contextPair_ShortMax contextPair_ShortMin。
选择合成头寸多头价值最高的期权组合与合成头寸空头价值最低的期权组合进行平仓条件判断,计算平仓利润,若低于平仓阈值,则调用下单函数进行平仓。 选择合成头寸多头价值最低的期权组合与合成头寸空头价值最高的期权组合进行开仓条件判断,计算开仓利润,若高于开仓阈值,则调用下单函数进行开仓。
getL2MDVol函数用于计算每个期权合约的可下单量的函数。 如果买卖方向为买,则取得五档行情中,卖价低于价格上限参数price的所有挂单的量,再乘下单比例,作为函数输出的结果。 如果买卖方向为卖,则取得五档行情中,买价高于价格下限参数price的所有挂单的量,再乘下单比例,作为函数输出的结果。 价格上限参数price=盘口卖一价+scanDepthThreshold 价格下限参数price=盘口买一价-scanDepthThreshold
下单函数,调用orderInsert函数进行下单。
log输出函数
substituteMap内部类,调用update函数计算合成头寸多头价值与合成头寸空头价值
Update函数, LongSubstituteValue = CALL的op_ask - PUT的op_bid + strike Update函数, LongSubstituteValue = CALL的op_ask - PUT的op_bid + strike*e^(-rT) ShortSubstituteValue = PUT的op_ask - CALL的op_bid – strike*e^(-rT)
谢谢聆听