| 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}")