Overall Statistics |
Total Orders 23 Average Win 6.01% Average Loss -4.05% Compounding Annual Return 32.847% Drawdown 13.400% Expectancy 0.580 Start Equity 200000 End Equity 263565.29 Net Profit 31.783% Sharpe Ratio 0.905 Sortino Ratio 0.506 Probabilistic Sharpe Ratio 53.438% Loss Rate 36% Win Rate 64% Profit-Loss Ratio 1.48 Alpha 0.122 Beta 0.488 Annual Standard Deviation 0.206 Annual Variance 0.042 Information Ratio 0.271 Tracking Error 0.206 Treynor Ratio 0.381 Total Fees $564.09 Estimated Strategy Capacity $37000000.00 Lowest Capacity Asset TYH U8JOSZGR4OKL Portfolio Turnover 6.41% |
from AlgorithmImports import * from datetime import datetime, timedelta class SummrBusinessTechnologySemiconductor(QCAlgorithm): def Initialize(self): self.SetStartDate(2024, 1, 1) # Set Start Date self.SetCash(200000) # Set Strategy Cash # Define symbols self.symbols = { "SOXL": "SOXL", "UPRO": "UPRO", "BIL": "BIL", "TLH": "TLH", "SPY": "SPY", "UVXY": "UVXY", "VIXY": "VIXY", "SOXS": "SOXS", "BSV": "BSV", "SPHB": "SPHB", "SQQQ": "SQQQ", "TECL": "TECL", "TQQQ": "TQQQ", "SPXL": "SPXL", "QLD": "QLD", "SPXU": "SPXU", "EUO": "EUO", "YCS": "YCS", "CURE": "CURE", "TMV": "TMV", "UUP": "UUP", "TECS": "TECS", "ERX": "ERX", "EWZ": "EWZ", "MVV": "MVV", "USD": "USD", "DBC": "DBC", "TLT": "TLT", "IEF": "IEF", "SHY": "SHY", "GLD": "GLD", "UCO": "UCO", "TMF": "TMF", "EFA": "EFA", "EEM": "EEM", "EPI": "EPI", "PUI": "PUI", "AGG": "AGG", "PSQ": "PSQ" } # Add all symbols to the algorithm for symbol in self.symbols.values(): self.AddEquity(symbol, Resolution.Daily) self.SetWarmUp(timedelta(days=360)) # Warmup period for indicators # Initialize indicators self.indicators = {} for symbol in self.symbols.values(): self.indicators[symbol] = { "RSI_5": self.RSI(symbol, 5), "RSI_6": self.RSI(symbol, 6), "RSI_7": self.RSI(symbol, 7), "RSI_8": self.RSI(symbol, 8), "RSI_9": self.RSI(symbol, 9), "RSI_10": self.RSI(symbol, 10), "RSI_11": self.RSI(symbol, 11), "RSI_12": self.RSI(symbol, 12), "RSI_13": self.RSI(symbol, 13), "RSI_18": self.RSI(symbol, 18), "RSI_42": self.RSI(symbol, 42), "RSI_70": self.RSI(symbol, 70), "SMA_12": self.SMA(symbol, 12), "SMA_200": self.SMA(symbol, 200), "EMA_210": self.EMA(symbol, 210), "SMA_360": self.SMA(symbol, 360), "STD_20": self.STD(symbol, 20) } self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.BeforeMarketClose("SPY", 10), self.Rebalance) def OnData(self, data): pass # Main logic handled in Rebalance def Rebalance(self): if self.IsWarmingUp: return # Clear existing positions self.Liquidate() # Main strategy logic selected_assets = self.SelectAssets() if selected_assets: # Equal weight distribution weight = 1.0 / len(selected_assets) for symbol in selected_assets: self.SetHoldings(symbol, weight) def SelectAssets(self): """Main asset selection logic""" # Initial condition check if self.indicators["SOXL"]["RSI_8"].Current.Value > self.indicators["UPRO"]["RSI_9"].Current.Value: return self.TechnologyFocusedSelection() else: return self.AlternativeSelection() def TechnologyFocusedSelection(self): """Technology focused selection logic""" if self.indicators["BIL"]["RSI_10"].Current.Value < self.indicators["TLH"]["RSI_10"].Current.Value: if self.indicators["SPY"]["RSI_6"].Current.Value > 75: return self.SelectVolatilityAssets() else: return self.SelectTechnologyAssets() else: return self.SelectDefensiveAssets() def SelectVolatilityAssets(self): """Select volatility based assets""" volatility_assets = ["UVXY", "VIXY"] return [self.SelectLowestRSI(volatility_assets, 13)] def SelectTechnologyAssets(self): """Select technology focused assets""" if self.indicators["SOXL"]["RSI_5"].Current.Value <= 75: return ["SOXL"] else: return ["SOXS"] def SelectDefensiveAssets(self): """Select defensive assets""" if self.indicators["SPY"]["RSI_6"].Current.Value < 27: if self.indicators["BSV"]["RSI_7"].Current.Value < self.indicators["SPHB"]["RSI_7"].Current.Value: bear_assets = ["SOXS", "SQQQ"] return [self.SelectLowestRSI(bear_assets, 7)] else: bull_assets = ["SOXL", "TECL"] return [self.SelectLowestRSI(bull_assets, 7)] return [] def SelectLowestRSI(self, assets, period): """Helper function to select asset with lowest RSI""" lowest_rsi = float('inf') selected_asset = None for asset in assets: rsi_key = f"RSI_{period}" if f"RSI_{period}" in self.indicators[asset] else "RSI_10" current_rsi = self.indicators[asset][rsi_key].Current.Value if current_rsi < lowest_rsi: lowest_rsi = current_rsi selected_asset = asset return selected_asset def STD(self, symbol, period): """Standard deviation indicator""" # Create StandardDeviation indicator return StandardDeviation(period) def AlternativeSelection(self): """Alternative selection logic when SOXL RSI is not greater than UPRO RSI""" # Implementing the second part of the strategy if self.indicators["BIL"]["RSI_42"].Current.Value < self.indicators["IEF"]["RSI_70"].Current.Value: if self.indicators["SPY"]["RSI_7"].Current.Value > 75: # Overbought S&P condition volatility_assets = ["UVXY", "VIXY"] return [self.SelectLowestRSI(volatility_assets, 12)] else: # Check SOXL momentum if (self.Securities["SOXL"].Price > self.indicators["SOXL"]["SMA_200"].Current.Value): momentum_assets = ["SOXL", "UPRO"] return [self.SelectLowestMAReturn(momentum_assets, 12)] else: hedge_assets = ["SOXS", "SQQQ"] return [self.SelectLowestMAReturn(hedge_assets, 12)] else: if self.indicators["SPY"]["RSI_6"].Current.Value < 27: # Extremely oversold condition if self.indicators["BSV"]["RSI_8"].Current.Value < self.indicators["SPHB"]["RSI_8"].Current.Value: bear_assets = ["SOXS", "SQQQ"] return [self.SelectLowestRSI(bear_assets, 18)] else: bull_assets = ["SOXL", "SPXL", "TECL", "TMF", "UPRO", "USD", "TQQQ"] return [self.SelectLowestRSI(bull_assets, 18)] return [] def SelectLowestMAReturn(self, assets, period): """Helper function to select asset with lowest moving average return""" lowest_ma = float('inf') selected_asset = None for asset in assets: current_price = self.Securities[asset].Price # Use SMA_200 as default if the requested period's SMA doesn't exist sma_key = f"SMA_{period}" if f"SMA_{period}" in self.indicators[asset] else "SMA_200" ma_price = self.indicators[asset][sma_key].Current.Value if ma_price is not None and ma_price != 0: ma_return = (current_price - ma_price) / ma_price if ma_return < lowest_ma: lowest_ma = ma_return selected_asset = asset return selected_asset