量化百科|波动率风险溢价策略概述 Volatility Risk Premium|附回测代码

文摘   2024-09-06 04:08   英国  

波动率风险溢价策略概述

波动率风险溢价(Volatility Risk Premium, VRP)策略是一种广泛应用于期权市场的交易策略,旨在通过捕捉隐含波动率与实际波动率之间的差异来获取收益。通常情况下,股票期权的隐含波动率往往高于市场的实际波动率,因此通过卖出平值期权可以系统性地获得风险溢价。许多研究显示,这种溢价相当可观——卖出看跌期权的平均回报率约为每天0.5%至1.5%。

然而,在执行这些短波动率策略时需要非常谨慎。尽管这些策略通过卖出期权或跨式期权组合来捕捉波动率溢价,但其回报分布极为异常,卖出看跌期权的投资者可能面临高达-800%的损失。此外,负回报日之间存在强烈的序列相关性,因此在实施这些策略时需要准备充足的保证金,且实际回报可能远低于预期。

为了防止市场崩盘等极端波动带来的巨大风险,策略通常会同时购买虚值看跌期权作为保护措施。本文将详细介绍该策略的具体操作、风险管理和潜在收益,帮助投资者更好地理解如何通过波动率风险溢价获利。

我们提出了一种简单的期权策略,通过回测1987年市场崩盘期间的数据来挖掘期权溢价的潜力。本文将详细介绍该策略的具体操作、风险管理和潜在收益,帮助投资者更好地理解如何通过波动率风险溢价获利。本文将详细介绍该策略的具体操作、风险管理和潜在收益,帮助投资者更好地理解如何通过波动率风险溢价获利。

波动率风险溢价(Volatility Risk Premium, VRP)策略是一种广泛应用于期权市场的策略,其目的是通过捕捉隐含波动率与实际波动率之间的差异来获取收益。通常情况下,期权的隐含波动率往往高于市场的实际波动率,因此通过出售期权可以获得这一差异的溢价。为防止市场崩盘等极端波动带来的风险,策略同时会购买虚值看跌期权作为保护措施。

VRP示意图

基本原理

大多数研究人员认为,波动率溢价的原因是投资者非常厌恶负回报和股指的高波动性,因此愿意为通过看跌期权提供的投资组合保险支付溢价。其他研究人员通过“比索问题”(黑天鹅事件)解释波动率溢价——这一理论认为,在样本中,一些稀有但可能发生的事件并未出现(从而保留了溢价),但其他研究表明,除非每隔几年发生一次大规模市场崩盘,否则这种解释极不可能完全消除波动率溢价。

简单的交易策略

每个月,卖出一个平值的跨式期权组合(期权还有一个月到期),按照5%的期权溢价卖出,并购买一个15%的虚值看跌期权(按要价买入)作为市场崩盘的保险。剩余的现金和期权费投资于指数。该策略每月重新平衡。

策略核心

波动率风险溢价策略的核心是在每月出售平值跨式期权组合,同时通过购买15%的虚值看跌期权来对冲市场风险。该策略包括以下几个关键步骤:

1. 每月出售平值跨式期权组合

在每月初,策略会出售一个平值跨式期权组合,即同时卖出一个平值看涨期权和一个平值看跌期权。这类组合的特征是期权的行权价接近标的资产(如S&P 500指数ETF, SPY)的当前市场价格。

通过卖出跨式期权组合,投资者可以获得期权费,通常情况下,这些期权费反映了市场预期的隐含波动率。由于市场的实际波动率往往低于隐含波动率,投资者通过这种方式捕捉到了波动率溢价。

2. 购买15%的虚值看跌期权

为了防范市场崩盘带来的潜在巨大风险,策略在出售跨式期权组合的同时,会购买一个虚值看跌期权作为对冲保护。虚值看跌期权的行权价通常设置为当前市场价格的85%(即距离市场现价约15%的下跌空间)。

该看跌期权可以在市场大幅下跌时提供补偿,避免因平值期权组合带来的无限下跌风险。

3. 投资剩余现金于标普500指数

