Overall Statistics
Total Trades
542
Average Win
1.37%
Average Loss
0%
Compounding Annual Return
37.680%
Drawdown
23.400%
Expectancy
0
Net Profit
4599.017%
Sharpe Ratio
2.172
Probabilistic Sharpe Ratio
99.741%
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
0.256
Beta
0.86
Annual Standard Deviation
0.185
Annual Variance
0.034
Information Ratio
2.311
Tracking Error
0.101
Treynor Ratio
0.466
Total Fees
$4835.51
import numpy as np

syms = ['DPZ', 'AAPL', 'MKTX', 'NFLX', 'MO', 'DLTR', 'ORLY', 'HRL', 'AZO',
       'AMZN', 'ROST', 'TJX', 'NI', 'MA', 'TYL', 'CMS', 'ISRG', 'BKNG',
       'SWKS', 'NVDA', 'IDXX', 'TDG', 'DXCM', 'BR', 'MCD', 'FDN']


class MultidimensionalModulatedRegulators(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2009, 1, 1)
        self.SetCash(1000000)
        self.SetExecution(VolumeWeightedAveragePriceExecutionModel())
 
        self.symbols = []
        for i in range(len(syms)):
            self.symbols.append(Symbol.Create(syms[i], SecurityType.Equity, Market.USA))
            self.Debug(syms[i])
            
        self.SetUniverseSelection(ManualUniverseSelectionModel(self.symbols) )
        self.UniverseSettings.Resolution = Resolution.Hour
        
        self.AddEquity('SPY', Resolution.Hour)
        self.SetBenchmark('SPY')

        self.SetBrokerageModel(AlphaStreamsBrokerageModel())
        
        self.constant_weights = np.array([0.15127148, 0.14096956, 0.11464883, 0.08053819, 0.07183724,
       0.0689432 , 0.0593862 , 0.04365404, 0.03406639, 0.02905478,
       0.02853938, 0.02340857, 0.02157884, 0.01870045, 0.01373184,
       0.01336607, 0.01219164, 0.01180656, 0.01143535, 0.01089439,
       0.01046122, 0.00775818, 0.00726694, 0.00591355, 0.00452038,
       0.00405665])

        self.constant_weights /= np.sum(np.abs(self.constant_weights))
        self.leverage = 1.0

    def OnData(self, data):
                
        rebalance = False
        
        if self.Portfolio.TotalHoldingsValue > 0:
            total = 0.0
            for i, sym in enumerate(self.symbols):
                curr = (self.Securities[sym].Holdings.HoldingsValue/self.Portfolio.TotalHoldingsValue)
                diff = self.constant_weights[i] - curr
                total += np.abs(diff)
                
            if total > 0.155: 
                rebalance = True
                
            if rebalance:
                for i, sym in enumerate(self.symbols):
                    curr = (self.Securities[sym].Holdings.HoldingsValue/self.Portfolio.TotalHoldingsValue)
                    if self.constant_weights[i] < curr:
                        self.SetHoldings(sym, self.constant_weights[i] * self.leverage)
                for i, sym in enumerate(self.symbols):
                    curr = (self.Securities[sym].Holdings.HoldingsValue/self.Portfolio.TotalHoldingsValue)                       
                    if self.constant_weights[i] > curr:
                        self.SetHoldings(sym, self.constant_weights[i] * self.leverage)
        else:
            for i, sym in enumerate(self.symbols):
                    self.SetHoldings(sym, self.constant_weights[i] * self.leverage)