期权收益的择时策略
登录后收藏学术论文
The Timing of Option Returns [点击查看论文]
- NZPharmac
- ?Wellington Management
- CHUniversity of Zurich
- Institute of Finance and Banking
- ?University of Zurich - Department of Banking and Finance
https://papers.ssrn.com/sol3/papers2.cfm?abstract_id=2909163
策略概要
投资范围包括流动性最强的标准普尔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)