策略执行后获得的期权费和剩余的现金将投资于标普500指数ETF(SPY),从而在市场上涨时获取额外收益。通过这种方式,投资者可以同时参与市场的上涨,同时捕捉波动率溢价。

4. 每月重新平衡

策略每月会重新平衡持仓,即平掉到期的期权合约,并重新卖出新的平值跨式期权组合,同时购买新的虚值看跌期权进行保护。这种循环的方式确保了投资者能够持续捕捉市场中的波动率溢价。

策略实现

A. 卖出平值跨式期权

平值跨式期权由卖出平值看涨期权和看跌期权组成,期权的行权价接近标的资产的现价。通过出售这类期权组合,投资者能够获取期权费,这部分费用来源于市场对未来波动的预期。

由于期权的价格通常包含隐含波动率的因素,而隐含波动率常常高于市场实际波动率,因此卖出期权能够在多数情况下产生收益。

B. 购买15%的虚值看跌期权

虚值看跌期权是策略中的重要风险对冲工具。其行权价通常设置为当前市场价格的85%,意味着只有当市场下跌超过15%时,该看跌期权才会开始具有实际价值。它的主要作用是在市场出现崩盘时为投资组合提供保护。

通过购买该看跌期权,策略能够有效应对市场的极端波动,限制潜在的损失。

C. 将剩余资金投资于标普500指数

除了期权交易部分,策略还会将剩余的现金和从期权交易中获得的溢价投资于标普500指数(SPY)。这种投资方式允许投资者在市场上涨时享受收益,进一步增强策略的回报。

风险管理

