Overall Statistics |
Total Orders 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Start Equity 10000 End Equity 10000 Net Profit 0% Sharpe Ratio 0 Sortino 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 -2.533 Tracking Error 0.091 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset Portfolio Turnover 0% |
#region imports from AlgorithmImports import * #endregion class WellDressedSkyBlueSardine(QCAlgorithm): def Initialize(self): self.SetStartDate(2024, 1, 1) #self.SetEndDate(2021, 1, 1) self.SetCash(10000) self.rebalanceTime = datetime.min self.activeStocks = set() #self.universe_selection(alt_coarse)= True self.AddUniverse(self._fundamental_filter_function) self.AddUniverse(BrainSentimentIndicatorUniverse, self.universe_selection) self.UniverseSettings.Resolution = Resolution.Daily self.portfolioTargets = [] self.fundamental =[] def _fundamental_filter_function(self, fundamental: List[Fundamental]) -> List[Symbol]: sorted_by_dollar_volume = sorted(fundamental, key=lambda x: x.dollar_volume, reverse=True) self.fundamental = [c.symbol for c in sorted_by_dollar_volume if c.Price>10][:50] #self.Debug("{} self.fundamental: {}".format(self.Time, self.fundamental)) return Universe.UNCHANGED def universe_selection(self, alt_coarse: List[BrainSentimentIndicatorUniverse]) -> List[Symbol]: # Rebalancing monthly if self.Time <= self.rebalanceTime: return self.Universe.Unchanged self.Log("{} Entered fine selection".format(self.Time)) for x in self.fundamental: self.Log("{}".format(x)) self.rebalanceTime = self.Time + timedelta(30) sortedby30daySentiment = sorted([x for x in alt_coarse if x.sentiment_30_days is not None], key=lambda x: x.sentiment_30_days, reverse=True) self.list =list (set(self.fundamental) & set(sortedby30daySentiment)) self.Log("{} self.list".format(self.Time, self.list)) for x in self.list: self.Log("{}".format(x)) #sortedby30daySentiment = sorted (alt_coarse, key=lambda x: x.sentiment_30_days, reverse=True) #self.alt_coarse = [s.symbol for s in sortedby30daySentiment[:10]] return list (set(self.fundamental) & set(sortedby30daySentiment)) #return [d.symbol for d in sorted([x for x in alt_coarse if x.SentimentalArticleMentions30Days], # key=lambda x: x.SentimentalArticleMentions30Days, reverse=True)[:10]] #sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) #return [x.Symbol for x in sortedByDollarVolume if x.Price > 10 # and x.HasFundamentalData][:10] def OnSecuritiesChanged(self, changes: List[Fundamental]) -> List[Symbol]: # close positions in removed securities for x in changes.RemovedSecurities: self.Liquidate(x.Symbol) self.Log("{} Removed {}".format(self.Time,x.Symbol)) self.activeStocks.remove(x.Symbol) # can't open positions here since data might not be added correctly yet for x in changes.AddedSecurities: self.activeStocks.add(x.Symbol) self.Log("{} Added {}".format(self.Time,x)) # adjust targets if universe has changed self.portfolioTargets = [PortfolioTarget(symbol, 1/len(self.activeStocks)) for symbol in self.activeStocks] self.Log("{} Portfolio Targets: {}".format(self.Time, self.portfolioTargets)) self.Log("{} Portfolio: ".format(self.Time)) for symbol in self.activeStocks: self.Log(f"{symbol} ") def OnData(self, data): if self.portfolioTargets == []: return for symbol in self.activeStocks: if symbol not in data: return self.SetHoldings(self.portfolioTargets) self.portfolioTargets = []