Overall Statistics
Total Trades
30
Average Win
3.45%
Average Loss
-3.95%
Compounding Annual Return
7.149%
Drawdown
7.300%
Expectancy
0.338
Net Profit
41.237%
Sharpe Ratio
0.805
Probabilistic Sharpe Ratio
27.495%
Loss Rate
29%
Win Rate
71%
Profit-Loss Ratio
0.87
Alpha
0.045
Beta
0.047
Annual Standard Deviation
0.063
Annual Variance
0.004
Information Ratio
-0.409
Tracking Error
0.165
Treynor Ratio
1.079
Total Fees
$256.89
Estimated Strategy Capacity
$77000000.00
Lowest Capacity Asset
PEP R735QTJ8XC9X
# RSI pair trading

# -------------------------------------------------
PAIR = ['PEP', 'KO']; PERIOD = 8; UB = 60; LB = 40;
# -------------------------------------------------

class RSIpairTrading(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2017, 3, 20)  
        self.SetEndDate(2022, 3, 19)
        self.SetCash(100000)
        self.rsi = {}
        self.symbols =  [self.AddEquity(ticker, Resolution.Daily).Symbol for ticker in PAIR]
        for x in self.symbols:
            self.rsi[x] = self.RSI(x, PERIOD, MovingAverageType.Simple, Resolution.Daily)
        self.SetWarmUp(PERIOD + 1, Resolution.Daily)
        

    def OnData(self, data):
        if self.IsWarmingUp: return
        
        for sec in self.symbols:
            if not self.rsi[sec].IsReady: return

            rsi_0 = self.rsi[self.symbols[0]].Current.Value
            rsi_1 = self.rsi[self.symbols[1]].Current.Value
            
            if rsi_0 < LB and rsi_1 > UB and self.Portfolio[self.symbols[0]].Quantity <= 0:
                self.SetHoldings(self.symbols[0], 0.5)
                self.SetHoldings(self.symbols[1], -0.5)
            
            elif rsi_0 > UB and rsi_1 < LB and self.Portfolio[self.symbols[0]].Quantity >= 0:
                self.SetHoldings(self.symbols[0], -0.5)
                self.SetHoldings(self.symbols[1], 0.5)