| Overall Statistics |
|
Total Trades 261 Average Win 0.81% Average Loss -0.02% Compounding Annual Return -0.073% Drawdown 2.700% Expectancy -0.218 Net Profit -0.792% Sharpe Ratio -2.638 Sortino Ratio -2.616 Probabilistic Sharpe Ratio 0.002% Loss Rate 98% Win Rate 2% Profit-Loss Ratio 32.87 Alpha -0.015 Beta -0.022 Annual Standard Deviation 0.006 Annual Variance 0 Information Ratio -0.7 Tracking Error 0.145 Treynor Ratio 0.763 Total Fees $231.00 Estimated Strategy Capacity $0 Lowest Capacity Asset SPY 32EE1LPPYNMNA|SPY R735QTJ8XC9X Portfolio Turnover 0.00% |
# region imports
from AlgorithmImports import *
# endregion
class SquareMagentaViper(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2013, 1, 14)
self.SetCash(100000)
# Portfolio setup
self.Portfolio.MarginCallModel = MarginCallModel.Null
# Create Equity Option Universe
option = self.AddOption("SPY")
self.symbol = option.Symbol
# Select put contracts with exiracy between 80 and 90 days
option.SetFilter(lambda option_filter_universe: option_filter_universe.PutsOnly().Expiration(85, 90))
# Variables
self.last_month = None
self.ticket = None
def OnData(self, slice: Slice):
current_month = self.Time.month
if current_month != self.last_month:
chain = slice.OptionChains.get(self.symbol)
if chain:
# we sort the contracts to find OTM contract with farthest expiration
expiry = max([x.Expiry for x in chain])
filtered_symbols = [x for x in chain if
x.Right == OptionRight.Put and
x.Expiry == expiry and
x.Strike <= (x.UnderlyingLastPrice * 0.72) and x.Strike >= (x.UnderlyingLastPrice * 0.68)]
contracts = sorted(filtered_symbols, key=lambda symbol: symbol.Strike)
if len(contracts) == 0:
self.Debug('No contracts found..')
return
elif len(contracts)> 1:
contract = contracts[int(len(contracts)/2)]
else:
contract = contracts[-1]
if not self.ticket is None:
self.MarketOrder(self.ticket.Symbol, -1)
self.ticket = self.MarketOrder(contract.Symbol, 1)
self.last_month = current_month