Overall Statistics |
Total Trades 353 Average Win 2.96% Average Loss -0.55% Compounding Annual Return -9.995% Drawdown 23.300% Expectancy 0.093 Net Profit -2.450% Sharpe Ratio 0.241 Probabilistic Sharpe Ratio 35.257% Loss Rate 83% Win Rate 17% Profit-Loss Ratio 5.41 Alpha -0.41 Beta -1.187 Annual Standard Deviation 0.748 Annual Variance 0.559 Information Ratio 0.529 Tracking Error 1.283 Treynor Ratio -0.152 Total Fees $814.55 |
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.SetWarmUp(timedelta(days=20)) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.EveryDayAfterMarketOpen) def EveryDayAfterMarketOpen(self): # wait for our slow ema to fully initialize if self.IsWarmingUp: return # define a small tolerance on our checks to avoid bouncing tolerance = 0.00015 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") 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")