该策略涉及在到期前一周卖空流动性最强的前月OTM标准普尔500指数看跌期权,持有至到期,并等权重投资组合,不包括流动性不足的证券。

I. 策略概要

投资范围包括流动性最强的标准普尔500指数期权,不包括价格低于0.1美元的流动性不足的证券。选择交易量最大的前月看跌期权的前25%,分类为平值期权(ATM)、实值期权(ITM)或虚值期权(OTM)。每个月,投资者在到期前一周卖空前月虚值看跌期权,并持有至到期。投资组合等权重,头寸维持一周。该策略针对流动性强、交易活跃的期权,同时侧重于卖空接近到期的虚值看跌期权。

II. 策略合理性

在期权周期的最后几天,交易活动非常活跃。期权回报主要在到期日前不久产生。到期日前不久的这种期权溢价反映了价格跳跃风险,而不是波动率风险。具体而言,期权的凸性风险在接近到期日时急剧增加,使其对标的价格的跳跃更加敏感。波动率风险在接近到期日时没有起到如此大的作用。

III. 来源论文

The Timing of Option Returns [点击查看论文]

<摘要>

我们通过实证记录了卖空虚值标准普尔500看跌期权的回报集中在到期前的几天。远月期权几乎没有回报,近月期权也只在期权周期结束时才有回报。期权溢价在周期结束时的集中反映了期权风险特征的变化。具体而言,期权的凸性风险在接近到期日时急剧增加,使其对标的价格的跳跃更加敏感。相比之下,波动率风险在接近到期日时作用较小。我们的结果表明,希望获取看跌期权溢价的投机者应仅在周期最后几天卖空近月期权,而希望防范下行风险的投资者应使用远月期权以降低对冲成本。

IV. 回测表现

年化回报8.69%
波动率3.11%
β值0.751
夏普比率2.8
索提诺比率0.613
最大回撤N/A
胜率100%

V. 完整的 Python 代码

from AlgorithmImports import *
#endregion
class TimingOptionReturns(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)
        
        data = self.AddEquity("SPY", Resolution.Minute)
        self.symbol = data.Symbol
        
        option = self.AddOption("SPY", Resolution.Minute)
        option.SetFilter(-20, 20, 0, 7)
        
    def OnData(self, slice):
        if self.symbol not in slice:
            return
        for i in slice.OptionChains:
            chains = i.Value
            if not self.Portfolio.Invested:
                puts = list(filter(lambda x: x.Right == OptionRight.Put, chains))
                if not puts: return
            
                underlying_price = slice[self.symbol].Value
                expiries = [i.Expiry for i in puts]
                
                # Determine expiration date nearly one month.
                expiry = min(expiries, key=lambda x: abs((x.date() - self.Time.date()).days - 7))
                strikes = [i.Strike for i in puts]
                
                # Determine 5% out-of-the-money strike.
                otm_strike = min(strikes, key = lambda x:abs(x - float(0.95) * underlying_price))
                otm_put = [i for i in puts if i.Expiry == expiry and i.Strike == otm_strike]
        
                if otm_put:
                    # Sell 10% OTM put.
                    options_q = int(self.Portfolio.MarginRemaining / (underlying_price * 100))
                    self.Sell(otm_put[0].Symbol, options_q)

发表评论

了解 Quant Buffet 的更多信息

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

继续阅读