Overall Statistics |
Total Trades 2 Average Win 0% Average Loss 0% Compounding Annual Return 323.148% Drawdown 1.800% Expectancy 0 Net Profit 1.460% Sharpe Ratio 7.891 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 1.601 Beta 0.656 Annual Standard Deviation 0.316 Annual Variance 0.1 Information Ratio 6.37 Tracking Error 0.178 Treynor Ratio 3.799 Total Fees $2.01 |
class SPY_With_Options(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) # Set Start Date self.SetEndDate(2019, 1, 5) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.AddEquity("SPY", Resolution.Minute) option = self.AddOption("SPY") option.SetFilter(-10, +10, timedelta(30*35), timedelta(30*36)) self.__consolidateTradeCnt = 0 self.__consolidateTradeTrigger = False self.__consolidateQuoteCnt = 0 self.__consolidateQuoteTrigger = False self.consolidators = dict() # ------------------------------------------------------------------------------------------------------- def PrintOptionContractInfo(self, contract, prefix=""): c = contract self.Log(f"{prefix} {c.Symbol}, Strike: {c.Strike} Expiry: {c.Expiry} Right: {c.Right} Price => A:{c.AskPrice} B:{c.BidPrice} L:{c.LastPrice} T:{c.TheoreticalPrice} Intrest: {c.OpenInterest} ") return def PrintOptionChainInfo(self, chain, prefix=""): for contract in chain: self.PrintOptionContractInfo(contract, prefix) return # ------------------------------------------------------------------------------------------------------- def OnData(self, slice): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' if not self.Portfolio.Invested: self.SetHoldings("SPY", 0.5) for kvp in slice.OptionChains: chain = kvp.Value # find the second call strike under market price expiring today contracts = sorted(sorted(chain, key = lambda x: abs(chain.Underlying.Price - x.Strike)), key = lambda x: x.Expiry, reverse=False) self.PrintOptionChainInfo(contracts) # Purchase options if len(contracts) == 0: continue if contracts[0] != None: self.Log("Purchased"+'xx'+str(contracts[0].Symbol)+'xx') self.MarketOrder(contracts[0].Symbol, 1) if contracts[0].Symbol == 'SPY 211217C00245000': self.Log("Matched") else: self.Log("Not Matched") # self.GetMyOption("SPY", slice) # self.MarketOrder('SPY 211217C00245000', 1) # ------------------------------------------------------------------------------------------------------- # Function that helps consolidation def OnOrderEvent(self, orderEvent): self.Log(str(orderEvent)) def OnQuoteBarConsolidated(self, sender, quoteBar): # self.Log("QBCon:" + str(self.__consolidateQuoteCnt) + " " + str(self.Time) + str(quoteBar)) # Trigger when last of the contract was consolidated # 3 year - "211217P00260" # 1 year - "200918P00260" # 3 month - "191115P00260" # 1 month - "190920P00260" if ( str(quoteBar).find("211217P00240") > 0 ): # self.Log("OnQuoteBarConsolidated:" + str(self.__consolidateQuoteCnt) + " " + str(self.Time) + str(quoteBar)) self.__consolidateQuoteTrigger = True self.__consolidateQuoteCnt += 1 def OnTradeBarConsolidated(self, sender, tradeBar): # self.Log("TBCon:" + str(self.__consolidateTradeCnt) + " " + str(self.Time) + str(tradeBar)) self.__consolidateTradeCnt += 1 def OnSecuritiesChanged(self, changes): for security in changes.AddedSecurities: if security.Type == SecurityType.Equity: consolidator = TradeBarConsolidator(timedelta(minutes=60)) consolidator.DataConsolidated += self.OnTradeBarConsolidated else: consolidator = QuoteBarConsolidator(timedelta(minutes=60)) consolidator.DataConsolidated += self.OnQuoteBarConsolidated self.SubscriptionManager.AddConsolidator(security.Symbol, consolidator) self.consolidators[security.Symbol] = consolidator for security in changes.RemovedSecurities: consolidator = self.consolidators.pop(security.Symbol) self.SubscriptionManager.RemoveConsolidator(security.Symbol, consolidator) if security.Type == SecurityType.Equity: consolidator.DataConsolidated -= self.OnTradeBarConsolidated else: consolidator.DataConsolidated -= self.OnQuoteBarConsolidated # -------------------------------------------------------------------------------------------------------