Overall Statistics
Total Trades
89
Average Win
0.09%
Average Loss
-0.11%
Compounding Annual Return
-49.851%
Drawdown
2.300%
Expectancy
-0.284
Net Profit
-1.447%
Sharpe Ratio
-4.452
Probabilistic Sharpe Ratio
13.229%
Loss Rate
61%
Win Rate
39%
Profit-Loss Ratio
0.85
Alpha
-0.888
Beta
0.793
Annual Standard Deviation
0.091
Annual Variance
0.008
Information Ratio
-12.724
Tracking Error
0.08
Treynor Ratio
-0.512
Total Fees
$1317.20
Estimated Strategy Capacity
$2600000.00
Lowest Capacity Asset
MES XMXYBDF3IXHD
import datetime
from AlgorithmImports import *


class BasicTemplateFuturesAlgorithm(QCAlgorithm):

    def __init__(self):
        super().__init__()
        self.signal = None

    def Initialize(self):
        self.SetStartDate(2020, 12, 25)
        self.SetEndDate(2021, 1, 1)
        self.SetCash(100000)

        resolution = Resolution.Hour
        
        es = self.AddFuture(Futures.Indices.MicroSP500EMini, resolution)
        vx = self.AddFuture(Futures.Indices.VIX, resolution)

        es.SetFilter(TimeSpan.FromDays(5), TimeSpan.FromDays(30))
        vx.SetFilter(TimeSpan.FromDays(5), TimeSpan.FromDays(130))

    def OnMarginCallWarning(self):
        self.Error("You received a margin call warning..")

    def OnData(self, slice):

        for chain in slice.FutureChains:
            
            vix_contracts = [contract for contract in chain.Value if contract.Symbol.ID.Symbol == Futures.Indices.VIX]
            es_contracts = [contract for contract in chain.Value if contract.Symbol.ID.Symbol == Futures.Indices.MicroSP500EMini]
            
            if vix_contracts:
                vix_sorted_exp = sorted(vix_contracts, key=lambda k: k.Expiry, reverse=False)
                vx1 = slice.Bars[vix_sorted_exp[0].Symbol].Price
                vx3 = slice.Bars[vix_sorted_exp[2].Symbol].Price

                self.signal = vx1<vx3

            if es_contracts and self.signal is not None:
                es_sorted_exp = sorted(es_contracts, key=lambda k: k.Expiry, reverse=False)
                es_front = es_sorted_exp[0]
                if not self.Portfolio.Invested and self.signal:
                    self.SetHoldings(es_front.Symbol, 0.1)
                else:
                    self.Liquidate()