Overall Statistics
Total Trades
6
Average Win
0%
Average Loss
0%
Compounding Annual Return
-1.369%
Drawdown
46.000%
Expectancy
0
Net Profit
-3.280%
Sharpe Ratio
0.044
Probabilistic Sharpe Ratio
3.737%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.025
Beta
0.164
Annual Standard Deviation
0.17
Annual Variance
0.029
Information Ratio
-0.806
Tracking Error
0.234
Treynor Ratio
0.045
Total Fees
$11.10
Estimated Strategy Capacity
$57000000.00
Lowest Capacity Asset
CL JL
class ContinuousFutureRegressionAlgorithm(QCAlgorithm):
    def Initialize(self):
        '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
        self.SetCash(1000000)
        self.SetStartDate(2019, 1, 1)
        self.SetEndDate(2021, 6, 1)

        self._lastDateLog = -1
        self._continuousContract = self.AddFuture(Futures.Energies.CrudeOilWTI,
                                                  dataNormalizationMode = DataNormalizationMode.BackwardsRatio,
                                                  dataMappingMode = DataMappingMode.OpenInterest,
                                                  contractDepthOffset = 0)
        self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Midnight, self.PlotPrices);

    def PlotPrices(self):
        if self._continuousContract.HasData:
            self.Plot(self._continuousContract.Symbol.ID.Symbol, self._continuousContract.Symbol.ID.Symbol, self._continuousContract.Price)

    def OnData(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
        Arguments:
            data: Slice object keyed by symbol containing the stock data
        '''
        for changedEvent in data.SymbolChangedEvents.Values:
            if changedEvent.Symbol == self._continuousContract.Symbol:
                self.Log(f"SymbolChanged event: {changedEvent}")

        if not self.Portfolio.Invested:
            self.Buy(self._continuousContract.Symbol, 1)

        if self._lastDateLog != self.Time.month:
            self._lastDateLog = self.Time.month
            response = self.History( [ self._continuousContract.Symbol ], 60 * 24 * 90)
            if response.empty:
                raise ValueError("Unexpected empty history response")

    def OnOrderEvent(self, orderEvent):
        if orderEvent.Status == OrderStatus.Filled:
            self.Debug("Purchased Stock: {0}".format(orderEvent.Symbol))