Overall Statistics |
Total Trades 1237 Average Win 0.81% Average Loss -0.48% Compounding Annual Return 68.491% Drawdown 16.500% Expectancy 0.084 Net Profit 29.072% Sharpe Ratio 1.882 Probabilistic Sharpe Ratio 67.663% Loss Rate 60% Win Rate 40% Profit-Loss Ratio 1.69 Alpha 0.421 Beta -0.26 Annual Standard Deviation 0.256 Annual Variance 0.066 Information Ratio 1.978 Tracking Error 0.364 Treynor Ratio -1.854 Total Fees $2515.33 Estimated Strategy Capacity $320000.00 Lowest Capacity Asset CDN R735QTJ8XC9X |
from QuantConnect.Indicators import * from AlgorithmImports import * import numpy as numpy import pandas as pd class WTIBRENTSpread(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 1, 1) self.SetCash(100000) period_BB = 25 self.symbols = [ "CDNS", # WTI Crude Futures, Continuous Contract "SNPS" # Brent Crude Oil Futures, Continuous Contract ] self.spread = RollingWindow[float](5) for symbol in self.symbols: data = self.AddEquity(symbol, Resolution.Hour) #self.spread= data[symbol1].Price-data[symbol2].Price #self.Bolband = self.BB(self.spread, period_BB, 2, MovingAverageType.Simple, Resolution.Hour) def OnData(self, data): symbol1 = self.Symbol(self.symbols[0]) symbol2 = self.Symbol(self.symbols[1]) if symbol1 in data.Keys and symbol2 in data.Keys and data[symbol1] and data[symbol2]: price1 = data[symbol1].Price price2 = data[symbol2].Price if price1 != 0 and price2 != 0: spread = price1 - price2 self.spread.Add(spread) # MA calculation. if self.spread.IsReady: if (self.Time.date() - self.Securities[symbol1].GetLastData().Time.date()).days < 5 and (self.Time.date() - self.Securities[symbol2].GetLastData().Time.date()).days < 5: spreads = [x for x in self.spread] spread_ma20 = sum(spreads) / len(spreads) current_spread = spreads[0] #if spread <= self.Bolband.LowerBand.Current.Value: if current_spread > spread_ma20: self.SetHoldings(symbol1, -1) self.SetHoldings(symbol2, 1) #elif spread >= self.Bolband.MiddleBand.Current.Value: elif current_spread < spread_ma20: self.SetHoldings(symbol1, 1) self.SetHoldings(symbol2, -1) else: self.Liquidate()