| Overall Statistics |
|
Total Trades 104 Average Win 0.57% Average Loss -0.46% Compounding Annual Return 30.564% Drawdown 4.800% Expectancy 0.420 Net Profit 10.417% Sharpe Ratio 2.896 Probabilistic Sharpe Ratio 88.573% Loss Rate 37% Win Rate 63% Profit-Loss Ratio 1.24 Alpha 0.248 Beta -0.033 Annual Standard Deviation 0.087 Annual Variance 0.008 Information Ratio 0.796 Tracking Error 0.483 Treynor Ratio -7.618 Total Fees $104.00 |
from QuantConnect.Data.Custom.CBOE import *
from datetime import timedelta
class VixAlgo(QCAlgorithm):
target_pct_change_time = datetime.min
def Initialize(self):
self.SetStartDate(2020, 1, 1)
self.SetEndDate(2020, 5, 15)
self.SetCash(10000)
self.spy = self.AddEquity("SPY", Resolution.Minute).Symbol
self.cboeVix = self.AddData(CBOE, "VIX").Symbol
self.vixPrevious = None
self.vixLatest = None
self.pct_change = None
self.SetWarmup(5, Resolution.Daily)
self.stop_price = None
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen(self.spy, 10), Action(self.Buy))
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen(self.spy, 60), Action(self.Sell))
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Every(timedelta(minutes=1)), Action(self.StopLoss))
# ''' for charting benchmark over equity curve'''
# self.benchmarkTicker = 'SPY'
# self.SetBenchmark(self.benchmarkTicker)
# self.initBenchmarkPrice = None
# self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.BeforeMarketClose(self.spy, 1), Action(self.PlotBenchmark))
def OnData(self, data):
if data.ContainsKey(self.cboeVix):
self.vixPrevious = self.vixLatest
self.vixLatest = data.Get(CBOE, self.cboeVix).Close
if self.IsWarmingUp:
return
if not data.Bars.ContainsKey("SPY"):
return
if self.vixPrevious != 0:
self.pct_change = (self.vixLatest - self.vixPrevious) / self.vixPrevious
#self.Log("VIX percent change is {}".format(self.pct_change))
# self.UpdateBenchmarkValue()
def Buy(self):
# keep buying for 3 days after the pct change target occurs
if (self.Time - self.target_pct_change_time).days < 4:
print('Test check')
self.SetHoldings("SPY", 1)
self.stop_price = self.Securities["SPY"].Price
return
if self.pct_change is not None and self.pct_change > 0.05:
self.SetHoldings("SPY", 1)
self.stop_price = self.Securities["SPY"].Price
self.target_pct_change_time = self.Time
self.Log("VIX percent change of {} is greater than 5%. Trading today".format(self.pct_change))
def Sell(self):
self.SetHoldings("SPY", 0)
def StopLoss(self):
if self.stop_price is not None:
if self.Securities["SPY"].Price < self.stop_price * 0.97:
self.SetHoldings("SPY", 0)
# def UpdateBenchmarkValue(self):
# ''' Simulate buy and hold the Benchmark '''
# if self.initBenchmarkPrice is None:
# self.initBenchmarkCash = self.Portfolio.Cash
# self.initBenchmarkPrice = self.Benchmark.Evaluate(self.Time)
# self.benchmarkValue = self.initBenchmarkCash
# else:
# currentBenchmarkPrice = self.Benchmark.Evaluate(self.Time)
# self.benchmarkValue = (currentBenchmarkPrice / self.initBenchmarkPrice) * self.initBenchmarkCash
# def PlotBenchmark(self):
# self.Plot('Strategy Equity', self.benchmarkTicker, self.benchmarkValue)