Overall Statistics |
Total Trades 384 Average Win 13.26% Average Loss -3.22% Compounding Annual Return 268.636% Drawdown 36.200% Expectancy 2.654 Net Profit 9015964.605% Sharpe Ratio 4.203 Probabilistic Sharpe Ratio 100.000% Loss Rate 29% Win Rate 71% Profit-Loss Ratio 4.12 Alpha 2.348 Beta 0.274 Annual Standard Deviation 0.567 Annual Variance 0.322 Information Ratio 3.913 Tracking Error 0.576 Treynor Ratio 8.71 Total Fees $146779.98 |
import decimal class CboeVix(PythonData): '''CBOE Vix Download Custom Data Class''' #use GetSource(SubscriptionDataConfig, DateTime, bool) def GetSource(self, config, date, datafeed): url_vix = "http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vixcurrent.csv" return SubscriptionDataSource(url_vix, SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): 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])) 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 # except KeyError, e: # print 'I got a KeyError - reason "%s"' % str(e) return index class CboeVixsm(PythonData): '''CBOE Vix Download Custom Data Class''' def GetSource(self, config, date, datafeed): url_vix = "https://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vix9ddailyprices.csv" return SubscriptionDataSource(url_vix, SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New CboeVix object index = CboeVixsm(); 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])) 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 # except KeyError, e: # print 'I got a KeyError - reason "%s"' % str(e) 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, datafeed): url_vxv = "http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vix3mdailyprices.csv" return SubscriptionDataSource(url_vxv, SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): 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])) 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
from my_custom_data import * # QuandlFuture, CboeVix, CboeVxV from datetime import date, timedelta, datetime from decimal import Decimal import numpy as np from math import floor import json class QuandlFutures(PythonQuandl): def __init__(self): self.ValueColumnName = "open" class VentralTachyonAtmosphericScrubbers(QCAlgorithm): def Initialize(self): self.SetStartDate(2011, 10, 1) # Set Start Date #self.SetEndDate(2020, 1, 1) self.SetCash(500) # Set Strategy Cash self.perc_qnty = 1 self.selectedResolution = Resolution.Daily self.uvxy = self.AddEquity("UVXY", self.selectedResolution).Symbol self.svxy = self.AddEquity("SVXY", self.selectedResolution).Symbol self.tqqq = self.AddEquity("TQQQ", self.selectedResolution).Symbol self.Defense = self.AddEquity("GLD", self.selectedResolution).Symbol self.CanaryA = self.AddEquity("VWO", self.selectedResolution).Symbol self.CanaryB = self.AddEquity("BND", self.selectedResolution).Symbol self.spy = self.AddEquity("SPY", self.selectedResolution).Symbol self.spySma = self.SMA(self.spy, 25, self.selectedResolution, Field.Open) #Add 200-day Momentum Percent indicator (MomentumPercent computes the n-period percent change in the security) for BND (symbol, period, and resolution) self.CanaryAMomentum = self.MOMP("VWO", 35, self.selectedResolution) #Add 200-day Momentum Percent indicator (MomentumPercent computes the n-period percent change in the security) for BND (symbol, period, and resolution) self.CanaryBMomentum = self.MOMP("BND", 200, self.selectedResolution) self.vixStr = "VIX" self.vxvStr = "VXV" self.vixsmStr = "VIX9D" self.AddData(CboeVix, "VIX") self.AddData(CboeVxv, "VXV") self.AddData(CboeVixsm, "VIX9D") self.macd = self.MACD("SPY", 12, 26, 6, MovingAverageType.Exponential, self.selectedResolution, Field.Open) self.yvixRatio = 0 self.yvixCrossUp = False self.yspy = 0 self.yspySma = 0 #1RiskManagement close anything that loses more than 5% self.SetRiskManagement(MaximumDrawdownPercentPortfolio(0.05)) def OnData(self, data): if self.vixStr not in data or self.vxvStr not in data: return vixPrice = data[self.vixStr].Close vxvPrice = data[self.vxvStr].Close vixsmPrice = 10 if self.vixsmStr in data: vixsmPrice = data[self.vixsmStr].Close uvxy_qnty = self.Portfolio["UVXY"].Quantity svxy_qnty = self.Portfolio["SVXY"].Quantity tqqq_qnty = self.Portfolio["TQQQ"].Quantity gld_qnty = self.Portfolio["GLD"].Quantity vixRatio = vixPrice/vxvPrice self.Plot("Vix/Vix3M", "Vix/Vix3M", vixRatio) self.Plot("vix9DCross", "vixPrice", vixPrice) self.Plot("vix9DCross", "vixsmPrice", vixsmPrice) self.Plot("MACD", "Source", self.macd.Current.Value) self.Plot("MACD", "Signal-Long Greater than Source", self.macd.Signal.Current.Value) self.Plot("SVXY", "SVXY", self.Securities["SVXY"].Price) self.Plot("SPY", "SPY open - Short Vol if NOT less that Sma current value", self.Securities["SPY"].Open) self.Plot("SPY", "Sma current value", self.spySma.Current.Value) self.Plot("SPY2", "yspy - Short Vol if greater than yspySma", self.yspy) self.Plot("SPY2", "yspySma", self.yspySma) self.Plot("MOMP", "CanaryAMomentum", self.CanaryAMomentum.Current.Value) self.Plot("MOMP", "CanaryBMomentum", self.CanaryBMomentum.Current.Value) vixCrossUp = False if vixsmPrice: vixCrossUp = vixsmPrice > vixPrice macdLong = self.macd.Current.Value < self.macd.Signal.Current.Value inLong = uvxy_qnty != 0 inShort = svxy_qnty != 0 inRest = tqqq_qnty != 0 shortEntry = (vixRatio < 0.95) and not vixCrossUp and not (self.Securities["SPY"].Open <= self.spySma.Current.Value and self.yspy > self.yspySma) shortExit = inShort and (not shortEntry) longEntry = vixRatio > 1.05 and vixCrossUp and macdLong longExit = inLong and (not longEntry) if shortExit or longExit: self.Liquidate() if not inRest and longExit: self.SetHoldings(self.tqqq, self.perc_qnty) return if (shortEntry): if inLong: self.Liquidate(self.uvxy) if inRest: self.Liquidate(self.tqqq) if not inShort: self.SetHoldings(self.svxy, self.perc_qnty) if (longEntry): if inShort: self.Liquidate(self.svxy) if inRest: self.Liquidate(self.tqqq) if not inLong: self.SetHoldings(self.uvxy, self.perc_qnty) self.yvixRatio = vixRatio self.yvixCrossUp = vixCrossUp self.yspy = self.Securities["SPY"].Open self.yspySma = self.spySma.Current.Value