Overall Statistics |
Total Trades 129 Average Win 1.46% Average Loss -0.61% Compounding Annual Return 21.409% Drawdown 13.300% Expectancy 1.428 Net Profit 79.055% Sharpe Ratio 1.506 Probabilistic Sharpe Ratio 75.840% Loss Rate 29% Win Rate 71% Profit-Loss Ratio 2.40 Alpha 0.187 Beta -0.041 Annual Standard Deviation 0.12 Annual Variance 0.014 Information Ratio 0.176 Tracking Error 0.246 Treynor Ratio -4.425 Total Fees $319.47 Estimated Strategy Capacity $71000000.00 Lowest Capacity Asset BND 2T |
class CrawlingYellowGreenJackal(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 1, 1) self.SetEndDate(2021, 1, 1) self.SetCash(100000) self.spy = self.AddEquity("QQQ", Resolution.Daily).Symbol self.bnd = self.AddEquity("BND", Resolution.Daily).Symbol length = self.GetParameter("sma_length") length = 30 if length is None else int(length) self.sma = self.SMA(self.spy, length, Resolution.Daily) #self.sma = self.SMA(self.spy, 30, Resolution.Daily) self.rebalanceTime = datetime.min self.uptrend = True def OnData(self, data): if not self.sma.IsReady or self.spy not in data or self.bnd not in data: return self.Debug(str(self.Time)) if self.spy in data.Dividends and self.spy not in data.Bars: self.Debug("Dividend paid for QQQ at time "+str(self.Time)) return if data[self.spy].Price >= self.sma.Current.Value: # Either rebalance or rice has crossed above SMA if self.Time >= self.rebalanceTime or not self.uptrend: self.SetHoldings(self.spy, 0.8) self.SetHoldings(self.bnd, 0.2) self.uptrend = True self.rebalanceTime = self.Time + timedelta(30) # Either rebalance or price has crossed below SMA elif self.Time >= self.rebalanceTime or self.uptrend: self.SetHoldings(self.spy, 0.2) self.SetHoldings(self.bnd, 0.8) self.uptrend = False self.rebalanceTime = self.Time + timedelta(30) self.Plot("Benchmark", "SMA", self.sma.Current.Value)