Overall Statistics |
Total Trades 8235 Average Win 0.28% Average Loss -0.19% Compounding Annual Return 28.019% Drawdown 10.300% Expectancy 0.059 Net Profit 85.071% Sharpe Ratio 2.008 Probabilistic Sharpe Ratio 96.672% Loss Rate 56% Win Rate 44% Profit-Loss Ratio 1.43 Alpha 0.192 Beta -0.002 Annual Standard Deviation 0.095 Annual Variance 0.009 Information Ratio 0.468 Tracking Error 0.232 Treynor Ratio -86.789 Total Fees $96183.80 Estimated Strategy Capacity $540000.00 Lowest Capacity Asset CDN R735QTJ8XC9X |
# Bollinger Bands of spread pair trading from AlgorithmImports import * # ---------------------------- BB_PERIOD = 5; STD_MULT = 0.1; # ---------------------------- class BollingerBandsOfSpreadPairTrading(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetEndDate(2022, 6, 28) self.SetCash(1000000) res = Resolution.Hour self.stock1 = self.AddEquity("SNPS", res).Symbol self.stock2 = self.AddEquity("CDNS", res).Symbol i1 = self.Identity(self.stock1, res) i2 = self.Identity(self.stock2, res) self.spread = IndicatorExtensions.Minus(i1, i2) bb = BollingerBands(BB_PERIOD, STD_MULT, MovingAverageType.Simple) self.bb_spread = IndicatorExtensions.Of(bb, self.spread) self.SetWarmUp(BB_PERIOD, res) def OnData(self, data): if self.IsWarmingUp: return if not (self.spread.IsReady and self.bb_spread.IsReady): return if self.spread.Current.Value >= self.bb_spread.UpperBand.Current.Value: self.SetHoldings(self.stock1, -0.49) self.SetHoldings(self.stock2, 0.49) elif self.spread.Current.Value < self.bb_spread.LowerBand.Current.Value: self.SetHoldings(self.stock1, 0.49) self.SetHoldings(self.stock2, -0.49) self.Plot("spread", "spread", self.spread.Current.Value) self.Plot("spread", "bb_ub", self.bb_spread.UpperBand.Current.Value) self.Plot("spread", "bb_lb", self.bb_spread.LowerBand.Current.Value)