| 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]