Overall Statistics |
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 18.782% Drawdown 33.400% Expectancy 0 Net Profit 30.020% Sharpe Ratio 0.847 Probabilistic Sharpe Ratio 38.655% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.002 Beta 0.985 Annual Standard Deviation 0.276 Annual Variance 0.076 Information Ratio -1.209 Tracking Error 0.004 Treynor Ratio 0.237 Total Fees $1.00 |
''' ref. https://www.quantconnect.com/forum/discussion/2657/a-simple-vix-strategy ''' from QuantConnect.Python import PythonQuandl # quandl data not CLOSE from QuantConnect.Python import PythonData # custom data from QuantConnect.Data import SubscriptionDataSource from QuantConnect import * from QuantConnect.Algorithm import * import pandas as pd import numpy as np from datetime import datetime, timedelta import decimal ONEDAYSHIFT = timedelta(1) # shift date to avoid look ahead bias class CboeVix(PythonData): '''CBOE Vix Download Custom Data Class''' def GetSource(self, config, date, isLiveMode): url_vix = "http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vixcurrent.csv" return SubscriptionDataSource(url_vix, SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, isLiveMode): if not (line.strip() and line[0].isdigit()): return None # New CboeVix object index = CboeVix(); index.Symbol = config.Symbol try: # Example File Format: # Date VIX Open VIX High VIX Low VIX Close # 01/02/2004 17.96 18.68 17.54 18.22 #print line data = line.split(',') date = data[0].split('/') index.Time = datetime(int(date[2]), int(date[0]), int(date[1]))+ONEDAYSHIFT index.Value = decimal.Decimal(data[4]) index["Open"] = float(data[1]) index["High"] = float(data[2]) index["Low"] = float(data[3]) index["Close"] = float(data[4]) except ValueError: return None return index # NB: CboeVxV class == CboeVix class, except for the URL class CboeVxV(PythonData): '''CBOE VXV Download Custom Data Class''' def GetSource(self, config, date, isLiveMode): url_vxv = "http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vix3mdailyprices.csv" return SubscriptionDataSource(url_vxv, SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, isLiveMode): if not (line.strip() and line[0].isdigit()): return None index = CboeVxV(); index.Symbol = config.Symbol try: # Example File Format: # OPEN HIGH LOW CLOSE # 12/04/2007 24.8 25.01 24.15 24.65 data = line.split(',') date = data[0].split('/') index.Time = datetime(int(date[2]), int(date[0]), int(date[1]))+ONEDAYSHIFT index.Value = decimal.Decimal(data[4]) index["Open"] = float(data[1]) index["High"] = float(data[2]) index["Low"] = float(data[3]) index["Close"] = float(data[4]) except ValueError: # Do nothing return None return index # for using VIX futures settle in calc. ratios like VIX/VIX1 class QuandlFuture(PythonQuandl): '''Custom quandl data type for setting customized value column name. Value column is used for the primary trading calculations and charting.''' def __init__(self): # Define ValueColumnName: cannot be None, Empty or non-existant column name # If ValueColumnName is "Close", do not use PythonQuandl, use Quandl: # self.AddData[QuandlFuture](self.VIX1, Resolution.Daily) self.ValueColumnName = "Settle" class MyAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 6, 15) self.SetEndDate(datetime.now().date() - timedelta(1)) self.SetCash(10000) self.SetBrokerageModel(BrokerageName.AlphaStreams) self.spy = self.AddEquity("SPY", Resolution.Minute).Symbol self.vix = self.AddData(CboeVix, "VIX").Symbol self.vxv = self.AddData(CboeVxV, "VXV").Symbol self.SetBenchmark("SPY") # Define the Schedules self.Schedule.On( self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen(self.spy,1), Action(self.Balance) ) # logging is limited, add plot! indicatorPlot0 = Chart("len") self.AddChart(indicatorPlot0) def Balance(self): _window_len = 252*5 self.histSPY = self.History([self.spy], _window_len, Resolution.Daily) self.histVIX = self.History([self.vix], _window_len, Resolution.Daily) self.histVXV = self.History([self.vxv], _window_len, Resolution.Daily) self.SetHoldings(self.spy,1.0) # plot signals self.Plot("len",'spy',len(self.histSPY)) self.Plot("len",'vix',len(self.histVXV)) self.Plot("len",'vxv',len(self.histVXV))