Overall Statistics
Total Orders
5227
Average Win
0.65%
Average Loss
-0.46%
Compounding Annual Return
11.595%
Drawdown
31.000%
Expectancy
0.344
Start Equity
1000000
End Equity
1413169.13
Net Profit
41.317%
Sharpe Ratio
0.278
Sortino Ratio
0.291
Probabilistic Sharpe Ratio
13.513%
Loss Rate
44%
Win Rate
56%
Profit-Loss Ratio
1.41
Alpha
0.02
Beta
1.025
Annual Standard Deviation
0.195
Annual Variance
0.038
Information Ratio
0.194
Tracking Error
0.11
Treynor Ratio
0.053
Total Fees
$3716.08
Estimated Strategy Capacity
$7100000.00
Lowest Capacity Asset
MTUM VFUDGZIY8ZMT
Portfolio Turnover
6.60%
#region imports
from AlgorithmImports import *
#endregion
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Algorithm.Framework")
AddReference("QuantConnect.Common")

from System import *
from QuantConnect import *
from QuantConnect.Orders import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Selection import *
from QuantConnect.Algorithm.Framework.Execution import *
from QuantConnect.Algorithm.Framework.Risk import *
from Portfolio.BlackLittermanOptimizationPortfolioConstructionModel import *
from Portfolio.UnconstrainedMeanVariancePortfolioOptimizer import UnconstrainedMeanVariancePortfolioOptimizer
from Risk.NullRiskManagementModel import NullRiskManagementModel
from Alphas.HistoricalReturnsAlphaModel import HistoricalReturnsAlphaModel
from Alphas.EmaCrossAlphaModel import EmaCrossAlphaModel
from Alphas.MacdAlphaModel import MacdAlphaModel
from Alphas.RsiAlphaModel import RsiAlphaModel
from Alphas.ConstantAlphaModel import ConstantAlphaModel

class EnergeticSkyBlueFrog(QCAlgorithm):

    def Initialize(self):
        
        self.SetStartDate(2022, 3, 1) 
        self.SetEndDate(2025, 4, 24)
        self._cash = 1000000
        self.SetCash(self._cash)  
        
        self.UniverseSettings.Resolution = Resolution.Daily
        
        # Define the symbols we will trade
        symbols = [
            Symbol.Create("USMV", SecurityType.Equity, Market.USA),
            Symbol.Create("DGRO", SecurityType.Equity, Market.USA),
            Symbol.Create("QUAL", SecurityType.Equity, Market.USA),
            Symbol.Create("DVY", SecurityType.Equity, Market.USA),
            Symbol.Create("MTUM", SecurityType.Equity, Market.USA),
            Symbol.Create("VLUE", SecurityType.Equity, Market.USA),
            Symbol.Create("TLT", SecurityType.Equity, Market.USA),
            Symbol.Create("SPY", SecurityType.Equity, Market.USA)  # Add SPY to universe
        ]
        
        self.SetUniverseSelection(ManualUniverseSelectionModel(symbols))

        # Add Alpha models
        self.AddAlpha(HistoricalReturnsAlphaModel(2, Resolution.Daily))
        self.AddAlpha(EmaCrossAlphaModel(5, 10, Resolution.Daily))  # Corrected call
        self.AddAlpha(ConstantAlphaModel(InsightType.Price, InsightDirection.Up, timedelta(days=1), 0.025, None))
       
        # Set Portfolio Construction Model
        optimizer = UnconstrainedMeanVariancePortfolioOptimizer()
        self.SetPortfolioConstruction(BlackLittermanOptimizationPortfolioConstructionModel(optimizer=optimizer))

        # Set Execution Model
        self.SetExecution(ImmediateExecutionModel())
        
        # Set Risk Management Model
        self.AddRiskManagement(MaximumDrawdownPercentPortfolio(0.01, isTrailing=False))

        # Set Benchmark (manually tracking SPY)
        self._benchmark = Symbol.Create("SPY", SecurityType.Equity, Market.USA)
        history = self.History(self._benchmark, 1, Resolution.Daily)
        if not history.empty:
            self._benchmarkPrice = history['close'][0]
        else:
            self._benchmarkPrice = 1  # Default to avoid division by zero if no history is available

    def OnData(self, data):
        if self._benchmark in self.Securities and self.Securities[self._benchmark].HasData:
            current_spy_price = self.Securities[self._benchmark].Price
            if self._benchmarkPrice != 0:
                relative_spy_value = self._cash * current_spy_price / self._benchmarkPrice
                self.Plot("Relative Performance", "SPY", relative_spy_value)
        
        self.Plot("Relative Performance", "Portfolio Value", self.Portfolio.TotalPortfolioValue)