Overall Statistics |
Total Orders 174 Average Win 5.05% Average Loss -2.15% Compounding Annual Return 16.616% Drawdown 37.600% Expectancy 0.912 Start Equity 10000 End Equity 46565.18 Net Profit 365.652% Sharpe Ratio 0.705 Sortino Ratio 0.757 Probabilistic Sharpe Ratio 23.634% Loss Rate 43% Win Rate 57% Profit-Loss Ratio 2.35 Alpha 0.055 Beta 0.596 Annual Standard Deviation 0.144 Annual Variance 0.021 Information Ratio 0.185 Tracking Error 0.129 Treynor Ratio 0.17 Total Fees $155.00 Estimated Strategy Capacity $830000000.00 Lowest Capacity Asset QQQ RIWIV7K5Z9LX Portfolio Turnover 4.21% |
from AlgorithmImports import * class UniversalMarketStrategy(QCAlgorithm): def Initialize(self): # Set backtest parameters self.SetStartDate(2015, 1, 1) # Backtest start date self.set_end_date(2025, 1, 1) self.SetCash(10000) # Starting cash # Add SPY as the crossover indicator self.spy_symbol = self.AddEquity("SPY", Resolution.Daily).Symbol # Add assets for different regimes self.bull_market_asset = self.AddEquity("QQQ", Resolution.Daily).Symbol self.sideways_market_asset = self.AddEquity("SPY", Resolution.Daily).Symbol self.bear_market_asset = self.AddEquity("GLD", Resolution.Daily).Symbol # Define SMAs for SPY self.spy_sma_100 = self.SMA(self.spy_symbol, 100, Resolution.Daily) self.spy_sma_200 = self.SMA(self.spy_symbol, 200, Resolution.Daily) # Warm up data for SMAs self.SetWarmUp(200) def OnData(self, slice): # Ensure SMAs are ready if not (self.spy_sma_100.IsReady and self.spy_sma_200.IsReady): return # Retrieve SMA values and current SPY price spy_price = self.Securities[self.spy_symbol].Price sma_100_value = self.spy_sma_100.Current.Value sma_200_value = self.spy_sma_200.Current.Value # Determine the current market regime and allocate assets accordingly if spy_price > sma_200_value: # Bull Market if not self.Portfolio[self.bull_market_asset].Invested: self.SetHoldings(self.bull_market_asset, 1.0) self.Liquidate(self.sideways_market_asset) self.Liquidate(self.bear_market_asset) elif sma_100_value < spy_price <= sma_200_value: # Sideways Market if not self.Portfolio[self.sideways_market_asset].Invested: self.SetHoldings(self.sideways_market_asset, 1.0) self.Liquidate(self.bull_market_asset) self.Liquidate(self.bear_market_asset) elif spy_price <= sma_200_value: # Bear Market if not self.Portfolio[self.bear_market_asset].Invested: self.SetHoldings(self.bear_market_asset, 1.0) self.Liquidate(self.bull_market_asset) self.Liquidate(self.sideways_market_asset)