“该策略交易VIX ETN,根据VIX/VXV比率进行买卖,在顺行市场中持有XVIX,在反向市场中持有XVZ,并进行每日再平衡。XVIX可以通过VXZ和SVXY进行复制。”

I. 策略概要: 每日VIX曲线时机:通过XVIX-XVZ轮换

该策略基于VIX期货市场的状态(顺行市场或反向市场)交易两只ETN,XVIX和XVZ。每日决策依据30天VIX与93天VXV的比率。比率低于1表示顺行市场,偏向于持有XVIX;比率高于1表示反向市场,偏向于持有XVZ。投资组合每日再平衡。XVIX(目前已无法获得)通过持有中期期货的多头仓位和短期期货的空头仓位,捕捉标普500 VIX中期和短期期货之间的价差。此策略可以通过100%多头VXZ和100%多头SVXY来复制,反映VIX期货曲线中的顺行效应。

II. 策略合理性

根据学术研究,XVIX和XVZ ETN具有互补的表现。XVIX在市场处于顺行市场时表现最佳,而XVZ仅在市场崩盘时表现良好,即当VIX期货期限结构急剧进入反向市场时,此时XVZ的表现非常出色,正是XVIX遭受重大亏损的时刻。

III. 来源论文

Understanding ETNs on VIX Futures [点击查看论文]

<摘要>

本文旨在提高关于VIX期货的直接、杠杆和反向交易所交易票据(ETN)市场的透明度。第一批VIX期货ETN于2009年发行。如今,市场上大约有30种此类产品,总市值约为30亿美元,其中一些产品的日交易量可达到50亿美元。然而,波动率交易非常复杂,监管机构正当关切许多市场参与者缺乏足够的风险理解。我们建议交易所、做市商、发行人、潜在投资者以及监管者阅读本文,以提高对这些ETN的理解。

我们详细解释了驱动VIX期货ETN回报的滚动收益和凸性效应,并通过使用每日收盘的VIX期货价格跟踪其波动性,并评估它们在从2004年3月开始的八年期间的表现。我们解释了ETN发行人如何构建几乎完美的对冲策略,管理其发行(大多数ETN是可赎回的),并在所有引导情境下获得显著利润。然而,市场知识促使了发行人对冲活动的抢先交易,使得利润变得更难控制。此外,对于对冲这些ETN,必须在VIX期货上采取如此巨大的仓位,以至于ETN市场现在领先于它们应该跟踪的VIX期货。这导致自2009年以来VIX期货的波动性明显增加。如果这种统计波动性的增加导致VIX期货隐含波动率的上升,那么后续效应将是VIX期权价格的上涨,而标普期权不受影响。

此前的讨论论文,Alexander和Korovilas(2012)提供了不可辩驳的证据,表明任何到期的直接VIX期货ETN的单一头寸——包括中期和长期跟踪器——只能在类似2008年末银行崩溃的大危机初期几个月提供股票敞口的多样化/对冲。相比之下,本文的讨论表明,可以通过持有某些VIX期货ETN的投资组合来简单地构建一些极具吸引力的长期投资工具。特别地,我们介绍了一种新的“滚动收益套利”ETN投资组合类别,我们称之为ETN2(因为它在直接和反向VIX期货跟踪ETN之间进行分配)和ETN3投资组合(它在静态和动态ETN2之间进行分配)。这些投资组合对中期直接跟踪ETN具有正向敞口,并且通常对短期直接跟踪ETN具有负向敞口(等效地,对短期反向跟踪ETN具有正向敞口)。它们独特的风险和回报特征使它们成为极具吸引力的长期投资工具,并且是股票、债券和商品的优秀多样化工具。

IV. 回测表现

年化回报30.8%
波动率23.49%
β值0.448
夏普比率1.14
索提诺比率0.402
最大回撤N/A
胜率45%

V. 完整的 Python 代码

from AlgorithmImports import *
#endregion
class TimingVIXETNs(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2012, 1, 1)
        self.SetCash(100000)
        
        self.symbols = ['SVXY', 'VIXM', 'XVZ']
        for symbol in self.symbols:
            data = self.AddEquity(symbol, Resolution.Daily)
            data.SetLeverage(5)
        self.vix = self.AddData(CBOE, 'VIX', Resolution.Daily).Symbol
        self.vxv = self.AddData(CBOE, 'VIX3M', Resolution.Daily).Symbol
        self.settings.daily_precise_end_time = False
    def OnData(self, data):
        if not all(x in data for x in self.symbols): 
            self.Liquidate()
            return
    
        if self.vix in data and self.vxv in data:
            vix_price = data[self.vix].Value
            vxv_price = data[self.vxv].Value
            
            if vix_price != 0 and vxv_price != 0:
                ratio = float(vix_price / vxv_price)
                
                if ratio < 1:
                    if not self.Portfolio['SVXY'].IsLong and not self.Portfolio['VIXM'].IsLong:
                        self.Liquidate('XVZ')
                        if data['SVXY'].Close != 0 and data['VIXM'].Close != 0:
                            self.SetHoldings('SVXY', 1)
                            self.SetHoldings('VIXM', 1)
                else:
                    if not self.Portfolio['XVZ'].IsLong:
                        self.Liquidate('SVXY')
                        self.Liquidate('VIXM')
                        if data['XVZ'].Close != 0:
                            self.SetHoldings('XVZ', 1)
        else:
            self.Liquidate()

VI. Execute Strategy via API

发表评论

了解 Quant Buffet 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读