Quant Buffet放轻松,别过度思虑

期权收益的择时策略

登录后收藏

学术论文

The Timing of Option Returns

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

机构
  • NZPharmac
  • ?Wellington Management
  • CHUniversity of Zurich
  • Institute of Finance and Banking
  • ?University of Zurich - Department of Banking and Finance

策略概要

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

II. 策略合理性

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

回测表现

波动率3.11%
夏普比率2.8
索提诺比率0.613
胜率100%

完整 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)