Overall Statistics |
Total Trades 390 Average Win 4.24% Average Loss -0.75% Compounding Annual Return 67.983% Drawdown 49.000% Expectancy 3.274 Net Profit 4063.340% Sharpe Ratio 1.788 Probabilistic Sharpe Ratio 91.919% Loss Rate 36% Win Rate 64% Profit-Loss Ratio 5.67 Alpha 0.486 Beta -0.073 Annual Standard Deviation 0.271 Annual Variance 0.074 Information Ratio 1.672 Tracking Error 0.283 Treynor Ratio -6.678 Total Fees $70466.19 Estimated Strategy Capacity $12000.00 Lowest Capacity Asset ETHUSD XJ |
# region imports from AlgorithmImports import * # endregion class AdaptableYellowLeopard(QCAlgorithm): def Initialize(self): start = datetime(2016, 1, 1) # Start date end = datetime(2024, 12, 30) # End date cash = 1000000 # Starting capital self.period = 200 # rolling period to consider for drawup and drawdown calculations self.SetWarmUp(200) self.SetStartDate(start) # Set Start Date self.SetEndDate(end) self.SetCash(cash) # Set Strategy Cash self.AddEquity("LQD", Resolution.Minute) #GOLD self.AddEquity("GLD", Resolution.Minute) self.AddEquity("IAU", Resolution.Minute) self.AddEquity("IAUM", Resolution.Minute) #TREASURY self.AddEquity("VTIP", Resolution.Minute) self.AddEquity("EDV", Resolution.Minute) self.AddEquity("IEI", Resolution.Minute) self.AddEquity("TIP", Resolution.Minute) self.AddEquity("LTPZ", Resolution.Minute) self.AddEquity("SPY", Resolution.Minute) self.AddEquity("IEF", Resolution.Minute) self.AddEquity("QQQ", Resolution.Minute) self.AddEquity("KR", Resolution.Minute) self.AddEquity("WMT", Resolution.Minute) self.AddEquity("TSCO", Resolution.Minute) self.AddEquity("HD", Resolution.Minute) self.AddEquity("GIS", Resolution.Minute) self.AddEquity("NEE", Resolution.Minute) self.AddEquity("AAPL", Resolution.Minute) self.AddEquity("AJG", Resolution.Minute) self.AddEquity("ORCL", Resolution.Minute) self.AddEquity("MSFT", Resolution.Minute) self.AddEquity("RJF", Resolution.Minute) self.AddEquity("SCHW", Resolution.Minute) # self.AddEquity("ODFL", Resolution.Minute) self.AddEquity("CVBF", Resolution.Minute) self.AddEquity("CB", Resolution.Minute) #BLOCK self.AddCrypto("BTCUSD", Resolution.Minute) self.AddCrypto("ETHUSD", Resolution.Minute) #NO DIV self.AddEquity("TSLA", Resolution.Minute) # self.AddEquity("NFLX", Resolution.Minute) # self.AddEquity("TMUS", Resolution.Minute) # self.AddEquity("VBR", Resolution.Minute) # self.AddEquity("SHY", Resolution.Minute) # self.AddEquity("BIL", Resolution.Minute) # self.AddEquity("TLT", Resolution.Minute) # self.AddEquity("HYG", Resolution.Minute) # self.AddEquity("VCLT", Resolution.Minute) # self.AddEquity("ETHE", Resolution.Minute) # self.AddEquity("LQD", Resolution.Minute).SetDataNormalizationMode(DataNormalizationMode.Raw) # self.AddEquity("VWEHX", Resolution.Minute) # self.btc = self.AddCrypto("BTCUSD", Resolution.Minute).Symbol 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['LQD'].Close self.high.Add(self.Securities['LQD'].High) self.low.Add(self.Securities['LQD'].Low) # self.close = self.Securities['HYG'].Close # self.high.Add(self.Securities['HYG'].High) # self.low.Add(self.Securities['HYG'].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 = .01 # dd = 10000 if du == 0: du = 1000 # du = .0001 # if dd != 0: # ddd = dd ddd = dd / du if ddd < 1 and not self.state1: # 100% SPY self.LiquidateExisting([ 'IAU', 'IEF','GLD', 'EDV', 'VTIP', 'IEI']) # quantity = self.CalculateOrderQuantity("GLD", .30) # self.MarketOrder('GLD', quantity, tag='.2% GLD') quantity = self.CalculateOrderQuantity("BTCUSD", .1) self.MarketOrder('BTCUSD', quantity, tag='.05% BTCUSD') quantity = self.CalculateOrderQuantity("ETHUSD", .1) self.MarketOrder('ETHUSD', quantity, tag='.05% ETHUSD') quantity = self.CalculateOrderQuantity("SPY", .2) self.MarketOrder('SPY', quantity, tag='.05% SPY') # quantity = self.CalculateOrderQuantity("KR", .05) # self.MarketOrder('KR', quantity, tag='100% KR') # quantity = self.CalculateOrderQuantity("WMT", .05) # self.MarketOrder('WMT', quantity, tag='100% WMT') # quantity = self.CalculateOrderQuantity("TSCO", .05) # self.MarketOrder('TSCO', quantity, tag='100% TSCO') # quantity = self.CalculateOrderQuantity("HD", .05) # self.MarketOrder('HD', quantity, tag='100% HD') # quantity = self.CalculateOrderQuantity("GIS", .05) # self.MarketOrder('GIS', quantity, tag='100% GIS') # quantity = self.CalculateOrderQuantity("AJG", .05) # self.MarketOrder('AJG', quantity, tag='100% AJG') # quantity = self.CalculateOrderQuantity("RJF", .05) # self.MarketOrder('RJF', quantity, tag='100% RJF') # quantity = self.CalculateOrderQuantity("SCHW", .05) # self.MarketOrder('SCHW', quantity, tag='100% SCHW') # quantity = self.CalculateOrderQuantity("CVBF", .05) # self.MarketOrder('CVBF', quantity, tag='100% CVBF') # quantity = self.CalculateOrderQuantity("AAPL", .05) # self.MarketOrder('AAPL', quantity, tag='100% AAPL') # quantity = self.CalculateOrderQuantity("NEE", .05) # self.MarketOrder('NEE', quantity, tag='100% NEE') # quantity = self.CalculateOrderQuantity("ORCL", .05) # self.MarketOrder('ORCL', quantity, tag='100% ORCL') # quantity = self.CalculateOrderQuantity("CB", .05) # self.MarketOrder('CB', quantity, tag='100% CB') # 'KR','WMT', 'TSCO' , \ # 'HD', 'GIS', 'ODFL' \ # 'AJG', 'RJF', 'SCHW', 'CVBF' \ # 'AAPL', 'NEE', 'ORCL' # quantity = self.CalculateOrderQuantity("HD", .16) # self.MarketOrder('HD', quantity, tag='100% HD') # quantity = self.CalculateOrderQuantity("AAPL", .17) # self.MarketOrder('AAPL', quantity, tag='100% AAPL') # quantity = self.CalculateOrderQuantity("TSCO", .17) # self.MarketOrder('TSCO', quantity, tag='100% TSCO') quantity = self.CalculateOrderQuantity("AAPL", .2) self.MarketOrder('AAPL', quantity, tag='100% AAPL') quantity = self.CalculateOrderQuantity("GLD", .2) self.MarketOrder('GLD', quantity, tag='100% GLD') # # quantity = self.CalculateOrderQuantity("WMT", .20) # # self.MarketOrder('WMT', quantity, tag='100% WMT') # quantity = self.CalculateOrderQuantity("TSCO", .15) # self.MarketOrder('WMT', quantity, tag='100% WMT') # # quantity = self.CalculateOrderQuantity("AMZN", .30) # # self.MarketOrder('AMZN', quantity, tag='100% AMZN') # # quantity = self.CalculateOrderQuantity("NFLX", .25) # # self.MarketOrder('NFLX', quantity, tag='100% NFLX') quantity = self.CalculateOrderQuantity("TSLA", .2) self.MarketOrder('TSLA', quantity, tag='100% TSLA') # quantity = self.CalculateOrderQuantity("SPY", .8) # self.MarketOrder('SPY', quantity, tag='100% SPY') # quantity = self.CalculateOrderQuantity("QQQ", .67) # self.MarketOrder('QQQ', quantity, tag='100% QQQ') # quantity = self.CalculateOrderQuantity("VBR", 0.1) # self.MarketOrder('VBR', quantity, tag='40% VBR') # quantity = self.CalculateOrderQuantity("IEF", 0.1) # self.MarketOrder('IEF', quantity, tag='40% IEF') self.state1 = True self.state2 = False self.state3 = False if ddd >= 1 and not self.state2: # 50% BIL, 40% TLT, 10% IAU self.LiquidateExisting([ 'IAU','GLD', \ 'SPY','QQQ', \ 'ETHUSD', \ 'BTCUSD', \ # 'KR','WMT', 'TSCO' , \ # 'HD', 'GIS', \ # 'AJG', 'RJF', 'SCHW', 'CVBF', \ # 'AAPL', 'NEE', 'ORCL', \ # 'CB', \ 'TSLA', 'AAPL' \ # 'DLTR', 'NFLX', 'TMUS', 'TUP', 'AMZN', 'TSLA', 'AAPL' \ ]) # self.LiquidateExisting(['BTCUSD']) # self.LiquidateExisting(['QQQ']) # quantity = self.CalculateOrderQuantity("EDV", .5) # self.MarketOrder('IEF', quantity, tag='40% IEF') quantity = self.CalculateOrderQuantity("GLD", 0.5) self.MarketOrder('GLD', quantity, tag='10% GLD') # quantity = self.CalculateOrderQuantity("BIL", .45) # self.MarketOrder('BIL', quantity, tag='50% BIL') quantity = self.CalculateOrderQuantity("VTIP", .5) self.MarketOrder('VTIP', quantity, tag='50% VTIP') # quantity = self.CalculateOrderQuantity("TLT", 0.5) # self.MarketOrder('TLT', quantity, tag='40% TLT') # quantity = self.CalculateOrderQuantity("IAU", 0.5) # self.MarketOrder('IAU', quantity, tag='10% IAU') # quantity = self.CalculateOrderQuantity("VBR", 0.33) # self.MarketOrder('VBR', quantity, tag='10% VBR') # 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') 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