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