
“该策略交易VIX ETN,根据VIX/VXV比率进行买卖,在顺行市场中持有XVIX,在反向市场中持有XVZ,并进行每日再平衡。XVIX可以通过VXZ和SVXY进行复制。”
资产类别: ETF | 地区: 美国 | 周期: 每日 | 市场: 股票 | 关键词: 时机, VIX, ETN
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 [点击查看论文]
- Carol Alexander 和 Dimitris Korovilas。萨塞克斯大学商学院;指数科学基金会。雷丁大学 – ICMA中心。
<摘要>
本文旨在提高关于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