Overall Statistics
Total Trades
48
Average Win
0.30%
Average Loss
-0.23%
Compounding Annual Return
0.432%
Drawdown
1.000%
Expectancy
0.041
Net Profit
0.221%
Sharpe Ratio
0.263
Probabilistic Sharpe Ratio
30.008%
Loss Rate
54%
Win Rate
46%
Profit-Loss Ratio
1.27
Alpha
0.01
Beta
-0.015
Annual Standard Deviation
0.019
Annual Variance
0
Information Ratio
-2.09
Tracking Error
0.167
Treynor Ratio
-0.338
Total Fees
$48.00
Estimated Strategy Capacity
$81000000.00
class PairsStrategy(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 9, 14)  # Set Start Date
        self.SetCash(10000)  # Set Strategy Cash
        self.AddEquity("NFLX", Resolution.Hour)
        self.AddEquity("ROKU", Resolution.Hour)
        
        self.lookbackdays = 5
        self.diffthreshold = 5 # 5 = 5%
        
        self.profitlevel = 10 # 10 = 10%
        self.stoplevel = 5 # 5 = 5%
        
        self.tradestoday = 0
        self.dailytradeslimit = 6
        self.holding_roku = 0
        
    def OnData(self, data):
        
        # Reset the Trades Counter at the beginning of each day
        if int(str(self.Time.time())[0:8].replace(':','')) == 100000: # Note: on hourly resolution, 10:00 AM is the first datapoint we get for the day
            self.tradestoday = 0
        
        # Limit Number of Trades in a Day
        if self.tradestoday >= self.dailytradeslimit:
            return
        
        # Get last X Days of Data to Compare Move With
        NFLXhis = self.History(["NFLX"], self.lookbackdays, Resolution.Daily)
        ROKUhis = self.History(["ROKU"], self.lookbackdays, Resolution.Daily)
        
        # Identify The Close From X Days Ago
        NFLXcomppoint = NFLXhis.close[0]
        ROKUcomppoint = ROKUhis.close[0]
        
        # Identify The Current Price
        NFLXprice = self.Securities["NFLX"].Price
        ROKUprice = self.Securities["ROKU"].Price
        
        # Calculate The Percantage Gain/Loss of Each Symbol
        if NFLXcomppoint >= NFLXprice:
            self.NFLXmove = 100*(1-(NFLXprice/NFLXcomppoint))
        else:
            self.NFLXmove = -100*(1-(NFLXcomppoint/NFLXprice))
            
        if ROKUcomppoint >= ROKUprice:
            self.ROKUmove = 100*(1-(ROKUprice/ROKUcomppoint))
        else:
            self.ROKUmove = -100*(1-(ROKUcomppoint/ROKUprice))
        
        # Enter Short Position
        if self.holding_roku == 0 and self.ROKUmove > self.NFLXmove and self.Portfolio.TotalPortfolioValue > max(NFLXprice, ROKUprice):
            if abs(self.NFLXmove-self.ROKUmove) > self.diffthreshold:
                self.MarketOrder("ROKU", -1)
                self.shortprofit = ROKUprice*(1-(self.profitlevel/100))
                self.shortstop = ROKUprice*(1+(self.stoplevel/100))
                self.holding_roku = self.holding_roku + 1
        
        # Enter Long Position
        if self.holding_roku == 0 and self.ROKUmove < self.NFLXmove and self.Portfolio.TotalPortfolioValue > max(NFLXprice, ROKUprice):
            if abs(self.ROKUmove-self.NFLXmove) > self.diffthreshold:
                self.MarketOrder("ROKU", 1)
                self.longprofit = ROKUprice*(1+(self.profitlevel/100))
                self.longstop = ROKUprice*(1-(self.stoplevel/100))
                self.holding_roku = self.holding_roku + 1
        
        # Long Take Profit
        if self.Portfolio["ROKU"].Quantity > 0 and ROKUprice >= self.longprofit:
            self.Liquidate()
            self.tradestoday = self.tradestoday+1
            self.holding_roku = self.holding_roku - 1
            
        # Long Stop Loss
        if self.Portfolio["ROKU"].Quantity > 0 and ROKUprice <= self.longstop:
            self.Liquidate()
            self.tradestoday = self.tradestoday+1
            self.holding_roku = self.holding_roku - 1
            
        # Short Take Profit
        if self.Portfolio["ROKU"].Quantity < 0 and ROKUprice <= self.shortprofit:
            self.Liquidate()
            self.tradestoday = self.tradestoday+1
            self.holding_roku = self.holding_roku - 1
            
        # Short Stop Loss
        if self.Portfolio["ROKU"].Quantity < 0 and ROKUprice >= self.shortstop:
            self.Liquidate()
            self.tradestoday = self.tradestoday+1
            self.holding_roku = self.holding_roku - 1