今天,我们来介绍期权对冲策略。这篇文章假设读者对“什么是期权”有基本的了解。如果不懂得期权是什么,可以从官网上下载期权基本知识进行学习。
一、背景知识和策略逻辑
我们先谈一下什么是对冲。一般来说,对冲是基于两种标的,并对它们进行双向交易,即做多一种资产,做空另一种资产。通过两个市场的盈亏相抵,来锁定既得利润,规避市场的系统性风险。
我们用一个图来说明对冲的原理。一般来说,我们把一个资产的收益和风险分解成两个部分:市场相关和市场无关,即:
其中, R 表示预期收益率, 表示风险程度。金融理论表明,。
也就是说,每个资产的收益有一部分是来自市场,另一部分是来自其本身的超额收益。那么,如果我们找到了一个具有较高超额收益的资产,但是当前市场行情较差,那么单独购买此产品有可能仍然是亏损的。为此,我们可以同时做空 比例的市场指数,这相当于将市场的行情“抵消”掉了,此时组合的收益就变为了超额收益。同时,我们也相当于对冲掉了市场的风险(即系统性风险),剩余的部分就是来自我们找到标的的个体风险(又称为非系统性风险)。
相信读者已经发现了,想要在对冲策略中效果较好,应该具有以下两个条件:
(1)做多标的有较大的超额收益,也就是 Rnon -market 尽量大。
(2)做空资产和做多标的的系统性部分相关性尽可能大,使得市场风险尽量多地被对冲掉。
第二条是比较容易满足的,现在很多的指数基金基本复制了市场行情,可以直接使用。在本策略中我们使用 50ETF 作为对冲资产。
在策略开发过程中,最富有挑战性的就是第一部分标的的选取。在这里我们选用期权,利用期权的波动率寻求超额收益。
利用波动率套利是一个期货交易不大常见的思路,但是隐含波动率对于期权价格的影响较大。根据 B-S 期权定价公式,我们有如下恒等式:
其中 是市场收益,是历史隐含波动率均值,V 是当前期权的价值。也就是说,期权的超额收益来自于当前隐含波动率 低于历史水平的部分和边际变动水平。在期权中,这个边际变动水平一般用希腊值 Vega 表示,即 。
为什么我们用历史隐含波动率作基准呢?通过观察期权的隐含波动率可以发现其具有均值回归的特性,即如果当前隐含波动率高于历史平均水平,那么在可期的时间内波动率会回归当前水平。如下图,该图表示了 50ETF 的隐含的波动率和历史波动率上市以来的走势,其均值回复的特性是较为明显的。
因此,我们策略模式便呼之欲出了:当前波动率高于历史平均水平时,预期未来波动率将下调,期权价值将下降,从而做空 ETF 期权,持有 50ETF 多头;当前波动率下降到历史平均水平时,平仓套利;但如果当前波动率持续升高,则平仓止损。
二、策略的工程实现
(一) 策略整体框架
首先,我们应当明确整个策略的基本框架。一个完整的策略应当能够初始化参数,并在实时行情到来的时候处理行情数据并完成相应的策略,并将所有的订单记录日志便于查看。因此,我们的策略基本框架是这样的。
(二)交易初始化
完成 50ETF 与期权对冲策略时,我们需要对参数进行初始化、登陆交易账户,同时设置我们的投资标的。这些功能在 Onstart 函数中实现。
首先,我们登陆账户。由于策略中同时含有证券和期权的交易,因此需要初始化两个账户,如下所示。
接下来,我们就要选择投资标的了。证券的交易标的可以直接在初始化中获取,而期权的交易标的由于存在较多与当时 50EFT 走势相关的参数,因此需要在行情事件中获取。
然后我们需要订阅交易合约的 K 线数据。如果没有订阅当前合约的 K 线数据,那么是无法完成下单的。
(三)策略核心逻辑的实现
接下来就是策略核心逻辑的实现了。期权策略不同于期货策略的一点在于,我们购买的期权标的不是固定的,而是需要根据当前的 50ETF 信息进行调整。除此之外,传统的择时、止盈、止损策略与期货基本相同。
1、 初始化期权
在这个策略中,我们需要根据当天的日期、50ETF 的现价来确定要持仓的期权的参数,然后对期权进行初始化。我们将这个部分封装在一个函数 Getop 中,输入现货的代码,就可以获取相关期权的代码。
首先,我们获取当前现货的价格数据,然后构造一个实值期权,其行权价格时当前价格加0.05;接下来,利用当前的日期,计算所要购买的期权的到期年月;最后,利用内建函数GetAtmOptionContract 获取指定档位的看涨看跌期权合约。
构建函数完成后,我们就可以在 OnQuote 中订阅当前的 50ETF 和期权的行情走势,如下图所示。
2、 择时入场
在这里,我们通过计算 50ETF 波动率,通过与阈值的比较选取择时入场信号。首先,需要计算 50ETF 的波动率,利用近 30 天的数据进行计算。首先设置获取历史数据的参数,然后获取历史数据,并转化为 numpy 格式计算时间序列的波动率。这里要注意历史数据未成功获取的情况。
接下来,我们需要计算期权的隐含波动率。隐含波动率的计算基于 B-S 公式。具体的求解方法较为复杂,有需要的读者可自行查看相关文献。在真格量化中,一般可以使用 GetImpliedVolatility 函数计算期权的隐含波动率,函数需要输入期权种类(看涨期权)、标的种类(股票)、标的资产价格、行权价、标的资产历史波动率、无风险利率、到期时间、当前期权价格。相关参数如下形式获取。
交易之前,我们还需要获取两个账户资金状况和持仓情况,保证没有异常。如果当前账户有持仓,则无法继续下单。
下面,我们完成择时策略。如果当前期权的隐含波动率较高,则预期未来期权波动率回归均值,从而做空期权,做多 50ETF。下单前,需要检查两个账户登入且当前没有持仓。
3、 止盈
如果当前期权隐含波动率已经回归均值,则平仓止盈。如下图,注意要检验当前有持仓,否则买卖时会报错。
4、 止损
止损是期权策略非常重要的一部分。均值回复是一个长期性质,但是短期上可能并不收敛。如果短期内隐含波动率持续走高,则有可能会发生较大规模的亏损。因此需要及时做平仓止损处理。如果隐含波动率高于 0.3,则平仓,如下图所示。注意仍然需要检验当前的仓位。
5、 仓位控制
由于期权有期限,我们一般不持有合约到到期日,从而需要对快要到期的期权进行平仓处理。这里需要计算距离行权日的时间,利用 GetDaytoExpire 进行计算。函数的定义如下所示。
到期前 3 天平仓的代码如下。
至此,我们完成了期权对冲套利策略的全部流程。用户可以在真格量化平台上复现并进行回测,观看回测效果如何。然后试着调整部分参数、阈值,观察策略的效果敏感度。
这个策略,510050,再做T0,效果应该更好吧。
可惜,我们平台无法回测股票。
请问在交易过程中是否维持了delta中性策略?
很有启发性
请问 如果是卖看跌期权,然后做空50etf可以实现吗?sell open 510050 是不是暂时不能支持?
很赞的demo
很赞的demo
17年怎么没有交易呢