Overall Statistics |
Total Trades 117 Average Win 8.63% Average Loss -2.84% Compounding Annual Return 25.514% Drawdown 26.400% Expectancy 1.765 Net Profit 984.023% Sharpe Ratio 1.074 Probabilistic Sharpe Ratio 45.181% Loss Rate 32% Win Rate 68% Profit-Loss Ratio 3.04 Alpha 0.24 Beta -0.04 Annual Standard Deviation 0.219 Annual Variance 0.048 Information Ratio 0.411 Tracking Error 0.273 Treynor Ratio -5.892 Total Fees $3300.82 |
#take the paper "Leverage For The Long Run", use a 200 SMA on SPY to generate weekly buy/sell signals to either go long multiple 3x leveraged assets, or go to "AGG". class LeverageForTheLongRunDiversifiedWeekly(QCAlgorithm): def Initialize(self): self.SetStartDate(2010,3, 1) #Set Start Date self.SetEndDate(2020,8,20) #Set End Date self.SetCash(100000) #Set Strategy Cash self.spy = self.AddEquity("SPY", Resolution.Daily) self.tqqq = self.AddEquity("TQQQ", Resolution.Daily) self.ubt = self.AddEquity("UBT", Resolution.Daily) self.ust = self.AddEquity("UST", Resolution.Daily) self.agg = self.AddEquity("AGG", Resolution.Daily) # general bond fund as cash replacement self.etfs = ["TQQQ","UST","UBT"] self.sma = self.SMA("SPY", 200) self.SetWarmUp(200) # warm up the indicator self.Settings.FreePortfolioValuePercentage = 0.05 # Rebalancing logic self.rebal = 1 # Rebalance every 1 week self.rebalTimer = self.rebal - 1 # Initialize to trigger first week self.flag1 = 0 # Flag to initate trades # Increment rebalance timer at every week start self.Schedule.On(self.DateRules.WeekStart("SPY"), self.TimeRules.AfterMarketOpen("SPY", 30), self.Rebalance) def OnData(self, data): if not self.sma.IsReady: return if data.ContainsKey("SPY") == False: return # make sure we have data for trading symbols if data.ContainsKey("TQQQ") == False: return if data.ContainsKey("UBT") == False: return if data.ContainsKey("UST") == False: return # If ready to rebalance, set each holding at 1/3 if self.flag1 == 1: if not self.Portfolio.Invested and data[self.spy.Symbol].Close>self.sma.Current.Value: # if holdings are empty and SPY>200SMA for stock in self.etfs: if stock =='TQQQ': weight = 0.5 else: weight = 0.25 self.SetHoldings(stock, weight) else: if self.Portfolio.Invested and data[self.spy.Symbol].Close<self.sma.Current.Value: # if holdings are full and SPY<200SMA for stock in self.etfs: self.SetHoldings(stock, 0) self.rebalTimer = 0 # Reset rebalance timer self.flag1 = 0 def Rebalance(self): self.rebalTimer +=1 if self.rebalTimer == self.rebal: self.flag1 = 1