Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0.901 Tracking Error 0.205 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
# region imports from AlgorithmImports import * # endregion class DancingYellowGreenZebra(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 3, 17) # Set Start Date self.SetCash(100000) # Set Strategy Cash # add SPY so that we can use it in the schedule rule below self.SPY = self.AddEquity('SPY', Resolution.Minute).Symbol # build a universe using the CoarseFilter and FineFilter functions defined below self.AddUniverse(self.CoarseFilter, self.FineFilter) #Add event to run every day self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.AfterMarketOpen) #lis of tickers tickerSymbolValuesOnly = [] print1 = 1 def CoarseFilter(self, universe): # filter universe, ensure DollarVolume is above a certain threshold # also filter by assets that have fundamental data universe = [asset for asset in universe if asset.DollarVolume > 1000000 and asset.Price > 10 and asset.HasFundamentalData] # sort universe by highest dollar volume sortedByDollarVolume = sorted(universe, key=lambda asset: asset.DollarVolume, reverse=True) # only select the first 500 topSortedByDollarVolume = sortedByDollarVolume[:5] # we must return a list of the symbol objects only symbolObjects = [asset.Symbol for asset in topSortedByDollarVolume] # this line is not necessary, but we will use it for debugging to see a list of ticker symbols tickerSymbolValuesOnly = [symbol.Value for symbol in symbolObjects] return symbolObjects def FineFilter(self, coarseUniverse): yesterday = self.Time - timedelta(days=1) fineUniverse = [asset.Symbol for asset in coarseUniverse if asset.EarningReports.FileDate == yesterday and asset.MarketCap > 1e9] tickerSymbolValuesOnly = [symbol.Value for symbol in fineUniverse] return fineUniverse def AfterMarketOpen(self): for security in self.ActiveSecurities.Values: symbol = security.Symbol if symbol == self.SPY: continue historyData = self.History(symbol, 2, Resolution.Daily) try: openDayAfterEarnings = historyData['open'][-1] closeDayAfterEarnings = historyData['close'][-1] highDayAfterEarnings = historyData['high'][-1] closeDayBeforeEarnings = historyData['close'][-2] except: self.Debug(f"History data unavailable for {symbol.Value}") continue self.Debug(f"{symbol.Value} in list") priceGap = openDayAfterEarnings - closeDayBeforeEarnings percentGap = priceGap / closeDayBeforeEarnings closeStrength = (closeDayAfterEarnings - openDayAfterEarnings) / (highDayAfterEarnings - openDayAfterEarnings) if percentGap > 0.05: self.Debug(f"{symbol.Value} gapped up by {percentGap} - {closeDayBeforeEarnings} {openDayAfterEarnings}") if closeDayAfterEarnings > closeDayBeforeEarnings and closeStrength > 0.5: self.Debug(f"{symbol.Value} closed strong!") else: self.Debug(f"{symbol.Value} faded after earnings")