Overall Statistics |
Total Orders 10018 Average Win 3.48% Average Loss -1.48% Compounding Annual Return 114.871% Drawdown 66.000% Expectancy 0.261 Start Equity 100000 End Equity 214421.59 Net Profit 114.422% Sharpe Ratio 1.702 Sortino Ratio 1.565 Probabilistic Sharpe Ratio 56.567% Loss Rate 62% Win Rate 38% Profit-Loss Ratio 2.36 Alpha 0.775 Beta 2.245 Annual Standard Deviation 0.668 Annual Variance 0.446 Information Ratio 2.331 Tracking Error 0.418 Treynor Ratio 0.506 Total Fees $670.95 Estimated Strategy Capacity $5300000.00 Lowest Capacity Asset BA R735QTJ8XC9X Portfolio Turnover 22.91% |
# region imports from AlgorithmImports import * # endregion class AlertFluorescentYellowChinchilla(QCAlgorithm): def initialize(self): self.set_start_date(2020, 1, 3) self.set_end_date(2021, 1, 1) self.set_cash(100000) self.rebalanceTime = self.Time self.AddUniverse(self.CoarseFilter, self.FineFilter) self.UniverseSettings.Resolution = Resolution.Minute self.final_universe_size = 10 self.activeStocks = set() self.SetWarmUp(10*390) self.AddEquity("AAPL", Resolution.Minute) self.neverInvested = True # set trailing stop risk management self.SetRiskManagement(TrailingStopRiskManagementModel(0.1)) def CoarseFilter(self, coarse): # Rebalancing monthly if self.Time <= self.rebalanceTime: return self.Universe.Unchanged self.rebalanceTime = self.Time + timedelta(days=360) sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) return [x.Symbol for x in sortedByDollarVolume if x.HasFundamentalData][:1000] def FineFilter(self, fine): sortedbyVolume = sorted(fine, key=lambda x: x.DollarVolume, reverse=True ) fine_output = [x.Symbol for x in sortedbyVolume if x.MarketCap > 0][:self.final_universe_size] return fine_output def OnSecuritiesChanged(self, changes): # region removed securities for x in changes.RemovedSecurities: self.Liquidate(x.Symbol) if x.Symbol in self.activeStocks: self.activeStocks.remove(x.Symbol) for x in changes.AddedSecurities: self.activeStocks.add(x.Symbol) def on_data(self, data: Slice): if len(self.activeStocks) == 1 and not self.Portfolio["AAPL"].Invested: self.SetHoldings("AAPL", 2) self.neverInvested = True for x in self.activeStocks: if data.ContainsKey(x) and data[x] != None: if self.neverInvested and str(x).split(" ")[0] != "AAPL": self.Liquidate("AAPL") self.neverInvested = False if not self.Portfolio[x].Invested and self.Portfolio.MarginRemaining > 1000: self.SetHoldings(x, .2)