波动率风险溢价策略的核心在于平衡收益与风险:

  1. 1. 风险:

  • • 市场的极端波动,尤其是市场大幅上涨或下跌时,策略可能会面临损失。特别是当市场超出策略对冲范围(15%的虚值看跌期权)时,投资组合仍可能遭遇较大的下行风险。

  • 2. 对冲:

    • • 通过购买虚值看跌期权,策略在一定程度上限制了下行风险。在市场下跌超过15%时,虚值看跌期权将发挥作用,为组合提供下跌保护。

  • 3. 平衡收益与风险:

    • • 在多数情况下,市场的实际波动率低于隐含波动率,投资者能够从卖出的期权中获取溢价。同时,通过购买看跌期权,策略可以在市场波动较大时限制潜在损失。

    策略优势

    1. 1. 捕捉波动率溢价
      通过出售期权组合,策略能够系统性地捕捉隐含波动率与实际波动率之间的差异。这部分溢价来源于市场普遍高估了未来的波动性。

    2. 2. 下行保护
      虚值看跌期权为组合提供了崩盘保护,能够有效应对市场的极端下跌风险。

    3. 3. 市场参与
      剩余资金投资于标普500指数,让策略在市场上涨时也能够享受股市带来的收益,提升整体回报。

    结论

    波动率风险溢价策略通过捕捉隐含波动率与实际波动率之间的差异,为投资者提供了一种稳定的期权交易策略。通过出售平值跨式期权组合获取溢价,并结合购买虚值看跌期权来对冲极端市场风险,策略能够在控制风险的前提下为投资组合带来稳健的收益。

    对于期权交易者和量化投资者而言,该策略提供了一种平衡风险与收益的有效方式。通过灵活运用该策略,投资者可以在波动率市场中获取长期稳定的回报。

    通过本篇文章,希望大家对波动率风险溢价策略有了更深入的理解,并在实际交易中能够灵活应用这一策略。

    策略实现代码基于QuantConnect平台,详细完整代码和策略原文请见知识星球

    # Description:
    #
    # Each month, at-the-money straddle, with one month until maturity, is sold at
    # the bid price with a 5% option premium, and an offsetting 15%
    # out-of-the-money puts are bought (at the ask price) as insurance against a
    # market crash. The remaining cash and received option premium are invested in
    # the index. The strategy is rebalanced monthly.
    #
    # Advice:
    #   - To view algorithm errors, toggle Console view below when in Backtesting
    #   - To print out debugging messages (the difference is only in colours), use
    #     `self.Debug(...)` or `self.Error(...)`
    #   - To stop backtesting, go to Organisation (tab #2) -> Resources -> Stop

    class VolatilityRiskPremiumEffect(QCAlgorithm):

        def Initialize(self):

            # To debug, print logs and errors (the difference is only in colours),
            # use self.Debug(...), self.Info(...), self.Error(...)

            TODO:1 (Strategy)
            # Set up conditions:
            #   - cash (e.g 10000)
            #   - time period (e.g 1/5/2010 to 1/5/2011)
            # Links: _8_
            self.SetCash(...)
            self.SetStartDate(...)
            self.SetEndDate(...)

            TODO:2 (API)
            # Set up an option:
            #   - on S&P ("SPY")
            #   - with daily resolution
            #   - with filter on +-20 price relative to strike price, 30+-5 days expiry date
            # Links: _1_ _2_
            data = self.AddEquity(...)
            option = self.AddOption(...)

            TODO:3 (Python)
            # Save necessary information that you intend to use in the strategy
            ...

            # Benchmark
            self.benchmarkTicker = self.symbol
            self.SetBenchmark(self.symbol)
            self.initBenchmarkPrice = None


        def OnData(self,data):

            self.UpdateBenchmarkValue()
            self.Plot('Strategy Equity'self.benchmarkTicker, self.benchmarkValue)

            # Go through options chains _3_ (expect one or zero option chains here)
            for chains in data.OptionChains.Values:

                if not self.Portfolio.Invested:

                    TODO:4 (Python)
            
                    # Links: _5_
                    calls = list(...)
                    puts = list(...)

                    TODO:5 (API)
                    # Get security price for the selected ticker
                    # Links: _4_
                    underlying_price = ...

                    TODO:6 (Python)
                    # Given the list of puts, select:
     
                    # Links: _2_
                    expiry = ...
                    atm_strike = ...
                    otm_strike = ...

                    TODO:7 (Python)
                    # Collect the strategy prescribed options that match selected parameters
                    atm_calls = list(...)
                    atm_puts = list(...)
                    otm_puts = list(...)

                    # When all relevant options are available
                    if atm_calls and atm_puts and otm_puts:

                        TODO:8 (API)
     
                        # Links: _6_
                        options_quantity = ...

                        TODO:9 (Strategy)
                        # Perform trades:
     
                        # Links: _0_ _7_
                        self.Sell(...)
                        self.Buy(...)
                        self.SetHoldings(...)

                # Liquidate assets if not holding options (they are expired or not bought)



        # Benchmark
        def UpdateBenchmarkValue(self):
            ''' Simulate investing in the Benchmark '''

            self.benchmarkExposure = 1

            if self.initBenchmarkPrice == None:
                self.initBenchmarkCash = self.Portfolio.Cash
                self.initBenchmarkPrice = self.Benchmark.Evaluate(self.Time)
                self.benchmarkValue = self.initBenchmarkCash
            else:
                currentBenchmarkPrice = self.Benchmark.Evaluate(self.Time)
                lastReturn = ((currentBenchmarkPrice / self.initBenchmarkPrice) - 1) * self.benchmarkExposure
                self.benchmarkValue = (1 + lastReturn) * self.initBenchmarkCash

    关于LLMQuant





    起源于剑桥大学的知识分享社区,每日更新大语言模型与量化金融的最新资讯 🌍📊 www.llmquant.com 🌟🌟加入知识星球,你将获得:
    • 📰 每日资讯:人工智能与量化金融的前沿动态,附中英文原文,助你紧跟行业发展。

    • 💻 策略详解:获取量化策略的完整代码,提升你的实战能力。

    • ❓ 免费答疑:每日解答社区成员问题,高效提升你的知识水平。

    • 🌐 线上交流:与国内外量化从业者互动,拓展你的专业网络。


    欢迎加入我们的知识星球,和全球精英一起探索人工智能与量化金融的无限可能!🚀✨


    搜索 LLMQuant

    关注我们




    LLMQuant
    起源于剑桥大学的量化社区,每日分享人工智能与量化金融前沿: www.llmquant.com