Overall Statistics |
Total Trades 435 Average Win 25.17% Average Loss -0.57% Compounding Annual Return 19.134% Drawdown 86.700% Expectancy 1.555 Net Profit 1185.231% Sharpe Ratio 0.441 Probabilistic Sharpe Ratio 0.000% Loss Rate 94% Win Rate 6% Profit-Loss Ratio 44.36 Alpha 0.59 Beta 0.527 Annual Standard Deviation 1.487 Annual Variance 2.211 Information Ratio 0.357 Tracking Error 1.486 Treynor Ratio 1.246 Total Fees $16838.79 Estimated Strategy Capacity $21000000.00 Lowest Capacity Asset SPY 31Q9LB7UFPYX2|SPY R735QTJ8XC9X |
class UncoupledTransdimensionalPrism(QCAlgorithm): def Initialize(self): self.SetStartDate(2007, 1, 1) # Set Start Date #self.SetEndDate(2020, 4, 1) self.SetCash(100000) # Set Strategy Cash spy = self.AddEquity("SPY", Resolution.Minute) spy.SetDataNormalizationMode(DataNormalizationMode.Raw) self.SetSecurityInitializer(lambda security: security.SetMarketPrice(self.GetLastKnownPrice(security))) self.spy = spy.Symbol self.contract = None self.secondcontract = None self.thirdcontract = None self.fourthcontract = None self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 5), self.TailRiskExit) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 10), self.Roll) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 15), self.OptionsSetup) self.expiry1 = 60 self.expiry2 = 150 self.buycontract = True self.buysecondcontract = True self.buythirdcontract = True self.buyfourthcontract = True def TailRiskExit(self): if self.contract != None: if self.Securities[self.spy].Price < self.contract.ID.StrikePrice *1.175 : self.Liquidate(self.contract) self.RemoveSecurity(self.contract) self.contract = None if self.secondcontract != None: if self.Securities[self.spy].Price < self.secondcontract.ID.StrikePrice *1.175 : self.Liquidate(self.secondcontract) self.RemoveSecurity(self.secondcontract) self.secondcontract = None if self.thirdcontract != None: if self.Securities[self.spy].Price < self.thirdcontract.ID.StrikePrice *1.175 : self.Liquidate(self.thirdcontract) self.RemoveSecurity(self.thirdcontract) self.thirdcontract = None if self.fourthcontract != None: if self.Securities[self.spy].Price < self.fourthcontract.ID.StrikePrice *1.175 : self.Liquidate(self.fourthcontract) self.RemoveSecurity(self.fourthcontract) self.fourthcontract = None def Roll(self): if self.contract != None: if (self.contract.ID.Date - self.Time).days <= 20: self.Liquidate(self.contract) self.RemoveSecurity(self.contract) self.contract = None self.buycontract=True if self.secondcontract != None: if (self.secondcontract.ID.Date - self.Time).days <= 25: self.Liquidate(self.secondcontract) self.RemoveSecurity(self.secondcontract) self.secondcontract = None self.buysecondcontract=True if self.thirdcontract != None: if (self.thirdcontract.ID.Date - self.Time).days <= 30: self.Liquidate(self.thirdcontract) self.RemoveSecurity(self.thirdcontract) self.thirdcontract = None self.buythirdcontract=True if self.fourthcontract != None: if (self.fourthcontract.ID.Date - self.Time).days <= 35: self.Liquidate(self.fourthcontract) self.RemoveSecurity(self.fourthcontract) self.fourthcontract = None self.buyfourthcontract=True def OptionsSetup(self): if self.contract is None: self.contract = self.GetContract(self.expiry1,self.expiry2,strike=0) if self.secondcontract is None: self.secondcontract = self.GetContract(self.expiry1,self.expiry2,strike=1) if self.thirdcontract is None: self.thirdcontract = self.GetContract(self.expiry1,self.expiry2,strike=2) if self.fourthcontract is None: self.fourthcontract = self.GetContract(self.expiry1,self.expiry2,strike=3) if self.buycontract and self.contract != None: self.SetHoldings(self.contract, 0.0025) self.buycontract=False if self.buysecondcontract and self.secondcontract != None: self.SetHoldings(self.secondcontract, 0.0025) self.buysecondcontract = False if self.buythirdcontract and self.thirdcontract != None: self.SetHoldings(self.thirdcontract, 0.0025) self.buythirdcontract=False if self.buyfourthcontract and self.fourthcontract != None: self.SetHoldings(self.fourthcontract, 0.0025) self.buyfourthcontract = False if self.Portfolio.Cash > (self.Portfolio.TotalPortfolioValue* 0.05): self.SetHoldings(self.spy, 0.99) def GetContract(self,firstexpiry,secondexpiry,strike): targetStrike = (self.Securities[self.spy].Price * 0.6) - (self.Securities[self.spy].Price * 0.6)%5 contracts = self.OptionChainProvider.GetOptionContractList(self.spy, self.Time) puts = [x for x in contracts if x.ID.OptionRight == OptionRight.Put] puts = sorted( sorted(puts, key = lambda x: x.ID.Date, reverse = False), key = lambda x: x.ID.StrikePrice) puts = [x for x in puts if targetStrike* 0.975 < x.ID.StrikePrice < targetStrike* 1.025] puts = [x for x in puts if firstexpiry < (x.ID.Date - self.Time).days <= secondexpiry] if len(puts) == 0: return None else: closestdate = puts[0].ID.Date puts=[x for x in puts if x.ID.Date == closestdate] if len(puts) >= strike+1: self.AddOptionContract(puts[strike], Resolution.Minute) return puts[strike] else: return None