Overall Statistics
Total Trades
37
Average Win
0.05%
Average Loss
-0.09%
Compounding Annual Return
-6.673%
Drawdown
0.700%
Expectancy
-0.241
Net Profit
-0.189%
Sharpe Ratio
-1.626
Probabilistic Sharpe Ratio
32.462%
Loss Rate
53%
Win Rate
47%
Profit-Loss Ratio
0.61
Alpha
-0.036
Beta
0.207
Annual Standard Deviation
0.04
Annual Variance
0.002
Information Ratio
0.663
Tracking Error
0.114
Treynor Ratio
-0.312
Total Fees
$37.00
Estimated Strategy Capacity
$24000000.00
Lowest Capacity Asset
AMZN R735QTJ8XC9X
class MomentumEffectAlgorithm(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2021, 9, 15)
        self.SetCash(100000)         
        self.UniverseSettings.Resolution = Resolution.Minute
        self.macd = {}         
        self.userlist = ["AAPL","AMZN","TSLA","BABA"]
        self.AutomaticIndicatorWarmup = True
        self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
        self.consolidators = {}
        
    def ThirtyMinuteHandler(self, sender, bar):
        for i in self.Securities.Keys:
            if self.macd[i].Current.Value > self.macd[i].Signal.Current.Value:
                self.SetHoldings(i, 0.1)
            elif self.macd[i].Signal.Current.Value > self.macd[i].Current.Value:
                self.Liquidate(i)

    def CoarseSelectionFunction(self, coarse):
        return [x.Symbol for x in coarse if x.Symbol.Value in self.userlist]

    def FineSelectionFunction(self, fine):
        return [x.Symbol for x in fine if x.Symbol.Value in self.userlist]

    def OnData(self, data):
        pass

    def OnSecuritiesChanged(self, changes):

        # Clean up data for removed securities
        for security in changes.RemovedSecurities:
            
            # Remove consolidator
            consolidator = self.consolidators.pop(security.Symbol)
            self.SubscriptionManager.RemoveConsolidator(security.Symbol, consolidator)
            consolidator.DataConsolidated -= self.ThirdtyMinuteHandler
            
            # Remove indicators
            self.macd.pop(security.Symbol, None)
            
            # Liquidate
            self.Liquidate(security.Symbol)
        
        # Loop through added securities
        for security in changes.AddedSecurities:
        
            # Register consolidator to get automatically updated with minute data
            thirtyMinuteConsolidator = TradeBarConsolidator(timedelta(minutes=30))
            thirtyMinuteConsolidator.DataConsolidated += self.ThirtyMinuteHandler
            self.SubscriptionManager.AddConsolidator(security.Symbol, thirtyMinuteConsolidator)
            self.consolidators[security.Symbol] = thirtyMinuteConsolidator
            
            # Register indicators to get automatically updated with 30 minute bars
            self.macd[security.Symbol] = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Exponential)
            self.RegisterIndicator(security.Symbol, self.macd[security.Symbol], thirtyMinuteConsolidator, Field.Open)