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()