Overall Statistics
Total Orders
1046
Average Win
0.10%
Average Loss
-0.17%
Compounding Annual Return
6.767%
Drawdown
31.100%
Expectancy
0.330
Start Equity
100000
End Equity
196223.89
Net Profit
96.224%
Sharpe Ratio
0.266
Sortino Ratio
0.264
Probabilistic Sharpe Ratio
1.961%
Loss Rate
16%
Win Rate
84%
Profit-Loss Ratio
0.58
Alpha
-0.018
Beta
0.704
Annual Standard Deviation
0.113
Annual Variance
0.013
Information Ratio
-0.637
Tracking Error
0.061
Treynor Ratio
0.043
Total Fees
$1045.53
Estimated Strategy Capacity
$440000.00
Lowest Capacity Asset
WOOD U3RDKMG7QNHH
Portfolio Turnover
0.19%
#region imports
from AlgorithmImports import *
#endregion
from clr import AddReference
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Algorithm.Framework")

from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Alphas import AlphaModel, Insight, InsightType, InsightDirection


class constantAlphaModel(AlphaModel):
    

    def __init__(self, type, direction, period, magnitude = None, confidence = None):
        
        self.type = type
        self.direction = direction
        self.period = period
        self.magnitude = magnitude
        self.confidence = confidence
        self.securities = []
        self.insightsTimeBySymbol = {}

        typeString = Extensions.GetEnumString(type, InsightType)
        directionString = Extensions.GetEnumString(direction, InsightDirection)

        self.Name = '{}({},{},{}'.format(self.__class__.__name__, typeString, directionString, strfdelta(period))
        if magnitude is not None:
            self.Name += ',{}'.format(magnitude)
        if confidence is not None:
            self.Name += ',{}'.format(confidence)

        self.Name += ')';


    def Update(self, algorithm, data):
        
        insights = []

        for security in self.securities:
            if security.Price != 0 and self.ShouldEmitInsight(algorithm.UtcTime, security.Symbol):
                insights.append(Insight(security.Symbol, self.period, self.type, self.direction, self.magnitude, self.confidence))

        return insights


    def OnSecuritiesChanged(self, algorithm, changes):
        for added in changes.AddedSecurities:
            self.securities.append(added)

        for removed in changes.RemovedSecurities:
            if removed in self.securities:
                self.securities.remove(removed)
            if removed.Symbol in self.insightsTimeBySymbol:
                self.insightsTimeBySymbol.pop(removed.Symbol)


    def ShouldEmitInsight(self, utcTime, symbol):

        generatedTimeUtc = self.insightsTimeBySymbol.get(symbol)

        if generatedTimeUtc is not None:
            if utcTime - generatedTimeUtc < self.period:
                return False

        self.insightsTimeBySymbol[symbol] = utcTime
        return True

def strfdelta(tdelta):
    d = tdelta.days
    h, rem = divmod(tdelta.seconds, 3600)
    m, s = divmod(rem, 60)
    return "{}.{:02d}:{:02d}:{:02d}".format(d,h,m,s)
#region imports
from AlgorithmImports import *
#endregion
from Risk.MaximumDrawdownPercentPerSecurity import MaximumDrawdownPercentPerSecurity
from Constant_Alpha import constantAlphaModel

class EnergeticSkyBlueFrog(QCAlgorithm):

    def Initialize(self):
        
        self.SetStartDate(2015, 1, 1) 
        self.SetEndDate(2025,4,15)
        self._cash = 100000
        self.SetCash(self._cash)  
    
      
        # 1. UNIVERSE SELECTION MODEL
        self.UniverseSettings.Resolution = Resolution.Daily
        symbols = [ # OUR INVESTMENT UNIVERSE
                    # AGGREGATE INDICES
                    Symbol.Create("SPY", SecurityType.Equity, Market.USA),
                    Symbol.Create("IEFA", SecurityType.Equity, Market.USA),
                    Symbol.Create("AGG", SecurityType.Equity, Market.USA),
                    Symbol.Create("IWM", SecurityType.Equity, Market.USA),
                    Symbol.Create("EEM", SecurityType.Equity, Market.USA),
                    Symbol.Create("EWJ", SecurityType.Equity, Market.USA),
                    Symbol.Create("EPP", SecurityType.Equity, Market.USA),
                    # FIXED INCOME AND REAL ESTATE
                    Symbol.Create("IYR", SecurityType.Equity, Market.USA),
                    Symbol.Create("LQD", SecurityType.Equity, Market.USA),
                    Symbol.Create("EMB", SecurityType.Equity, Market.USA),
                    Symbol.Create("IEF", SecurityType.Equity, Market.USA),
                    Symbol.Create("IEI", SecurityType.Equity, Market.USA),
                    # COMMODITIES
                    Symbol.Create("IAU", SecurityType.Equity, Market.USA),
                    Symbol.Create("GSG", SecurityType.Equity, Market.USA),
                    Symbol.Create("COMT", SecurityType.Equity, Market.USA),
                    # FACTORS
                    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("EFAV", SecurityType.Equity, Market.USA),
                    Symbol.Create("EEMV", SecurityType.Equity, Market.USA),
                    Symbol.Create("IDV", SecurityType.Equity, Market.USA),
                    Symbol.Create("DVY", SecurityType.Equity, Market.USA),
                    Symbol.Create("IQLT", SecurityType.Equity, Market.USA),
                    # SECTORS AND INDUSTRIES
                    Symbol.Create("IBB", SecurityType.Equity, Market.USA),
                    Symbol.Create("IHI", SecurityType.Equity, Market.USA),
                    Symbol.Create("IYW", SecurityType.Equity, Market.USA),
                    Symbol.Create("IGF", SecurityType.Equity, Market.USA),
                    Symbol.Create("IYH", SecurityType.Equity, Market.USA),
                    Symbol.Create("VYF", SecurityType.Equity, Market.USA),
                    Symbol.Create("IXC", SecurityType.Equity, Market.USA),
                    Symbol.Create("PICK", SecurityType.Equity, Market.USA),
                    Symbol.Create("IYE", SecurityType.Equity, Market.USA),
                    Symbol.Create("KXI", SecurityType.Equity, Market.USA),
                    Symbol.Create("WOOD", SecurityType.Equity, Market.USA)]
        self.SetUniverseSelection(ManualUniverseSelectionModel(symbols))
        
        # 2. ALPHA MODEL
        self.AddAlpha(constantAlphaModel(InsightType.Price, InsightDirection.Up, timedelta(days = 1), 0.025, None))
        #self.AddAlpha(constantAlphaModel(InsightType.Price, InsightDirection.Up, timedelta(days = 1), 0.999))

        # 3. PORTFOLIO CONSTRUCTION MODEL
        self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
        
        # 4. RISK MANAGEMENT
        self.SetRiskManagement(MaximumDrawdownPercentPortfolio(0.05))
        
        # 5. EXECUTION MODEL
        # If we say nothing about it, it is assumed as Immediate Execution (Market Orders)
        
        self._benchmark = self.AddEquity("SPY", Resolution.Daily).Symbol
        self._benchmarkInitial = self.History(self._benchmark, 1, Resolution.Daily)
        self._benchmarkPrice = self._benchmarkInitial['close'][0]
        
    def OnData(self,data): #customizable part of the sandwich truck
        
        self.Plot("Relative Performance", "SPY", self._cash*self.Securities["SPY"].Close/self._benchmarkPrice)
        self.Plot("Relative Performance", "Portfolio Value", self.Portfolio.TotalPortfolioValue)