Overall Statistics
Total Trades
162
Average Win
0.01%
Average Loss
0.00%
Compounding Annual Return
-0.454%
Drawdown
0.100%
Expectancy
-0.229
Net Profit
-0.039%
Sharpe Ratio
-3.25
Probabilistic Sharpe Ratio
9.977%
Loss Rate
78%
Win Rate
22%
Profit-Loss Ratio
2.47
Alpha
-0.004
Beta
-0.008
Annual Standard Deviation
0.001
Annual Variance
0
Information Ratio
-0.051
Tracking Error
0.11
Treynor Ratio
0.451
Total Fees
$162.00
Estimated Strategy Capacity
$210000000.00
Lowest Capacity Asset
ROKU WO9FGTL2I89X
class TestStrategy(QCAlgorithm):

    def Initialize(self):
        #set backtest time and starting cash to 10000
        self.SetStartDate(2020, 1, 1)
        self.SetEndDate(2020, 2, 1)
        self.SetCash(100000) 
        self.AddUniverse(self.CoarseSelectionFunction)
        self.UniverseSettings.Resolution = Resolution.Minute
        
        #add Equity of TSLA 
        self.universe = []
        self.previous_close_by_symbol = {}
        self.AddEquity("SPY",Resolution.Minute)    
        
        
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("SPY", 1), self.FilterForGaps)
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("SPY", 1), self.StartDayTrading)
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen("SPY", 60), self.ClosePositions) 
        
    def CoarseSelectionFunction(self,coarse):
        selected = [c for c in coarse if c.HasFundamentalData and c.Price>100]
        selected = sorted(selected, key=lambda x: x.DollarVolume, reverse=True)[:10]
        self.previous_close_by_symbol = {}
        for l in selected:
            self.previous_close_by_symbol[l.Symbol] = l.AdjustedPrice
        return list(self.previous_close_by_symbol.keys())

    
    def FilterForGaps(self): 
        # Narrow down universe
        self.universe_Long = []
        self.universe_Short = []
        for symbol, previous_close in self.previous_close_by_symbol.items():
            if symbol not in self.CurrentSlice.Bars:
                continue
            open_price = self.CurrentSlice.Bars[symbol].Open
            gap = (open_price - previous_close) / previous_close
            if gap <-0.01:
                self.universe_Long.append(symbol)
                self.Log(str(symbol) + str(self.Time) + "Gap is " + str(gap * 100))
            if gap>0.01:
                self.universe_Short.append(symbol)
                self.Log(str(symbol) + str(self.Time) + "Gap is " + str(gap * 100))
        
        
    def StartDayTrading(self):
        # Day-trade universe of securities that had a sufficient gap
        for symbol in self.universe_Long:
            self.MarketOrder(symbol,1)
        for symbol in self.universe_Short:
            self.MarketOrder(symbol,-1)
            
        
    def ClosePositions(self): 
        self.Liquidate()