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