Created with Highcharts 12.1.2EquityJan 2Jan 9Jan 16Jan 23Jan 30Feb 6Feb 13Feb 20Feb 27Mar 6Mar 13Mar 20Mar 27Apr 3980k990k1,000k1,010k-2-1000.050.100.050.101G2G0.50.60.70.8
Overall Statistics
Total Orders
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-1.246%
Drawdown
1.700%
Expectancy
0
Start Equity
1000000
End Equity
996925.06
Net Profit
-0.307%
Sharpe Ratio
-2.592
Sortino Ratio
-3.213
Probabilistic Sharpe Ratio
20.326%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.063
Beta
0.038
Annual Standard Deviation
0.021
Annual Variance
0
Information Ratio
-1.801
Tracking Error
0.137
Treynor Ratio
-1.439
Total Fees
$2.47
Estimated Strategy Capacity
$1700000000.00
Lowest Capacity Asset
CL Y7S8YM5PTSJL
Portfolio Turnover
0.09%
from AlgorithmImports import *

class OilFuturesStrategy(QCAlgorithm):

    def Initialize(self):
        # Set start date, end date, and initial cash
        self.SetStartDate(2023, 1, 1)
        self.SetEndDate(2023, 4, 1)
        self.SetCash(1000000)

        # Add Crude Oil futures contract and filter for contracts expiring after 90 days
        self.contractSymbol = self.AddFuture(Futures.Energies.CrudeOilWTI)
        self.contractSymbol.SetFilter(timedelta(0), timedelta(182))

    def OnData(self, slice):
        # Check if any futures chain data is available
        if slice.FutureChains.Count == 0:
            return

        # Iterate through the futures chain and select contracts expiring in 90+ days
        for chain in slice.FutureChains:
            contracts = [contract for contract in chain.Value if contract.Expiry > self.Time + timedelta(90)]

            if contracts:
                front_contract = sorted(contracts, key=lambda x: x.Expiry)[0]

                # Enter long position if not already invested
                if not self.Portfolio.Invested:
                    self.MarketOrder(front_contract.Symbol, 1)
                    self.contractSymbol = front_contract.Symbol