Overall Statistics |
Total Trades 657 Average Win 0.06% Average Loss -0.03% Compounding Annual Return 2.959% Drawdown 0.600% Expectancy 0.295 Net Profit 2.956% Sharpe Ratio 2.847 Probabilistic Sharpe Ratio 95.663% Loss Rate 59% Win Rate 41% Profit-Loss Ratio 2.16 Alpha 0.021 Beta -0.005 Annual Standard Deviation 0.007 Annual Variance 0 Information Ratio -1.839 Tracking Error 0.105 Treynor Ratio -4.468 Total Fees $361.00 Estimated Strategy Capacity $180000000.00 Lowest Capacity Asset SPY 31966X63E2YFA|SPY R735QTJ8XC9X |
class RetrospectiveRedOrangeHornet(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) # Set Start Date self.SetEndDate(2019, 12, 31) # Set Start Date self.SetCash(100000) # Set Strategy Cash equity = self.AddEquity("SPY", Resolution.Minute) option = self.AddOption("SPY", Resolution.Minute) option.SetFilter(lambda universe: universe.IncludeWeeklys().Strikes(-12,12).Expiration(timedelta(0), timedelta(0))) self.symbol = option.Symbol #self.vix_symbol = self.AddIndex('VIX', Resolution.Minute).Symbol self.SetBenchmark("SPY") self.lastDay=None self.openPrice=None #self.openVix=None self.atr = self.ATR("SPY", 4, Resolution.Daily) self.spread=10 self.SetWarmup(1) #self.Consolidate("SPY", Resolution.Daily, self.OnDailyData) def OnData(self, slice): if self.Portfolio.Invested: self.SetHoldings("SPY", 0) day = self.Time.weekday() if( day != 0 and day != 2 and day != 4): return if self.lastDay == self.Time.day : return if self.openPrice == None and slice.ContainsKey("SPY"): try: self.openPrice = slice.Bars["SPY"].Close except Exception: self.openPrice = None #if self.openVix == None and slice.ContainsKey("VIX"): # try: # self.openVix = slice.Bars["VIX"].Close # except Exception: # self.openVix = None if(self.Time.hour >= 10 and self.openPrice != None): # and self.openVix != None if(not (slice.ContainsKey("SPY"))): #slice.ContainsKey("VIX") and return tenPrice = slice.Bars["SPY"].Close self.lastDay = self.Time.day diff = tenPrice - self.openPrice #tenVix = slice.Bars["VIX"].Close #vixdiff = tenVix - self.openVix if(diff > 0):# and vixdiff<0 #bullish sellStrikePrice = tenPrice #+ 3 * self.atr.Current.Value self.TradeOption(slice,sellStrikePrice, self.Time, 0, OptionRight.Put) buyStrikePrice = sellStrikePrice - self.spread self.TradeOption(slice,buyStrikePrice, self.Time, 1, OptionRight.Put) elif (diff < 0):# and vixdiff>0 #bearish sellStrikePrice = tenPrice #+ 3 * self.atr.Current.Value self.TradeOption(slice,sellStrikePrice, self.Time, 0, OptionRight.Call) buyStrikePrice = sellStrikePrice + self.spread self.TradeOption(slice,buyStrikePrice, self.Time, 1, OptionRight.Call) self.openPrice=None #self.openVix=None def TradeOption(self,slice,strike, exp, isBuy, isPut): if slice.OptionChains.Count == 0: return for i in slice.OptionChains: if i.Key != self.symbol: continue chain = i.Value call = [x for x in chain if x.Right == isPut] contracts = sorted(sorted(call, key = lambda x: abs(x.Strike - strike)), key = lambda x: abs(x.Expiry - exp)) if len(contracts) == 0: return contract = contracts[0] if isBuy: self.Buy(contract.Symbol, 1) else: self.Sell(contract.Symbol, 1)