Overall Statistics
Total Trades
5
Average Win
0%
Average Loss
0%
Compounding Annual Return
-0.215%
Drawdown
1.500%
Expectancy
0
Net Profit
-0.442%
Sharpe Ratio
-0.252
Probabilistic Sharpe Ratio
1.897%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.002
Beta
0.008
Annual Standard Deviation
0.006
Annual Variance
0
Information Ratio
-0.278
Tracking Error
0.16
Treynor Ratio
-0.193
Total Fees
$5.00
Estimated Strategy Capacity
$940000000.00
Lowest Capacity Asset
QRTEB WSRW88XX4PR9
from AlgorithmImports import *

class CalibratedOptimizedCompensator(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 1, 1)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash
        # Set QC500 Universe Selection Model
        self.SetUniverseSelection(QC500UniverseSelectionModel())
        # Dictionary to hold SecurityData 
        self.data = {}
    
    def OnData(self, data):
      
        # Sorted by MOM
        sortedByMOM = sorted(list(self.data.keys()), key=lambda k : self.data[k].mom.Current.Value, reverse=True)
        # Select top 15 symbols
        rankings = sortedByMOM[:10]
        #[x for x in a if x > 2]
       # sma_shortlist = [x for rankings  if self.data[x].sma45.Current.Value > self.data[x].sma44.Current.Value  ]
        # Liquidate outdated symbols
        for kvp in self.Portfolio:
            symbol = kvp.Key
            holding = kvp.Value
            if self.data[symbol].sma45.Current.Value < self.data[symbol].sma44.Current.Value:
              if not self.Portfolio[symbol].Invested:
                self.Liquidate(symbol)
        # Set holdings to selected symbols
        for symbol in rankings:
            if self.data[symbol].sma45.Current.Value > self.data[symbol].sma44.Current.Value:
              if not self.Portfolio[symbol].Invested:
                self.SetHoldings(symbol, 1/len(self.Portfolio))
                
    def OnSecuritiesChanged(self, changes):
        
        for security in changes.AddedSecurities:
            symbol = security.Symbol
            if symbol not in self.data:
                self.data[symbol] = SecurityData(self, symbol, security) 


class SecurityData:
    
    def __init__(self, algorithm, symbol, security):
        self.algorithm = algorithm
        self.symbol = symbol
        self.security = security
        # Retrieves ROIC fundamental
        self.mom = algorithm.MOMP(symbol, 42, Resolution.Daily)
        self.sma45 = algorithm.SMA(symbol,45,Resolution.Daily)
        self.sma44 = algorithm.SMA(symbol,44,Resolution.Daily)
        # Initialize MOM indicator with historical data
        history = algorithm.History(symbol,46, Resolution.Daily)
        
        if not history.empty:
            history = history.close.unstack(0)
            if not history.empty:
                df = history[symbol]
                for time, close in df.iteritems():
                    self.mom.Update(time, close)
                    self.sma45.Update(time,close)
                    self.sma44.Update(time,close)