Overall Statistics |
Total Trades 44 Average Win 0.69% Average Loss -2.04% Compounding Annual Return -42.126% Drawdown 25.700% Expectancy -0.465 Net Profit -20.124% Sharpe Ratio -2.424 Loss Rate 60% Win Rate 40% Profit-Loss Ratio 0.34 Alpha -0.853 Beta 25.583 Annual Standard Deviation 0.179 Annual Variance 0.032 Information Ratio -2.517 Tracking Error 0.179 Treynor Ratio -0.017 Total Fees $473.68 |
import numpy as np class RegionalETFrotationAlgorithm(QCAlgorithm): def Initialize(self): self.changes = None self.growth = {} self.SetStartDate(2011, 1, 5) #Set Start Date self.SetEndDate(2011, 6 ,5) #Set End Date self.SetCash(100000) #Set Strategy Cash self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverse(self.CoarseSelectionFunction) self.AddEquity("EDV", Resolution.Daily) self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol #self.etf = self.growth[0] self.current = [] self.top = [] self.Schedule.On(self.DateRules.MonthStart(self.spy), self.TimeRules.AfterMarketOpen(self.spy,5), self.rebalance) def OnSecuritiesChanged(self, changes): self.Debug("enter changes") self.changes = changes for ticker in self.changes.AddedSecurities: self.growth[ticker.Symbol] = self.MACD(ticker.Symbol,12, 26, 9, MovingAverageType.Exponential, Resolution.Daily) def OnData(self, data): if self.changes is None: return else: for universe in self.UniverseManager.Values: if universe is UserDefinedUniverse: self.tickers = universe.Members.Keys for symbol in self.tickers: self.Debug(symbol.Symbol.Value) # if self.etf[1].Current.Value < 0: # self.rebalance() # if not self.Portfolio.Invested: # self.rebalance() # self.Log(len(self.current)) # for etf in self.current: # if etf[1].Current.Value < 0: # self.replace(etf) # pass def replace(etf): self.SetHoldings(etf[0], 0) self.current.remove(etf) for security in self.top: if security in self.current: continue else: if security[1].Current.Value > 0: self.current.append(security) self.SetHoldings(security, 0.2) def CoarseSelectionFunction(self, coarse): etfs = list(coarse) return [ x.Symbol for x in etfs if x.HasFundamentalData==False ] def rebalance(self): #self.current = self.growth #self.current.sort(key=self.getMomentum, reverse = True) #self.etf = self.current[0] # if self.etf[1].Current.Value > 0: # if self.Portfolio.Invested and not self.Portfolio[self.etf[0]].Invested: # self.Liquidate() # self.SetHoldings(self.etf[0], 1) # else: # if self.Portfolio.Invested: # self.Liquidate() # self.SetHoldings("EDV", 1) self.Liquidate() self.top = [] for etf in self.growth: if self.growth[etf].Current.Value > 0: self.top.append(etf) self.current.sort(key=self.getMomentum, reverse = True) if len(self.top) ==0: self.SetHoldings("EDV", 1) else: self.SetHoldings(self.top[0], 0.2) self.SetHoldings(self.top[1], 0.2) self.SetHoldings(self.top[2], 0.2) self.SetHoldings(self.top[3], 0.2) self.SetHoldings(self.top[4], 0.2) def getMomentum(self,elem): return elem[1]