Overall Statistics |
Total Trades 9 Average Win 0.22% Average Loss -0.46% Compounding Annual Return 20.031% Drawdown 7.100% Expectancy -0.752 Net Profit 13.566% Sharpe Ratio 1.405 Loss Rate 83% Win Rate 17% Profit-Loss Ratio 0.49 Alpha -0.236 Beta 21.685 Annual Standard Deviation 0.134 Annual Variance 0.018 Information Ratio 1.259 Tracking Error 0.134 Treynor Ratio 0.009 Total Fees $11.75 |
from datetime import timedelta class EtfEmaMultiAssetCrossoverExample(QCAlgorithm): def Initialize(self): self.SetStartDate(2017,6,1) self.SetEndDate(2017,12,1) self.SetCash(25000) # Add equities and store the Symbol object self.etfs = [ self.AddEquity("VXX", Resolution.Minute).Symbol, self.AddEquity("VONE", Resolution.Minute).Symbol, self.AddEquity("ILTB", Resolution.Minute).Symbol, ] # add indicator dicts(to store an indicator per asset) self.ema13 = {} self.ema49 = {} for symbol in self.etfs: self.ema13[symbol] = self.EMA(symbol, 13, Resolution.Daily) self.ema49[symbol] = self.EMA(symbol, 49, Resolution.Daily) # Fire rebalance on open each day self.AddEquity("SPY", Resolution.Minute) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 0), Action(self.Rebalance)) # Charting is cool for debugging, but careful not to overdo it and run out of quota self.charting_mode = True if self.charting_mode: stockPlot = Chart('Indicators') # On the Trade Plotter Chart we want 3 series: trades and price: for i, symbol in enumerate(self.etfs): stockPlot.AddSeries(Series('%s'%str(symbol), SeriesType.Line, i)) #y axis label only stockPlot.AddSeries(Series('%s_Price'%str(symbol), SeriesType.Line, i)) stockPlot.AddSeries(Series('%s_13'%str(symbol), SeriesType.Line, i)) stockPlot.AddSeries(Series('%s_49'%str(symbol), SeriesType.Line, i)) self.AddChart(stockPlot) # warmup to prepare the indicators so they work on day 1(which are in daily mode, but algo steps in minute mode) self.SetWarmUp(int(6.5*60*49)) def OnData(self, data): # fires every minute if self.IsWarmingUp: return pass def Rebalance(self): # loop through universe for symbol in self.etfs: # Ensure the Indicators are ready and not returning 0.0 if self.ema13[symbol].IsReady and self.ema49[symbol].IsReady: #Long if self.ema13[symbol].Current.Value > self.ema49[symbol].Current.Value: if self.Portfolio[symbol].Quantity <= 0: self.SetHoldings(symbol, 1./float(len(self.etfs)), tag="Long") # Short elif self.ema13[symbol].Current.Value < self.ema49[symbol].Current.Value: if self.Portfolio[symbol].Quantity >= 0: self.SetHoldings(symbol, -1./float(len(self.etfs)), tag="Short") if self.charting_mode: self.Plot('Indicators', '%s_Price'%str(symbol), self.Securities[symbol].Price) self.Plot('Indicators', '%s_13'%str(symbol), self.ema13[symbol].Current.Value) self.Plot('Indicators', '%s_49'%str(symbol), self.ema49[symbol].Current.Value)