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