Overall Statistics
Total Trades
10
Average Win
0.01%
Average Loss
-5.34%
Compounding Annual Return
-2.767%
Drawdown
21.000%
Expectancy
-0.800
Net Profit
-0.926%
Sharpe Ratio
0.106
Probabilistic Sharpe Ratio
28.560%
Loss Rate
80%
Win Rate
20%
Profit-Loss Ratio
0.00
Alpha
0.026
Beta
-0.132
Annual Standard Deviation
0.343
Annual Variance
0.118
Information Ratio
0.171
Tracking Error
0.657
Treynor Ratio
-0.277
Total Fees
$14.14
class VerticalNadionGearbox(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 2, 20)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash
        
        symbols = [ Symbol.Create("SPY", SecurityType.Equity, Market.USA) ]
        self.SetUniverseSelection( ManualUniverseSelectionModel(symbols) )
        self.UniverseSettings.Resolution = Resolution.Daily
        
        self.AddAlpha(MyAlphaModel(symbols[0]))
        
        self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
        
        self.SetRiskManagement(MaximumDrawdownPercentPerSecurityCustom(0.05))
        
        self.SetExecution(ImmediateExecutionModel())

        
class MyAlphaModel(AlphaModel):
    def __init__(self, symbol):
        self.symbol = symbol
    
    def Update(self, algorithm, data):
        if algorithm.Portfolio.Invested:
            return []
        return [Insight.Price("SPY", timedelta(365), InsightDirection.Up)]
        
            
class MaximumDrawdownPercentPerSecurityCustom(RiskManagementModel):

    def __init__(self, maximumDrawdownPercent = 0.05, reenter_after_days = 5):
        self.maximumDrawdownPercent = -abs(maximumDrawdownPercent)
        self.liquidated_dates_by_symbol = {}
        self.reenter_after_days = timedelta(reenter_after_days)

    def ManageRisk(self, algorithm, targets):
        symbols_to_pop = []
        for symbol, liquidation_date in self.liquidated_dates_by_symbol.items():
            if algorithm.Time - liquidation_date >= self.reenter_after_days:
                symbols_to_pop.append(symbol)
        for symbol in symbols_to_pop:
            self.liquidated_dates_by_symbol.pop(symbol, None)
        
        targets = []
        for kvp in algorithm.Securities:
            security = kvp.Value

            pnl = security.Holdings.UnrealizedProfitPercent
            if pnl < self.maximumDrawdownPercent or security.Symbol in self.liquidated_dates_by_symbol:
                # liquidate
                targets.append(PortfolioTarget(security.Symbol, 0))
                if algorithm.Securities[security.Symbol].Invested:
                    self.liquidated_dates_by_symbol[security.Symbol] = algorithm.Time

        return targets