Overall Statistics |
Total Trades 315 Average Win 7.60% Average Loss -5.30% Compounding Annual Return 14.414% Drawdown 60.100% Expectancy 0.240 Net Profit 304.942% Sharpe Ratio 0.492 Probabilistic Sharpe Ratio 2.004% Loss Rate 49% Win Rate 51% Profit-Loss Ratio 1.43 Alpha 0.052 Beta 1.003 Annual Standard Deviation 0.312 Annual Variance 0.097 Information Ratio 0.189 Tracking Error 0.277 Treynor Ratio 0.153 Total Fees $5617.27 Estimated Strategy Capacity $4700000.00 Lowest Capacity Asset SVXY V0H08FY38ZFP |
# region imports from AlgorithmImports import * import numpy as np # endregion class DancingRedHorse(QCAlgorithm): def Initialize(self): self.SetStartDate(2012, 7, 15) # Set Start Date self.SetEndDate(2022,11,30) self.SetCash(100000) # Set Strategy Cash res = Resolution.Daily #add etfs and indexs self.svxy = self.AddEquity('SVXY',res).Symbol self.uvxy = self.AddEquity('UVXY',res).Symbol self.spy = self.AddEquity('SPY',res).Symbol self.upro = self.AddEquity('UPRO',res).Symbol self.vix_idx = self.AddData(CBOE,'VIX',res).Symbol self.vix9d_idx = self.AddData(CBOE,'VIX9D',res).Symbol #add hull moving averages self.vix_hma = self.HMA(self.vix_idx,5,res) self.vix9d_hma = self.HMA(self.vix9d_idx,5,res) #get histories vix_close = self.History(self.vix_idx,10,res)['close'] vix9d_close = self.History(self.vix9d_idx,10,res)['close'] for time,price in vix_close.loc[self.vix_idx].items(): self.vix_hma.Update(time,price) for time,price in vix9d_close.loc[self.vix9d_idx].items(): self.vix9d_hma.Update(time,price) #set warmup self.SetWarmUp(5,res) self.hma_vix_list = [] def OnData(self, data: Slice): #if indicators warming up exit if self.IsWarmingUp: return #if indicaotr not ready exit if not self.vix_hma.IsReady and self.vix9d_hma.IsReady: return #vix_current = self.Securities[self.vix_idx].Price #if list is empty or less than 2 elements add hma if len(self.hma_vix_list) <2: hma_diff_current = self.vix9d_hma.Current.Value - self.vix_hma.Current.Value self.hma_vix_list.append(hma_diff_current) if len(self.hma_vix_list)>1: hma_diff_current = self.vix9d_hma.Current.Value - self.vix_hma.Current.Value #- self.vix_hma.Current.Value hma_diff_prev = self.hma_vix_list[1] #self.Log(f"VIX: {vix_current} VIX_HMA: {vix_hma_current} VIX_HMA_Prev: {self.hma_vix_list[0]} ") self.Log(f"Current: {hma_diff_current} Prev: {hma_diff_prev}") #and self.vix_idx in data.Bars if self.svxy in data.Bars: if not self.Portfolio.Invested: #if not invested and vix9d is less than vix currently and previously vix9d was > vix then go long svxy (short vol) if (hma_diff_current < 0) and (hma_diff_prev > 0): self.SetHoldings("SVXY", 1) #self.SetHoldings("UPRO",.50) if self.Portfolio.Invested: if (hma_diff_current > .05) and (hma_diff_prev < -.05): self.Liquidate("SVXY") #self.Liquidate("UPRO") #update self.hma_vix_list.pop(1) self.hma_vix_list.insert(0,hma_diff_current)