Overall Statistics |
Total Trades 123 Average Win 7.43% Average Loss -0.97% Compounding Annual Return 3.981% Drawdown 21.800% Expectancy 0.995 Net Profit 60.463% Sharpe Ratio 0.387 Probabilistic Sharpe Ratio 0.546% Loss Rate 77% Win Rate 23% Profit-Loss Ratio 7.69 Alpha 0.003 Beta 0.292 Annual Standard Deviation 0.079 Annual Variance 0.006 Information Ratio -0.529 Tracking Error 0.123 Treynor Ratio 0.105 Total Fees $5840.47 Estimated Strategy Capacity $490000.00 Lowest Capacity Asset BIL TT1EBZ21QWKL |
# region imports from AlgorithmImports import * # endregion class AdaptableYellowLeopard(QCAlgorithm): def Initialize(self): start = datetime(2011, 1, 1) # Start date end = datetime(2024, 12, 30) # End date cash = 1000000 # Starting capital self.period = 900 # rolling period to consider for drawup and drawdown calculations self.SetStartDate(start) # Set Start Date self.SetEndDate(end) self.SetCash(cash) # Set Strategy Cash self.AddEquity("SPY", Resolution.Minute) self.AddEquity("BIL", Resolution.Minute) self.AddEquity("TLT", Resolution.Minute) self.AddEquity("IAU", Resolution.Minute) self.high = RollingWindow[float](self.period) self.low = RollingWindow[float](self.period) self.close = RollingWindow[float](self.period) self.state1 = False self.state2 = False self.state3 = False # self.spy # self.Schedule.On(self.DateRules.MonthEnd("SPY", 1), self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose("SPY", 2), self.FunctionBeforeMarketClose) def OnData(self, slice: Slice): pass def LiquidateExisting(self, symbols): for symbol in symbols: quantity = self.Portfolio[symbol].Quantity if quantity != 0: self.MarketOrder(symbol, -quantity, tag=f"Rebalancing {symbol}") def FunctionBeforeMarketClose(self): self.close = self.Securities['SPY'].Close self.high.Add(self.Securities['SPY'].High) self.low.Add(self.Securities['SPY'].Low) if self.high.IsReady: dd = abs((self.close / max(self.high)) - 1) * 100 du = (1 - (min(self.low) / self.close)) * 100 if dd ==0: dd == .0000001 # if dd != -1000000: ddd = dd # ddd = dd / du if ddd < 7 and not self.state1: # 100% SPY self.LiquidateExisting(['BIL', 'TLT', 'IAU']) quantity = self.CalculateOrderQuantity("SPY", 1.0) self.MarketOrder('SPY', quantity, tag='100% SPY') self.state1 = True self.state2 = False self.state3 = False if ddd >= 7 and not self.state2: # 50% BIL, 40% TLT, 10% IAU self.LiquidateExisting(['SPY']) quantity = self.CalculateOrderQuantity("BIL", 1.0) self.MarketOrder('BIL', quantity, tag='50% BIL') # quantity = self.CalculateOrderQuantity("TLT", 0.2) # self.MarketOrder('TLT', quantity, tag='40% TLT') # quantity = self.CalculateOrderQuantity("IAU", 1.0) # self.MarketOrder('IAU', quantity, tag='10% IAU') # quantity = self.CalculateOrderQuantity("BIL", 0.25) # self.MarketOrder('BIL', quantity, tag='50% BIL') # quantity = self.CalculateOrderQuantity("TLT", 0.2) # self.MarketOrder('TLT', quantity, tag='40% TLT') # quantity = self.CalculateOrderQuantity("IAU", 0.05) # self.MarketOrder('IAU', quantity, tag='10% IAU') self.state2 = True self.state1 = False self.state3 = False # if 1.2 >= ddd >= 0.8 and not self.state3: # # 50% SPY, 50% BIL # self.LiquidateExisting(['TLT', 'IAU']) # quantity = self.CalculateOrderQuantity("SPY", 0.25) # self.MarketOrder('SPY', quantity, tag='50% SPY') # quantity = self.CalculateOrderQuantity("BIL", 0.25) # self.MarketOrder('BIL', quantity, tag='50% BIL') # self.state3 = True # self.state1 = False # self.state2 = False