| 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