Overall Statistics |
Total Trades 225 Average Win 7.83% Average Loss -2.59% Compounding Annual Return 19.809% Drawdown 34.400% Expectancy 1.087 Net Profit 1600.041% Sharpe Ratio 0.919 Probabilistic Sharpe Ratio 24.751% Loss Rate 48% Win Rate 52% Profit-Loss Ratio 3.03 Alpha 0 Beta 0 Annual Standard Deviation 0.161 Annual Variance 0.026 Information Ratio 0.919 Tracking Error 0.161 Treynor Ratio 0 Total Fees $187462.82 Estimated Strategy Capacity $590000000.00 Lowest Capacity Asset QQQ RIWIV7K5Z9LX Portfolio Turnover 3.88% |
# region imports from AlgorithmImports import * import pandas as pd class MyAlgorithm(QCAlgorithm): def Initialize(self): #self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage) self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) self.SetStartDate(2008, 1, 1) # self.SetEndDate(2022, 3, 1) # Imposta la data di inizio self.cap = 1000000 self.SetCash(self.cap) # Imposta il capitale iniziale self.spy_symbol = self.AddEquity("SPY", Resolution.Daily).Symbol # Aggiungi SPY come asset self.qqq_symbol = self.AddEquity("QQQ", Resolution.Daily).Symbol # Aggiungi QQQ come asset self.xlp_symbol = self.AddEquity("XLP", Resolution.Daily).Symbol # Aggiungi XLP come asset self.qld_symbol = self.AddEquity("QLD", Resolution.Daily).Symbol # Aggiungi QLD come asset # self.BNC = Benchmark on chart self.BNC = "SPY" self.mkt = [] self.buy_new = False # 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: self.Liquidate() # Liquidate la posizione attuale # Se la nuova condizione è diversa dalla posizione attuale, esegui la transazione # Se la nuova condizione è diversa dalla posizione attuale, esegui la transazione if not self.Portfolio.Invested: self.SetHoldings(new_position, 0.99) self.Debug("New position opened") self.current_position = new_position self.Debug(f"Cambio di posizione: Nuova posizione = {new_position}") self.buy_new == False def OnEndOfDay(self): # plot the equity we are holding at any given time #excl = ["SPY"] excl = [] for sym in self.Portfolio.Keys: if sym in excl: continue # check that we are invested in the symbol if self.Portfolio[sym].Invested: self.Plot("Holdings", sym, 1) else: self.Plot("Holdings", sym, 0) # plot the benchmark equity on the equity curve # plot the benchmark equity on the equity curve # Put in initialize: # self.BNC = "SPY" # self.mkt = [] # self.cap = 1000000 if not self.LiveMode: mkt_price = self.Securities[self.BNC].Close # the below fixes the divide by zero error in the MKT plot if mkt_price > 0 and mkt_price is not None: self.mkt.append(mkt_price) if len(self.mkt) >= 2 and not self.IsWarmingUp: mkt_perf = self.mkt[-1] / self.mkt[0] * self.cap self.Plot('Strategy Equity', self.BNC, mkt_perf)