Overall Statistics
Total Trades
27
Average Win
3.49%
Average Loss
-3.60%
Compounding Annual Return
30.580%
Drawdown
10.200%
Expectancy
0.363
Net Profit
16.848%
Sharpe Ratio
1.313
Loss Rate
31%
Win Rate
69%
Profit-Loss Ratio
0.97
Alpha
0.224
Beta
-2.108
Annual Standard Deviation
0.149
Annual Variance
0.022
Information Ratio
1.22
Tracking Error
0.149
Treynor Ratio
-0.093
Total Fees
$49.95
import numpy as np
from QuantConnect.Python import PythonQuandl
from QuantConnect.Data.Custom import *
import pandas as pd
from datetime import timedelta
from decimal import Decimal

class TermStructureOfVixAlgorithm(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2018, 1, 1)   # Set Start Date
        self.SetEndDate(2018, 8, 1)     # Set End Date
        self.SetCash(100000)          # Set Strategy Cash
        # Add Quandl VIX price (daily)
        self.AddData(QuandlVix, "CBOE/VIX", Resolution.Daily, TimeZones.Chicago)           
        # Add VIX futures contract data 
        self.AddFuture(Futures.Indices.VIX).SetFilter(timedelta(0), timedelta(days=182))
        # Add E-mini S&P500 futures contract data 
        self.AddFuture(Futures.Indices.SP500EMini).SetFilter(self.UniverseFunc)
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage)
        self.entryLong = None
        self.latest_VX = None
        self.latest_ES = None
        self.vix = Identity("VIX")
        self.vx_identity = Identity("VX")
        self.es_identity = Identity("ES")
        self.PlotIndicator("VIX", self.vix)
        self.PlotIndicator("VIX", self.vx_identity)
        self.PlotIndicator("ES", self.es_identity)

    def UniverseFunc(self, universe):
        return universe.FrontMonth()
        
    def OnData(self, data):
        if data.ContainsKey("CBOE/VIX"):
            self.vix.Update(self.Time, self.Securities["CBOE/VIX"].Price)
        for chain in data.FutureChains:
            if chain.Key.Value == "VX": 
                front_VX = sorted(chain.Value, key = lambda x: x.Expiry)[0]
                self.latest_VX = front_VX.LastPrice
            if chain.Key.Value == "ES": 
                front_ES = sorted(chain.Value, key = lambda x: x.Expiry)[-1]
                self.latest_ES = front_ES.LastPrice
                if not self.Portfolio.Invested and self.entryLong:
                    self.MarketOrder(front_ES.Symbol, 1)
                    self.entryDate = self.Time
                if self.Portfolio.Invested and self.Time > self.entryDate + timedelta(days=15):
                    self.Liquidate()
    
    def OnEndOfDay(self):
        if self.latest_VX and self.latest_ES:
            self.vx_identity.Update(self.Time, self.latest_VX)
            self.es_identity.Update(self.Time, self.latest_ES)
            self.entryLong = self.vix < self.vx_identity


class QuandlVix(PythonQuandl):
    def __init__(self):
        self.ValueColumnName = "vix Close"