Overall Statistics |
Total Trades 277 Average Win 7.37% Average Loss -2.67% Compounding Annual Return 18.593% Drawdown 30.700% Expectancy 0.828 Net Profit 1348.743% Sharpe Ratio 0.832 Probabilistic Sharpe Ratio 15.682% Loss Rate 51% Win Rate 49% Profit-Loss Ratio 2.76 Alpha 0.085 Beta 0.707 Annual Standard Deviation 0.17 Annual Variance 0.029 Information Ratio 0.469 Tracking Error 0.131 Treynor Ratio 0.2 Total Fees $32219.54 Estimated Strategy Capacity $500000000.00 Lowest Capacity Asset QQQ RIWIV7K5Z9LX Portfolio Turnover 4.79% |
# region imports from AlgorithmImports import * import pandas as pd class MyAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2008, 1, 1) # self.SetEndDate(2022, 3, 1) # Imposta la data di inizio self.SetCash(100000) # Imposta il capitale iniziale self.AddEquity("SPY", Resolution.Daily) # Aggiungi SPY come asset self.AddEquity("QQQ", Resolution.Daily) # Aggiungi QQQ come asset self.AddEquity("XLP", Resolution.Daily) # Aggiungi XLP come asset self.AddEquity("QLD", Resolution.Daily) # Aggiungi QLD come asset self.spy_symbol = self.Symbol("SPY") self.qqq_symbol = self.Symbol("QQQ") self.xlp_symbol = self.Symbol("XLP") self.qld_symbol = self.Symbol("QLD") # Aggiungi l'indicatore di media mobile a 200 giorni per SPY self.spy_sma = self.SMA("SPY", 200, Resolution.Daily) self.spy_rsi = self.RSI("SPY", 10, MovingAverageType.Wilders) self.current_position = None # Mantieni traccia della posizione attuale self.AddRiskManagement(MaximumDrawdownPercentPerSecurity(0.05)) def OnData(self, slice): if not self.spy_sma.IsReady: return if not self.spy_rsi.IsReady: return # Calcola l'RSI di SPY self.Debug(f"RSI di SPY: {self.spy_rsi.Current.Value}") if self.Securities[self.spy_symbol].Price > self.spy_sma.Current.Value: new_position = "QQQ" elif self.spy_rsi.Current.Value < 30: new_position = "QLD" else: new_position = "XLP" if self.current_position != new_position: # Se la nuova condizione è diversa dalla posizione attuale, esegui la transazione self.Liquidate() # Liquidate la posizione attuale self.SetHoldings(new_position, 0.99) # Imposta la nuova posizione al 100% self.current_position = new_position # Aggiorna la posizione attuale self.Debug(f"Cambio di posizione: Nuova posizione = {new_position}")