该策略在VIX指数上涨至超过均值三个标准差的当天开立SPDR S&P500信托ETF(SPY)的多头仓位,持有该仓位22个交易日(一个月)。策略的假设是VIX的大幅上涨通常意味着市场恐慌,随后可能会出现市场回升,因此采取反向操作买入SPY。

策略概述

投资组合包括SPDR S&P500信托ETF(SPY)。在VIX指数上涨至均值以上三个标准差的一天后,开立SPY的多头仓位,并保持该仓位一个月(22个交易日)。

策略合理性

正如简述中提到的,恐惧指数(美国的VIX指数)的极端波动预示着未来市场将有显著的正收益。该策略之所以有效,主要原因在于货币政策对隐含波动率指数正向冲击的敏感性。根据Bekaert等人(2013)的研究,通过对VIX指数的分解,较高的风险厌恶情绪和不确定性通常会导致宽松的货币政策。因此,折现率下降可能导致实际收益的增加。

换句话说,该策略可以被描述为一种均值回归策略,在市场经历恐慌后购买股票——即在VIX大幅上涨之后。因此,该策略是一个具吸引力的量化指标,用于判断股市的入市时机。

论文来源

Do Not Fear the Fear Index: Evidence from the US, UK and European Markets [点击浏览原文]

<摘要>

VIX指数通常被称为“恐惧指数”。类似的指数也在英国和欧洲股市中引入。在本研究中,我们研究了这些指数是否反映了投资者的恐惧。我们基于长期预测回归的结果表明,这些指数的波动,以及极端跳升,并未显著预测出美国、英国和欧洲市场中的负向市场回报。此外,领先商业周期指标对恐惧指数冲击的反应在统计上并不显著。然而,这些国家的货币政策似乎对这些冲击很敏感。

回测表现

年化收益率10.8%
波动率5.59%
Beta0.405
夏普比率1.93
索提诺比率-0.036
最大回撤-3.61%
胜率62%

完整python代码

from AlgorithmImports import *
# endregion
class ContrarianVIXstrategy(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2000, 1, 1)
        self.SetCash(100000)
        self.market:Symbol = self.AddEquity("SPY", Resolution.Daily).Symbol
        
        # Subscribe to VIX index data
        self.vix:Symbol = self.AddData(CBOE, "VIX").Symbol
     
        self.period:int = 120 * 21
        self.min_period:int = 12 * 21
        self.std_multiplier:int = 2
        self.buy_date:DateTime = None
        history:DataFrame = self.History(CBOE, self.vix, self.period, Resolution.Daily)['close']
        self.close_list:List[float] = history.values.tolist()
        self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
        self.SetExecution(ImmediateExecutionModel())
    
    def OnData(self, data:Slice) -> None:
        if self.vix in data and data[self.vix]:
            # store vix value
            self.close_list.append(data[self.vix].Close)
            if len(self.close_list) >= self.min_period:
                vix_mean:float = np.mean(self.close_list[:-1])
                vix_std:float = np.std(self.close_list[:-1])
                vix_yesterday:float = self.close_list[-2]
                
                if not self.Portfolio.Invested and vix_yesterday >= vix_mean + self.std_multiplier * vix_std:
                    self.EmitInsights(Insight.Price(self.market, timedelta(days=22), InsightDirection.Up))

Leave a Reply

Discover more from Quant Buffet

Subscribe now to keep reading and get access to the full archive.

Continue reading