Overall Statistics
Total Trades
378
Average Win
0.42%
Average Loss
-0.38%
Compounding Annual Return
27.319%
Drawdown
5.900%
Expectancy
0.230
Net Profit
17.263%
Sharpe Ratio
1.837
Probabilistic Sharpe Ratio
74.840%
Loss Rate
42%
Win Rate
58%
Profit-Loss Ratio
1.11
Alpha
0.252
Beta
0.002
Annual Standard Deviation
0.138
Annual Variance
0.019
Information Ratio
0.709
Tracking Error
0.201
Treynor Ratio
106.746
Total Fees
$1772.33
class FadingTheGap(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2017, 11, 1)
        self.SetEndDate(2018, 7, 1)
        self.SetCash(100000) 
        
        
        self.tickers=["TSLA", "FB", "SPY", "NVDA", "AMD"]
        self.volatilities = {}
        self.windows = {}
        for ticker in self.tickers:
            symbol = self.AddEquity(ticker, Resolution.Minute).Symbol
            self.volatilities[symbol] = StandardDeviation(ticker, 60)
            self.windows[symbol] = RollingWindow[TradeBar](2)
        
        
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.BeforeMarketClose("SPY", 0), self.ClosingBar) 
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("SPY", 1), self.OpeningBar)
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("SPY", 45), 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, 1/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])