Overall Statistics
Total Trades
611
Average Win
2.93%
Average Loss
-2.33%
Compounding Annual Return
387.305%
Drawdown
17.600%
Expectancy
0.380
Net Profit
1008.899%
Sharpe Ratio
7.586
Probabilistic Sharpe Ratio
99.429%
Loss Rate
39%
Win Rate
61%
Profit-Loss Ratio
1.26
Alpha
4.886
Beta
0.241
Annual Standard Deviation
0.651
Annual Variance
0.424
Information Ratio
6.905
Tracking Error
0.682
Treynor Ratio
20.49
Total Fees
$0.00
class FadingTheGap(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2019, 1, 1)
        #self.SetEndDate(2018, 7, 1)
        self.SetCash(100000) 
        self.SetBrokerageModel(BrokerageName.Alpaca)
        
        self.tickers=["TQQQ", "UVXY", "FAS", #"UPRO", "NUGT", "UDOW", "TECL", "SPXL", "SOXL"
                            ]
        self.volatilities = {}
        self.windows = {}
        for ticker in self.tickers:
            symbol = self.AddEquity(ticker, Resolution.Minute).Symbol
            self.volatilities[symbol] = StandardDeviation(ticker, 120)
            self.windows[symbol] = RollingWindow[TradeBar](2)
        
        
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.BeforeMarketClose("TQQQ", 0), self.ClosingBar) 
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("TQQQ", 2), self.OpeningBar)
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("TQQQ", 90), self.ClosePositions)         
        
        
    def OnData(self, data):
        for symbol, std in self.volatilities.items():
            if data.ContainsKey(symbol) and data[symbol] is not None:             #
                std.Update(self.Time, data[symbol].Close)
    
    def OpeningBar(self):
        for symbol, window in self.windows.items():
            if self.CurrentSlice[symbol] is not None:
                window.Add(self.CurrentSlice[symbol])
        
        if not all([window.IsReady for symbol, window in self.windows.items()]) or not all([std.IsReady for symbol, std in self.volatilities.items()]):
            return
        
        symbolsToTrade = []
        
        for symbol, window in self.windows.items():
            delta = window[0].Open - window[1].Close
            deviations = delta / self.volatilities[symbol].Current.Value 
            if deviations < -3:
                symbolsToTrade.append(symbol)
        
        for symbol in symbolsToTrade:
            self.SetHoldings(symbol, 2/len(symbolsToTrade))
        
    def ClosePositions(self):
        self.Liquidate()
        
    def ClosingBar(self):
        for symbol, window in self.windows.items():
            if self.CurrentSlice[symbol] is not None:
                window.Add(self.CurrentSlice[symbol])