| Overall Statistics |
|
Total Trades 1462 Average Win 1.42% Average Loss -0.84% Compounding Annual Return 9.046% Drawdown 18.900% Expectancy 0.263 Net Profit 465.950% Sharpe Ratio 0.788 Probabilistic Sharpe Ratio 13.326% Loss Rate 53% Win Rate 47% Profit-Loss Ratio 1.70 Alpha 0.072 Beta 0.338 Annual Standard Deviation 0.126 Annual Variance 0.016 Information Ratio 0.109 Tracking Error 0.168 Treynor Ratio 0.294 Total Fees $46381367.77 |
class DailyVMASSforQQQ(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2000, 7, 22) # Set Start Date
self.SetEndDate(2020, 7, 22)
self.SetCash(250000000) # Set Strategy Cash
self.AddEquity("QQQ", Resolution.Minute)
self.AddEquity("SPY", Resolution.Minute)
#self.AddEquity("TQQQ", Resolution.Minute)
#self.AddEquity("UVXY", Resolution.Minute)
self.SetBenchmark("SPY")
self.lastBenchmarkValue = None
self.BenchmarkPerformance = self.Portfolio.TotalPortfolioValue
self.UniverseSettings.Resolution = Resolution.Daily
self.AddEquity("QQQ", Resolution.Minute)
#self.AddEquity("TQQQ", Resolution.Minute)
#self.AddEquity("UVXY", Resolution.Minute)
self.vma = self.SMA("QQQ", 365, Resolution.Daily, Field.Volume)
self.vmaSlope = Momentum(12)
self.BuyThreshold = -0.123
self.SellThreshold = -0.1
self.Schedule.On(
self.DateRules.EveryDay("QQQ"),
self.TimeRules.AfterMarketOpen("QQQ", 3),
self.Derp)
#Whenever I raise the number of minutes to anything < 2 or > 10,
#it buys and sells once every single trading day throughout
#the entire backtest. I don't understand this at all.
self.SetWarmup(365, Resolution.Daily)
def OnData(self, data):
if self.IsWarmingUp:
return
self.vmaSlope.Update(self.Time, self.vma.Current.Value)
benchmark = self.Securities["SPY"].Close
if self.lastBenchmarkValue is not None:
self.BenchmarkPerformance = self.BenchmarkPerformance * (benchmark/self.lastBenchmarkValue)
self.lastBenchmarkValue = benchmark
self.Plot("Strategy vs Benchmark", "Portfolio Value", self.Portfolio.TotalPortfolioValue)
self.Plot("Strategy vs Benchmark", "Benchmark", self.BenchmarkPerformance)
def Derp(self):
if not self.vmaSlope.IsReady:
return
if (self.vmaSlope.Current.Value >= self.SellThreshold):
self.Liquidate("QQQ")
#self.SetHoldings("UVXY", 0)
#self.Liquidate("TQQQ")
if self.vmaSlope.Current.Value <= self.BuyThreshold:
self.SetHoldings("QQQ", 1)
#self.SetHoldings("TQQQ", 0)
#self.SetHoldings("UVXY", 0)
#self.Short == False
#self.Long == True
#if self.vmaSlope.Current.Value >= self.SellThreshold:
# self.Liquidate("TQQQ")
# self.Liquidate("QQQ")
#self.Long == False
#self.Short == True
#self.market or limit order for UVXY equal to 10% of total portfolio value
#def GimmeHedge(self):
#if not self.vmaSlope.IsReady:
#return
#if self.Short == True:
#self.SetHoldings("UVXY", 0.15)