| 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"