The strategy involves shorting the most liquid front-month OTM S&P 500 index put options one week before expiration, holding until maturity, and equally weighting the portfolio, excluding illiquid securities.

I. STRATEGY IN A NUTSHELL

The strategy focuses on highly liquid S&P 500 index options, excluding securities priced below $0.1. Each month, the top 25% of the most traded front-month put options are selected and classified as ATM, ITM, or OTM. The investor shorts front-month OTM puts one week before expiration and holds them until expiration. The portfolio is equally weighted, maintaining positions for one week, targeting liquid, heavily traded options near expiry.

II. ECONOMIC RATIONALE

Option returns are concentrated in the final days before expiration due to heightened convexity risk rather than volatility risk. Close to maturity, OTM puts become highly sensitive to price jumps in the underlying, capturing the option premium associated with jump risk during this critical period.

III. SOURCE PAPER

The Timing of Option Returns [Click to Open PDF]

Adriano Tosia, Wellington Management; Alexandre Ziegler, University of Zurich – Department of Finance

<Abstract>

We document empirically that the returns from shorting out-of-the-money S&P 500 put options are concentrated in the few days preceding their expiration. Back-month options generate almost no returns, and front-month options do so only towards the end of the option cycle. The concentration of the option premium at the end of the cycle re ects changes in options’ risk characteristics. Speci cally, options’ convexity risk increases sharply close to maturity, making them more sensitive to jumps in the underlying price. By contrast, volatility risk plays a smaller role close to maturity. Our results imply that speculators wishing to harvest the put option premium should short front-month options only during the last days of the cycle, while investors wishing to protect against downside risk should use back-month options to reduce hedging costs.

IV. BACKTEST PERFORMANCE

Annualised Return8.69%
Volatility3.11%
Beta0.751
Sharpe Ratio2.8
Sortino Ratio0.613
Maximum DrawdownN/A
Win Rate100%

V. FULL PYTHON CODE

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)

VI. Backtest Performance

Leave a Reply

Discover more from Quant Buffet

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

Continue reading