Overall Statistics |
Total Trades 10001 Average Win 0.01% Average Loss -0.01% Compounding Annual Return -99.998% Drawdown 20.500% Expectancy -0.724 Net Profit -20.485% Sharpe Ratio -25.288 Probabilistic Sharpe Ratio 0.200% Loss Rate 91% Win Rate 9% Profit-Loss Ratio 2.06 Alpha -9.459 Beta 0.387 Annual Standard Deviation 0.371 Annual Variance 0.138 Information Ratio -25.621 Tracking Error 0.374 Treynor Ratio -24.25 Total Fees $12338.08 |
import decimal as d from datetime import timedelta import numpy from datetime import datetime class MovingAverageCrossAlgorithm(QCAlgorithm): def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' self.SetStartDate(2020, 1, 1) #Set Start Date self.SetEndDate(2020, 3, 26) #Set End Date self.SetCash(60000) #Set Strategy Cash self.AddEquity("SPY", Resolution.Minute).Symbol self.AddEquity("SPXS", Resolution.Minute).Symbol self.AddEquity("SDOW", Resolution.Minute).Symbol self.AddEquity("EDZ", Resolution.Minute).Symbol self.AddEquity("UDOW", Resolution.Minute).Symbol self.AddEquity("TQQQ", Resolution.Minute).Symbol self.AddEquity("SPXL", Resolution.Minute).Symbol self.AddEquity("DIA", Resolution.Minute).Symbol self.AddEquity("VOO", Resolution.Minute).Symbol #Simple moving average self.sma = {} equity = self.AddEquity("SPY") self.sma[equity.Symbol] = self.SMA(equity.Symbol, 60, Resolution.Minute) self.smas = {} equity = self.AddEquity("SPY") self.smas[equity.Symbol] = self.SMA(equity.Symbol, 100, Resolution.Minute) self.fastest = self.TEMA("DIA", 15, Resolution.Minute) # create a 13 day exponential moving average self.fast = self.EMA("VOO", 5, Resolution.Daily) # create a 48 day exponential moving average self.slow = self.EMA("VOO", 10, Resolution.Daily) self.previous = None self.SetWarmUp(timedelta(days=20)) self.now = datetime.now() def OnData(self, data): # wait for our slow ema to fully initialize if self.IsWarmingUp: return # only once per day #if self.previous is not None and self.previous.date() == self.Time.date(): #return self.TimeRules.Every(TimeSpan.FromMinutes(60)) # define a small tolerance on our checks to avoid bouncing tolerance = 0.00015 #holdings = self.Portfolio["SPXL", "TQQQ", "UDOW", "SPXS", "SDOW", "EDZ"].Quantity #if holdings <= 0: # we only want to go long if we're currently short or flat if self.fast.Current.Value > self.slow.Current.Value: # if the fast is greater than the slow, we'll go long self.SetHoldings("SPXL", .3, True) self.SetHoldings("TQQQ", .5, True) self.SetHoldings("UDOW", .2, True) print("bull") # we only want to liquidate if we're currently long # if the fast is less than the slow we'll liquidate our long if self.slow.Current.Value > self.fast.Current.Value: self.SetHoldings("SPXS", .3, True) self.SetHoldings("SDOW", .2, True) self.SetHoldings("EDZ", .5, True) print("bear") self.previous = self.Time