Overall Statistics
Total Trades
247893
Average Win
0.00%
Average Loss
0.00%
Compounding Annual Return
15.501%
Drawdown
33.300%
Expectancy
0.853
Net Profit
303.369%
Sharpe Ratio
0.983
Probabilistic Sharpe Ratio
39.486%
Loss Rate
24%
Win Rate
76%
Profit-Loss Ratio
1.43
Alpha
-0.006
Beta
0.984
Annual Standard Deviation
0.15
Annual Variance
0.022
Information Ratio
-0.557
Tracking Error
0.015
Treynor Ratio
0.15
Total Fees
$420691.53
Estimated Strategy Capacity
$0
Lowest Capacity Asset
BBK R735QTJ8XC9X
class IndexInvesting(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2012, 1, 1)  # Set Start Date
        self.SetCash(100000000)  # Set Strategy Cash
        
        self.SetBenchmark("SPY")
        
        self.UniverseSettings.Resolution = Resolution.Hour
        
        self.spy = self.AddEquity("SPY", Resolution.Hour).Symbol
        self.AddUniverse(self.Universe.ETF(self.spy, self.UniverseSettings, self.ETFConstituentsFilter))
        
        self.weights = {}
        
        self.Schedule.On(
            self.DateRules.WeekStart(self.spy),
            self.TimeRules.AfterMarketOpen(self.spy, 1),
            self.Rebalance)
    
    def ETFConstituentsFilter(self, constituents):
        self.weights = {c.Symbol: c.Weight for c in constituents}
        return list(self.weights.keys())
    
    def Rebalance(self):
        for symbol, weight in self.weights.items():
            if symbol in self.ActiveSecurities:
                self.SetHoldings(symbol, weight)  # Market cap weighted
                # self.SetHoldings(symbol, 1 / len(self.weights))  # Equally weighted
    
    def OnSecuritiesChanged(self, changes):
        for security in changes.RemovedSecurities:
            if security.Invested:
                self.Liquidate(security.Symbol, 'No longer in universe')
                if security.Symbol in self.weights.keys(): del self.weights[security.Symbol]